*Update on Shadowfang keep
--HG-- branch : trunk
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -85,7 +85,11 @@ bool GossipHello_npc_shadowfang_prisoner(Player *player, Creature *_Creature)
|
|||||||
{
|
{
|
||||||
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
|
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
|
||||||
|
|
||||||
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
if (!pInstance)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user