Ru-MaNGOS

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

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

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.11.2010, 13:28   #1
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию [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;
 }
Вложения
Тип файла: patch warior T10 4P bonus.patch (7.3 Кб, 2 просмотров)
Warlord123 вне форума  
2 пользователя(ей) сказали cпасибо:
Den (16.12.2010), Vladimir (24.06.2011)
Старый 29.05.2011, 13:45   #2
Den
Ученый
 
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
Den Скоро придёт к известностиDen Скоро придёт к известности
По умолчанию

По части Warrior T10 Protection 4P Bonus:
Обновлен вариант Warlord123


И есть еще мой вариант, скорее не правильный:


Может и не верно сунуть это в HandleSpellSpecificBoosts.
Вариант Warlord123 кажется правильнее.
По части Warrior T10 Melee 4P Bonus уже принято, это что бы не запутаться.
Den вне форума  
Пользователь сказал cпасибо:
Vladimir (24.06.2011)
Старый 24.06.2011, 04:54   #3
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

В [11666]. Спасибо!
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
 


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

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


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


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


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