Skip to content

Instantly share code, notes, and snippets.

@Demonid
Created February 24, 2016 22:19
Show Gist options
  • Save Demonid/65f44ad217d1e92862d7 to your computer and use it in GitHub Desktop.
Save Demonid/65f44ad217d1e92862d7 to your computer and use it in GitHub Desktop.
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