From aa028392f03d906e64a4a8d6a573ccf63d031c84 Mon Sep 17 00:00:00 2001 From: CakeLancelot Date: Sun, 25 Apr 2021 02:40:36 -0500 Subject: [PATCH] Fix #205 - if a player times out a race, warp them back to the start --- src/PlayerManager.cpp | 30 +++++++++++++++--------------- src/PlayerManager.hpp | 1 + src/Racing.cpp | 5 +++++ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/PlayerManager.cpp b/src/PlayerManager.cpp index 83075da..c817f7e 100644 --- a/src/PlayerManager.cpp +++ b/src/PlayerManager.cpp @@ -371,21 +371,6 @@ static void exitGame(CNSocket* sock, CNPacketData* data) { sock->sendPacket(response, P_FE2CL_REP_PC_EXIT_SUCC); } -static WarpLocation* getRespawnPoint(Player *plr) { - WarpLocation* best = nullptr; - uint32_t curDist, bestDist = UINT32_MAX; - - for (auto& targ : NPCManager::RespawnPoints) { - curDist = sqrt(pow(plr->x - targ.x, 2) + pow(plr->y - targ.y, 2)); - if (curDist < bestDist && targ.instanceID == MAPNUM(plr->instanceID)) { // only mapNum needs to match - best = &targ; - bestDist = curDist; - } - } - - return best; -} - static void revivePlayer(CNSocket* sock, CNPacketData* data) { Player *plr = getPlayer(sock); WarpLocation* target = getRespawnPoint(plr); @@ -673,6 +658,21 @@ CNSocket *PlayerManager::getSockFromAny(int by, int id, int uid, std::string fir return nullptr; } +WarpLocation *PlayerManager::getRespawnPoint(Player *plr) { + WarpLocation* best = nullptr; + uint32_t curDist, bestDist = UINT32_MAX; + + for (auto& targ : NPCManager::RespawnPoints) { + curDist = sqrt(pow(plr->x - targ.x, 2) + pow(plr->y - targ.y, 2)); + if (curDist < bestDist && targ.instanceID == MAPNUM(plr->instanceID)) { // only mapNum needs to match + best = &targ; + bestDist = curDist; + } + } + + return best; +} + #pragma endregion void PlayerManager::init() { diff --git a/src/PlayerManager.hpp b/src/PlayerManager.hpp index cdb14b8..a32bd62 100644 --- a/src/PlayerManager.hpp +++ b/src/PlayerManager.hpp @@ -31,6 +31,7 @@ namespace PlayerManager { CNSocket *getSockFromID(int32_t iID); CNSocket *getSockFromName(std::string firstname, std::string lastname); CNSocket *getSockFromAny(int by, int id, int uid, std::string firstname, std::string lastname); + WarpLocation *getRespawnPoint(Player *plr); void sendToViewable(CNSocket *sock, void* buf, uint32_t type, size_t size); diff --git a/src/Racing.cpp b/src/Racing.cpp index a9f5a06..04e5abf 100644 --- a/src/Racing.cpp +++ b/src/Racing.cpp @@ -58,10 +58,15 @@ static void racingCancel(CNSocket* sock, CNPacketData* data) { if (EPRaces.find(sock) == EPRaces.end()) return; // race not found + Player* plr = PlayerManager::getPlayer(sock); EPRaces.erase(sock); INITSTRUCT(sP_FE2CL_REP_EP_RACE_CANCEL_SUCC, resp); sock->sendPacket(resp, P_FE2CL_REP_EP_RACE_CANCEL_SUCC); + + // we have to teleport the player back after this, otherwise they are unable to move + WarpLocation* respawnLoc = PlayerManager::getRespawnPoint(plr); + PlayerManager::sendPlayerTo(sock, respawnLoc->x, respawnLoc->y, respawnLoc->z, respawnLoc->instanceID); } static void racingEnd(CNSocket* sock, CNPacketData* data) {