aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2009-05-11 03:17:13 -0500
committermegamage <none@none>2009-05-11 03:17:13 -0500
commitf9f5d078fda410c0551f1376197094bc4a7bfe08 (patch)
tree3abb3147c83938b1aee627add7b4f97f0af37e8b
parent4fef015112f7bc5fd114c116a384515859b95e9d (diff)
*Update instance script functions.
--HG-- branch : trunk
-rw-r--r--src/bindings/scripts/include/sc_creature.h4
-rw-r--r--src/bindings/scripts/include/sc_instance.h13
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp20
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp2
-rw-r--r--src/game/InstanceData.cpp41
-rw-r--r--src/game/InstanceData.h21
-rw-r--r--src/game/InstanceSaveMgr.cpp8
-rw-r--r--src/game/Map.cpp2
22 files changed, 83 insertions, 56 deletions
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index 26bf5fb400b..444b16e6cdf 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -221,13 +221,13 @@ struct TRINITY_DLL_DECL NullCreatureAI : public ScriptedAI
struct TRINITY_DLL_DECL BossAI : public ScriptedAI
{
BossAI(Creature *c, uint32 id) : ScriptedAI(c), bossId(id)
- , summons(me), instance((ScriptedInstance*)c->GetInstanceData())
+ , summons(me), instance(c->GetInstanceData())
{}
uint32 bossId;
EventMap events;
SummonList summons;
- ScriptedInstance *instance;
+ InstanceData *instance;
void JustSummoned(Creature *summon);
void SummonedCreatureDespawn(Creature *summon);
diff --git a/src/bindings/scripts/include/sc_instance.h b/src/bindings/scripts/include/sc_instance.h
index cdf0e03aa37..0620e89af07 100644
--- a/src/bindings/scripts/include/sc_instance.h
+++ b/src/bindings/scripts/include/sc_instance.h
@@ -17,20 +17,7 @@
class TRINITY_DLL_DECL ScriptedInstance : public InstanceData
{
public:
-
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
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
index 3cfb0af2fa1..37194a89b21 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
@@ -191,7 +191,7 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp b/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
index 41cb91f86b7..595a05a727f 100644
--- a/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
+++ b/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
diff --git a/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp b/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
index bd3fccd98d9..7e0252f2009 100644
--- a/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
+++ b/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
@@ -117,7 +117,7 @@ struct TRINITY_DLL_DECL instance_azjol_nerub : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
diff --git a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
index 43646746505..bf5d62a7b86 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
@@ -303,7 +303,7 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
index 6e26f3a0c03..d9f3ecd808a 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
@@ -265,7 +265,7 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
index 0dfa99198ac..cdcd6cb6b66 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
@@ -279,7 +279,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
}else debug_log("TSCR: Instance Hyjal: UpdateWorldState, but PlayerList is empty!");
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
index 6c4ae72aec1..8aa759a87c8 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
@@ -236,7 +236,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
}
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
index 6d01da7f625..d375d073c35 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
@@ -209,7 +209,7 @@ struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
index 34943449b1e..4c90fdf49a8 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
@@ -144,7 +144,7 @@ struct TRINITY_DLL_DECL instance_gruuls_lair : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
index e8dccdd62a4..62ad6fcf42c 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
@@ -247,7 +247,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
}
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
index 4dc189723f3..23f44f5daf8 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
@@ -77,9 +77,9 @@ inline uint32 GetEruptionSection(float x, float y)
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)
{
SetBossNumber(MAX_BOSS_NUMBER);
@@ -88,12 +88,14 @@ struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance
std::set<GameObject*> HeiganEruption[4];
Creature *Sapphiron;
+ std::set<Creature*> Worshipper;
void OnCreatureCreate(Creature *creature, bool add)
{
switch(creature->GetEntry())
{
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);
}
+ 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)
{
switch(id)
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
index caf18778abb..30f843badb0 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
@@ -185,7 +185,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
index f8bba5acf21..597103b62cf 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
@@ -236,7 +236,7 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
{
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
index 66e595ab729..55ef8c60bbd 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
index d6f5828d295..d483006642d 100644
--- a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
@@ -231,7 +231,7 @@ struct TRINITY_DLL_DECL instance_utgarde_keep : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
diff --git a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
index 4ebf541515b..8ff01927908 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
@@ -179,7 +179,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
instance->SendToPlayers(&data);
}
- const char* Save()
+ std::string GetSaveData()
{
std::ostringstream ss;
ss << "S " << BossKilled << " " << ChestLooted << " " << QuestMinute;
diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp
index 80e728f7b3c..96c10f7b85c 100644
--- a/src/game/InstanceData.cpp
+++ b/src/game/InstanceData.cpp
@@ -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();
+}
diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h
index d68cb7ff7f8..91f589384a0 100644
--- a/src/game/InstanceData.h
+++ b/src/game/InstanceData.h
@@ -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;
diff --git a/src/game/InstanceSaveMgr.cpp b/src/game/InstanceSaveMgr.cpp
index 131d26e90f7..7e2ad67c518 100644
--- a/src/game/InstanceSaveMgr.cpp
+++ b/src/game/InstanceSaveMgr.cpp
@@ -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);
}
}
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index 3884f39f5a4..3280970750b 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -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);