From c7591c6ce2c75a6aede6654d6ee392eff774ee0d Mon Sep 17 00:00:00 2001 From: Gent Date: Sun, 8 Nov 2020 12:54:05 -0500 Subject: [PATCH] Implement buddy warp --- src/BuddyManager.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/BuddyManager.cpp b/src/BuddyManager.cpp index fe053fe..c74a48a 100644 --- a/src/BuddyManager.cpp +++ b/src/BuddyManager.cpp @@ -399,7 +399,30 @@ void BuddyManager::reqBuddyDelete(CNSocket* sock, CNPacketData* data) { } // Warping to buddy -void BuddyManager::reqBuddyWarp(CNSocket* sock, CNPacketData* data) {} // stub +void BuddyManager::reqBuddyWarp(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_BUDDY_WARP)) + return; // malformed packet + + sP_CL2FE_REQ_PC_BUDDY_WARP* pkt = (sP_CL2FE_REQ_PC_BUDDY_WARP*)data->buf; + + if (pkt->iSlotNum < 0 || pkt->iSlotNum >= 50) + return; // sanity check + + Player* otherPlr = PlayerManager::getPlayerFromID(pkt->iBuddyPCUID); + if (otherPlr == nullptr) + return; // buddy offline + + if (otherPlr->instanceID != INSTANCE_OVERWORLD) { + // player is instanced; no warp allowed + INITSTRUCT(sP_FE2CL_REP_PC_BUDDY_WARP_FAIL, resp); + resp.iBuddyPCUID = pkt->iBuddyPCUID; + resp.iErrorCode = 0; + sock->sendPacket((void*)&resp, P_FE2CL_REP_PC_BUDDY_WARP_FAIL, sizeof(sP_FE2CL_REP_PC_BUDDY_WARP_FAIL)); + return; + } + + PlayerManager::sendPlayerTo(sock, otherPlr->x, otherPlr->y, otherPlr->z); +} #pragma region Helper methods