Ru-MaNGOS

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

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

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.11.2010, 19:49   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию [10743][patch] Новое поле для spell_bonus_data

Суть проблемы:
1) в функции void Aura::HandlePeriodicDamage(bool apply, bool Real) захардкодено множество спеллов, таких как Rip, Garrote, Lock Jaw и Pounce Bleed.
2) т.к. мы переносим в БД и способности Охотников, появилась и надобность в расчётах RAP (Силы атаки дальнего боя)

Дабы избавиться от лишнего кода, появилась надобность добавить новую колонку для этого дела... но т.к. кому-то лень написать своё, ведь проще уже скопировать сделанное и протестированное - копируем.

Оригинальный автор: QAston с TrinityCore

Это портированная под мангос версия с небольшими изменениями от меня

патч
Код:
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index ef3be00..0732846 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -1346,7 +1346,7 @@ void SpellMgr::LoadSpellBonuses()
     mSpellBonusMap.clear();                             // need for reload case
     uint32 count = 0;
     //                                                0      1             2          3
-    QueryResult *result = WorldDatabase.Query("SELECT entry, direct_bonus, dot_bonus, ap_bonus FROM spell_bonus_data");
+    QueryResult *result = WorldDatabase.Query("SELECT entry, direct_bonus, dot_bonus, ap_bonus, ap_dot_bonus FROM spell_bonus_data");
     if( !result )
     {
         barGoLink bar( 1 );
@@ -1384,6 +1384,7 @@ void SpellMgr::LoadSpellBonuses()
         sbe.direct_damage = fields[1].GetFloat();
         sbe.dot_damage    = fields[2].GetFloat();
         sbe.ap_bonus      = fields[3].GetFloat();
+        sbe.ap_dot_bonus   = fields[4].GetFloat();
 
         bool need_dot = false;
         bool need_direct = false;
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index c69905a..ea741d0 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -453,6 +453,11 @@ inline bool IsAutoRepeatRangedSpell(SpellEntry const* spellInfo)
     return (spellInfo->Attributes & SPELL_ATTR_RANGED) && (spellInfo->AttributesEx2 & SPELL_ATTR_EX2_AUTOREPEAT_FLAG);
 }
 
+inline bool IsSpellRequiresRangedAP(SpellEntry const* spellInfo)
+{
+    return (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE);
+}
+
 SpellCastResult GetErrorAtShapeshiftedCast (SpellEntry const *spellInfo, uint32 form);
 
 inline bool IsChanneledSpell(SpellEntry const* spellInfo)
@@ -616,6 +621,7 @@ struct SpellBonusEntry
     float  direct_damage;
     float  dot_damage;
     float  ap_bonus;
+    float  ap_dot_bonus;
 };
 
 typedef UNORDERED_MAP<uint32, SpellProcEventEntry> SpellProcEventMap;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 1a6853f..80f9f3a 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -6196,9 +6196,13 @@ int32 Unit::SpellBonusWithCoeffs(SpellEntry const *spellProto, int32 total, int3
         coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
 
         // apply ap bonus at done part calculation only (it flat total mod so common with taken)
-        if (donePart && bonus->ap_bonus)
+        if (donePart && (bonus->ap_bonus || bonus->ap_dot_bonus))
         {
-            float ap_bonus = bonus->ap_bonus;
+            float ap_bonus = 0;
+            if (damagetype == DOT)
+                ap_bonus = bonus->ap_dot_bonus;
+            else
+                ap_bonus = bonus->ap_bonus;
 
             // Impurity
             if (GetTypeId() == TYPEID_PLAYER && spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
@@ -6207,7 +6211,7 @@ int32 Unit::SpellBonusWithCoeffs(SpellEntry const *spellProto, int32 total, int3
                     ap_bonus += ((spell->CalculateSimpleValue(EFFECT_INDEX_0) * ap_bonus) / 100.0f);
             }
 
-            total += int32(ap_bonus * (GetTotalAttackPowerValue(BASE_ATTACK) + ap_benefit));
+            total += int32(ap_bonus * (GetTotalAttackPowerValue(IsSpellRequiresRangedAP(spellProto) ? RANGED_ATTACK : BASE_ATTACK) + ap_benefit));
         }
     }
     // Default calculation
или тут http://paste2.org/p/1092864

база
Код:
ALTER TABLE `spell_bonus_data` ADD COLUMN `ap_dot_bonus` float NOT NULL default '0' AFTER `ap_bonus`;
Пора бы уже юзать таблицу по полной, нечего в ядре такое держать...

патч протестирован и выполняет требуемую от него задачу
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо"

Последний раз редактировалось Insider42; 17.11.2010 в 10:20.
Insider42 вне форума  
6 пользователя(ей) сказали cпасибо:
Den (19.11.2010), KiriX (16.11.2010), LordJZ (15.11.2010), PSZ (16.11.2010), Vladimir (19.11.2010)
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поле боя Onfus Баг-репорты 1 08.12.2010 16:33
[10743] Add AP/RAP bonus data to `spell_bonus_data`. newsbot CMaNGOS Commits 0 19.11.2010 05:10
[10742] Add `spell_bonus_data`.`spell_bonus_data` field and support for RAP bonuses use for spells d newsbot CMaNGOS Commits 0 19.11.2010 04:30
В каком поле передается SpellPower пета? rsa Опкоды, Формулы, Клиент 14 17.09.2010 12:15
[9898] Implement redundent values check in `spell_bonus_data` newsbot CMaNGOS Commits 0 15.05.2010 11:00


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


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