Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи

Важная информация

Патчи Если кто-то хочет выложить не свой готовый патч - не забудьте указать автора и источник.

Если кто-то хочет задать вопрос по патчу - велкам.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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 вне форума   Ответить с цитированием
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация Death Knight T8 Melee 4P Bonus + упрощение расчетов бонусов от болезней ДК Warlord123 Патчи на рассмотрении 0 22.10.2010 19:01
каким образом можно получить более 60 000 хитов в форме медведя? tempura Флудильня 25 04.07.2010 15:11
Реализация системы бонусов Max Z. Корзина 3 24.05.2010 18:45


Текущее время: 14:18. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot