*Update instance script functions.
--HG-- branch : trunk
This commit is contained in:
@@ -26,8 +26,9 @@
|
||||
|
||||
void InstanceData::SaveToDB()
|
||||
{
|
||||
if(!Save()) return;
|
||||
std::string data = Save();
|
||||
std::string data = GetSaveData();
|
||||
if(data.empty())
|
||||
return;
|
||||
CharacterDatabase.escape_string(data);
|
||||
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())
|
||||
{
|
||||
BossInfo *bossInfo = &bosses[id];
|
||||
if(bossInfo->state == state)
|
||||
return;
|
||||
|
||||
bossInfo->state = state;
|
||||
if(bossInfo->state == TO_BE_DECIDED) // loading
|
||||
bossInfo->state = state;
|
||||
else
|
||||
{
|
||||
if(bossInfo->state == state)
|
||||
return;
|
||||
bossInfo->state = state;
|
||||
SaveToDB();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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
@@ -37,7 +37,8 @@ enum EncounterState
|
||||
IN_PROGRESS = 1,
|
||||
FAIL = 2,
|
||||
DONE = 3,
|
||||
SPECIAL = 4
|
||||
SPECIAL = 4,
|
||||
TO_BE_DECIDED = 5,
|
||||
};
|
||||
|
||||
typedef std::set<GameObject*> DoorSet;
|
||||
@@ -51,7 +52,7 @@ enum DoorType
|
||||
|
||||
struct BossInfo
|
||||
{
|
||||
BossInfo() : state(NOT_STARTED) {}
|
||||
BossInfo() : state(TO_BE_DECIDED) {}
|
||||
EncounterState state;
|
||||
DoorSet door[MAX_DOOR_TYPES];
|
||||
};
|
||||
@@ -85,10 +86,10 @@ class TRINITY_DLL_SPEC InstanceData
|
||||
virtual void Initialize() {}
|
||||
|
||||
//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
|
||||
virtual const char* Save() { return ""; }
|
||||
virtual std::string GetSaveData() { return GetBossSaveData(); }
|
||||
|
||||
void SaveToDB();
|
||||
|
||||
@@ -121,7 +122,7 @@ class TRINITY_DLL_SPEC InstanceData
|
||||
//use HandleGameObject(GUID,boolen,NULL); in any other script
|
||||
void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL);
|
||||
|
||||
void SetBossState(uint32 id, EncounterState state);
|
||||
virtual void SetBossState(uint32 id, EncounterState state);
|
||||
protected:
|
||||
void LoadDoorData(const DoorData *data);
|
||||
|
||||
@@ -129,14 +130,8 @@ class TRINITY_DLL_SPEC InstanceData
|
||||
void AddDoor(GameObject *door, bool add);
|
||||
void UpdateDoorState(GameObject *door);
|
||||
|
||||
std::string GetBossSave()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
for(std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i)
|
||||
saveStream << (uint32)i->state << " ";
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
std::string LoadBossState(const char * data);
|
||||
std::string GetBossSaveData();
|
||||
private:
|
||||
std::vector<BossInfo> bosses;
|
||||
DoorInfoMap doors;
|
||||
|
||||
@@ -165,11 +165,11 @@ void InstanceSave::SaveToDB()
|
||||
if(map)
|
||||
{
|
||||
assert(map->IsDungeon());
|
||||
InstanceData *iData = ((InstanceMap *)map)->GetInstanceData();
|
||||
if(iData && iData->Save())
|
||||
if(InstanceData *iData = ((InstanceMap*)map)->GetInstanceData())
|
||||
{
|
||||
data = iData->Save();
|
||||
CharacterDatabase.escape_string(data);
|
||||
data = iData->GetSaveData();
|
||||
if(!data.empty())
|
||||
CharacterDatabase.escape_string(data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -2503,7 +2503,7 @@ void InstanceMap::CreateInstanceData(bool load)
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
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);
|
||||
i_data->Load(data);
|
||||
|
||||
Reference in New Issue
Block a user