aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-05-17 16:37:03 -0500
committermegamage <none@none>2009-05-17 16:37:03 -0500
commitc75e3d526b6f75911214df10eaeba49d57c51216 (patch)
tree67a25ba187f8b2a621cf36917ab0cd6f627c5784 /src
parent424391d7c4175b7baec814e00559a393d7ff1ba1 (diff)
*Update Naxx script. Let boss evade if they are pulled out of room.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp75
-rw-r--r--src/bindings/scripts/include/sc_creature.h32
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp15
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp54
-rw-r--r--src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp4
-rw-r--r--src/game/InstanceData.cpp26
-rw-r--r--src/game/InstanceData.h27
17 files changed, 176 insertions, 101 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index c1edc567457..6ab54b95428 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -84,29 +84,13 @@ ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature), m_creature(cr
HeroicMode = m_creature->GetMap()->IsHeroic();
}
-void ScriptedAI::AttackStart(Unit* who, bool melee)
+void ScriptedAI::AttackStartNoMove(Unit* who)
{
if (!who)
return;
- if (m_creature->Attack(who, melee))
- {
- if(melee)
- DoStartMovement(who);
- else
- DoStartNoMovement(who);
- }
-}
-
-void ScriptedAI::AttackStart(Unit* who)
-{
- if (!who)
- return;
-
- if (m_creature->Attack(who, true))
- {
- DoStartMovement(who);
- }
+ if(m_creature->Attack(who, false))
+ DoStartNoMovement(who);
}
void ScriptedAI::UpdateAI(const uint32 diff)
@@ -650,6 +634,12 @@ void Scripted_NoMovementAI::AttackStart(Unit* who)
}
}
+BossAI::BossAI(Creature *c, uint32 id) : ScriptedAI(c)
+, bossId(id), summons(me), instance(c->GetInstanceData())
+, boundary(instance ? instance->GetBossBoundary(id) : NULL)
+{
+}
+
void BossAI::_Reset()
{
events.Reset();
@@ -673,6 +663,53 @@ void BossAI::_EnterCombat()
instance->SetBossState(bossId, IN_PROGRESS);
}
+bool BossAI::CheckBoundary(Unit *who)
+{
+ if(!boundary || !who)
+ return true;
+
+ for(BossBoundaryMap::const_iterator itr = boundary->begin(); itr != boundary->end(); ++itr)
+ {
+ switch(itr->first)
+ {
+ case BOUNDARY_N:
+ if(me->GetPositionX() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_S:
+ if(me->GetPositionX() < itr->second)
+ return false;
+ break;
+ case BOUNDARY_E:
+ if(me->GetPositionY() < itr->second)
+ return false;
+ break;
+ case BOUNDARY_W:
+ if(me->GetPositionY() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_NW:
+ if(me->GetPositionX() + me->GetPositionY() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_SE:
+ if(me->GetPositionX() + me->GetPositionY() < itr->second)
+ return false;
+ break;
+ case BOUNDARY_NE:
+ if(me->GetPositionX() - me->GetPositionY() > itr->second)
+ return false;
+ break;
+ case BOUNDARY_SW:
+ if(me->GetPositionX() - me->GetPositionY() < itr->second)
+ return false;
+ break;
+ }
+ }
+
+ return true;
+}
+
void BossAI::JustSummoned(Creature *summon)
{
summons.Summon(summon);
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index 80016619e8b..dc1b8f6144f 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -11,6 +11,7 @@
#include "Creature.h"
#include "CreatureAI.h"
#include "CreatureAIImpl.h"
+#include "InstanceData.h"
class ScriptedInstance;
@@ -55,9 +56,7 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
//CreatureAI Functions
//*************
- //Called at each attack of m_creature by any victim
- void AttackStart(Unit *);
- void AttackStart(Unit *, bool melee);
+ void AttackStartNoMove(Unit *target);
// Called at any Damage from any attacker (before damage apply)
void DamageTaken(Unit *done_by, uint32 &damage) {}
@@ -204,27 +203,36 @@ struct TRINITY_DLL_DECL Scripted_NoMovementAI : public ScriptedAI
struct TRINITY_DLL_DECL BossAI : public ScriptedAI
{
- BossAI(Creature *c, uint32 id) : ScriptedAI(c), bossId(id)
- , summons(me), instance(c->GetInstanceData())
- {}
+ BossAI(Creature *c, uint32 id);
- uint32 bossId;
+ const uint32 bossId;
EventMap events;
SummonList summons;
- InstanceData *instance;
+ InstanceData * const instance;
+ const BossBoundaryMap * const boundary;
void JustSummoned(Creature *summon);
void SummonedCreatureDespawn(Creature *summon);
void UpdateAI(const uint32 diff) = 0;
- void _Reset();
- void _EnterCombat();
- void _JustDied();
-
void Reset() { _Reset(); }
void EnterCombat(Unit *who) { _EnterCombat(); }
void JustDied(Unit *killer) { _JustDied(); }
+
+ protected:
+ void _Reset();
+ void _EnterCombat();
+ void _JustDied();
+
+ bool CheckInRoom()
+ {
+ if(CheckBoundary(me))
+ return true;
+ EnterEvadeMode();
+ return false;
+ }
+ bool CheckBoundary(Unit *who);
};
#endif
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index 68431cb81ee..855dd7f0d05 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -441,9 +441,9 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
return;
if(Phase == PHASE_FLIGHT || Phase == PHASE_DEMON)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void MoveInLineOfSight(Unit *who) {}
@@ -1415,16 +1415,16 @@ struct TRINITY_DLL_DECL boss_maievAI : public ScriptedAI
return;
if(Phase == PHASE_TALK_SEQUENCE)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else if(Phase == PHASE_DEMON || Phase == PHASE_TRANSFORM_SEQUENCE )
{
GETUNIT(Illidan, IllidanGUID);
if(Illidan && m_creature->IsWithinDistInMap(Illidan, 25))
BlinkToPlayer();//Do not let dread aura hurt her.
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
}
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void DoAction(const int32 param)
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
index bb7e1a2c29e..46e08c40432 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
@@ -339,7 +339,7 @@ struct TRINITY_DLL_DECL boss_vazruden_the_heraldAI : public ScriptedAI
summoned->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
summoned->SetSpeed(MOVE_FLIGHT, 2.5);
if(victim)
- ((ScriptedAI*)summoned->AI())->AttackStart(victim,false);
+ AttackStartNoMove(victim);
}
else if(victim)
summoned->AI()->AttackStart(victim);
@@ -349,7 +349,7 @@ struct TRINITY_DLL_DECL boss_vazruden_the_heraldAI : public ScriptedAI
{
if(sentryDown)
{
- AttackStart(killer, false);
+ AttackStartNoMove(killer);
sentryDown = false;
}
else
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
index c675c8d7c27..476141dfa57 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
@@ -77,7 +77,7 @@ struct TRINITY_DLL_DECL boss_anubrekhanAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ if(!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
index 7ac92252383..3e44b1c1f6e 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
@@ -99,7 +99,7 @@ struct TRINITY_DLL_DECL boss_gluthAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictimWithGaze())
+ if(!UpdateVictimWithGaze() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
index 90b82679c68..dad6fc9e0ee 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
@@ -202,7 +202,7 @@ struct TRINITY_DLL_DECL boss_gothikAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictimByReact())
+ if(!UpdateVictimByReact() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
index 0302a93c488..06fdec15206 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
@@ -95,7 +95,7 @@ struct TRINITY_DLL_DECL boss_heiganAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ if(!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
index 1f7b1a55daa..3299ab85c42 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
@@ -128,19 +128,8 @@ struct TRINITY_DLL_DECL boss_nothAI : public BossAI
void UpdateAI(const uint32 diff)
{
- if(me->HasReactState(REACT_AGGRESSIVE)) // ground
- {
- if(!UpdateVictim())
- return;
- }
- else // balcony
- {
- if(me->getThreatManager().isThreatListEmpty()) // if no enemy, go back at once
- {
- events.Reset();
- events.ScheduleEvent(EVENT_GROUND, 0);
- }
- }
+ if(!UpdateVictimByReact() || !CheckInRoom())
+ return;
events.Update(diff);
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
index 71259df7824..dce3c974f47 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
@@ -171,13 +171,13 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public BossAI
if(!phase)
return;
+ if(!UpdateVictimByReact() || !CheckInRoom())
+ return;
+
events.Update(diff);
if(phase == PHASE_GROUND)
{
- if(!UpdateVictim())
- return;
-
while(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
@@ -224,12 +224,6 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public BossAI
}
else
{
- /*if(me->getThreatManager().isThreatListEmpty())
- {
- EnterEvadeMode();
- return;
- }*/
-
if(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
index 92f6180045a..d9a2c80064d 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
@@ -19,29 +19,29 @@
const DoorData doorData[] =
{
- {181126, BOSS_ANUBREKHAN,DOOR_TYPE_ROOM},
- {181195, BOSS_ANUBREKHAN,DOOR_TYPE_PASSAGE},
- {194022, BOSS_FAERLINA, DOOR_TYPE_PASSAGE},
- {181209, BOSS_FAERLINA, DOOR_TYPE_PASSAGE},
- {181209, BOSS_MAEXXNA, DOOR_TYPE_ROOM},
- {181200, BOSS_NOTH, DOOR_TYPE_ROOM},
- {181201, BOSS_NOTH, DOOR_TYPE_PASSAGE},
- {181202, BOSS_NOTH, DOOR_TYPE_PASSAGE},
- {181202, BOSS_HEIGAN, DOOR_TYPE_ROOM},
- {181203, BOSS_HEIGAN, DOOR_TYPE_PASSAGE},
- {181241, BOSS_HEIGAN, DOOR_TYPE_PASSAGE},
- {181241, BOSS_LOATHEB, DOOR_TYPE_ROOM},
- {181123, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE},
- {181123, BOSS_GROBBULUS, DOOR_TYPE_ROOM},
- {181120, BOSS_GLUTH, DOOR_TYPE_PASSAGE},
- {181121, BOSS_GLUTH, DOOR_TYPE_PASSAGE},
- {181121, BOSS_THADDIUS, DOOR_TYPE_ROOM},
- {181124, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE},
- {181124, BOSS_GOTHIK, DOOR_TYPE_ROOM},
- {181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE},
- {181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE},
- {181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM},
- {0, 0, DOOR_TYPE_ROOM}, // EOF
+ {181126, BOSS_ANUBREKHAN,DOOR_TYPE_ROOM, BOUNDARY_S},
+ {181195, BOSS_ANUBREKHAN,DOOR_TYPE_PASSAGE, 0},
+ {194022, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, 0},
+ {181209, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, 0},
+ {181209, BOSS_MAEXXNA, DOOR_TYPE_ROOM, BOUNDARY_SW},
+ {181200, BOSS_NOTH, DOOR_TYPE_ROOM, BOUNDARY_N},
+ {181201, BOSS_NOTH, DOOR_TYPE_PASSAGE, BOUNDARY_E},
+ {181202, BOSS_NOTH, DOOR_TYPE_PASSAGE, 0},
+ {181202, BOSS_HEIGAN, DOOR_TYPE_ROOM, BOUNDARY_N},
+ {181203, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, BOUNDARY_E},
+ {181241, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, 0},
+ {181241, BOSS_LOATHEB, DOOR_TYPE_ROOM, BOUNDARY_W},
+ {181123, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE, 0},
+ {181123, BOSS_GROBBULUS, DOOR_TYPE_ROOM, 0},
+ {181120, BOSS_GLUTH, DOOR_TYPE_PASSAGE, BOUNDARY_NW},
+ {181121, BOSS_GLUTH, DOOR_TYPE_PASSAGE, 0},
+ {181121, BOSS_THADDIUS, DOOR_TYPE_ROOM, 0},
+ {181124, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE, 0},
+ {181124, BOSS_GOTHIK, DOOR_TYPE_ROOM, BOUNDARY_N},
+ {181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, BOUNDARY_S},
+ {181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, 0},
+ {181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE},
+ {0, 0, DOOR_TYPE_ROOM, 0}, // EOF
};
const MinionData minionData[] =
@@ -68,10 +68,10 @@ const float HeiganEruptionSlope[3] =
(-3637 - HeiganPos[1]) /(2771 - HeiganPos[0]),
};
-// 0 H O-->x
-// 1 |
-// 2 V
-// 3 y
+// 0 H x
+// 1 ^
+// 2 |
+// 3 y<--o
inline uint32 GetEruptionSection(float x, float y)
{
y -= HeiganPos[1];
diff --git a/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp b/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
index e346b9c25fc..fe57e99c035 100644
--- a/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
+++ b/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
@@ -94,7 +94,7 @@ bool GossipSelect_npc_raliq_the_drunk(Player *player, Creature *_Creature, uint3
{
player->CLOSE_GOSSIP_MENU();
_Creature->setFaction(FACTION_HOSTILE_RD);
- ((npc_raliq_the_drunkAI*)_Creature->AI())->AttackStart(player);
+ _Creature->AI()->AttackStart(player);
}
return true;
}
@@ -158,7 +158,7 @@ bool GossipHello_npc_salsalabim(Player *player, Creature *_Creature)
if( player->GetQuestStatus(QUEST_10004) == QUEST_STATUS_INCOMPLETE )
{
_Creature->setFaction(FACTION_HOSTILE_SA);
- ((npc_salsalabimAI*)_Creature->AI())->AttackStart(player);
+ _Creature->AI()->AttackStart(player);
}
else
{
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
index dfeb7fea3e6..5f1d92beaf1 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
@@ -150,9 +150,9 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
void AttackStart(Unit* who)
{
if(Phase1)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void DamageTaken(Unit* pKiller, uint32 &damage)
diff --git a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
index df3fe6dd0fe..6fdb4421b94 100644
--- a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
+++ b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
@@ -173,7 +173,7 @@ bool GossipSelect_npc_cooshcoosh(Player *player, Creature *_Creature, uint32 sen
{
player->CLOSE_GOSSIP_MENU();
_Creature->setFaction(FACTION_HOSTILE_CO);
- ((npc_cooshcooshAI*)_Creature->AI())->AttackStart(player);
+ _Creature->AI()->AttackStart(player);
}
return true;
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
index c58ff08c94e..c342b8283d5 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
@@ -258,9 +258,9 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
void AttackStart(Unit *who)
{
if(Phase == 2)
- ScriptedAI::AttackStart(who, false);
+ AttackStartNoMove(who);
else
- ScriptedAI::AttackStart(who, true);
+ ScriptedAI::AttackStart(who);
}
void DoMeleeAttackIfReady()
diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp
index 1eff6ba3efe..fcc708e274c 100644
--- a/src/game/InstanceData.cpp
+++ b/src/game/InstanceData.cpp
@@ -76,7 +76,7 @@ void InstanceData::LoadDoorData(const DoorData *data)
while(data->entry)
{
if(data->bossId < bosses.size())
- doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type)));
+ doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type, BoundaryType(data->boundary))));
++data;
}
@@ -143,7 +143,31 @@ void InstanceData::AddDoor(GameObject *door, bool add)
for(DoorInfoMap::iterator itr = lower; itr != upper; ++itr)
{
if(add)
+ {
itr->second.bossInfo->door[itr->second.type].insert(door);
+ switch(itr->second.boundary)
+ {
+ default:
+ case BOUNDARY_NONE:
+ break;
+ case BOUNDARY_N:
+ case BOUNDARY_S:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionX();
+ break;
+ case BOUNDARY_E:
+ case BOUNDARY_W:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionY();
+ break;
+ case BOUNDARY_NW:
+ case BOUNDARY_SE:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionX() + door->GetPositionY();
+ break;
+ case BOUNDARY_NE:
+ case BOUNDARY_SW:
+ itr->second.bossInfo->boundary[itr->second.boundary] = door->GetPositionX() - door->GetPositionY();
+ break;
+ }
+ }
else
itr->second.bossInfo->door[itr->second.type].erase(door);
}
diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h
index 9f7d4521fd1..43042a7f914 100644
--- a/src/game/InstanceData.h
+++ b/src/game/InstanceData.h
@@ -51,10 +51,30 @@ enum DoorType
MAX_DOOR_TYPES,
};
+enum BoundaryType
+{
+ BOUNDARY_NONE = 0,
+ BOUNDARY_N,
+ BOUNDARY_S,
+ BOUNDARY_E,
+ BOUNDARY_W,
+ BOUNDARY_NE,
+ BOUNDARY_NW,
+ BOUNDARY_SE,
+ BOUNDARY_SW,
+ BOUNDARY_MAX_X = BOUNDARY_N,
+ BOUNDARY_MIN_X = BOUNDARY_S,
+ BOUNDARY_MAX_Y = BOUNDARY_W,
+ BOUNDARY_MIN_Y = BOUNDARY_E,
+};
+
+typedef std::map<BoundaryType, float> BossBoundaryMap;
+
struct DoorData
{
uint32 entry, bossId;
DoorType type;
+ uint32 boundary;
};
struct MinionData
@@ -68,14 +88,16 @@ struct BossInfo
EncounterState state;
DoorSet door[MAX_DOOR_TYPES];
MinionSet minion;
+ BossBoundaryMap boundary;
};
struct DoorInfo
{
- explicit DoorInfo(BossInfo *_bossInfo, DoorType _type)
- : bossInfo(_bossInfo), type(_type) {}
+ explicit DoorInfo(BossInfo *_bossInfo, DoorType _type, BoundaryType _boundary)
+ : bossInfo(_bossInfo), type(_type), boundary(_boundary) {}
BossInfo *bossInfo;
DoorType type;
+ BoundaryType boundary;
};
struct MinionInfo
@@ -137,6 +159,7 @@ class TRINITY_DLL_SPEC InstanceData
void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL);
virtual void SetBossState(uint32 id, EncounterState state);
+ const BossBoundaryMap * GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; }
protected:
void SetBossNumber(uint32 number) { bosses.resize(number); }
void LoadDoorData(const DoorData *data);