All pastes #677209 Raw Edit

Untitled

public text v1 · immutable
#677209 ·published 2007-08-31 20:05 UTC
rendered paste body
Index: src/game/Creature.cpp
===================================================================
--- src/game/Creature.cpp	(revision 4412)
+++ src/game/Creature.cpp	(working copy)
@@ -241,8 +241,10 @@
         {
             Unit::Update( diff );
             i_motionMaster.UpdateMotion(diff);
-            i_AI->UpdateAI(diff);
 
+            if(!IsInEvadeMode())
+                i_AI->UpdateAI(diff);
+
             if(m_regenTimer > 0)
             {
                 if(diff >= m_regenTimer)
@@ -1681,3 +1683,8 @@
     CreatureSpellCooldowns::const_iterator itr = m_CreatureSpellCooldowns.find(spell_id);
     return (itr != m_CreatureSpellCooldowns.end() && itr->second > time(NULL)) || m_GlobalCooldown > 0 || HasCategoryCooldown(spell_id);
 }
+
+bool Creature::IsInEvadeMode() const
+{
+    return !i_motionMaster.empty() && i_motionMaster.top()->GetMovementGeneratorType() == HOME_MOTION_TYPE;
+}
\ No newline at end of file
Index: src/game/Creature.h
===================================================================
--- src/game/Creature.h	(revision 4412)
+++ src/game/Creature.h	(working copy)
@@ -327,6 +327,8 @@
             return GetCreatureInfo()->rank == CREATURE_ELITE_WORLDBOSS;
         }
 
+        bool IsInEvadeMode() const;
+
         void AIM_Initialize();
         MotionMaster* operator->(void) { return &i_motionMaster; }
 
Index: src/game/GridNotifiersImpl.h
===================================================================
--- src/game/GridNotifiersImpl.h	(revision 4412)
+++ src/game/GridNotifiersImpl.h	(working copy)
@@ -72,7 +72,7 @@
     // Creature AI reaction
     if(!c->hasUnitState(UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING))
     {
-        if( c->AI() && c->AI()->IsVisible(pl) )
+        if( c->AI() && c->AI()->IsVisible(pl) && !c->IsInEvadeMode() )
             c->AI()->MoveInLineOfSight(pl);
     }
 }
@@ -81,13 +81,13 @@
 {
     if(!c1->hasUnitState(UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING))
     {
-        if( c1->AI() && c1->AI()->IsVisible(c2) )
+        if( c1->AI() && c1->AI()->IsVisible(c2) && !c1->IsInEvadeMode() )
             c1->AI()->MoveInLineOfSight(c2);
     }
 
     if(!c2->hasUnitState(UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING))
     {
-        if( c2->AI() && c2->AI()->IsVisible(c1) )
+        if( c2->AI() && c2->AI()->IsVisible(c1) && !c2->IsInEvadeMode() )
             c2->AI()->MoveInLineOfSight(c1);
     }
 }
@@ -142,6 +142,10 @@
     if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
         return;
 
+    // Evade target
+    if( target->GetTypeId()==TYPEID_UNIT && ((Creature*)target)->IsInEvadeMode() )
+        return;
+
     //Check player targets and remove if in GM mode or GM invisibility (for not self casting case)
     if( target->GetTypeId()==TYPEID_PLAYER && target != i_check && (((Player*)target)->isGameMaster() || ((Player*)target)->GetVisibility()==VISIBILITY_OFF) )
         return;
Index: src/game/MotionMaster.h
===================================================================
--- src/game/MotionMaster.h	(revision 4412)
+++ src/game/MotionMaster.h	(working copy)
@@ -34,6 +34,7 @@
         MovementGenerator* operator->(void) { return top(); }
 
         using std::stack<MovementGenerator *>::top;
+        using std::stack<MovementGenerator *>::empty;
 
         void UpdateMotion(const uint32 &diff);
 
Index: src/game/Spell.cpp
===================================================================
--- src/game/Spell.cpp	(revision 4413)
+++ src/game/Spell.cpp	(working copy)
@@ -454,6 +454,14 @@
                 continue;
             }
 
+            // Evade target
+            if( (*itr)->GetTypeId()==TYPEID_UNIT && ((Creature*)(*itr))->IsInEvadeMode() )
+            {
+                m_caster->SendAttackStateUpdate(HITINFO_RESIST|HITINFO_SWINGNOHITSOUND, (*itr), 1, SpellSchools(m_spellInfo->School), 0, 0,0,VICTIMSTATE_EVADES,0);
+                itr = tmpUnitMap.erase(itr);
+                continue;
+            }
+
             //Check player targets and remove if in GM mode or GM invisibility (for not self casting case)
             if( (*itr) != m_caster && (*itr)->GetTypeId()==TYPEID_PLAYER)
             {
Index: src/game/Unit.cpp
===================================================================
--- src/game/Unit.cpp	(revision 4419)
+++ src/game/Unit.cpp	(working copy)
@@ -391,7 +391,8 @@
 
 void Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchools damageSchool, SpellEntry const *spellProto, uint32 procFlag, bool durabilityLoss)
 {
-    if (!pVictim->isAlive() || pVictim->isInFlight()) return;
+    if (!pVictim->isAlive() || pVictim->isInFlight() || pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
+        return;
 
     //You don't lose health from damage taken from another player while in a sanctuary
     //You still see it in the combat log though
@@ -1097,7 +1098,7 @@
         case SPELL_SCHOOL_ARCANE:
 
             //Spell miss (sends resist message)
-            if(SpellMissChanceCalc(pVictim) > urand(0,10000))
+            if( SpellMissChanceCalc(pVictim) > urand(0,10000) )
             {
                 cleanDamage->damage = 0;
                 *damage = 0;
@@ -2029,6 +2030,9 @@
 
 MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 hit_chance) const
 {
+    if(pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
+        return MELEE_HIT_MISS;
+
     int32 skillDiff =  GetWeaponSkillValue(attType) - pVictim->GetDefenseSkillValue();
     // bonus from skills is 0.04%
     int32    skillBonus = skillDiff * 4;
@@ -4407,8 +4411,16 @@
         return false;
 
     // anyone don't must attack GM in GM-mode
-    if(victim->GetTypeId()==TYPEID_PLAYER && ((Player*)victim)->isGameMaster())
-        return false;
+    if(victim->GetTypeId()==TYPEID_PLAYER)
+    {
+        if(((Player*)victim)->isGameMaster())
+            return false;
+    }
+    else
+    {
+        if(((Creature*)victim)->IsInEvadeMode())
+            return false;
+    }
 
     if (m_attacking)
     {