Суть проблемы: спеллы с флагом SPELL_ATTR_EXG_UNK28 не подавляют более слабые эффекты спеллов с тем же аттрибутом, которые уже наложены на цели.
Автор: я, но с данными для DBCStructure и т.п. помог
nos4r2zod
Одна из первых и самых сырых версий патча
полная работоспособная версия http://paste2.org/p/1064859
укороченная версия - только для просмотра проблеммного кода!
Код:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 5b95452..5f2e690 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -5745,7 +5745,8 @@ void Aura::HandleRangedAmmoHaste(bool apply, bool /*Real*/)
void Aura::HandleAuraModAttackPower(bool apply, bool /*Real*/)
{
- GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(m_modifier.m_amount), apply);
+ float value = ReplaceByMorePowerfulAura(m_modifier.m_auraname, m_modifier.m_amount);
+ GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, value, apply);
}
void Aura::HandleAuraModRangedAttackPower(bool apply, bool /*Real*/)
@@ -5753,13 +5754,15 @@ void Aura::HandleAuraModRangedAttackPower(bool apply, bool /*Real*/)
if((GetTarget()->getClassMask() & CLASSMASK_WAND_USERS)!=0)
return;
- GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(m_modifier.m_amount), apply);
+ float value = ReplaceByMorePowerfulAura(m_modifier.m_auraname, m_modifier.m_amount);
+ GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, value, apply);
}
void Aura::HandleAuraModAttackPowerPercent(bool apply, bool /*Real*/)
{
+ float value = ReplaceByMorePowerfulAura(m_modifier.m_auraname, m_modifier.m_amount);
//UNIT_FIELD_ATTACK_POWER_MULTIPLIER = multiplier - 1
- GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_PCT, float(m_modifier.m_amount), apply);
+ GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_PCT, value, apply);
}
void Aura::HandleAuraModRangedAttackPowerPercent(bool apply, bool /*Real*/)
@@ -5767,8 +5770,9 @@ void Aura::HandleAuraModRangedAttackPowerPercent(bool apply, bool /*Real*/)
if((GetTarget()->getClassMask() & CLASSMASK_WAND_USERS)!=0)
return;
+ float value = ReplaceByMorePowerfulAura(m_modifier.m_auraname, m_modifier.m_amount);
//UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = multiplier - 1
- GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_PCT, float(m_modifier.m_amount), apply);
+ GetTarget()->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_PCT, value, apply);
}
void Aura::HandleAuraModRangedAttackPowerOfStatPercent(bool /*apply*/, bool Real)
@@ -8058,6 +8062,24 @@ void Aura::HandleAuraModAllCritChance(bool apply, bool Real)
((Player*)target)->UpdateAllSpellCritChances();
}
+float Aura::ReplaceByMorePowerfulAura(AuraType type, float newValue)
+{
+ if (GetSpellProto()->AttributesEx7 & SPELL_ATTR_EX7_UNK28)
+ {
+ int32 oldMaxValue = 0;
+ Unit::AuraList const& APPauras = GetTarget()->GetAurasByType(type);
+ for (Unit::AuraList::const_iterator i = APPauras.begin(); i != APPauras.end(); ++i)
+ if ((*i)->GetSpellProto()->Id != GetSpellProto()->Id && (*i)->GetSpellProto()->AttributesEx7 & SPELL_ATTR_EX7_UNK28)
+ {
+ if (oldMaxValue < (*i)->GetModifier()->m_amount)
+ oldMaxValue = (*i)->GetModifier()->m_amount;
+ }
+
+ return (newValue > oldMaxValue) ? newValue - oldMaxValue : 0.0f;
+ }
+ return newValue;
+}
+
void Aura::SetAuraMaxDuration( int32 duration )
{
m_maxduration = duration;
diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h
index bb17cc4..cd9d353 100644
--- a/src/game/SpellAuras.h
+++ b/src/game/SpellAuras.h
@@ -365,6 +365,7 @@ class MANGOS_DLL_SPEC Aura
void HandleAuraModAllCritChance(bool Apply, bool Real);
void HandleAuraLinked(bool Apply, bool Real);
void HandleAuraOpenStable(bool apply, bool Real);
+ float ReplaceByMorePowerfulAura(AuraType type, float newValue);
virtual ~Aura();
За основу взят код из одного древнего патча на замену резистов xD
Жду подмоги, сам уже замаялся этот патч мучить... тут как минимум нужно упростить код, но на это врятли способен, ибо не особо шарю в составлении функций мангоса :/