diff options
author | megamage <none@none> | 2009-05-16 14:49:30 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-05-16 14:49:30 -0500 |
commit | 819326f2863aa6ce0d4ada9e21ae9134eb4ea06a (patch) | |
tree | 682545ca1d3bde25145b19ba093732e08f39d317 /src | |
parent | bb6e0dba89e01b59854750b2b84624dc8653295e (diff) |
*Update some instance script functions.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/CreatureAI.cpp | 22 | ||||
-rw-r--r-- | src/game/CreatureAI.h | 1 | ||||
-rw-r--r-- | src/game/InstanceData.cpp | 47 | ||||
-rw-r--r-- | src/game/InstanceData.h | 35 |
4 files changed, 96 insertions, 9 deletions
diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp index 67458f5a157..350e9d7ee13 100644 --- a/src/game/CreatureAI.cpp +++ b/src/game/CreatureAI.cpp @@ -51,7 +51,7 @@ void CreatureAI::DoZoneInCombat(Creature* creature) if(!creature->HasReactState(REACT_PASSIVE) && !creature->getVictim()) { - if(Unit *target = creature->SelectNearestTarget()) + if(Unit *target = creature->SelectNearestTarget(50)) creature->AI()->AttackStart(target); else if(creature->isSummon()) { @@ -97,6 +97,26 @@ void CreatureAI::MoveInLineOfSight(Unit *who) AttackStart(who->getVictim()); } +bool CreatureAI::UpdateVictimByReact() +{ + if(!me->isInCombat()) + return false; + + if(me->HasReactState(REACT_AGGRESSIVE)) + { + if(Unit *victim = me->SelectVictim()) + AttackStart(victim); + return me->getVictim(); + } + else if(me->getThreatManager().isThreatListEmpty()) + { + EnterEvadeMode(); + return false; + } + + return true; +} + bool CreatureAI::UpdateVictim() { if(!me->isInCombat()) diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h index c46dd2a54f2..8ebcb3eb5d8 100644 --- a/src/game/CreatureAI.h +++ b/src/game/CreatureAI.h @@ -82,6 +82,7 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI Creature * const m_creature; bool UpdateVictim(); + bool UpdateVictimByReact(); public: explicit CreatureAI(Creature *c) : UnitAI((Unit*)c), me(c), m_creature(c) {} diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp index 96c10f7b85c..1eff6ba3efe 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -23,6 +23,7 @@ #include "Map.h" #include "GameObject.h" #include "Creature.h" +#include "CreatureAI.h" void InstanceData::SaveToDB() { @@ -58,6 +59,18 @@ void InstanceData::OnCreatureCreate(Creature *creature, bool add) OnCreatureCreate(creature, creature->GetEntry()); } +void InstanceData::LoadMinionData(const MinionData *data) +{ + while(data->entry) + { + if(data->bossId < bosses.size()) + minions.insert(std::make_pair(data->entry, MinionInfo(&bosses[data->bossId]))); + + ++data; + } + sLog.outDebug("InstanceData::LoadMinionData: %u minions loaded.", doors.size()); +} + void InstanceData::LoadDoorData(const DoorData *data) { while(data->entry) @@ -70,6 +83,25 @@ void InstanceData::LoadDoorData(const DoorData *data) sLog.outDebug("InstanceData::LoadDoorData: %u doors loaded.", doors.size()); } +void InstanceData::UpdateMinionState(Creature *minion, EncounterState state) +{ + switch(state) + { + case NOT_STARTED: + if(!minion->isAlive()) + minion->Respawn(); + else if(minion->isInCombat()) + minion->AI()->EnterEvadeMode(); + break; + case IN_PROGRESS: + if(!minion->isAlive()) + minion->Respawn(); + else if(!minion->getVictim()) + minion->AI()->DoZoneInCombat(); + break; + } +} + void InstanceData::UpdateDoorState(GameObject *door) { DoorInfoMap::iterator lower = doors.lower_bound(door->GetEntry()); @@ -120,6 +152,18 @@ void InstanceData::AddDoor(GameObject *door, bool add) UpdateDoorState(door); } +void InstanceData::AddMinion(Creature *minion, bool add) +{ + MinionInfoMap::iterator itr = minions.find(minion->GetEntry()); + if(itr == minions.end()) + return; + + if(add) + itr->second.bossInfo->minion.insert(minion); + else + itr->second.bossInfo->minion.erase(minion); +} + void InstanceData::SetBossState(uint32 id, EncounterState state) { if(id < bosses.size()) @@ -138,6 +182,9 @@ void InstanceData::SetBossState(uint32 id, EncounterState state) for(uint32 type = 0; type < MAX_DOOR_TYPES; ++type) for(DoorSet::iterator i = bossInfo->door[type].begin(); i != bossInfo->door[type].end(); ++i) UpdateDoorState(*i); + + for(MinionSet::iterator i = bossInfo->minion.begin(); i != bossInfo->minion.end(); ++i) + UpdateMinionState(*i, state); } } diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index 91f589384a0..9f7d4521fd1 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -31,6 +31,9 @@ class Player; class GameObject; class Creature; +typedef std::set<GameObject*> DoorSet; +typedef std::set<Creature*> MinionSet; + enum EncounterState { NOT_STARTED = 0, @@ -41,8 +44,6 @@ enum EncounterState TO_BE_DECIDED = 5, }; -typedef std::set<GameObject*> DoorSet; - enum DoorType { DOOR_TYPE_ROOM = 0, @@ -50,11 +51,23 @@ enum DoorType MAX_DOOR_TYPES, }; +struct DoorData +{ + uint32 entry, bossId; + DoorType type; +}; + +struct MinionData +{ + uint32 entry, bossId; +}; + struct BossInfo { BossInfo() : state(TO_BE_DECIDED) {} EncounterState state; DoorSet door[MAX_DOOR_TYPES]; + MinionSet minion; }; struct DoorInfo @@ -65,14 +78,15 @@ struct DoorInfo DoorType type; }; -typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap; - -struct DoorData +struct MinionInfo { - uint32 entry, bossId; - DoorType type; + explicit MinionInfo(BossInfo *_bossInfo) : bossInfo(_bossInfo) {} + BossInfo *bossInfo; }; +typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap; +typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap; + class TRINITY_DLL_SPEC InstanceData { public: @@ -124,17 +138,22 @@ class TRINITY_DLL_SPEC InstanceData virtual void SetBossState(uint32 id, EncounterState state); protected: + void SetBossNumber(uint32 number) { bosses.resize(number); } void LoadDoorData(const DoorData *data); + void LoadMinionData(const MinionData *data); - void SetBossNumber(uint32 number) { bosses.resize(number); } void AddDoor(GameObject *door, bool add); + void AddMinion(Creature *minion, bool add); + void UpdateDoorState(GameObject *door); + void UpdateMinionState(Creature *minion, EncounterState state); std::string LoadBossState(const char * data); std::string GetBossSaveData(); private: std::vector<BossInfo> bosses; DoorInfoMap doors; + MinionInfoMap minions; virtual void OnObjectCreate(GameObject *) {} virtual void OnCreatureCreate(Creature *, uint32 entry) {} |