*Update instance script functions.
--HG-- branch : trunk
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
|
|||||||
@@ -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 == TO_BE_DECIDED) // loading
|
||||||
|
bossInfo->state = state;
|
||||||
|
else
|
||||||
|
{
|
||||||
if(bossInfo->state == state)
|
if(bossInfo->state == state)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bossInfo->state = state;
|
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
@@ -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;
|
||||||
|
|||||||
@@ -165,10 +165,10 @@ 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();
|
||||||
|
if(!data.empty())
|
||||||
CharacterDatabase.escape_string(data);
|
CharacterDatabase.escape_string(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user