aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp71
1 files changed, 34 insertions, 37 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 0f412a8cc3e..8583d055123 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -4301,30 +4301,27 @@ void Spell::TakeCastItem()
bool expendable = false;
bool withoutCharges = false;
- for (int i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
+ for (int i = 0; i < proto->Effects.size(); ++i)
{
- if (proto->Spells[i].SpellId)
+ // item has limited charges
+ if (proto->Effects[i].Charges)
{
- // item has limited charges
- if (proto->Spells[i].SpellCharges)
- {
- if (proto->Spells[i].SpellCharges < 0)
- expendable = true;
-
- int32 charges = m_CastItem->GetSpellCharges(i);
+ if (proto->Effects[i].Charges < 0)
+ expendable = true;
- // item has charges left
- if (charges)
- {
- (charges > 0) ? --charges : ++charges; // abs(charges) less at 1 after use
- if (proto->Stackable == 1)
- m_CastItem->SetSpellCharges(i, charges);
- m_CastItem->SetState(ITEM_CHANGED, player);
- }
+ int32 charges = m_CastItem->GetSpellCharges(i);
- // all charges used
- withoutCharges = (charges == 0);
+ // item has charges left
+ if (charges)
+ {
+ (charges > 0) ? --charges : ++charges; // abs(charges) less at 1 after use
+ if (proto->Stackable == 1)
+ m_CastItem->SetSpellCharges(i, charges);
+ m_CastItem->SetState(ITEM_CHANGED, player);
}
+
+ // all charges used
+ withoutCharges = (charges == 0);
}
}
@@ -4558,7 +4555,7 @@ void Spell::TakeReagents()
ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : NULL;
// do not take reagents for these item casts
- if (castItemTemplate && castItemTemplate->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST)
+ if (castItemTemplate && castItemTemplate->Flags[0] & ITEM_PROTO_FLAG_TRIGGERED_CAST)
return;
Player* p_caster = m_caster->ToPlayer();
@@ -4576,11 +4573,11 @@ void Spell::TakeReagents()
// if CastItem is also spell reagent
if (castItemTemplate && castItemTemplate->ItemId == itemid)
{
- for (int s = 0; s < MAX_ITEM_PROTO_SPELLS; ++s)
+ for (int s = 0; s < castItemTemplate->Effects.size(); ++s)
{
// CastItem will be used up and does not count as reagent
int32 charges = m_CastItem->GetSpellCharges(s);
- if (castItemTemplate->Spells[s].SpellCharges < 0 && abs(charges) < 2)
+ if (castItemTemplate->Effects[s].Charges < 0 && abs(charges) < 2)
{
++itemcount;
break;
@@ -5914,8 +5911,8 @@ SpellCastResult Spell::CheckItems()
if (!proto)
return SPELL_FAILED_ITEM_NOT_READY;
- for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
- if (proto->Spells[i].SpellCharges)
+ for (uint8 i = 0; i < proto->Effects.size(); ++i)
+ if (proto->Effects[i].Charges)
if (m_CastItem->GetSpellCharges(i) == 0)
return SPELL_FAILED_NO_CHARGES_REMAIN;
@@ -5989,7 +5986,7 @@ SpellCastResult Spell::CheckItems()
}
// do not take reagents for these item casts
- if (!(m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST))
+ if (!(m_CastItem && m_CastItem->GetTemplate()->Flags[0] & ITEM_PROTO_FLAG_TRIGGERED_CAST))
{
bool checkReagents = !(_triggeredCastFlags & TRIGGERED_IGNORE_POWER_AND_REAGENT_COST) && !player->CanNoReagentCast(m_spellInfo);
// Not own traded item (in trader trade slot) requires reagents even if triggered spell
@@ -6015,11 +6012,11 @@ SpellCastResult Spell::CheckItems()
ItemTemplate const* proto = m_CastItem->GetTemplate();
if (!proto)
return SPELL_FAILED_ITEM_NOT_READY;
- for (uint8 s = 0; s < MAX_ITEM_PROTO_SPELLS; ++s)
+ for (uint8 s = 0; s < proto->Effects.size(); ++s)
{
// CastItem will be used up and does not count as reagent
int32 charges = m_CastItem->GetSpellCharges(s);
- if (proto->Spells[s].SpellCharges < 0 && abs(charges) < 2)
+ if (proto->Effects[s].Charges < 0 && abs(charges) < 2)
{
++itemcount;
break;
@@ -6093,7 +6090,7 @@ SpellCastResult Spell::CheckItems()
if (m_targets.GetItemTarget()->GetOwner() != m_caster)
return SPELL_FAILED_NOT_TRADEABLE;
// do not allow to enchant vellum from scroll made by vellum-prevent exploit
- if (m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST)
+ if (m_CastItem && m_CastItem->GetTemplate()->Flags[0] & ITEM_PROTO_FLAG_TRIGGERED_CAST)
return SPELL_FAILED_TOTEM_CATEGORY;
ItemPosCountVec dest;
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1);
@@ -6114,12 +6111,12 @@ SpellCastResult Spell::CheckItems()
return SPELL_FAILED_LOWLEVEL;
bool isItemUsable = false;
- for (uint8 e = 0; e < MAX_ITEM_PROTO_SPELLS; ++e)
+ ItemTemplate const* proto = targetItem->GetTemplate();
+ for (uint8 e = 0; e < proto->Effects.size(); ++e)
{
- ItemTemplate const* proto = targetItem->GetTemplate();
- if (proto->Spells[e].SpellId && (
- proto->Spells[e].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE ||
- proto->Spells[e].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE))
+ if (proto->Effects[e].SpellID && (
+ proto->Effects[e].Trigger == ITEM_SPELLTRIGGER_ON_USE ||
+ proto->Effects[e].Trigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE))
{
isItemUsable = true;
break;
@@ -6216,7 +6213,7 @@ SpellCastResult Spell::CheckItems()
if (!m_targets.GetItemTarget())
return SPELL_FAILED_CANT_BE_PROSPECTED;
//ensure item is a prospectable ore
- if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_PROSPECTABLE))
+ if (!(m_targets.GetItemTarget()->GetTemplate()->Flags[0] & ITEM_PROTO_FLAG_PROSPECTABLE))
return SPELL_FAILED_CANT_BE_PROSPECTED;
//prevent prospecting in trade slot
if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
@@ -6239,7 +6236,7 @@ SpellCastResult Spell::CheckItems()
if (!m_targets.GetItemTarget())
return SPELL_FAILED_CANT_BE_MILLED;
//ensure item is a millable herb
- if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_MILLABLE))
+ if (!(m_targets.GetItemTarget()->GetTemplate()->Flags[0] & ITEM_PROTO_FLAG_MILLABLE))
return SPELL_FAILED_CANT_BE_MILLED;
//prevent milling in trade slot
if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID())
@@ -6296,8 +6293,8 @@ SpellCastResult Spell::CheckItems()
if (Item* pitem = player->GetItemByEntry(item_id))
{
- for (int x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
- if (pProto->Spells[x].SpellCharges != 0 && pitem->GetSpellCharges(x) == pProto->Spells[x].SpellCharges)
+ for (int x = 0; x < pProto->Effects.size(); ++x)
+ if (pProto->Effects[x].Charges != 0 && pitem->GetSpellCharges(x) == pProto->Effects[x].Charges)
return SPELL_FAILED_ITEM_AT_MAX_CHARGES;
}
break;