All pastes #989392 Raw Edit

Miscellany

public text v1 · immutable
#989392 ·published 2008-04-19 09:08 UTC
rendered paste body
Index: game/Spell.cpp
===================================================================
--- game/Spell.cpp	(revision 5663)
+++ game/Spell.cpp	(working copy)
@@ -3880,15 +3880,60 @@
             return SPELL_FAILED_OUT_OF_RANGE;               //0x5A;
         if(dist < min_range * min_range)
             return SPELL_FAILED_TOO_CLOSE;
-        if( !m_IsTriggeredSpell && !m_caster->isInFront( target, max_range) )
+        if( !m_IsTriggeredSpell && !IsPositiveSpell(m_spellInfo->Id) && !m_caster->isInFront( target, max_range) )
         {
-            if (m_rangedShoot)
+
+			// Spell-Family Related Checks
+			switch (m_spellInfo->SpellFamilyName)
+            {
+                case SPELLFAMILY_PRIEST:
+                {
+				    // Shadow Word: Death, castable without facing
+				    if (m_spellInfo->SpellFamilyFlags & 0x200000000LL)
+					    return 0;
+				    break;
+                }
+                case SPELLFAMILY_PALADIN:
+                {
+				    // Holy Shock, require facing
+				    if (m_spellInfo->SpellFamilyFlags & 0x200000LL)
+					    return SPELL_FAILED_UNIT_NOT_INFRONT;
+				    break;
+                }
+                case SPELLFAMILY_WARRIOR:
+                {
+				    // Charge, require facing
+				    if (m_spellInfo->SpellFamilyFlags & 1)
+					    return SPELL_FAILED_UNIT_NOT_INFRONT;
+				    break;
+                }
+            }
+
+            // Ranged Weapon
+            if (m_spellInfo->Attributes & 2)
                 return SPELL_FAILED_UNIT_NOT_INFRONT;
 
-            uint32 original_casttime = GetSpellCastTime(sCastTimesStore.LookupEntry(m_spellInfo->CastingTimeIndex));
+            // Melee Combat
+			if (m_spellInfo->rangeIndex == 2)
+                return SPELL_FAILED_UNIT_NOT_INFRONT;
 
-            if (original_casttime!= 0 && !IsPositiveSpell(m_spellInfo->Id) && !IsSingleTargetSpell(m_spellInfo))
+            // Missile Effect
+			if (m_spellInfo->speed > 0)
                 return SPELL_FAILED_UNIT_NOT_INFRONT;
+
+            // Channeled Spells need facing
+			if (IsChanneledSpell(m_spellInfo))
+                return SPELL_FAILED_UNIT_NOT_INFRONT;
+
+            // Direct Damage and charge effects
+			for (uint8 i=0;i<3;++i)
+            {
+				if (m_spellInfo->Effect[i] == SPELL_EFFECT_SCHOOL_DAMAGE ||
+					m_spellInfo->Effect[i] == SPELL_EFFECT_POWER_BURN ||
+					m_spellInfo->Effect[i] == SPELL_EFFECT_HEALTH_LEECH ||
+					m_spellInfo->Effect[i] == SPELL_EFFECT_CHARGE)
+                return SPELL_FAILED_UNIT_NOT_INFRONT;
+            }
         }
     }