*Update on Shadowfang keep

--HG--
branch : trunk
This commit is contained in:
Blaymoira
2009-01-18 13:56:40 +01:00
parent 9c9311c781
commit 74ee177262
2 changed files with 85 additions and 19 deletions
@@ -31,36 +31,61 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
instance_shadowfang_keep(Map *map) : ScriptedInstance(map) {Initialize();}; instance_shadowfang_keep(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS]; uint32 Encounter[ENCOUNTERS];
std::string str_data;
uint64 DoorCourtyard; uint64 DoorCourtyardGUID;
uint64 DoorSorcerer; uint64 DoorSorcererGUID;
uint64 DoorArugal; uint64 DoorArugalGUID;
void Initialize() void Initialize()
{ {
DoorCourtyard = 0; DoorCourtyardGUID = 0;
DoorSorcerer = 0; DoorSorcererGUID = 0;
DoorArugal = 0; DoorArugalGUID = 0;
for(uint8 i=0; i < ENCOUNTERS; ++i) for(uint8 i=0; i < ENCOUNTERS; ++i)
Encounter[i] = NOT_STARTED; 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) void OnObjectCreate(GameObject *go)
{ {
switch(go->GetEntry()) switch(go->GetEntry())
{ {
case 18895: DoorCourtyard = go->GetGUID(); break; case 18895: DoorCourtyardGUID = go->GetGUID(); break;
case 18972: DoorSorcerer = go->GetGUID(); break; case 18972: DoorSorcererGUID = go->GetGUID(); break;
case 18971: DoorArugal = go->GetGUID(); break; case 18971: DoorArugalGUID = go->GetGUID(); break;
} }
} }
void OpenDoor(uint64 DoorGUID, bool open) void HandleGameObject(uint64 guid, uint32 state)
{ {
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID)) Player *player = GetPlayerInMap();
Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
} 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) void SetData(uint32 type, uint32 data)
{ {
@@ -68,7 +93,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
{ {
case TYPE_FREE_NPC: case TYPE_FREE_NPC:
if(data == DONE) if(data == DONE)
OpenDoor(DoorCourtyard, true); HandleGameObject(DoorCourtyardGUID,0);
Encounter[0] = data; Encounter[0] = data;
break; break;
case TYPE_RETHILGORE: case TYPE_RETHILGORE:
@@ -76,15 +101,28 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
break; break;
case TYPE_FENRUS: case TYPE_FENRUS:
if(data == DONE) if(data == DONE)
OpenDoor(DoorSorcerer, true); HandleGameObject(DoorSorcererGUID,0);
Encounter[2] = data; Encounter[2] = data;
break; break;
case TYPE_NANDOS: case TYPE_NANDOS:
if(data == DONE) if(data == DONE)
OpenDoor(DoorArugal, true); HandleGameObject(DoorArugalGUID,0);
Encounter[3] = data; Encounter[3] = data;
break; 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) uint32 GetData(uint32 type)
@@ -103,6 +141,30 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
return 0; 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) InstanceData* GetInstanceData_instance_shadowfang_keep(Map* map)
@@ -84,8 +84,12 @@ CreatureAI* GetAI_npc_shadowfang_prisoner(Creature *_Creature)
bool GossipHello_npc_shadowfang_prisoner(Player *player, Creature *_Creature) bool GossipHello_npc_shadowfang_prisoner(Player *player, Creature *_Creature)
{ {
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData()); 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()); 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) if (action == GOSSIP_ACTION_INFO_DEF+1)
{ {
player->CLOSE_GOSSIP_MENU(); player->CLOSE_GOSSIP_MENU();
((npc_escortAI*)(_Creature->AI()))->Start(false, false, false, player->GetGUID()); ((npc_escortAI*)(_Creature->AI()))->Start(false, false, false);
} }
return true; return true;
} }