Ru-MaNGOS

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

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

Патчи на рассмотрении Рассматриваемые к принятию патчи

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.10.2010, 19:01   #1
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию Реализация 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); }
Вложения
Тип файла: patch T8.patch (7.4 Кб, 3 просмотров)
Warlord123 вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Den (24.10.2010), PSZ (24.10.2010)
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[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


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


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