|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.
Повод для гордости. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
05.11.2010, 13:28 | #1 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
|
[11666][patch] Warrior T10 Melee\Protection 4P Bonus
Первоисточник на getmangos.com.
Добавил реализацию Warrior T10 Protection 4P Bonus. В реализацию Warrior T10 Melee 4P Bonus добавлены спелы, снижающие GCD Slam и Execute. Удаление ауры Sudden Death(52437) заменено сбросом заряда. С аурой Slam!(46816) возникли проблемы - сбрасывались сразу оба заряда ауры. В текущей реализации Slam проходит в 2 фазы: 1 заклинание типа Effect 0: Id 3 (SPELL_EFFECT_DUMMY), при котором запускается Slam(50782), который и наносит урон. Добавил код в Unit::HandleAddPctModifierAuraProc, но сброс продолжился. Оказалось что в Player::ApplySpellMod заряды сбрасываются при каждом вызове. ApplySpellMod для ID - 46916 Slam! Aura Id 108 (SPELL_AURA_ADD_PCT_MODIFIER), value = -100, misc = 10 (SPELLMOD_CASTING_TIME), miscB = 0, periodic = 0 вызывался при каждом GetSpellCastTime. 1 заряд сбрасывал Spell:: prepare , 2-ой Spell:: DoAllEffectOnTarget(TargetInfo *target). Добавил флаг, который не дает сбрасывать заряды у SpellMod. Warrior T10 Melee 4P Bonus заработал нормально. Пока проблем , вызванных патчем, не заметил. Но исключать их нельзя. Возможно, что нужно просто прописать исключение в Spell:: DoAllEffectOnTarget(TargetInfo *target). В этот код Код:
// recheck for visibility of target if ((m_spellInfo->speed > 0.0f || (m_spellInfo->EffectImplicitTargetA[0] == TARGET_CHAIN_DAMAGE && GetSpellCastTime(m_spellInfo, this) > 0)) && !unit->isVisibleForOrDetect(caster, caster, false)) Код патча. Код:
diff --git a/src/game/Player.h b/src/game/Player.h index fd7df3c..126d76a 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1718,7 +1718,7 @@ class MANGOS_DLL_SPEC Player : public Unit void AddSpellMod(SpellModifier* mod, bool apply); bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell const* spell = NULL); - template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell = NULL); + template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell = NULL, bool const drop_charges=true); void RemoveSpellMods(Spell const* spell); static uint32 const infinityCooldownDelay = MONTH; // used for set "infinity cooldowns" for spells and check @@ -2740,7 +2740,7 @@ void AddItemsSetItem(Player*player,Item *item); void RemoveItemsSetItem(Player*player,ItemPrototype const *proto); // "the bodies of template functions must be made available in a header file" -template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell) +template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell, bool const drop_charges) { SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId); if (!spellInfo) return 0; @@ -2767,7 +2767,7 @@ template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &bas totalpct += mod->value; } - if (mod->charges > 0 ) + if (mod->charges > 0 && drop_charges) { --mod->charges; if (mod->charges == 0) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 7f853ad..194e1ec 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2836,7 +2836,7 @@ void Spell::prepare(SpellCastTargets const* targets, Aura* triggeredByAura) prepareDataForTriggerSystem(); // calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail) - m_casttime = GetSpellCastTime(m_spellInfo, this); + m_casttime = GetSpellCastTime(m_spellInfo, this,false); // set timer base at cast time ReSetTimer(); @@ -3025,6 +3025,21 @@ void Spell::cast(bool skipCheck) if ((m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000020000000000)) && m_spellInfo->Category==1209) if (m_caster->HasAura(58375)) // Glyph of Blocking AddTriggeredSpell(58374); // Glyph of Blocking + //Warrior T10 Protection 4P Bonus trigger from Bloodrage. + if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000100) && m_caster->HasAura(70844)) + AddTriggeredSpell(70845); //Stoicism + // Item - Warrior T10 Melee 4P Bonus + if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0300000000000000)) //Slam! & Sudden Death + { + Aura* A=m_caster->GetAura(70847,EFFECT_INDEX_0); + if (A && roll_chance_i(A->GetModifier()->m_amount) ) + { + AddPrecastSpell(70849); //Extra Charge! + // Slam! trigger Slam GCD Reduced . Sudden Death trigger Execute GCD Reduced + int32 gcd_spell=m_spellInfo->Id==46916 ? 71072 : 71069 ; + AddPrecastSpell(gcd_spell); + } + } break; } case SPELLFAMILY_PRIEST: diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 21d6db5..ef3c88c 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -6859,6 +6859,13 @@ void Aura::HandleSchoolAbsorb(bool apply, bool Real) DoneActualBenefit = caster->SpellBaseHealingBonusDone(GetSpellSchoolMask(spellProto)) * 0.75f; } break; + case SPELLFAMILY_GENERIC: + // Stoicism + if (spellProto->Id==70845) + { + DoneActualBenefit = caster->GetMaxHealth()*0.20f; + } + break; default: break; } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 6a68d64..affaa66 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -2451,7 +2451,9 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) if(rageLeft < lastrage) rageLeft = lastrage; - m_caster->RemoveAura(52437, EFFECT_INDEX_0); // Remove Sudden Death after calculations + Aura *s_aura = m_caster->GetAura(52437, EFFECT_INDEX_0);// Drop charge Sudden Death after calculations + if (s_aura && s_aura->GetHolder()->DropAuraCharge()) + m_caster->RemoveAura(52437, EFFECT_INDEX_0); m_caster->SetPower(POWER_RAGE,rageLeft); return; diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index c58ddbb..d586192 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -61,7 +61,7 @@ int32 GetSpellMaxDuration(SpellEntry const *spellInfo) return (du->Duration[2] == -1) ? -1 : abs(du->Duration[2]); } -uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell) +uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell, bool drop_charges) { if (spell) { @@ -88,7 +88,7 @@ uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell) if (spell) { if (Player* modOwner = spell->GetCaster()->GetSpellModOwner()) - modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell); + modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell,drop_charges); if (!(spellInfo->Attributes & (SPELL_ATTR_UNK4|SPELL_ATTR_TRADESPELL))) castTime = int32(castTime * spell->GetCaster()->GetFloatValue(UNIT_MOD_CAST_SPEED)); diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index 7fe73f7..6921801 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -112,7 +112,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId); // Different spell properties inline float GetSpellRadius(SpellRadiusEntry const *radius) { return (radius ? radius->Radius : 0); } -uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell = NULL); +uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell = NULL, bool drop_charges=true); uint32 GetSpellCastTimeForBonus( SpellEntry const *spellProto, DamageEffectType damagetype ); float CalculateDefaultCoefficient(SpellEntry const *spellProto, DamageEffectType const damagetype); inline float GetSpellMinRange(SpellRangeEntry const *range, bool friendly = false) diff --git a/src/game/UnitAuraProcHandler.cpp b/src/game/UnitAuraProcHandler.cpp index ff71edf..f0f1e26 100644 --- a/src/game/UnitAuraProcHandler.cpp +++ b/src/game/UnitAuraProcHandler.cpp @@ -4109,6 +4109,12 @@ SpellAuraProcResult Unit::HandleAddPctModifierAuraProc(Unit* /*pVictim*/, uint32 } break; } + case SPELLFAMILY_WARRIOR: + { + //Slam must proc only from Slam damage spell + return (spellInfo->Id==46916 && procSpell->Id==50782) ? SPELL_AURA_PROC_OK : SPELL_AURA_PROC_FAILED; + } + } return SPELL_AURA_PROC_OK; } |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[11685][fix] Death Knight T9 Melee 2P Bonus | Den | Принятые патчи | 1 | 27.06.2011 15:34 |
[fix]Paladin T8 Protection 4p bonus | Den | Патчи на рассмотрении | 0 | 10.05.2011 19:36 |
[patch] Warrior T8 Melee Bonus | Den | Патчи на рассмотрении | 0 | 09.05.2011 11:48 |
[fix] Warrior T8 Melee 2P Bonus | Den | Патчи на рассмотрении | 0 | 09.05.2011 10:21 |
Реализация Death Knight T8 Melee 4P Bonus + упрощение расчетов бонусов от болезней ДК | Warlord123 | Патчи на рассмотрении | 0 | 22.10.2010 19:01 |