Показать сообщение отдельно
Старый 31.10.2010, 15:23   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию [patch/dev] Замена бонусов аур более сильными

Суть проблемы: спеллы с флагом 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

Жду подмоги, сам уже замаялся этот патч мучить... тут как минимум нужно упростить код, но на это врятли способен, ибо не особо шарю в составлении функций мангоса :/
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо"

Последний раз редактировалось Insider42; 31.10.2010 в 15:42.
Insider42 вне форума   Ответить с цитированием