Показать сообщение отдельно
Старый 22.04.2010, 11:34   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию [patch/dev] Deterrence

Я уже как-то занимался данным спеллом, но старый вариант моего патча стал некорректен из-за изменений в механике работы этого спелла.
то что было реализовано:
1. deflect не должен срабатывать на дальние атаки, вместо этого используется SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
2. должен также триггерить 67801, который реализует п.1.
3. вражеские спеллы должны отражаться с любой стороны
4. спеллы не должны заменять друг друга
5. с этой способностью должны парироваться атаки с тыла
6. спелл должен отражать даже _уже_ выпущенные в охотника заклинания
Код:
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 7ff69a9..888237f 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1089,6 +1089,16 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
         return;
     }
 
+    // Recheck deflection (only for delayed spells)
+    if (m_spellInfo->speed && unit->HasAura(19263))
+    {
+        if (realCaster)
+            realCaster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_DEFLECT);
+
+        ResetEffectDamageAndHeal();
+        return;
+    }
+
     if (unit->GetTypeId() == TYPEID_PLAYER)
     {
         ((Player*)unit)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id);
@@ -2784,6 +2794,13 @@ void Spell::cast(bool skipCheck)
                 AddTriggeredSpell(60089);
             break;
         }
+        case SPELLFAMILY_HUNTER:
+        {
+            // Deterrence
+            if (m_spellInfo->Id == 19263)
+                AddTriggeredSpell(67801);
+            break;
+        }
         case SPELLFAMILY_ROGUE:
             // Fan of Knives (main hand)
             if (m_spellInfo->Id == 51723 && m_caster->GetTypeId() == TYPEID_PLAYER &&
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 8a14904..62c76b7 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -1728,6 +1728,10 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2) cons
                     (spellInfo_2->SpellFamilyFlags & UI64LIT(0x4)) && (spellInfo_1->SpellFamilyFlags & UI64LIT(0x00000004000)) )
                     return false;
 
+                // Deterrence
+                if( spellInfo_1->SpellIconID == 83 && spellInfo_2->SpellIconID == 83 )
+                    return false;
+
                 // Bestial Wrath
                 if( spellInfo_1->SpellIconID == 1680 && spellInfo_2->SpellIconID == 1680 )
                     return false;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 1e34f88..1424a56 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -2562,7 +2562,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
     // parry & block chances
 
     // check if attack comes from behind, nobody can parry or block if attacker is behind
-    if (!pVictim->HasInArc(M_PI_F,this))
+    if (!pVictim->HasInArc(M_PI_F,this) && !pVictim->HasAura(19263))
     {
         DEBUG_LOG ("RollMeleeOutcomeAgainst: attack came from behind.");
     }
@@ -2866,23 +2866,13 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell,
     bool canDodge = true;
     bool canParry = true;
 
-    // Same spells cannot be parry/dodge
+    // Some spells cannot be parry/dodge
     if (spell->Attributes & SPELL_ATTR_IMPOSSIBLE_DODGE_PARRY_BLOCK)
         return SPELL_MISS_NONE;
 
-    // Ranged attack cannot be parry/dodge only deflect
+    // Ranged attack cannot be parry/dodge only miss
     if (attType == RANGED_ATTACK)
-    {
-        // only if in front
-        if (pVictim->HasInArc(M_PI_F,this))
-        {
-            int32 deflect_chance = pVictim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS)*100;
-            tmp+=deflect_chance;
-            if (roll < tmp)
-                return SPELL_MISS_DEFLECT;
-        }
         return SPELL_MISS_NONE;
-    }
 
     // Check for attack from behind
     if (!pVictim->HasInArc(M_PI_F,this))
@@ -2891,7 +2881,8 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell,
         if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
             canDodge = false;
         // Can`t parry
-        canParry = false;
+        if (!pVictim->HasAura(19263))
+            canParry = false;
     }
     // Check creatures flags_extra for disable parry
     if(pVictim->GetTypeId()==TYPEID_UNIT)
@@ -3025,14 +3016,10 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell)
     if (rand < tmp)
         return SPELL_MISS_MISS;
 
-    // cast by caster in front of victim
-    if (pVictim->HasInArc(M_PI_F,this))
-    {
-        int32 deflect_chance = pVictim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS)*100;
-        tmp+=deflect_chance;
-        if (rand < tmp)
-            return SPELL_MISS_DEFLECT;
-    }
+    int32 deflect_chance = pVictim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS)*100;
+    tmp+=deflect_chance;
+    if (rand < tmp)
+        return SPELL_MISS_DEFLECT;
 
     return SPELL_MISS_NONE;
 }
Из недостатков:
1. Необходимо разобраться для чего нужна aura_288. Мы её не используем
2. Возможно не во всех случаях выдаются верные сообщения (судя по словам некоторых игроков с оффа в некоторых случаях пишет Уворот, хотя у нас выдает Отражение)
3. Также в п.6. реализованной части не проверяется наличие экспертизы у атакующего (а нужно ли?). Т.е. если вы уже выстрелили и охотник после этого включает Сдерживание, то он 100% отклонит вашу атаку, сколько бы у вас ни было экспертизы или прочей фигни.
4. Возможно не все спеллы (например АОЕ) должны отражаться

Последний раз редактировалось Insider42; 12.05.2010 в 11:44.
Insider42 вне форума   Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
Den (06.01.2011), Feel the Power (23.04.2010), PSZ (23.04.2010), YuruY (22.04.2010)