diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 45249f1..3a7926e 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -18,6 +18,7 @@ std::vector NPCManager::RespawnPoints; void NPCManager::init() { REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_WARP_USE_NPC, npcWarpHandler); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_TIME_TO_GO_WARP, npcWarpTimeMachine); REGISTER_SHARD_PACKET(P_CL2FE_REQ_NPC_SUMMON, npcSummonHandler); REGISTER_SHARD_PACKET(P_CL2FE_REQ_NPC_UNSUMMON, npcUnsummonHandler); REGISTER_SHARD_PACKET(P_CL2FE_REQ_BARKER, npcBarkHandler); @@ -499,17 +500,28 @@ void NPCManager::npcWarpHandler(CNSocket* sock, CNPacketData* data) { return; // malformed packet sP_CL2FE_REQ_PC_WARP_USE_NPC* warpNpc = (sP_CL2FE_REQ_PC_WARP_USE_NPC*)data->buf; - PlayerView& plrv = PlayerManager::players[sock]; + handleWarp(sock, warpNpc->iWarpID); +} +void NPCManager::npcWarpTimeMachine(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_TIME_TO_GO_WARP)) + return; // malformed packet + // this is just a warp request + handleWarp(sock, 28); +} + +void NPCManager::handleWarp(CNSocket* sock, int32_t warpId) { // sanity check - if (Warps.find(warpNpc->iWarpID) == Warps.end()) + if (Warps.find(warpId) == Warps.end()) return; + PlayerView& plrv = PlayerManager::players[sock]; + // send to client INITSTRUCT(sP_FE2CL_REP_PC_WARP_USE_NPC_SUCC, resp); - resp.iX = Warps[warpNpc->iWarpID].x; - resp.iY = Warps[warpNpc->iWarpID].y; - resp.iZ = Warps[warpNpc->iWarpID].z; + resp.iX = Warps[warpId].x; + resp.iY = Warps[warpId].y; + resp.iZ = Warps[warpId].z; // force player & NPC reload PlayerManager::removePlayerFromChunks(plrv.currentChunks, sock); diff --git a/src/NPCManager.hpp b/src/NPCManager.hpp index aee6553..7e40950 100644 --- a/src/NPCManager.hpp +++ b/src/NPCManager.hpp @@ -28,6 +28,7 @@ namespace NPCManager { void npcSummonHandler(CNSocket* sock, CNPacketData* data); void npcUnsummonHandler(CNSocket* sock, CNPacketData* data); void npcWarpHandler(CNSocket* sock, CNPacketData* data); + void npcWarpTimeMachine(CNSocket* sock, CNPacketData* data); void npcVendorStart(CNSocket* sock, CNPacketData* data); void npcVendorTable(CNSocket* sock, CNPacketData* data); @@ -36,4 +37,6 @@ namespace NPCManager { void npcVendorBuyback(CNSocket* sock, CNPacketData* data); void npcVendorBuyBattery(CNSocket* sock, CNPacketData* data); void npcCombineItems(CNSocket* sock, CNPacketData* data); + + void handleWarp(CNSocket* sock, int32_t warpId); } diff --git a/src/PlayerManager.cpp b/src/PlayerManager.cpp index 5fd1e5f..6ff9247 100644 --- a/src/PlayerManager.cpp +++ b/src/PlayerManager.cpp @@ -37,7 +37,7 @@ void PlayerManager::init() { REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_SPECIAL_STATE_SWITCH, PlayerManager::setSpecialSwitchPlayer); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_VEHICLE_ON, PlayerManager::enterPlayerVehicle); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_VEHICLE_OFF, PlayerManager::exitPlayerVehicle); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_CHANGE_MENTOR, PlayerManager::changePlayerGuide); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_CHANGE_MENTOR, PlayerManager::changePlayerGuide); } void PlayerManager::addPlayer(CNSocket* key, Player plr) { diff --git a/src/PlayerManager.hpp b/src/PlayerManager.hpp index b67b7ac..1fdd4d3 100644 --- a/src/PlayerManager.hpp +++ b/src/PlayerManager.hpp @@ -50,7 +50,7 @@ namespace PlayerManager { void setSpecialPlayer(CNSocket* sock, CNPacketData* data); void heartbeatPlayer(CNSocket* sock, CNPacketData* data); void revivePlayer(CNSocket* sock, CNPacketData* data); - void exitGame(CNSocket* sock, CNPacketData* data); + void exitGame(CNSocket* sock, CNPacketData* data); void setSpecialSwitchPlayer(CNSocket* sock, CNPacketData* data); void changePlayerGuide(CNSocket *sock, CNPacketData *data);