*Remove auras with duration lower than 30 sec on arena start.
*Do not remove rougue poisons and dk runes on arena start. *Apply healing bonus for healing stream totem. *Do not duplicate damage bonus in code with the one in db for Seal of Vengenance/Corruption --HG-- branch : trunk
This commit is contained in:
@@ -404,7 +404,20 @@ void BattleGround::Update(uint32 diff)
|
|||||||
|
|
||||||
for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||||
if (Player *plr = objmgr.GetPlayer(itr->first))
|
if (Player *plr = objmgr.GetPlayer(itr->first))
|
||||||
|
{
|
||||||
plr->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION);
|
plr->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION);
|
||||||
|
// remove auras with duration lower than 30s
|
||||||
|
Unit::AuraMap & aurMap = plr->GetAuras();
|
||||||
|
for(Unit::AuraMap::iterator iter = aurMap.begin(); iter != aurMap.end();)
|
||||||
|
{
|
||||||
|
if (iter->second->GetAuraDuration()<=30*IN_MILISECONDS)
|
||||||
|
{
|
||||||
|
plr->RemoveAura(iter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CheckArenaWinConditions();
|
CheckArenaWinConditions();
|
||||||
}
|
}
|
||||||
@@ -1109,7 +1122,7 @@ void BattleGround::AddPlayer(Player *plr)
|
|||||||
{
|
{
|
||||||
plr->RemoveArenaSpellCooldowns();
|
plr->RemoveArenaSpellCooldowns();
|
||||||
plr->RemoveArenaAuras();
|
plr->RemoveArenaAuras();
|
||||||
plr->RemoveAllEnchantments(TEMP_ENCHANTMENT_SLOT);
|
plr->RemoveArenaEnchantments(TEMP_ENCHANTMENT_SLOT);
|
||||||
if(team == ALLIANCE) // gold
|
if(team == ALLIANCE) // gold
|
||||||
{
|
{
|
||||||
if (plr->GetTeam() == HORDE)
|
if (plr->GetTeam() == HORDE)
|
||||||
|
|||||||
+7
-1
@@ -11717,7 +11717,7 @@ void Player::RemoveEnchantmentDurations(Item *item)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::RemoveAllEnchantments(EnchantmentSlot slot)
|
void Player::RemoveArenaEnchantments(EnchantmentSlot slot)
|
||||||
{
|
{
|
||||||
// remove enchantments from equipped items first to clean up the m_enchantDuration list
|
// remove enchantments from equipped items first to clean up the m_enchantDuration list
|
||||||
for(EnchantDurationList::iterator itr = m_enchantDuration.begin(),next;itr != m_enchantDuration.end();itr=next)
|
for(EnchantDurationList::iterator itr = m_enchantDuration.begin(),next;itr != m_enchantDuration.end();itr=next)
|
||||||
@@ -11727,6 +11727,12 @@ void Player::RemoveAllEnchantments(EnchantmentSlot slot)
|
|||||||
{
|
{
|
||||||
if(itr->item && itr->item->GetEnchantmentId(slot))
|
if(itr->item && itr->item->GetEnchantmentId(slot))
|
||||||
{
|
{
|
||||||
|
// Poisons and DK runes are enchants which are allowed on arenas
|
||||||
|
if (spellmgr.IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
|
||||||
|
{
|
||||||
|
++next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// remove from stats
|
// remove from stats
|
||||||
ApplyEnchantment(itr->item,slot,false,false);
|
ApplyEnchantment(itr->item,slot,false,false);
|
||||||
// remove visual
|
// remove visual
|
||||||
|
|||||||
+3
-2
@@ -278,7 +278,8 @@ struct Runes
|
|||||||
struct EnchantDuration
|
struct EnchantDuration
|
||||||
{
|
{
|
||||||
EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) {};
|
EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) {};
|
||||||
EnchantDuration(Item * _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot), leftduration(_leftduration) { assert(item); };
|
EnchantDuration(Item * _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot),
|
||||||
|
leftduration(_leftduration){ assert(item); };
|
||||||
|
|
||||||
Item * item;
|
Item * item;
|
||||||
EnchantmentSlot slot;
|
EnchantmentSlot slot;
|
||||||
@@ -1068,7 +1069,7 @@ class TRINITY_DLL_SPEC Player : public Unit
|
|||||||
void UpdateItemDuration(uint32 time, bool realtimeonly=false);
|
void UpdateItemDuration(uint32 time, bool realtimeonly=false);
|
||||||
void AddEnchantmentDurations(Item *item);
|
void AddEnchantmentDurations(Item *item);
|
||||||
void RemoveEnchantmentDurations(Item *item);
|
void RemoveEnchantmentDurations(Item *item);
|
||||||
void RemoveAllEnchantments(EnchantmentSlot slot);
|
void RemoveArenaEnchantments(EnchantmentSlot slot);
|
||||||
void AddEnchantmentDuration(Item *item,EnchantmentSlot slot,uint32 duration);
|
void AddEnchantmentDuration(Item *item,EnchantmentSlot slot,uint32 duration);
|
||||||
void ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool apply_dur = true, bool ignore_condition = false);
|
void ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool apply_dur = true, bool ignore_condition = false);
|
||||||
void ApplyEnchantment(Item *item,bool apply);
|
void ApplyEnchantment(Item *item,bool apply);
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ enum SpellCategory
|
|||||||
#define SPELL_ATTR_EX2_UNK10 0x00000400 // 10
|
#define SPELL_ATTR_EX2_UNK10 0x00000400 // 10
|
||||||
#define SPELL_ATTR_EX2_HEALTH_FUNNEL 0x00000800 // 11
|
#define SPELL_ATTR_EX2_HEALTH_FUNNEL 0x00000800 // 11
|
||||||
#define SPELL_ATTR_EX2_UNK12 0x00001000 // 12
|
#define SPELL_ATTR_EX2_UNK12 0x00001000 // 12
|
||||||
#define SPELL_ATTR_EX2_UNK13 0x00002000 // 13
|
#define SPELL_ATTR_EX2_UNK13 0x00002000 // 13 Items enchanted by spells with this flag preserve the enchant to arenas
|
||||||
#define SPELL_ATTR_EX2_UNK14 0x00004000 // 14
|
#define SPELL_ATTR_EX2_UNK14 0x00004000 // 14
|
||||||
#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 3.0.3
|
#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 3.0.3
|
||||||
#define SPELL_ATTR_EX2_TAME_BEAST 0x00010000 // 16
|
#define SPELL_ATTR_EX2_TAME_BEAST 0x00010000 // 16
|
||||||
|
|||||||
+1
-1
@@ -1319,7 +1319,7 @@ void Spell::DoTriggersOnSpellHit(Unit *unit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// spells with this flag can trigger only if not selfcast (eviscerate for example)
|
// spells with this flag can trigger only if not selfcast (eviscerate for example)
|
||||||
if (m_ChanceTriggerSpells.size() && (!(m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST | SPELL_ATTR_EX4_UNK4) || unit!=m_caster))
|
if (m_ChanceTriggerSpells.size() && (!((m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST | SPELL_ATTR_EX4_UNK4) && unit==m_caster)))
|
||||||
{
|
{
|
||||||
int _duration=0;
|
int _duration=0;
|
||||||
for(ChanceTriggerSpells::const_iterator i = m_ChanceTriggerSpells.begin(); i != m_ChanceTriggerSpells.end(); ++i)
|
for(ChanceTriggerSpells::const_iterator i = m_ChanceTriggerSpells.begin(); i != m_ChanceTriggerSpells.end(); ++i)
|
||||||
|
|||||||
@@ -657,28 +657,8 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
|
|||||||
}
|
}
|
||||||
case SPELLFAMILY_PALADIN:
|
case SPELLFAMILY_PALADIN:
|
||||||
{
|
{
|
||||||
// Judgement of Vengeance/Corruption ${1+0.22*$SPH+0.14*$AP} + 10% for each application of Holy Vengeance/Blood Corruption on the target
|
|
||||||
if((m_spellInfo->SpellFamilyFlags[1] & 0x400000) && m_spellInfo->SpellIconID==2292)
|
|
||||||
{
|
|
||||||
float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
|
||||||
int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
|
|
||||||
m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
|
|
||||||
damage+=int32(ap * 0.14f) + int32(holy * 22 / 100);
|
|
||||||
// Get stack of Holy Vengeance/Blood Corruption on the target added by caster
|
|
||||||
uint32 stacks = 0;
|
|
||||||
Unit::AuraEffectList const& auras = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
|
|
||||||
for(Unit::AuraEffectList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr)
|
|
||||||
if(((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID()==m_caster->GetGUID())
|
|
||||||
{
|
|
||||||
stacks = (*itr)->GetParentAura()->GetStackAmount();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// + 10% for each application of Holy Vengeance/Blood Corruption on the target
|
|
||||||
if(stacks)
|
|
||||||
damage += damage * stacks * 10 /100;
|
|
||||||
}
|
|
||||||
// Avenger's Shield ($m1+0.07*$SPH+0.07*$AP)
|
// Avenger's Shield ($m1+0.07*$SPH+0.07*$AP)
|
||||||
else if(m_spellInfo->SpellFamilyFlags[0] & 0x4000)
|
if(m_spellInfo->SpellFamilyFlags[0] & 0x4000)
|
||||||
{
|
{
|
||||||
float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
||||||
damage += int32(ap * 0.07f);
|
damage += int32(ap * 0.07f);
|
||||||
|
|||||||
+34
-1
@@ -3432,6 +3432,40 @@ void SpellMgr::LoadSpellCustomAttr()
|
|||||||
CreatureAI::FillAISpellInfo();
|
CreatureAI::FillAISpellInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill custom data about enchancments
|
||||||
|
void SpellMgr::LoadEnchantCustomAttr()
|
||||||
|
{
|
||||||
|
uint32 size = sSpellItemEnchantmentStore.GetNumRows();
|
||||||
|
mEnchantCustomAttr.resize(size);
|
||||||
|
|
||||||
|
for (uint32 i = 0;i<size; ++i)
|
||||||
|
mEnchantCustomAttr[i] = 0;
|
||||||
|
|
||||||
|
for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
|
||||||
|
{
|
||||||
|
SpellEntry * spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(i);
|
||||||
|
if(!spellInfo)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// TODO: find a better check
|
||||||
|
if (!(spellInfo->AttributesEx2 & SPELL_ATTR_EX2_UNK13) || !(spellInfo->Attributes & SPELL_ATTR_NOT_SHAPESHIFT))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for(uint32 j = 0; j < 3; ++j)
|
||||||
|
{
|
||||||
|
if(spellInfo->Effect[j] == SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY)
|
||||||
|
{
|
||||||
|
uint32 enchId = spellInfo->EffectMiscValue[j];
|
||||||
|
SpellItemEnchantmentEntry const *ench = sSpellItemEnchantmentStore.LookupEntry(enchId);
|
||||||
|
if (!enchId)
|
||||||
|
continue;
|
||||||
|
mEnchantCustomAttr[enchId] = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool SpellMgr::IsSkillTypeSpell(uint32 spellId, SkillType type) const
|
bool SpellMgr::IsSkillTypeSpell(uint32 spellId, SkillType type) const
|
||||||
{
|
{
|
||||||
SkillLineAbilityMap::const_iterator lower = GetBeginSkillLineAbilityMap(spellId);
|
SkillLineAbilityMap::const_iterator lower = GetBeginSkillLineAbilityMap(spellId);
|
||||||
@@ -3516,4 +3550,3 @@ void SpellMgr::LoadSpellLinked()
|
|||||||
sLog.outString();
|
sLog.outString();
|
||||||
sLog.outString( ">> Loaded %u linked spells", count );
|
sLog.outString( ">> Loaded %u linked spells", count );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -726,6 +726,7 @@ inline bool IsProfessionSkill(uint32 skill)
|
|||||||
|
|
||||||
|
|
||||||
typedef std::vector<uint32> SpellCustomAttribute;
|
typedef std::vector<uint32> SpellCustomAttribute;
|
||||||
|
typedef std::vector<bool> EnchantCustomAttribute;
|
||||||
|
|
||||||
typedef std::map<int32, std::vector<int32> > SpellLinkedMap;
|
typedef std::map<int32, std::vector<int32> > SpellLinkedMap;
|
||||||
|
|
||||||
@@ -886,6 +887,11 @@ class SpellMgr
|
|||||||
return spell_id;
|
return spell_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 IsArenaAllowedEnchancment(uint32 ench_id) const
|
||||||
|
{
|
||||||
|
return mEnchantCustomAttr[ench_id];
|
||||||
|
}
|
||||||
|
|
||||||
uint8 IsHighRankOfSpell(uint32 spell1,uint32 spell2) const
|
uint8 IsHighRankOfSpell(uint32 spell1,uint32 spell2) const
|
||||||
{
|
{
|
||||||
SpellChainMap::const_iterator itr = mSpellChains.find(spell1);
|
SpellChainMap::const_iterator itr = mSpellChains.find(spell1);
|
||||||
@@ -1071,6 +1077,7 @@ class SpellMgr
|
|||||||
void LoadSkillLineAbilityMap();
|
void LoadSkillLineAbilityMap();
|
||||||
void LoadSpellPetAuras();
|
void LoadSpellPetAuras();
|
||||||
void LoadSpellCustomAttr();
|
void LoadSpellCustomAttr();
|
||||||
|
void LoadEnchantCustomAttr();
|
||||||
void LoadSpellEnchantProcData();
|
void LoadSpellEnchantProcData();
|
||||||
void LoadSpellLinked();
|
void LoadSpellLinked();
|
||||||
void LoadPetLevelupSpellMap();
|
void LoadPetLevelupSpellMap();
|
||||||
@@ -1094,6 +1101,7 @@ class SpellMgr
|
|||||||
SpellCustomAttribute mSpellCustomAttr;
|
SpellCustomAttribute mSpellCustomAttr;
|
||||||
SpellLinkedMap mSpellLinkedMap;
|
SpellLinkedMap mSpellLinkedMap;
|
||||||
SpellEnchantProcEventMap mSpellEnchantProcEventMap;
|
SpellEnchantProcEventMap mSpellEnchantProcEventMap;
|
||||||
|
EnchantCustomAttribute mEnchantCustomAttr;
|
||||||
PetLevelupSpellMap mPetLevelupSpellMap;
|
PetLevelupSpellMap mPetLevelupSpellMap;
|
||||||
PetDefaultSpellsMap mPetDefaultSpellsMap; // only spells not listed in related mPetLevelupSpellMap entry
|
PetDefaultSpellsMap mPetDefaultSpellsMap; // only spells not listed in related mPetLevelupSpellMap entry
|
||||||
SpellAreaMap mSpellAreaMap;
|
SpellAreaMap mSpellAreaMap;
|
||||||
|
|||||||
+27
-17
@@ -1704,9 +1704,6 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
|
|||||||
}
|
}
|
||||||
if (slot != i)
|
if (slot != i)
|
||||||
continue;
|
continue;
|
||||||
// Check if item is useable (forms or disarm)
|
|
||||||
if (((Player*)this)->IsInFeralForm())
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
((Player*)this)->CastItemCombatSpell(item, damageInfo, proto);
|
((Player*)this)->CastItemCombatSpell(item, damageInfo, proto);
|
||||||
}
|
}
|
||||||
@@ -8869,6 +8866,23 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Custom scripted damage
|
// Custom scripted damage
|
||||||
|
// Judgement of Vengeance/ Judgement of Corruption
|
||||||
|
if((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID==2292)
|
||||||
|
{
|
||||||
|
// Get stack of Holy Vengeance/Blood Corruption on the target added by caster
|
||||||
|
uint32 stacks = 0;
|
||||||
|
Unit::AuraEffectList const& auras = pVictim->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
|
||||||
|
for(Unit::AuraEffectList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr)
|
||||||
|
if(((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID()==GetGUID())
|
||||||
|
{
|
||||||
|
stacks = (*itr)->GetParentAura()->GetStackAmount();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// + 10% for each application of Holy Vengeance/Blood Corruption on the target
|
||||||
|
if(stacks)
|
||||||
|
DoneTotalMod *= stacks * 10 + 100.0f /100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
// Ice Lance
|
// Ice Lance
|
||||||
if (spellProto->SpellFamilyName == SPELLFAMILY_MAGE && spellProto->SpellIconID == 186)
|
if (spellProto->SpellFamilyName == SPELLFAMILY_MAGE && spellProto->SpellIconID == 186)
|
||||||
{
|
{
|
||||||
@@ -9368,21 +9382,15 @@ uint32 Unit::SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint
|
|||||||
|
|
||||||
bool scripted = false;
|
bool scripted = false;
|
||||||
|
|
||||||
// No heal coeff for this class spells
|
for (uint8 i=0;i<3;++i)
|
||||||
if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
|
|
||||||
scripted = true;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
for (uint8 i=0;i<3;++i)
|
switch (spellProto->EffectApplyAuraName[i])
|
||||||
{
|
{
|
||||||
switch (spellProto->EffectApplyAuraName[i])
|
// These auras do not use healing coeff
|
||||||
{
|
case SPELL_AURA_PERIODIC_LEECH:
|
||||||
// These auras do not use healing coeff
|
case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
|
||||||
case SPELL_AURA_PERIODIC_LEECH:
|
scripted = true;
|
||||||
case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
|
break;
|
||||||
scripted = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9420,7 +9428,8 @@ uint32 Unit::SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint
|
|||||||
factorMod *= 0.45f;
|
factorMod *= 0.45f;
|
||||||
}
|
}
|
||||||
// Already set to scripted? so not uses healing bonus coefficient
|
// Already set to scripted? so not uses healing bonus coefficient
|
||||||
else if (scripted)
|
// No heal coeff for SPELL_DAMAGE_CLASS_NONE class spells by default
|
||||||
|
else if (scripted || spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
|
||||||
{
|
{
|
||||||
coeff = 0.0f;
|
coeff = 0.0f;
|
||||||
}
|
}
|
||||||
@@ -12997,6 +13006,7 @@ bool Unit::HandleAuraRaidProcFromChargeWithValue( AuraEffect* triggeredByAura )
|
|||||||
CastCustomSpell(target,spellProto->Id,&heal,NULL,NULL,true,NULL,triggeredByAura,caster->GetGUID());
|
CastCustomSpell(target,spellProto->Id,&heal,NULL,NULL,true,NULL,triggeredByAura,caster->GetGUID());
|
||||||
if (Aura * aur = target->GetAura(spellProto->Id, caster->GetGUID()))
|
if (Aura * aur = target->GetAura(spellProto->Id, caster->GetGUID()))
|
||||||
aur->SetAuraCharges(jumps);
|
aur->SetAuraCharges(jumps);
|
||||||
|
//caster->SpellHealingBonus(this, spellProto, heal, HEAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1339,6 +1339,9 @@ void World::SetInitialWorldSettings()
|
|||||||
sLog.outString( "Loading spell extra attributes...(TODO)" );
|
sLog.outString( "Loading spell extra attributes...(TODO)" );
|
||||||
spellmgr.LoadSpellCustomAttr();
|
spellmgr.LoadSpellCustomAttr();
|
||||||
|
|
||||||
|
sLog.outString( "Loading enchant custom attributes..." );
|
||||||
|
spellmgr.LoadEnchantCustomAttr();
|
||||||
|
|
||||||
sLog.outString( "Loading linked spells..." );
|
sLog.outString( "Loading linked spells..." );
|
||||||
spellmgr.LoadSpellLinked();
|
spellmgr.LoadSpellLinked();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user