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)
Старый 16.11.2010, 12:10   #2
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

А теперь несколько примеров по вычищению лишнего нынче кода
Код:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 95b929f..5aa2679 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -4785,14 +4785,6 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
 
         switch (spellProto->SpellFamilyName)
         {
-            case SPELLFAMILY_GENERIC:
-            {
-                // Pounce Bleed
-                if (spellProto->SpellIconID == 147 && spellProto->SpellVisual[0] == 0)
-                    // $AP*0.18/6 bonus per tick
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 / 100);
-                break;
-            }
             case SPELLFAMILY_WARRIOR:
             {
                 // Rend
@@ -4813,14 +4805,6 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
             }
             case SPELLFAMILY_DRUID:
             {
-                // Rake
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x0000000000001000) && spellProto->Effect[EFFECT_INDEX_2] == SPELL_EFFECT_ADD_COMBO_POINTS)
-                    // $AP*0.18/3 bonus per tick
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 6 / 100);
-                // Lacerate
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x000000010000000000))
-                    // $AP*0.05/5 bonus per tick
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
                 // Rip
                 if (spellProto->SpellFamilyFlags & UI64LIT(0x000000000000800000))
                 {
@@ -4842,10 +4826,6 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
                     }
                     m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * cp / 100);
                 }
-                // Lock Jaw
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x1000000000000000))
-                    // 0.15*$AP
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 15 / 100);
                 break;
             }
             case SPELLFAMILY_ROGUE:
@@ -4865,26 +4845,6 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
                     if (cp > 5) cp = 5;
                     m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * AP_per_combo[cp]);
                 }
-                // Garrote
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x000000000000000100))
-                    // $AP*0.07 bonus per tick
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 7 / 100);
-                // Deadly Poison
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x0000000000010000))
-                    // 0.12*$AP / 4 * amount of stack
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 * GetStackAmount() / 100);
-                break;
-            }
-            case SPELLFAMILY_HUNTER:
-            {
-                // Serpent Sting
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x0000000000004000))
-                    // $RAP*0.2/5 bonus per tick
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.2 / 5);
-                // Immolation Trap
-                if ((spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000004)) && spellProto->SpellIconID == 678)
-                    // $RAP*0.1/5 bonus per tick
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
                 break;
             }
             case SPELLFAMILY_PALADIN:
@@ -4901,15 +4861,6 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
                 }
                 break;
             }
-            case SPELLFAMILY_DEATHKNIGHT:
-            {
-                //Frost Fever and Blood Plague AP scale
-                if (spellProto->SpellFamilyFlags & UI64LIT(0x400080000000000))
-                {
-                    m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.055f * 1.15f);
-                }
-                break;
-            }
             default:
                 break;
         }
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index b65087a..2024bea 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -653,37 +653,12 @@ void Spell::EffectSchoolDMG(SpellEffectIndex effect_idx)
                     if (m_caster->HasAura(57627))           // Charge 6 sec post-affect
                         damage *= 2;
                 }
-                // Mongoose Bite
-                else if ((m_spellInfo->SpellFamilyFlags & UI64LIT(0x000000002)) && m_spellInfo->SpellVisual[0]==342)
-                {
-                    damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
-                }
-                // Counterattack
-                else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0008000000000000))
-                {
-                    damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
-                }
-                // Arcane Shot
-                else if ((m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000800)) && m_spellInfo->maxLevel > 0)
-                {
-                    damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15f);
-                }
                 // Steady Shot
                 else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x100000000))
                 {
                     int32 base = irand((int32)m_caster->GetWeaponDamageRange(RANGED_ATTACK, MINDAMAGE),(int32)m_caster->GetWeaponDamageRange(RANGED_ATTACK, MAXDAMAGE));
                     damage += int32(float(base)/m_caster->GetAttackTime(RANGED_ATTACK)*2800 + m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1f);
                 }
-                // Explosive Trap Effect
-                else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000004))
-                {
-                    damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1f);
-                }
-                // Volley
-                else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x00002000))
-                {
-                    damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.0837f);
-                }
                 break;
             }
             case SPELLFAMILY_PALADIN:
Затем заносим их (и ещё несколько которых небыло) в базу...
Код:
DELETE FROM `spell_bonus_data` WHERE `entry` IN (2818,42243,13797,13812,1495,19306,3044,42245,3674,9007,1822,33745,48628,703,1978,13797,55095,55078);
INSERT INTO `spell_bonus_data` VALUES
(2818,0,0,0,0.03,'Rogue - Deadly Poison'),
(3674,0,0,0,0.02,'Hunter - Black Arrow'),
(9007,0,0,0,0.03,'Druid - Pounce Bleed'),
(1822,0,0,0,0.06,'Druid - Rake'),
(33745,0,0,0.01,0.01,'Druid - Lacerate'),
(48628,0,0,0,0.15,'Druid - Lock Jaw'),
(703,0,0,0,0.07,'Rogue - Garrote'),
(1495,0,0,0.2,0,'Hunter - Mongoose Bite'),
(42243,0,0,0.0837,0,'Hunter - Volley'),
(1978,0,0,0,0.04,'Hunter - Serpent Sting'),
(3044,0,0,0.15,0,'Hunter - Arcane Shot'),
(13797,0,0,0,0.02,'Hunter - Immolation Trap'),
(13812,0,0,0.1,0.1,'Hunter - Explosive Trap'),
(19306,0,0,0.2,0,'Hunter - Counterattack'),
(55095,0,0,0,0.06325,'Death Knight - Frost Fever'),
(55078,0,0,0,0.06325,'Death Knight - Blood Plague');

