*Update instance script functions.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-05-11 03:17:13 -05:00
parent 4fef015112
commit f9f5d078fd
22 changed files with 83 additions and 56 deletions
+2 -2
View File
@@ -221,13 +221,13 @@ struct TRINITY_DLL_DECL NullCreatureAI : public ScriptedAI
struct TRINITY_DLL_DECL BossAI : public ScriptedAI struct TRINITY_DLL_DECL BossAI : public ScriptedAI
{ {
BossAI(Creature *c, uint32 id) : ScriptedAI(c), bossId(id) BossAI(Creature *c, uint32 id) : ScriptedAI(c), bossId(id)
, summons(me), instance((ScriptedInstance*)c->GetInstanceData()) , summons(me), instance(c->GetInstanceData())
{} {}
uint32 bossId; uint32 bossId;
EventMap events; EventMap events;
SummonList summons; SummonList summons;
ScriptedInstance *instance; InstanceData *instance;
void JustSummoned(Creature *summon); void JustSummoned(Creature *summon);
void SummonedCreatureDespawn(Creature *summon); void SummonedCreatureDespawn(Creature *summon);
@@ -17,20 +17,7 @@
class TRINITY_DLL_DECL ScriptedInstance : public InstanceData class TRINITY_DLL_DECL ScriptedInstance : public InstanceData
{ {
public: public:
ScriptedInstance(Map *map) : InstanceData(map) {} ScriptedInstance(Map *map) : InstanceData(map) {}
~ScriptedInstance() {}
//All-purpose data storage 64 bit
virtual uint64 GetData64(uint32 Data) { return 0; }
virtual void SetData64(uint32 Data, uint64 Value) { }
// Called every instance update
virtual void Update(uint32) {}
// Save and Load instance data to the database
const char* Save() { return NULL; }
void Load(const char* in) { }
}; };
#endif #endif
@@ -191,7 +191,7 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
return str_data.c_str(); return str_data.c_str();
} }
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
@@ -117,7 +117,7 @@ struct TRINITY_DLL_DECL instance_azjol_nerub : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
@@ -303,7 +303,7 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
return str_data.c_str(); return str_data.c_str();
} }
@@ -265,7 +265,7 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
return str_data.c_str(); return str_data.c_str();
} }
@@ -279,7 +279,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
}else debug_log("TSCR: Instance Hyjal: UpdateWorldState, but PlayerList is empty!"); }else debug_log("TSCR: Instance Hyjal: UpdateWorldState, but PlayerList is empty!");
} }
const char* Save() std::string GetSaveData()
{ {
return str_data.c_str(); return str_data.c_str();
} }
@@ -236,7 +236,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
} }
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
std::ostringstream stream; std::ostringstream stream;
@@ -209,7 +209,7 @@ struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
std::ostringstream stream; std::ostringstream stream;
@@ -144,7 +144,7 @@ struct TRINITY_DLL_DECL instance_gruuls_lair : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
std::ostringstream stream; std::ostringstream stream;
@@ -247,7 +247,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
} }
} }
const char* Save() std::string GetSaveData()
{ {
return str_data.c_str(); return str_data.c_str();
} }
@@ -77,9 +77,9 @@ inline uint32 GetEruptionSection(float x, float y)
return 3; return 3;
} }
struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance struct TRINITY_DLL_DECL instance_naxxramas : public InstanceData
{ {
instance_naxxramas(Map *map) : ScriptedInstance(map) instance_naxxramas(Map *map) : InstanceData(map)
, Sapphiron(NULL) , Sapphiron(NULL)
{ {
SetBossNumber(MAX_BOSS_NUMBER); SetBossNumber(MAX_BOSS_NUMBER);
@@ -88,12 +88,14 @@ struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance
std::set<GameObject*> HeiganEruption[4]; std::set<GameObject*> HeiganEruption[4];
Creature *Sapphiron; Creature *Sapphiron;
std::set<Creature*> Worshipper;
void OnCreatureCreate(Creature *creature, bool add) void OnCreatureCreate(Creature *creature, bool add)
{ {
switch(creature->GetEntry()) switch(creature->GetEntry())
{ {
case 15989: Sapphiron = add ? creature : NULL; break; case 15989: Sapphiron = add ? creature : NULL; break;
case 16506: if(add) Worshipper.insert(creature); else Worshipper.erase(creature); break;
} }
} }
@@ -117,6 +119,20 @@ struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance
AddDoor(go, add); AddDoor(go, add);
} }
void SetBossState(uint32 id, EncounterState state)
{
InstanceData::SetBossState(id, state);
switch(id)
{
case BOSS_FAERLINA:
if(state == NOT_STARTED)
for(std::set<Creature*>::iterator itr = Worshipper.begin(); itr != Worshipper.end(); ++itr)
if(!(*itr)->isAlive())
(*itr)->Respawn();
break;
}
}
void SetData(uint32 id, uint32 value) void SetData(uint32 id, uint32 value)
{ {
switch(id) switch(id)
@@ -185,7 +185,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
return str_data.c_str(); return str_data.c_str();
} }
@@ -236,7 +236,7 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
{ {
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
std::ostringstream stream; std::ostringstream stream;
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
std::ostringstream stream; std::ostringstream stream;
@@ -231,7 +231,7 @@ struct TRINITY_DLL_DECL instance_utgarde_keep : public ScriptedInstance
return 0; return 0;
} }
const char* Save() std::string GetSaveData()
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
@@ -179,7 +179,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
instance->SendToPlayers(&data); instance->SendToPlayers(&data);
} }
const char* Save() std::string GetSaveData()
{ {
std::ostringstream ss; std::ostringstream ss;
ss << "S " << BossKilled << " " << ChestLooted << " " << QuestMinute; ss << "S " << BossKilled << " " << ChestLooted << " " << QuestMinute;
+35 -6
View File
@@ -26,8 +26,9 @@
void InstanceData::SaveToDB() void InstanceData::SaveToDB()
{ {
if(!Save()) return; std::string data = GetSaveData();
std::string data = Save(); if(data.empty())
return;
CharacterDatabase.escape_string(data); CharacterDatabase.escape_string(data);
CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%d'", data.c_str(), instance->GetInstanceId()); CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%d'", data.c_str(), instance->GetInstanceId());
} }
@@ -124,13 +125,41 @@ void InstanceData::SetBossState(uint32 id, EncounterState state)
if(id < bosses.size()) if(id < bosses.size())
{ {
BossInfo *bossInfo = &bosses[id]; BossInfo *bossInfo = &bosses[id];
if(bossInfo->state == state) if(bossInfo->state == TO_BE_DECIDED) // loading
return; bossInfo->state = state;
else
bossInfo->state = state; {
if(bossInfo->state == state)
return;
bossInfo->state = state;
SaveToDB();
}
for(uint32 type = 0; type < MAX_DOOR_TYPES; ++type) for(uint32 type = 0; type < MAX_DOOR_TYPES; ++type)
for(DoorSet::iterator i = bossInfo->door[type].begin(); i != bossInfo->door[type].end(); ++i) for(DoorSet::iterator i = bossInfo->door[type].begin(); i != bossInfo->door[type].end(); ++i)
UpdateDoorState(*i); UpdateDoorState(*i);
} }
} }
std::string InstanceData::LoadBossState(const char * data)
{
if(!data) return NULL;
std::istringstream loadStream(data);
uint32 buff;
uint32 bossId = 0;
for(std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i, ++bossId)
{
loadStream >> buff;
if(buff < TO_BE_DECIDED)
SetBossState(bossId, (EncounterState)buff);
}
return loadStream.str();
}
std::string InstanceData::GetBossSaveData()
{
std::ostringstream saveStream;
for(std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i)
saveStream << (uint32)i->state << " ";
return saveStream.str();
}
+8 -13
View File
@@ -37,7 +37,8 @@ enum EncounterState
IN_PROGRESS = 1, IN_PROGRESS = 1,
FAIL = 2, FAIL = 2,
DONE = 3, DONE = 3,
SPECIAL = 4 SPECIAL = 4,
TO_BE_DECIDED = 5,
}; };
typedef std::set<GameObject*> DoorSet; typedef std::set<GameObject*> DoorSet;
@@ -51,7 +52,7 @@ enum DoorType
struct BossInfo struct BossInfo
{ {
BossInfo() : state(NOT_STARTED) {} BossInfo() : state(TO_BE_DECIDED) {}
EncounterState state; EncounterState state;
DoorSet door[MAX_DOOR_TYPES]; DoorSet door[MAX_DOOR_TYPES];
}; };
@@ -85,10 +86,10 @@ class TRINITY_DLL_SPEC InstanceData
virtual void Initialize() {} virtual void Initialize() {}
//On load //On load
virtual void Load(const char* /*data*/) {} virtual void Load(const char * data) { LoadBossState(data); }
//When save is needed, this function generates the data //When save is needed, this function generates the data
virtual const char* Save() { return ""; } virtual std::string GetSaveData() { return GetBossSaveData(); }
void SaveToDB(); void SaveToDB();
@@ -121,7 +122,7 @@ class TRINITY_DLL_SPEC InstanceData
//use HandleGameObject(GUID,boolen,NULL); in any other script //use HandleGameObject(GUID,boolen,NULL); in any other script
void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL); void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL);
void SetBossState(uint32 id, EncounterState state); virtual void SetBossState(uint32 id, EncounterState state);
protected: protected:
void LoadDoorData(const DoorData *data); void LoadDoorData(const DoorData *data);
@@ -129,14 +130,8 @@ class TRINITY_DLL_SPEC InstanceData
void AddDoor(GameObject *door, bool add); void AddDoor(GameObject *door, bool add);
void UpdateDoorState(GameObject *door); void UpdateDoorState(GameObject *door);
std::string GetBossSave() std::string LoadBossState(const char * data);
{ std::string GetBossSaveData();
std::ostringstream saveStream;
for(std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i)
saveStream << (uint32)i->state << " ";
return saveStream.str();
}
private: private:
std::vector<BossInfo> bosses; std::vector<BossInfo> bosses;
DoorInfoMap doors; DoorInfoMap doors;
+4 -4
View File
@@ -165,11 +165,11 @@ void InstanceSave::SaveToDB()
if(map) if(map)
{ {
assert(map->IsDungeon()); assert(map->IsDungeon());
InstanceData *iData = ((InstanceMap *)map)->GetInstanceData(); if(InstanceData *iData = ((InstanceMap*)map)->GetInstanceData())
if(iData && iData->Save())
{ {
data = iData->Save(); data = iData->GetSaveData();
CharacterDatabase.escape_string(data); if(!data.empty())
CharacterDatabase.escape_string(data);
} }
} }
+1 -1
View File
@@ -2503,7 +2503,7 @@ void InstanceMap::CreateInstanceData(bool load)
{ {
Field* fields = result->Fetch(); Field* fields = result->Fetch();
const char* data = fields[0].GetString(); const char* data = fields[0].GetString();
if(data) if(data && data != "")
{ {
sLog.outDebug("Loading instance data for `%s` with id %u", objmgr.GetScriptName(i_script_id), i_InstanceId); sLog.outDebug("Loading instance data for `%s` with id %u", objmgr.GetScriptName(i_script_id), i_InstanceId);
i_data->Load(data); i_data->Load(data);