|
Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.
Повод для гордости. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
15.11.2010, 19:49 | #1 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
[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 база Код:
ALTER TABLE `spell_bonus_data` ADD COLUMN `ap_dot_bonus` float NOT NULL default '0' AFTER `ap_bonus`; патч протестирован и выполняет требуемую от него задачу
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо" Последний раз редактировалось Insider42; 17.11.2010 в 10:20. |
16.11.2010, 12:10 | #2 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
А теперь несколько примеров по вычищению лишнего нынче кода
Код:
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. |
16.11.2010, 14:22 | #4 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Обновил 1 пост. Теперь он будет содержать главную часть патча, которая готова к принятию в GIT!
Обновил 2 пост. Теперь он будет содержать второстепенную часть патча, а конкретно - замена кода в ядре на записи в БД. Патч из поста №1 протестирован и работает на все 100% Патч из поста №2 протестирован и способности перенесенные в БД не потеряли функционала Забыл добавить - этот патч также исправит действие Охотничьей метки на некоторые способности охотников.
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо" Последний раз редактировалось Insider42; 16.11.2010 в 16:10. |
19.11.2010, 02:22 | #5 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Я уже несколько раз обжигался об это до этого забывая разницу для 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. |
19.11.2010, 02:48 | #6 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Хм... может я и не прав в части подозрений имеено для bonus->ap_bonus и предложенного. Он вызывается только для donePart я значит total в Unit::SpellBonusWithCoeffs - это базовый урон спела + возможно некоторые flat-бонусы.
Ну заняете обжегшись на молоке дуешь на воду
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
19.11.2010, 04:29 | #7 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Добавил в первую часть в [10742]. Спасибо.
[added] Вторая часть в [10743]. Спасибо
__________________
Так как устал объяснять знайте ICQ не пользуюсь Последний раз редактировалось Vladimir; 19.11.2010 в 05:04. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поле боя | 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 |