DELETE FROM `spell_chain` WHERE `first_spell` IN (2818,13797,13812,42243);
INSERT INTO `spell_chain` VALUES
(13812,0,13812,1,0),
(14314,13812,13812,2,0),
(14315,14314,13812,3,0),
(27026,14315,13812,4,0),
(49064,27026,13812,5,0),
(49065,49064,13812,6,0),
(13797,0,13797,1,0),
(14298,13797,13797,2,0),
(14299,14298,13797,3,0),
(14300,14299,13797,4,0),
(14301,14300,13797,5,0),
(27024,14301,13797,6,0),
(49053,27024,13797,7,0),
(49054,49053,13797,8,0),
(42243,0,42243,1,0),
(42244,42243,42243,2,0),
(42245,42244,42243,3,0),
(42234,42245,42243,4,0),
(58432,42234,42243,5,0),
(58433,58432,42243,6,0),
(2818,0,2818,1,0),
(2819,2818,2818,2,0),
(11353,2819,2818,3,0),
(11354,11353,2818,4,0),
(25349,11354,2818,5,0),
(26968,25349,2818,6,0),
(27187,26968,2818,7,0),
(57969,27187,2818,8,0),
(57970,57969,2818,9,0);
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо"

Последний раз редактировалось Insider42; 16.11.2010 в 15:36.
Insider42 вне форума  
5 пользователя(ей) сказали cпасибо:
Den (19.11.2010), PSZ (16.11.2010), rsa (16.11.2010), Vladimir (19.11.2010)
Старый 16.11.2010, 13:53   #3
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Спасибо, действительно полезнгая и нужная штука. Хранить в таблицах то, что "захардкодено" в коде - лучший вариант, чем текущий.
KiriX вне форума  
Старый 16.11.2010, 14:22   #4
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Обновил 1 пост. Теперь он будет содержать главную часть патча, которая готова к принятию в GIT!
Обновил 2 пост. Теперь он будет содержать второстепенную часть патча, а конкретно - замена кода в ядре на записи в БД.

Патч из поста №1 протестирован и работает на все 100%
Патч из поста №2 протестирован и способности перенесенные в БД не потеряли функционала

Забыл добавить - этот патч также исправит действие Охотничьей метки на некоторые способности охотников.
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо"

Последний раз редактировалось Insider42; 16.11.2010 в 16:10.
Insider42 вне форума  
5 пользователя(ей) сказали cпасибо:
Den (19.11.2010), evilstar (16.11.2010), KiriX (16.11.2010), PSZ (19.11.2010)
Старый 19.11.2010, 02:22   #5
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Я уже несколько раз обжигался об это до этого забывая разницу для spell power бонусов. Есть большая разница в spell effect/aura явном добавлении бонуса
и неявном использованиие spell_bonus_data.

spell_bonus_data для неявных _не_ указанных в описании спелла бонусов.

Когда мы применяем явный бонус в эффекте то мы увеличиваем базовую часть урона спела до всяких эфектов, бонусов процентных и т.д., когда мы добавляем неявный бонус из таблицы мы увеличиваем тотальную часть урона полученную уже после применения всех фиксированных бонусов и дебафов (крому) тотального процентного бонуса.

В одном случае у на

((base_damage + base_flat_bonus + ap_bonus) * base_pct + total_flat_bonus) * total_pct_bonus

В другом:

((base_damage + base_flat_bonus) * base_pct + total_flat_bonus + ap_bonus) * total_pct_bonus

Второе меньше первого на

(base_pct - 1) * ap_bonus * total_pct_bonus
__________________
Так как устал объяснять знайте ICQ не пользуюсь

Последний раз редактировалось Vladimir; 19.11.2010 в 02:38.
Vladimir вне форума  
Старый 19.11.2010, 02:48   #6
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Хм... может я и не прав в части подозрений имеено для bonus->ap_bonus и предложенного. Он вызывается только для donePart я значит total в Unit::SpellBonusWithCoeffs - это базовый урон спела + возможно некоторые flat-бонусы.

Ну заняете обжегшись на молоке дуешь на воду
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 19.11.2010, 04:29   #7
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Добавил в первую часть в [10742]. Спасибо.

[added]
Вторая часть в [10743]. Спасибо
__________________
Так как устал объяснять знайте ICQ не пользуюсь

Последний раз редактировалось Vladimir; 19.11.2010 в 05:04.
Vladimir вне форума  
6 пользователя(ей) сказали cпасибо:
Burned (19.11.2010), Den (19.11.2010), Insider42 (19.11.2010), Mayss (19.11.2010), PSZ (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


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


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