aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp96
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp8
2 files changed, 85 insertions, 19 deletions
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 e9454d713ed..5ae6ca9a583 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
@@ -31,36 +31,61 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
instance_shadowfang_keep(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
+ std::string str_data;
- uint64 DoorCourtyard;
- uint64 DoorSorcerer;
- uint64 DoorArugal;
+ uint64 DoorCourtyardGUID;
+ uint64 DoorSorcererGUID;
+ uint64 DoorArugalGUID;
void Initialize()
{
- DoorCourtyard = 0;
- DoorSorcerer = 0;
- DoorArugal = 0;
+ DoorCourtyardGUID = 0;
+ DoorSorcererGUID = 0;
+ DoorArugalGUID = 0;
for(uint8 i=0; i < ENCOUNTERS; ++i)
Encounter[i] = NOT_STARTED;
}
+ Player* GetPlayerInMap()
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+
+ if (!players.isEmpty())
+ {
+ for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ {
+ if (Player* plr = itr->getSource())
+ return plr;
+ }
+ }
+ debug_log("TSCR: Instance Shadowfang Keep: GetPlayerInMap, but PlayerList is empty!");
+ return NULL;
+ }
+
void OnObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
- case 18895: DoorCourtyard = go->GetGUID(); break;
- case 18972: DoorSorcerer = go->GetGUID(); break;
- case 18971: DoorArugal = go->GetGUID(); break;
+ case 18895: DoorCourtyardGUID = go->GetGUID(); break;
+ case 18972: DoorSorcererGUID = go->GetGUID(); break;
+ case 18971: DoorArugalGUID = go->GetGUID(); break;
}
}
- void OpenDoor(uint64 DoorGUID, bool open)
- {
- if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
- }
+ void HandleGameObject(uint64 guid, uint32 state)
+ {
+ Player *player = GetPlayerInMap();
+
+ if (!player || !guid)
+ {
+ debug_log("SD2: Instance Shadowfang Keep: HandleGameObject fail");
+ return;
+ }
+
+ if (GameObject *go = GameObject::GetGameObject(*player,guid))
+ go->SetGoState(state);
+ }
void SetData(uint32 type, uint32 data)
{
@@ -68,7 +93,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
{
case TYPE_FREE_NPC:
if(data == DONE)
- OpenDoor(DoorCourtyard, true);
+ HandleGameObject(DoorCourtyardGUID,0);
Encounter[0] = data;
break;
case TYPE_RETHILGORE:
@@ -76,15 +101,28 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
break;
case TYPE_FENRUS:
if(data == DONE)
- OpenDoor(DoorSorcerer, true);
+ HandleGameObject(DoorSorcererGUID,0);
Encounter[2] = data;
break;
case TYPE_NANDOS:
if(data == DONE)
- OpenDoor(DoorArugal, true);
+ HandleGameObject(DoorArugalGUID,0);
Encounter[3] = data;
break;
}
+
+ if (data == DONE)
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << Encounter[0] << " " << Encounter[1] << " " << Encounter[2] << " " << Encounter[3];
+
+ str_data = saveStream.str();
+
+ SaveToDB();
+ OUT_SAVE_INST_DATA_COMPLETE;
+ }
}
uint32 GetData(uint32 type)
@@ -103,6 +141,30 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
return 0;
}
+ const char* Save()
+ {
+ return str_data.c_str();
+ }
+
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(in);
+
+ std::istringstream loadStream(in);
+ loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3];
+
+ for(uint8 i = 0; i < ENCOUNTERS; ++i)
+ if (Encounter[i] == IN_PROGRESS)
+ Encounter[i] = NOT_STARTED;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
};
InstanceData* GetInstanceData_instance_shadowfang_keep(Map* map)
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp b/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp
index 94d09998acc..471efff8c95 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp
@@ -84,8 +84,12 @@ CreatureAI* GetAI_npc_shadowfang_prisoner(Creature *_Creature)
bool GossipHello_npc_shadowfang_prisoner(Player *player, Creature *_Creature)
{
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
+
+ if (!pInstance)
+ return false;
- player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ if (pInstance->GetData(TYPE_FREE_NPC) != DONE && pInstance->GetData(TYPE_RETHILGORE) == DONE)
+ player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
@@ -97,7 +101,7 @@ bool GossipSelect_npc_shadowfang_prisoner(Player *player, Creature *_Creature, u
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
player->CLOSE_GOSSIP_MENU();
- ((npc_escortAI*)(_Creature->AI()))->Start(false, false, false, player->GetGUID());
+ ((npc_escortAI*)(_Creature->AI()))->Start(false, false, false);
}
return true;
}