aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/ItemPrototype.h2
-rw-r--r--src/game/Player.cpp2
-rw-r--r--src/game/Spell.cpp134
-rw-r--r--src/game/SpellAuras.h1
-rw-r--r--src/game/SpellEffects.cpp14
-rw-r--r--src/game/Unit.cpp4
6 files changed, 76 insertions, 81 deletions
diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h
index a4210521bc7..781262189e1 100644
--- a/src/game/ItemPrototype.h
+++ b/src/game/ItemPrototype.h
@@ -117,7 +117,7 @@ enum ITEM_FLAGS
ITEM_FLAGS_THROWABLE = 0x00400000, // not used in game for check trow possibility, only for item in game tooltip
ITEM_FLAGS_SPECIALUSE = 0x00800000, // last used flag in 2.3.0
ITEM_FLAGS_BOA = 0x08000000, // bind on account
- ITEM_FLAGS_NO_REAGENT_CAST = 0x10000000, // used by enchanting scrolls made with vellum
+ ITEM_FLAGS_TRIGGERED_CAST = 0x10000000, // used by enchanting scrolls made with vellum
ITEM_FLAGS_MILLABLE = 0x20000000
};
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index a5a33c7d2fd..907d648f87f 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -6957,7 +6957,7 @@ void Player::CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 c
return;
}
- Spell *spell = new Spell(this, spellInfo, false);
+ Spell *spell = new Spell(this, spellInfo,false);
spell->m_CastItem = item;
spell->m_cast_count = cast_count; //set count of casts
spell->m_currentBasePoints[0] = learning_spell_id;
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index d0e6b0f8ede..5df891d6dc5 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -590,11 +590,8 @@ void Spell::FillTargetMap()
if(Guardian* pet = m_caster->GetGuardianPet())
tmpUnitMap.push_back(pet);
break;
- case SPELL_EFFECT_ENCHANT_ITEM:
- // add caster as unit target-needed by vellums to define who gets item
- AddUnitTarget(m_caster, i);
- break;
- /*case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY:
+ /*case SPELL_EFFECT_ENCHANT_ITEM:
+ case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY:
case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC:
case SPELL_EFFECT_DISENCHANT:
case SPELL_EFFECT_PROSPECTING:
@@ -3508,13 +3505,13 @@ void Spell::TakeReagents()
if(m_IsTriggeredSpell) // reagents used in triggered spell removed by original spell or don't must be removed.
return;
- if (m_CastItem)
- if (m_CastItem->GetProto()->Flags & ITEM_FLAGS_NO_REAGENT_CAST)
- return;
-
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
+ // do not take reagents for these item casts
+ if (m_CastItem && m_CastItem->GetProto()->Flags & ITEM_FLAGS_TRIGGERED_CAST)
+ return;
+
Player* p_caster = (Player*)m_caster;
if (p_caster->CanNoReagentCast(m_spellInfo))
return;
@@ -3636,8 +3633,8 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_DONT_REPORT;
// only check at first call, Stealth auras are already removed at second call
- // for now, ignore triggered by aura spells
- if( strict && !m_triggeredByAuraSpell)
+ // for now, ignore triggered spells
+ if( strict && !m_IsTriggeredSpell)
{
bool checkForm = true;
// Ignore form req aura
@@ -4923,73 +4920,77 @@ SpellCastResult Spell::CheckItems()
focusObject = ok; // game object found in range
}
- // check reagents (ignore triggered spells with reagents processed by original spell) and special reagent ignore case.
- if (!m_IsTriggeredSpell && !p_caster->CanNoReagentCast(m_spellInfo))
+ // do not take reagents for these item casts
+ if (!(m_CastItem && m_CastItem->GetProto()->Flags & ITEM_FLAGS_TRIGGERED_CAST))
{
- for(uint32 i=0;i<8;i++)
+ // check reagents (ignore triggered spells with reagents processed by original spell) and special reagent ignore case.
+ if (!m_IsTriggeredSpell && !p_caster->CanNoReagentCast(m_spellInfo))
{
- if(m_spellInfo->Reagent[i] <= 0)
- continue;
+ for(uint32 i=0;i<8;i++)
+ {
+ if(m_spellInfo->Reagent[i] <= 0)
+ continue;
- uint32 itemid = m_spellInfo->Reagent[i];
- uint32 itemcount = m_spellInfo->ReagentCount[i];
+ uint32 itemid = m_spellInfo->Reagent[i];
+ uint32 itemcount = m_spellInfo->ReagentCount[i];
- // if CastItem is also spell reagent
- if( m_CastItem && m_CastItem->GetEntry() == itemid )
- {
- ItemPrototype const *proto = m_CastItem->GetProto();
- if(!proto)
- return SPELL_FAILED_ITEM_NOT_READY;
- for(int s=0; s < MAX_ITEM_PROTO_SPELLS; ++s)
+ // if CastItem is also spell reagent
+ if( m_CastItem && m_CastItem->GetEntry() == itemid )
{
- // 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)
+ ItemPrototype const *proto = m_CastItem->GetProto();
+ if(!proto)
+ return SPELL_FAILED_ITEM_NOT_READY;
+ for(int s=0; s < MAX_ITEM_PROTO_SPELLS; ++s)
{
- ++itemcount;
- break;
+ // 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)
+ {
+ ++itemcount;
+ break;
+ }
}
}
+ if( !p_caster->HasItemCount(itemid,itemcount) )
+ return SPELL_FAILED_ITEM_NOT_READY; //0x54
}
- if( !p_caster->HasItemCount(itemid,itemcount) )
- return SPELL_FAILED_ITEM_NOT_READY; //0x54
}
- }
- // check totem-item requirements (items presence in inventory)
- uint32 totems = 2;
- for(int i=0;i<2;++i)
- {
- if(m_spellInfo->Totem[i] != 0)
+ // check totem-item requirements (items presence in inventory)
+ uint32 totems = 2;
+ for(int i=0;i<2;++i)
{
- if( p_caster->HasItemCount(m_spellInfo->Totem[i],1) )
+ if(m_spellInfo->Totem[i] != 0)
{
- totems -= 1;
- continue;
- }
- }else
- totems -= 1;
- }
- if(totems != 0)
- return SPELL_FAILED_TOTEMS; //0x7C
+ if( p_caster->HasItemCount(m_spellInfo->Totem[i],1) )
+ {
+ totems -= 1;
+ continue;
+ }
+ }else
+ totems -= 1;
+ }
+ if(totems != 0)
+ return SPELL_FAILED_TOTEMS; //0x7C
- // Check items for TotemCategory (items presence in inventory)
- uint32 TotemCategory = 2;
- for(int i=0;i<2;++i)
- {
- if(m_spellInfo->TotemCategory[i] != 0)
+ // Check items for TotemCategory (items presence in inventory)
+ uint32 TotemCategory = 2;
+ for(int i=0;i<2;++i)
{
- if( p_caster->HasItemTotemCategory(m_spellInfo->TotemCategory[i]) )
+ if(m_spellInfo->TotemCategory[i] != 0)
{
- TotemCategory -= 1;
- continue;
+ if( p_caster->HasItemTotemCategory(m_spellInfo->TotemCategory[i]) )
+ {
+ TotemCategory -= 1;
+ continue;
+ }
}
+ else
+ TotemCategory -= 1;
}
- else
- TotemCategory -= 1;
+ if(TotemCategory != 0)
+ return SPELL_FAILED_TOTEM_CATEGORY; //0x7B
}
- if(TotemCategory != 0)
- return SPELL_FAILED_TOTEM_CATEGORY; //0x7B
// special checks for spell effects
for(int i = 0; i < 3; i++)
@@ -5018,7 +5019,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->GetProto()->Flags & ITEM_FLAGS_NO_REAGENT_CAST)
+ if (m_CastItem && m_CastItem->GetProto()->Flags & ITEM_FLAGS_TRIGGERED_CAST)
return SPELL_FAILED_TOTEM_CATEGORY;
ItemPosCountVec dest;
uint8 msg = p_caster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->EffectItemType[i], 1 );
@@ -5665,15 +5666,12 @@ void Spell::CalculateDamageDoneForAllTargets()
}
}
- bool usesAmmo = !m_IsTriggeredSpell || m_autoRepeat;
- if (usesAmmo)
+ bool usesAmmo=true;
+ Unit::AuraEffectList const& Auras = m_caster->GetAurasByType(SPELL_AURA_ABILITY_CONSUME_NO_AMMO);
+ for(Unit::AuraEffectList::const_iterator j = Auras.begin();j != Auras.end(); ++j)
{
- Unit::AuraEffectList const& Auras = m_caster->GetAurasByType(SPELL_AURA_ABILITY_CONSUME_NO_AMMO);
- for(Unit::AuraEffectList::const_iterator j = Auras.begin();j != Auras.end(); ++j)
- {
- if((*j)->isAffectedOnSpell(m_spellInfo))
- usesAmmo=false;
- }
+ if((*j)->isAffectedOnSpell(m_spellInfo))
+ usesAmmo=false;
}
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h
index 89d8da7e500..a8c06828b48 100644
--- a/src/game/SpellAuras.h
+++ b/src/game/SpellAuras.h
@@ -66,6 +66,7 @@ class TRINITY_DLL_SPEC Aura
int32 GetAuraDuration() const { return m_duration; }
void SetAuraDuration(int32 duration);
void RefreshAura(){ SetAuraDuration (m_maxduration); }
+ inline bool IsExpired() { if(!GetAuraDuration() && !(IsPermanent() || (IsPassive()))) return true; return false;};
void SendAuraUpdate();
uint8 GetAuraSlot() const { return m_auraSlot; }
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index b1510f9039f..abac18f7a79 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -3688,15 +3688,10 @@ void Spell::EffectEnchantItemPerm(uint32 effect_idx)
// Handle vellums
if (itemTarget->IsWeaponVellum() || itemTarget->IsArmorVellum())
{
- // item can be in trade slot and have owner diff. from caster
- Player* item_owner = itemTarget->GetOwner();
- if(!item_owner)
- return;
-
// destroy one vellum from stack
uint32 count=1;
- item_owner->DestroyItemCount(itemTarget,count,true);
- unitTarget=item_owner;
+ p_caster->DestroyItemCount(itemTarget,count,true);
+ unitTarget=p_caster;
// and add a scroll
DoCreateItem(effect_idx,m_spellInfo->EffectItemType[effect_idx]);
itemTarget=NULL;
@@ -3704,8 +3699,9 @@ void Spell::EffectEnchantItemPerm(uint32 effect_idx)
}
else
{
- // not grow at item use at item case
- p_caster->UpdateCraftSkill(m_spellInfo->Id);
+ // do not increase skill if vellum used
+ if (!(m_CastItem && m_CastItem->GetProto()->Flags & ITEM_FLAGS_TRIGGERED_CAST))
+ p_caster->UpdateCraftSkill(m_spellInfo->Id);
uint32 enchant_id = m_spellInfo->EffectMiscValue[effect_idx];
if (!enchant_id)
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index b1a39c30cce..a859957d53e 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -3259,7 +3259,7 @@ void Unit::_UpdateSpells( uint32 time )
for(AuraMap::iterator i = m_Auras.begin(); i != m_Auras.end();)
{
- if(!i->second->GetAuraDuration() && !(i->second->IsPermanent() || (i->second->IsPassive())))
+ if(i->second->IsExpired())
RemoveAura(i, AURA_REMOVE_BY_EXPIRE);
else
++i;
@@ -3673,7 +3673,7 @@ int32 Unit::GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_
bool Unit::AddAura(Aura *Aur)
{
// aura doesn't apply effects-return
- if (!Aur->GetEffectMask())
+ if (!Aur->GetEffectMask() || Aur->IsExpired())
{
delete Aur;
return false;