Created
February 24, 2016 22:19
-
-
Save Demonid/65f44ad217d1e92862d7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp | |
index 5d62b74..8ee326a 100644 | |
--- a/src/server/game/Entities/Creature/Creature.cpp | |
+++ b/src/server/game/Entities/Creature/Creature.cpp | |
@@ -183,7 +183,8 @@ m_lootRecipient(), m_lootRecipientGroup(0), _skinner(), _pickpocketLootRestore(0 | |
m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), | |
m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), | |
m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), | |
-m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(NULL), m_creatureData(NULL), m_waypointID(0), m_path_id(0), m_formation(NULL) | |
+m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(NULL), m_creatureData(NULL), m_waypointID(0), m_path_id(0), m_formation(NULL), | |
+m_evadeDelay(15000), m_temporaryEvading(false), m_canEvadeCheckTime(0) | |
{ | |
m_regenTimer = CREATURE_REGEN_INTERVAL; | |
m_valuesCount = UNIT_END; | |
@@ -594,6 +595,33 @@ void Creature::Update(uint32 diff) | |
m_boundaryCheckTime -= diff; | |
} | |
+ // If can't reach target, delay the evade a little, to be sure it needs temporary evade | |
+ if (IsAIEnabled && IsInCombat() && m_canEvadeCheckTime) | |
+ { | |
+ if (diff >= m_canEvadeCheckTime) | |
+ { | |
+ AddUnitState(UNIT_STATE_EVADE); | |
+ m_temporaryEvading = true; | |
+ m_canEvadeCheckTime = 0; | |
+ } | |
+ else | |
+ m_canEvadeCheckTime -= diff; | |
+ } | |
+ | |
+ | |
+ // After entering temporary evade mode, if remains in it for 15seconds, then completely evades | |
+ if (IsAIEnabled && IsInTemporaryEvadeMode() && IsInCombat()) | |
+ { | |
+ if (diff >= m_evadeDelay) | |
+ { | |
+ SetCanTemporaryEvade(false); | |
+ AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_OTHER); | |
+ m_evadeDelay = 15000; | |
+ } | |
+ else | |
+ m_evadeDelay -= diff; | |
+ } | |
+ | |
// if periodic combat pulse is enabled and we are both in combat and in a dungeon, do this now | |
if (m_combatPulseDelay > 0 && IsInCombat() && GetMap()->IsDungeon()) | |
{ | |
@@ -757,6 +785,19 @@ void Creature::RegenerateHealth() | |
ModifyHealth(addvalue); | |
} | |
+void Creature::SetCanTemporaryEvade(uint32 active) | |
+{ | |
+ if (active) | |
+ m_canEvadeCheckTime = 3000; | |
+ else | |
+ { | |
+ ClearUnitState(UNIT_STATE_EVADE); | |
+ m_temporaryEvading = false; | |
+ m_canEvadeCheckTime = 0; | |
+ m_evadeDelay = 15000; | |
+ } | |
+} | |
+ | |
void Creature::DoFleeToGetAssistance() | |
{ | |
if (!GetVictim()) | |
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h | |
index 49bd854..8253a04 100644 | |
--- a/src/server/game/Entities/Creature/Creature.h | |
+++ b/src/server/game/Entities/Creature/Creature.h | |
@@ -474,7 +474,9 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject | |
uint8 getLevelForTarget(WorldObject const* target) const override; // overwrite Unit::getLevelForTarget for boss level support | |
- bool IsInEvadeMode() const { return HasUnitState(UNIT_STATE_EVADE); } | |
+ bool IsInEvadeMode() const { return HasUnitState(UNIT_STATE_EVADE) && !m_temporaryEvading; } | |
+ bool IsInTemporaryEvadeMode() const { return HasUnitState(UNIT_STATE_EVADE) && m_temporaryEvading; } | |
+ void SetCanTemporaryEvade(uint32 active); | |
bool AIM_Initialize(CreatureAI* ai = NULL); | |
void Motion_Initialize(); | |
@@ -705,6 +707,8 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject | |
uint32 m_boundaryCheckTime; // (msecs) remaining time for next evade boundary check | |
uint32 m_combatPulseTime; // (msecs) remaining time for next zone-in-combat pulse | |
uint32 m_combatPulseDelay; // (secs) how often the creature puts the entire zone in combat (only works in dungeons) | |
+ uint32 m_evadeDelay; | |
+ uint32 m_canEvadeCheckTime; | |
ReactStates m_reactState; // for AI, not charmInfo | |
void RegenerateMana(); | |
@@ -719,6 +723,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject | |
bool m_AlreadySearchedAssistance; | |
bool m_regenHealth; | |
bool m_AI_locked; | |
+ bool m_temporaryEvading; | |
SpellSchoolMask m_meleeDamageSchoolMask; | |
uint32 m_originalEntry; | |
diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp | |
index b595059..ffe4b1a 100644 | |
--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp | |
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp | |
@@ -197,7 +197,15 @@ template<class T> | |
void ChaseMovementGenerator<T>::_reachTarget(T* owner) | |
{ | |
if (owner->IsWithinMeleeRange(this->i_target.getTarget())) | |
+ { | |
+ if (owner->GetTypeId() == TYPEID_UNIT) | |
+ owner->ToCreature()->SetCanTemporaryEvadeMode(false); | |
owner->Attack(this->i_target.getTarget(), true); | |
+ } | |
+ else if(owner->GetTypeId() == TYPEID_UNIT) | |
+ { | |
+ owner->ToCreature()->SetCanTemporaryEvadeMode(true); | |
+ } | |
} | |
template<> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment