diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 6165ff3..ae39a3e 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -531,8 +531,20 @@ void NPCManager::handleWarp(CNSocket* sock, int32_t warpId) { if (Warps.find(warpId) == Warps.end()) return; - // remove the player's vehicle - plr->iPCState &= ~8; + if (plr->iPCState | 8) { + // remove the player's vehicle + plr->iPCState &= ~8; + + // send to self + INITSTRUCT(sP_FE2CL_PC_VEHICLE_OFF_SUCC, off); + sock->sendPacket((void*)&off, P_FE2CL_PC_VEHICLE_OFF_SUCC, sizeof(sP_FE2CL_PC_VEHICLE_OFF_SUCC)); + + // send to others + INITSTRUCT(sP_FE2CL_PC_STATE_CHANGE, chg); + chg.iPC_ID = plr->iID; + chg.iState = plr->iPCState; + PlayerManager::sendToViewable(sock, (void*)&chg, P_FE2CL_PC_STATE_CHANGE, sizeof(sP_FE2CL_PC_STATE_CHANGE)); + } // std::cerr << "Warped to Map Num:" << Warps[warpId].instanceID << " NPC ID " << Warps[warpId].npcID << std::endl; if (Warps[warpId].isInstance) { @@ -569,7 +581,20 @@ void NPCManager::handleWarp(CNSocket* sock, int32_t warpId) { otherPlr->recallInstance = instanceID; // remove their vehicle if they're on one - otherPlr->iPCState &= ~8; + if (otherPlr->iPCState | 8) { + // remove the player's vehicle + otherPlr->iPCState &= ~8; + + // send to self + INITSTRUCT(sP_FE2CL_PC_VEHICLE_OFF_SUCC, off); + sockTo->sendPacket((void*)&off, P_FE2CL_PC_VEHICLE_OFF_SUCC, sizeof(sP_FE2CL_PC_VEHICLE_OFF_SUCC)); + + // send to others + INITSTRUCT(sP_FE2CL_PC_STATE_CHANGE, chg); + chg.iPC_ID = otherPlr->iID; + chg.iState = otherPlr->iPCState; + PlayerManager::sendToViewable(sockTo, (void*)&chg, P_FE2CL_PC_STATE_CHANGE, sizeof(sP_FE2CL_PC_STATE_CHANGE)); + } PlayerManager::sendPlayerTo(sockTo, Warps[warpId].x, Warps[warpId].y, Warps[warpId].z, instanceID); }