diff options
| author | joschiwald <joschiwald.trinity@gmail.com> | 2014-09-07 00:42:14 +0200 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2014-09-07 00:42:14 +0200 |
| commit | ef9b4aea5e97ffbd4c0f611bef6fab6e554d82ff (patch) | |
| tree | 050f315e4d5e1cb99e38603ce585b3baa3dd097f /src/server/game | |
| parent | 9ab74b39109bb611c0deb5228640b92f22c83089 (diff) | |
Core/InstanceScript: refactored load and save methods
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Instances/InstanceScript.cpp | 136 | ||||
| -rw-r--r-- | src/server/game/Instances/InstanceScript.h | 42 |
2 files changed, 129 insertions, 49 deletions
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index adef21fe7a2..6278e66baef 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -43,16 +43,6 @@ void InstanceScript::SaveToDB() CharacterDatabase.Execute(stmt); } -void InstanceScript::HandleGameObject(uint64 GUID, bool open, GameObject* go) -{ - if (!go) - go = instance->GetGameObject(GUID); - if (go) - go->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); - else - TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed"); -} - bool InstanceScript::IsEncounterInProgress() const { for (std::vector<BossInfo>::const_iterator itr = bosses.begin(); itr != bosses.end(); ++itr) @@ -62,6 +52,13 @@ bool InstanceScript::IsEncounterInProgress() const return false; } +void InstanceScript::SetHeaders(std::string const& dataHeaders) +{ + for (char header : dataHeaders) + if (isalpha(header)) + headers.push_back(header); +} + void InstanceScript::LoadMinionData(const MinionData* data) { while (data->entry) @@ -232,65 +229,140 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state) return false; } -std::string InstanceScript::LoadBossState(const char * data) +void InstanceScript::Load(char const* data) { if (!data) - return NULL; + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(data); + std::istringstream loadStream(data); - uint32 buff; + + if (ReadSaveDataHeaders(loadStream)) + { + ReadSaveDataBossStates(loadStream); + ReadSaveDataMore(loadStream); + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; +} + +bool InstanceScript::ReadSaveDataHeaders(std::istringstream& data) +{ + for (char header : headers) + { + char buff; + data >> buff; + + if (header != buff) + return false; + } + + return true; +} + +void InstanceScript::ReadSaveDataBossStates(std::istringstream& data) +{ uint32 bossId = 0; for (std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i, ++bossId) { - loadStream >> buff; + uint32 buff; + data >> buff; + if (buff == IN_PROGRESS || buff == SPECIAL) + buff = NOT_STARTED; + if (buff < TO_BE_DECIDED) - SetBossState(bossId, (EncounterState)buff); + SetBossState(bossId, EncounterState(buff)); } - return loadStream.str(); } -std::string InstanceScript::GetBossSaveData() +std::string InstanceScript::GetSaveData() { + OUT_SAVE_INST_DATA; + std::ostringstream saveStream; - for (std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i) - saveStream << (uint32)i->state << ' '; + + WriteSaveDataHeaders(saveStream); + WriteSaveDataBossStates(saveStream); + WriteSaveDataMore(saveStream); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); } -void InstanceScript::DoUseDoorOrButton(uint64 uiGuid, uint32 uiWithRestoreTime, bool bUseAlternativeState) +void InstanceScript::WriteSaveDataHeaders(std::ostringstream& data) { - if (!uiGuid) - return; + for (char header : headers) + data << header << ' '; +} - GameObject* go = instance->GetGameObject(uiGuid); +void InstanceScript::WriteSaveDataBossStates(std::ostringstream& data) +{ + for (BossInfo const& bossInfo : bosses) + data << uint32(bossInfo.state) << ' '; +} +void InstanceScript::HandleGameObject(uint64 guid, bool open, GameObject* go /*= nullptr*/) +{ + if (!go) + go = instance->GetGameObject(guid); if (go) + go->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); + else + TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed"); +} + +void InstanceScript::DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime /*= 0*/, bool useAlternativeState /*= false*/) +{ + if (!guid) + return; + + if (GameObject* go = instance->GetGameObject(guid)) { if (go->GetGoType() == GAMEOBJECT_TYPE_DOOR || go->GetGoType() == GAMEOBJECT_TYPE_BUTTON) { if (go->getLootState() == GO_READY) - go->UseDoorOrButton(uiWithRestoreTime, bUseAlternativeState); + go->UseDoorOrButton(withRestoreTime, useAlternativeState); else if (go->getLootState() == GO_ACTIVATED) go->ResetDoorOrButton(); } else - TC_LOG_ERROR("misc", "SD2: Script call DoUseDoorOrButton, but gameobject entry %u is type %u.", go->GetEntry(), go->GetGoType()); + TC_LOG_ERROR("scripts", "InstanceScript: DoUseDoorOrButton can't use gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType()); } + else + TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed"); } -void InstanceScript::DoRespawnGameObject(uint64 uiGuid, uint32 uiTimeToDespawn) +void InstanceScript::DoRespawnGameObject(uint64 guid, uint32 timeToDespawn /*= MINUTE*/) { - if (GameObject* go = instance->GetGameObject(uiGuid)) + if (GameObject* go = instance->GetGameObject(guid)) { - //not expect any of these should ever be handled - if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE || go->GetGoType() == GAMEOBJECT_TYPE_DOOR || - go->GetGoType() == GAMEOBJECT_TYPE_BUTTON || go->GetGoType() == GAMEOBJECT_TYPE_TRAP) - return; + switch (go->GetGoType()) + { + case GAMEOBJECT_TYPE_DOOR: + case GAMEOBJECT_TYPE_BUTTON: + case GAMEOBJECT_TYPE_TRAP: + case GAMEOBJECT_TYPE_FISHINGNODE: + // not expect any of these should ever be handled + TC_LOG_ERROR("scripts", "InstanceScript: DoRespawnGameObject can't respawn gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType()); + return; + default: + break; + } if (go->isSpawned()) return; - go->SetRespawnTime(uiTimeToDespawn); + go->SetRespawnTime(timeToDespawn); } + else + TC_LOG_DEBUG("scripts", "InstanceScript: DoRespawnGameObject failed"); } void InstanceScript::DoUpdateWorldState(uint32 uiStateId, uint32 uiStateData) diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index f379572961c..41f62cfb5f2 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -137,38 +137,38 @@ class InstanceScript : public ZoneScript Map* instance; - //On creation, NOT load. + // On creation, NOT load. virtual void Initialize() { } - //On load - virtual void Load(char const* data) { LoadBossState(data); } + // On load + virtual void Load(char const* data); - //When save is needed, this function generates the data - virtual std::string GetSaveData() { return GetBossSaveData(); } + // When save is needed, this function generates the data + virtual std::string GetSaveData(); void SaveToDB(); virtual void Update(uint32 /*diff*/) { } - //Used by the map's CanEnter function. - //This is to prevent players from entering during boss encounters. + // Used by the map's CanEnter function. + // This is to prevent players from entering during boss encounters. virtual bool IsEncounterInProgress() const; - //Called when a player successfully enters the instance. + // Called when a player successfully enters the instance. virtual void OnPlayerEnter(Player* /*player*/) { } - //Handle open / close objects - //use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts - //use HandleGameObject(GUID, boolen, NULL); in any other script - void HandleGameObject(uint64 guid, bool open, GameObject* go = NULL); + // Handle open / close objects + // * use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts + // * use HandleGameObject(GUID, boolen, NULL); in any other script + void HandleGameObject(uint64 guid, bool open, GameObject* go = nullptr); - //change active state of doors or buttons + // Change active state of doors or buttons void DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime = 0, bool useAlternativeState = false); - //Respawns a GO having negative spawntimesecs in gameobject-table + // Respawns a GO having negative spawntimesecs in gameobject-table void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn = MINUTE); - //sends world state update to all players in instance + // Sends world state update to all players in instance void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue); // Send Notify to all players in instance @@ -215,6 +215,7 @@ class InstanceScript : public ZoneScript virtual void FillInitialWorldStates(WorldPacket& /*data*/) { } protected: + void SetHeaders(std::string const& dataHeaders); void SetBossNumber(uint32 number) { bosses.resize(number); } void LoadDoorData(DoorData const* data); void LoadMinionData(MinionData const* data); @@ -225,9 +226,16 @@ class InstanceScript : public ZoneScript void UpdateDoorState(GameObject* door); void UpdateMinionState(Creature* minion, EncounterState state); - std::string LoadBossState(char const* data); - std::string GetBossSaveData(); + // Instance Load and Save + bool ReadSaveDataHeaders(std::istringstream& data); + void ReadSaveDataBossStates(std::istringstream& data); + virtual void ReadSaveDataMore(std::istringstream& /*data*/) { } + void WriteSaveDataHeaders(std::ostringstream& data); + void WriteSaveDataBossStates(std::ostringstream& data); + virtual void WriteSaveDataMore(std::ostringstream& /*data*/) { } + private: + std::vector<char> headers; std::vector<BossInfo> bosses; DoorInfoMap doors; MinionInfoMap minions; |
