|
Патчи на рассмотрении Рассматриваемые к принятию патчи |
|
Опции темы | Поиск в этой теме | Опции просмотра |
22.10.2010, 19:01 | #1 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
|
Реализация Death Knight T8 Melee 4P Bonus + упрощение расчетов бонусов от болезней ДК
При расчетах бонусов от болезней DK в ядре используются 4 куска повторяющегося кода в различных местах программы.
При расчетах Glacier Rot (2 места ) не учитывалось, кем были наложены болезни. Выделил подсчет числа наложенных дебаффов в отдельную функцию класса Unit. Возможно, что вспомогательную фунцию надо не добавлять в класс, а сделать отдельную. Тогда возникает вопрос, в какой модуль лучше всего ее поместить? Добавил расчет для бонуса от заклинания www.wowhead.com/spell=64736. Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index c59658e..703bb51 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1073,20 +1073,15 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) // Scourge Strike, here because needs to use final damage in second part of the spell if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags & UI64LIT(0x0800000000000000)) { - uint32 count = 0; - Unit::SpellAuraHolderMap const& auras = unitTarget->GetSpellAuraHolderMap(); - for(Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) - { - if(itr->second->GetSpellProto()->Dispel == DISPEL_DISEASE && - itr->second->GetCasterGUID() == caster->GetGUID()) - ++count; - } - - if (count) + if ( uint32 count = unitTarget->HasDiseasesByCaster(caster)) { int32 bp = count * CalculateDamage(EFFECT_INDEX_2, unitTarget) * damageInfo.damage / 100; if (bp) + { + if (Aura* dummy=m_caster->GetDummyAura(64736)) // Death Knight T8 Melee 4P Bonus + bp*= (100+dummy->GetModifier()->m_amount) / 100.f; caster->CastCustomSpell(unitTarget, 70890, &bp, NULL, NULL, true); + } } } } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 48cdb23..5f0548a 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -2528,19 +2528,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) // Death Strike else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000000000000010)) { - uint32 count = 0; - Unit::SpellAuraHolderMap const& auras = unitTarget->GetSpellAuraHolderMap(); - for(Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) - { - if (itr->second->GetSpellProto()->Dispel == DISPEL_DISEASE && - itr->second->GetCasterGUID() == m_caster->GetGUID()) - { - ++count; - // max. 15% - if (count == 3) - break; - } - } + uint32 count = unitTarget->HasDiseasesByCaster(m_caster); int32 bp = int32(count * m_caster->GetMaxHealth() * m_spellInfo->DmgMultiplier[EFFECT_INDEX_0] / 100); @@ -5328,16 +5316,8 @@ void Spell::EffectWeaponDmg(SpellEffectIndex eff_idx) if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0002000001400000) || m_spellInfo->SpellIconID == 1736) { - uint32 count = 0; - Unit::SpellAuraHolderMap const& auras = unitTarget->GetSpellAuraHolderMap(); - for(Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) - { - if(itr->second->GetSpellProto()->Dispel == DISPEL_DISEASE && - itr->second->GetCasterGUID() == m_caster->GetGUID()) - ++count; - } - if (count) + if (uint32 count = unitTarget->HasDiseasesByCaster(m_caster)) { // Effect 1(for Blood-Caked Strike)/3(other) damage is bonus float bonus = count * CalculateDamage(m_spellInfo->SpellIconID == 1736 ? EFFECT_INDEX_0 : EFFECT_INDEX_2, unitTarget) / 100.0f; @@ -5346,6 +5326,13 @@ void Spell::EffectWeaponDmg(SpellEffectIndex eff_idx) m_spellInfo->SpellIconID == 1736) bonus /= 2.0f; + if (!(m_spellInfo->SpellIconID == 1736)) // Blood Strike, Heart Strike, Obliterate + { + if (Aura* dummy=m_caster->GetDummyAura(64736)) // Death Knight T8 Melee 4P Bonus + + bonus*=(1.f+dummy->GetModifier()->m_amount / 100.0f); + } + totalDamagePercentMod *= 1.0f + bonus; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 2614123..33cee86 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -479,6 +479,26 @@ bool Unit::HasAuraType(AuraType auraType) const return (!m_modAuras[auraType].empty()); } +uint32 Unit::HasDiseasesByCaster(const Unit *caster) const +{ + uint32 count = 0; + uint64 caster_guid=caster->GetGUID(); + + Unit::SpellAuraHolderMap const& auras = GetSpellAuraHolderMap(); + for(Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) + { + if (itr->second->GetSpellProto()->Dispel == DISPEL_DISEASE && + itr->second->GetCasterGUID() == caster_guid) + { + ++count; + // max. 3 diseases + if (count == 3) + break; + } + } + return count; +} + /* Called by DealDamage for auras that have a chance to be dispelled on damage taken. */ void Unit::RemoveSpellbyDamageTaken(AuraType auraType, uint32 damage) { @@ -6362,17 +6382,7 @@ uint32 Unit::SpellDamageBonusDone(Unit *pVictim, SpellEntry const *spellProto, u if (spellProto->SpellFamilyFlags & UI64LIT(0x0000000200000002)) { // search disease - bool found = false; - Unit::SpellAuraHolderMap const& auras = pVictim->GetSpellAuraHolderMap(); - for(Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) - { - if(itr->second->GetSpellProto()->Dispel == DISPEL_DISEASE) - { - found = true; - break; - } - } - if(!found) + if(pVictim->HasDiseasesByCaster(this)==0) break; // search for Glacier Rot dummy aura @@ -7258,18 +7268,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit *pVictim, uint32 pdamage,WeaponAttackType if (spellProto && spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && spellProto->SpellFamilyFlags & UI64LIT(0x0000000400000000)) { // search disease - bool found = false; - Unit::SpellAuraHolderMap const& auras = pVictim->GetSpellAuraHolderMap(); - for(Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr) - { - if(itr->second->GetSpellProto()->Dispel == DISPEL_DISEASE) - { - found = true; - break; - } - } - - if(found) + if(pVictim->HasDiseasesByCaster(this)!=0) { // search for Glacier Rot dummy aura Unit::AuraList const& dummyAuras = GetAurasByType(SPELL_AURA_DUMMY); diff --git a/src/game/Unit.h b/src/game/Unit.h index 9b7aeba..64aa046 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1406,6 +1406,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject } bool virtual HasSpell(uint32 /*spellID*/) const { return false; } + uint32 HasDiseasesByCaster(const Unit *caster) const; bool HasStealthAura() const { return HasAuraType(SPELL_AURA_MOD_STEALTH); } bool HasInvisibilityAura() const { return HasAuraType(SPELL_AURA_MOD_INVISIBILITY); } |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[11666][patch] Warrior T10 Melee\Protection 4P Bonus | Warlord123 | Принятые патчи | 2 | 24.06.2011 04:54 |
Реализация системы бонусов | Max Z. | Корзина | 3 | 24.05.2010 18:45 |
[9897] Avoid multiply AP bonus coeff. with spell power bonus. | newsbot | CMaNGOS Commits | 0 | 15.05.2010 10:20 |
[9874] Fix auras with custom periodic damage not entering spell/melee bonus damage done methods | newsbot | CMaNGOS Commits | 0 | 11.05.2010 22:30 |
[patch] Реализация бонуса к Death Coil от Sigil of the Vengeful Heart | Warlord123 | Патчи на рассмотрении | 0 | 15.03.2010 14:01 |