diff options
Diffstat (limited to 'src/bindings/scripts/include')
| -rw-r--r-- | src/bindings/scripts/include/sc_creature.cpp | 48 | ||||
| -rw-r--r-- | src/bindings/scripts/include/sc_creature.h | 5 |
2 files changed, 52 insertions, 1 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp index 0ed59db42bf..5edc67f7120 100644 --- a/src/bindings/scripts/include/sc_creature.cpp +++ b/src/bindings/scripts/include/sc_creature.cpp @@ -79,7 +79,7 @@ void SummonList::DespawnAll() } } -ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature), m_creature(creature), IsFleeing(false), CombatMovement(true) +ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature), m_creature(creature), IsFleeing(false), CombatMovement(true), m_uiEvadeCheckCooldown(2500) { HeroicMode = m_creature->GetMap()->IsHeroic(); } @@ -577,6 +577,52 @@ void ScriptedAI::SetCombatMovement(bool CombatMove) CombatMovement = CombatMove; } +// Hacklike storage used for misc creatures that are expected to evade of outside of a certain area. +// It is assumed the information is found elswehere and can be handled by mangos. So far no luck finding such information/way to extract it. +bool ScriptedAI::EnterEvadeIfOutOfCombatArea(const uint32 uiDiff) +{ + if (m_uiEvadeCheckCooldown < uiDiff) + m_uiEvadeCheckCooldown = 2500; + else + { + m_uiEvadeCheckCooldown -= uiDiff; + return false; + } + + if (m_creature->IsInEvadeMode() || !m_creature->getVictim()) + return false; + + float fX = m_creature->GetPositionX(); + float fY = m_creature->GetPositionY(); + float fZ = m_creature->GetPositionZ(); + + switch(m_creature->GetEntry()) + { + case 12017: // broodlord (not move down stairs) + if (fZ > 448.60f) + return false; + break; + case 19516: // void reaver (calculate from center of room) + if (m_creature->GetDistance2d(432.59f, 371.93f) < 105.0f) + return false; + break; + case 23578: // jan'alai (calculate by Z) + if (fZ > 12.0f) + return false; + break; + case 28860: // sartharion (calculate box) + if (fX > 3218.86f && fX < 3275.69f && fY > 572.40f && fY < 484.68f) + return false; + break; + default: + error_log("TSCR: EnterEvadeIfOutOfCombatArea used for creature entry %u, but does not have any definition.", m_creature->GetEntry()); + return false; + } + + EnterEvadeMode(); + return true; +} + /*void Scripted_NoMovementAI::MoveInLineOfSight(Unit *who) { if( !m_creature->getVictim() && m_creature->canAttack(who) && ( m_creature->IsHostileTo( who )) && who->isInAccessiblePlaceFor(m_creature) ) diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h index e4142780443..b4328f2fd66 100644 --- a/src/bindings/scripts/include/sc_creature.h +++ b/src/bindings/scripts/include/sc_creature.h @@ -191,9 +191,14 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI void SetEquipmentSlots(bool bLoadDefault, int32 uiMainHand = EQUIP_NO_CHANGE, int32 uiOffHand = EQUIP_NO_CHANGE, int32 uiRanged = EQUIP_NO_CHANGE); void SetCombatMovement(bool CombatMove); + + bool EnterEvadeIfOutOfCombatArea(const uint32 uiDiff); protected: bool CombatMovement; + + private: + uint32 m_uiEvadeCheckCooldown; }; struct TRINITY_DLL_DECL Scripted_NoMovementAI : public ScriptedAI |
