diff --git a/Makefile b/Makefile index a77c0cf..e08753c 100644 --- a/Makefile +++ b/Makefile @@ -44,6 +44,7 @@ CXXSRC=\ src/ItemManager.cpp\ src/NPCManager.cpp\ src/PlayerManager.cpp\ + src/PlayerMovement.cpp\ src/BuiltinCommands.cpp\ src/settings.cpp\ src/TransportManager.cpp\ @@ -84,6 +85,7 @@ CXXHDR=\ src/NPCManager.hpp\ src/Player.hpp\ src/PlayerManager.hpp\ + src/PlayerMovement.hpp\ src/BuiltinCommands.hpp\ src/settings.hpp\ src/TransportManager.hpp\ diff --git a/src/PlayerManager.cpp b/src/PlayerManager.cpp index 8e6bb82..a3538a5 100644 --- a/src/PlayerManager.cpp +++ b/src/PlayerManager.cpp @@ -26,15 +26,6 @@ void PlayerManager::init() { // register packet types REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_ENTER, enterPlayer); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_LOADING_COMPLETE, loadPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVE, movePlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_STOP, stopPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_JUMP, jumpPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_JUMPPAD, jumppadPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_LAUNCHER, launchPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_ZIPLINE, ziplinePlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVEPLATFORM, movePlatformPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVETRANSPORTATION, moveSliderPlayer); - REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_SLOPE, moveSlopePlayer); REGISTER_SHARD_PACKET(P_CL2FE_REP_LIVE_CHECK, heartbeatPlayer); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_REGEN, revivePlayer); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_EXIT, exitGame); @@ -381,286 +372,6 @@ void PlayerManager::loadPlayer(CNSocket* sock, CNPacketData* data) { sock->sendPacket((void*)&response, P_FE2CL_REP_PC_LOADING_COMPLETE_SUCC, sizeof(sP_FE2CL_REP_PC_LOADING_COMPLETE_SUCC)); } -void PlayerManager::movePlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_MOVE)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_MOVE* moveData = (sP_CL2FE_REQ_PC_MOVE*)data->buf; - updatePlayerPosition(sock, moveData->iX, moveData->iY, moveData->iZ, plr->instanceID, moveData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_MOVE, moveResponse); - - moveResponse.iID = plr->iID; - moveResponse.cKeyValue = moveData->cKeyValue; - - moveResponse.iX = moveData->iX; - moveResponse.iY = moveData->iY; - moveResponse.iZ = moveData->iZ; - moveResponse.iAngle = moveData->iAngle; - moveResponse.fVX = moveData->fVX; - moveResponse.fVY = moveData->fVY; - moveResponse.fVZ = moveData->fVZ; - - moveResponse.iSpeed = moveData->iSpeed; - moveResponse.iCliTime = moveData->iCliTime; // maybe don't send this??? seems unneeded... - moveResponse.iSvrTime = tm; - - sendToViewable(sock, (void*)&moveResponse, P_FE2CL_PC_MOVE, sizeof(sP_FE2CL_PC_MOVE)); -} - -void PlayerManager::stopPlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_STOP)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_STOP* stopData = (sP_CL2FE_REQ_PC_STOP*)data->buf; - updatePlayerPosition(sock, stopData->iX, stopData->iY, stopData->iZ, plr->instanceID, plr->angle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_STOP, stopResponse); - - stopResponse.iID = plr->iID; - - stopResponse.iX = stopData->iX; - stopResponse.iY = stopData->iY; - stopResponse.iZ = stopData->iZ; - - stopResponse.iCliTime = stopData->iCliTime; // maybe don't send this??? seems unneeded... - stopResponse.iSvrTime = tm; - - sendToViewable(sock, (void*)&stopResponse, P_FE2CL_PC_STOP, sizeof(sP_FE2CL_PC_STOP)); -} - -void PlayerManager::jumpPlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_JUMP)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_JUMP* jumpData = (sP_CL2FE_REQ_PC_JUMP*)data->buf; - updatePlayerPosition(sock, jumpData->iX, jumpData->iY, jumpData->iZ, plr->instanceID, jumpData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_JUMP, jumpResponse); - - jumpResponse.iID = plr->iID; - jumpResponse.cKeyValue = jumpData->cKeyValue; - - jumpResponse.iX = jumpData->iX; - jumpResponse.iY = jumpData->iY; - jumpResponse.iZ = jumpData->iZ; - jumpResponse.iAngle = jumpData->iAngle; - jumpResponse.iVX = jumpData->iVX; - jumpResponse.iVY = jumpData->iVY; - jumpResponse.iVZ = jumpData->iVZ; - - jumpResponse.iSpeed = jumpData->iSpeed; - jumpResponse.iCliTime = jumpData->iCliTime; // maybe don't send this??? seems unneeded... - jumpResponse.iSvrTime = tm; - - sendToViewable(sock, (void*)&jumpResponse, P_FE2CL_PC_JUMP, sizeof(sP_FE2CL_PC_JUMP)); -} - -void PlayerManager::jumppadPlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_JUMPPAD)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_JUMPPAD* jumppadData = (sP_CL2FE_REQ_PC_JUMPPAD*)data->buf; - updatePlayerPosition(sock, jumppadData->iX, jumppadData->iY, jumppadData->iZ, plr->instanceID, jumppadData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_JUMPPAD, jumppadResponse); - - jumppadResponse.iPC_ID = plr->iID; - jumppadResponse.cKeyValue = jumppadData->cKeyValue; - - jumppadResponse.iX = jumppadData->iX; - jumppadResponse.iY = jumppadData->iY; - jumppadResponse.iZ = jumppadData->iZ; - jumppadResponse.iVX = jumppadData->iVX; - jumppadResponse.iVY = jumppadData->iVY; - jumppadResponse.iVZ = jumppadData->iVZ; - - jumppadResponse.iCliTime = jumppadData->iCliTime; - jumppadResponse.iSvrTime = tm; - - sendToViewable(sock, (void*)&jumppadResponse, P_FE2CL_PC_JUMPPAD, sizeof(sP_FE2CL_PC_JUMPPAD)); -} - -void PlayerManager::launchPlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_LAUNCHER)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_LAUNCHER* launchData = (sP_CL2FE_REQ_PC_LAUNCHER*)data->buf; - updatePlayerPosition(sock, launchData->iX, launchData->iY, launchData->iZ, plr->instanceID, launchData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_LAUNCHER, launchResponse); - - launchResponse.iPC_ID = plr->iID; - - launchResponse.iX = launchData->iX; - launchResponse.iY = launchData->iY; - launchResponse.iZ = launchData->iZ; - launchResponse.iVX = launchData->iVX; - launchResponse.iVY = launchData->iVY; - launchResponse.iVZ = launchData->iVZ; - launchResponse.iSpeed = launchData->iSpeed; - launchResponse.iAngle = launchData->iAngle; - - launchResponse.iCliTime = launchData->iCliTime; - launchResponse.iSvrTime = tm; - - sendToViewable(sock, (void*)&launchResponse, P_FE2CL_PC_LAUNCHER, sizeof(sP_FE2CL_PC_LAUNCHER)); -} - -void PlayerManager::ziplinePlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_ZIPLINE)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_ZIPLINE* ziplineData = (sP_CL2FE_REQ_PC_ZIPLINE*)data->buf; - updatePlayerPosition(sock, ziplineData->iX, ziplineData->iY, ziplineData->iZ, plr->instanceID, ziplineData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_ZIPLINE, ziplineResponse); - - ziplineResponse.iPC_ID = plr->iID; - ziplineResponse.iCliTime = ziplineData->iCliTime; - ziplineResponse.iSvrTime = tm; - ziplineResponse.iX = ziplineData->iX; - ziplineResponse.iY = ziplineData->iY; - ziplineResponse.iZ = ziplineData->iZ; - ziplineResponse.fVX = ziplineData->fVX; - ziplineResponse.fVY = ziplineData->fVY; - ziplineResponse.fVZ = ziplineData->fVZ; - ziplineResponse.fMovDistance = ziplineData->fMovDistance; - ziplineResponse.fMaxDistance = ziplineData->fMaxDistance; - ziplineResponse.fDummy = ziplineData->fDummy; // wtf is this for? - ziplineResponse.iStX = ziplineData->iStX; - ziplineResponse.iStY = ziplineData->iStY; - ziplineResponse.iStZ = ziplineData->iStZ; - ziplineResponse.bDown = ziplineData->bDown; - ziplineResponse.iSpeed = ziplineData->iSpeed; - ziplineResponse.iAngle = ziplineData->iAngle; - ziplineResponse.iRollMax = ziplineData->iRollMax; - ziplineResponse.iRoll = ziplineData->iRoll; - - sendToViewable(sock, (void*)&ziplineResponse, P_FE2CL_PC_ZIPLINE, sizeof(sP_FE2CL_PC_ZIPLINE)); -} - -void PlayerManager::movePlatformPlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_MOVEPLATFORM)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_MOVEPLATFORM* platformData = (sP_CL2FE_REQ_PC_MOVEPLATFORM*)data->buf; - updatePlayerPosition(sock, platformData->iX, platformData->iY, platformData->iZ, plr->instanceID, platformData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_MOVEPLATFORM, platResponse); - - platResponse.iPC_ID = plr->iID; - platResponse.iCliTime = platformData->iCliTime; - platResponse.iSvrTime = tm; - platResponse.iX = platformData->iX; - platResponse.iY = platformData->iY; - platResponse.iZ = platformData->iZ; - platResponse.iAngle = platformData->iAngle; - platResponse.fVX = platformData->fVX; - platResponse.fVY = platformData->fVY; - platResponse.fVZ = platformData->fVZ; - platResponse.iLcX = platformData->iLcX; - platResponse.iLcY = platformData->iLcY; - platResponse.iLcZ = platformData->iLcZ; - platResponse.iSpeed = platformData->iSpeed; - platResponse.bDown = platformData->bDown; - platResponse.cKeyValue = platformData->cKeyValue; - platResponse.iPlatformID = platformData->iPlatformID; - - sendToViewable(sock, (void*)&platResponse, P_FE2CL_PC_MOVEPLATFORM, sizeof(sP_FE2CL_PC_MOVEPLATFORM)); -} - -void PlayerManager::moveSliderPlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_MOVETRANSPORTATION)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_MOVETRANSPORTATION* sliderData = (sP_CL2FE_REQ_PC_MOVETRANSPORTATION*)data->buf; - updatePlayerPosition(sock, sliderData->iX, sliderData->iY, sliderData->iZ, plr->instanceID, sliderData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_MOVETRANSPORTATION, sliderResponse); - - sliderResponse.iPC_ID = plr->iID; - sliderResponse.iCliTime = sliderData->iCliTime; - sliderResponse.iSvrTime = tm; - sliderResponse.iX = sliderData->iX; - sliderResponse.iY = sliderData->iY; - sliderResponse.iZ = sliderData->iZ; - sliderResponse.iAngle = sliderData->iAngle; - sliderResponse.fVX = sliderData->fVX; - sliderResponse.fVY = sliderData->fVY; - sliderResponse.fVZ = sliderData->fVZ; - sliderResponse.iLcX = sliderData->iLcX; - sliderResponse.iLcY = sliderData->iLcY; - sliderResponse.iLcZ = sliderData->iLcZ; - sliderResponse.iSpeed = sliderData->iSpeed; - sliderResponse.cKeyValue = sliderData->cKeyValue; - sliderResponse.iT_ID = sliderData->iT_ID; - - sendToViewable(sock, (void*)&sliderResponse, P_FE2CL_PC_MOVETRANSPORTATION, sizeof(sP_FE2CL_PC_MOVETRANSPORTATION)); -} - -void PlayerManager::moveSlopePlayer(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_PC_SLOPE)) - return; // ignore the malformed packet - - Player* plr = getPlayer(sock); - - sP_CL2FE_REQ_PC_SLOPE* slopeData = (sP_CL2FE_REQ_PC_SLOPE*)data->buf; - updatePlayerPosition(sock, slopeData->iX, slopeData->iY, slopeData->iZ, plr->instanceID, slopeData->iAngle); - - uint64_t tm = getTime(); - - INITSTRUCT(sP_FE2CL_PC_SLOPE, slopeResponse); - - slopeResponse.iPC_ID = plr->iID; - slopeResponse.iCliTime = slopeData->iCliTime; - slopeResponse.iSvrTime = tm; - slopeResponse.iX = slopeData->iX; - slopeResponse.iY = slopeData->iY; - slopeResponse.iZ = slopeData->iZ; - slopeResponse.iAngle = slopeData->iAngle; - slopeResponse.fVX = slopeData->fVX; - slopeResponse.fVY = slopeData->fVY; - slopeResponse.fVZ = slopeData->fVZ; - slopeResponse.iSpeed = slopeData->iSpeed; - slopeResponse.cKeyValue = slopeData->cKeyValue; - slopeResponse.iSlopeID = slopeData->iSlopeID; - - sendToViewable(sock, (void*)&slopeResponse, P_FE2CL_PC_SLOPE, sizeof(sP_FE2CL_PC_SLOPE)); -} - void PlayerManager::heartbeatPlayer(CNSocket* sock, CNPacketData* data) { getPlayer(sock)->lastHeartbeat = getTime(); } diff --git a/src/PlayerManager.hpp b/src/PlayerManager.hpp index 06d7d47..a99f7cc 100644 --- a/src/PlayerManager.hpp +++ b/src/PlayerManager.hpp @@ -28,15 +28,6 @@ namespace PlayerManager { void enterPlayer(CNSocket* sock, CNPacketData* data); void loadPlayer(CNSocket* sock, CNPacketData* data); - void movePlayer(CNSocket* sock, CNPacketData* data); - void stopPlayer(CNSocket* sock, CNPacketData* data); - void jumpPlayer(CNSocket* sock, CNPacketData* data); - void jumppadPlayer(CNSocket* sock, CNPacketData* data); - void launchPlayer(CNSocket* sock, CNPacketData* data); - void ziplinePlayer(CNSocket* sock, CNPacketData* data); - void movePlatformPlayer(CNSocket* sock, CNPacketData* data); - void moveSliderPlayer(CNSocket* sock, CNPacketData* data); - void moveSlopePlayer(CNSocket* sock, CNPacketData* data); void heartbeatPlayer(CNSocket* sock, CNPacketData* data); void revivePlayer(CNSocket* sock, CNPacketData* data); void exitGame(CNSocket* sock, CNPacketData* data); diff --git a/src/PlayerMovement.cpp b/src/PlayerMovement.cpp new file mode 100644 index 0000000..ecc31d5 --- /dev/null +++ b/src/PlayerMovement.cpp @@ -0,0 +1,295 @@ +#include "PlayerMovement.hpp" +#include "PlayerManager.hpp" +#include "CNProtocol.hpp" + +static void movePlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_MOVE)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_MOVE* moveData = (sP_CL2FE_REQ_PC_MOVE*)data->buf; + PlayerManager::updatePlayerPosition(sock, moveData->iX, moveData->iY, moveData->iZ, plr->instanceID, moveData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_MOVE, moveResponse); + + moveResponse.iID = plr->iID; + moveResponse.cKeyValue = moveData->cKeyValue; + + moveResponse.iX = moveData->iX; + moveResponse.iY = moveData->iY; + moveResponse.iZ = moveData->iZ; + moveResponse.iAngle = moveData->iAngle; + moveResponse.fVX = moveData->fVX; + moveResponse.fVY = moveData->fVY; + moveResponse.fVZ = moveData->fVZ; + + moveResponse.iSpeed = moveData->iSpeed; + moveResponse.iCliTime = moveData->iCliTime; // maybe don't send this??? seems unneeded... + moveResponse.iSvrTime = tm; + + PlayerManager::sendToViewable(sock, (void*)&moveResponse, P_FE2CL_PC_MOVE, sizeof(sP_FE2CL_PC_MOVE)); +} + +static void stopPlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_STOP)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_STOP* stopData = (sP_CL2FE_REQ_PC_STOP*)data->buf; + PlayerManager::updatePlayerPosition(sock, stopData->iX, stopData->iY, stopData->iZ, plr->instanceID, plr->angle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_STOP, stopResponse); + + stopResponse.iID = plr->iID; + + stopResponse.iX = stopData->iX; + stopResponse.iY = stopData->iY; + stopResponse.iZ = stopData->iZ; + + stopResponse.iCliTime = stopData->iCliTime; // maybe don't send this??? seems unneeded... + stopResponse.iSvrTime = tm; + + PlayerManager::sendToViewable(sock, (void*)&stopResponse, P_FE2CL_PC_STOP, sizeof(sP_FE2CL_PC_STOP)); +} + +static void jumpPlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_JUMP)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_JUMP* jumpData = (sP_CL2FE_REQ_PC_JUMP*)data->buf; + PlayerManager::updatePlayerPosition(sock, jumpData->iX, jumpData->iY, jumpData->iZ, plr->instanceID, jumpData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_JUMP, jumpResponse); + + jumpResponse.iID = plr->iID; + jumpResponse.cKeyValue = jumpData->cKeyValue; + + jumpResponse.iX = jumpData->iX; + jumpResponse.iY = jumpData->iY; + jumpResponse.iZ = jumpData->iZ; + jumpResponse.iAngle = jumpData->iAngle; + jumpResponse.iVX = jumpData->iVX; + jumpResponse.iVY = jumpData->iVY; + jumpResponse.iVZ = jumpData->iVZ; + + jumpResponse.iSpeed = jumpData->iSpeed; + jumpResponse.iCliTime = jumpData->iCliTime; // maybe don't send this??? seems unneeded... + jumpResponse.iSvrTime = tm; + + PlayerManager::sendToViewable(sock, (void*)&jumpResponse, P_FE2CL_PC_JUMP, sizeof(sP_FE2CL_PC_JUMP)); +} + +static void jumppadPlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_JUMPPAD)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_JUMPPAD* jumppadData = (sP_CL2FE_REQ_PC_JUMPPAD*)data->buf; + PlayerManager::updatePlayerPosition(sock, jumppadData->iX, jumppadData->iY, jumppadData->iZ, plr->instanceID, jumppadData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_JUMPPAD, jumppadResponse); + + jumppadResponse.iPC_ID = plr->iID; + jumppadResponse.cKeyValue = jumppadData->cKeyValue; + + jumppadResponse.iX = jumppadData->iX; + jumppadResponse.iY = jumppadData->iY; + jumppadResponse.iZ = jumppadData->iZ; + jumppadResponse.iVX = jumppadData->iVX; + jumppadResponse.iVY = jumppadData->iVY; + jumppadResponse.iVZ = jumppadData->iVZ; + + jumppadResponse.iCliTime = jumppadData->iCliTime; + jumppadResponse.iSvrTime = tm; + + PlayerManager::sendToViewable(sock, (void*)&jumppadResponse, P_FE2CL_PC_JUMPPAD, sizeof(sP_FE2CL_PC_JUMPPAD)); +} + +static void launchPlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_LAUNCHER)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_LAUNCHER* launchData = (sP_CL2FE_REQ_PC_LAUNCHER*)data->buf; + PlayerManager::updatePlayerPosition(sock, launchData->iX, launchData->iY, launchData->iZ, plr->instanceID, launchData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_LAUNCHER, launchResponse); + + launchResponse.iPC_ID = plr->iID; + + launchResponse.iX = launchData->iX; + launchResponse.iY = launchData->iY; + launchResponse.iZ = launchData->iZ; + launchResponse.iVX = launchData->iVX; + launchResponse.iVY = launchData->iVY; + launchResponse.iVZ = launchData->iVZ; + launchResponse.iSpeed = launchData->iSpeed; + launchResponse.iAngle = launchData->iAngle; + + launchResponse.iCliTime = launchData->iCliTime; + launchResponse.iSvrTime = tm; + + PlayerManager::sendToViewable(sock, (void*)&launchResponse, P_FE2CL_PC_LAUNCHER, sizeof(sP_FE2CL_PC_LAUNCHER)); +} + +static void ziplinePlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_ZIPLINE)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_ZIPLINE* ziplineData = (sP_CL2FE_REQ_PC_ZIPLINE*)data->buf; + PlayerManager::updatePlayerPosition(sock, ziplineData->iX, ziplineData->iY, ziplineData->iZ, plr->instanceID, ziplineData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_ZIPLINE, ziplineResponse); + + ziplineResponse.iPC_ID = plr->iID; + ziplineResponse.iCliTime = ziplineData->iCliTime; + ziplineResponse.iSvrTime = tm; + ziplineResponse.iX = ziplineData->iX; + ziplineResponse.iY = ziplineData->iY; + ziplineResponse.iZ = ziplineData->iZ; + ziplineResponse.fVX = ziplineData->fVX; + ziplineResponse.fVY = ziplineData->fVY; + ziplineResponse.fVZ = ziplineData->fVZ; + ziplineResponse.fMovDistance = ziplineData->fMovDistance; + ziplineResponse.fMaxDistance = ziplineData->fMaxDistance; + ziplineResponse.fDummy = ziplineData->fDummy; // wtf is this for? + ziplineResponse.iStX = ziplineData->iStX; + ziplineResponse.iStY = ziplineData->iStY; + ziplineResponse.iStZ = ziplineData->iStZ; + ziplineResponse.bDown = ziplineData->bDown; + ziplineResponse.iSpeed = ziplineData->iSpeed; + ziplineResponse.iAngle = ziplineData->iAngle; + ziplineResponse.iRollMax = ziplineData->iRollMax; + ziplineResponse.iRoll = ziplineData->iRoll; + + PlayerManager::sendToViewable(sock, (void*)&ziplineResponse, P_FE2CL_PC_ZIPLINE, sizeof(sP_FE2CL_PC_ZIPLINE)); +} + +static void movePlatformPlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_MOVEPLATFORM)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_MOVEPLATFORM* platformData = (sP_CL2FE_REQ_PC_MOVEPLATFORM*)data->buf; + PlayerManager::updatePlayerPosition(sock, platformData->iX, platformData->iY, platformData->iZ, plr->instanceID, platformData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_MOVEPLATFORM, platResponse); + + platResponse.iPC_ID = plr->iID; + platResponse.iCliTime = platformData->iCliTime; + platResponse.iSvrTime = tm; + platResponse.iX = platformData->iX; + platResponse.iY = platformData->iY; + platResponse.iZ = platformData->iZ; + platResponse.iAngle = platformData->iAngle; + platResponse.fVX = platformData->fVX; + platResponse.fVY = platformData->fVY; + platResponse.fVZ = platformData->fVZ; + platResponse.iLcX = platformData->iLcX; + platResponse.iLcY = platformData->iLcY; + platResponse.iLcZ = platformData->iLcZ; + platResponse.iSpeed = platformData->iSpeed; + platResponse.bDown = platformData->bDown; + platResponse.cKeyValue = platformData->cKeyValue; + platResponse.iPlatformID = platformData->iPlatformID; + + PlayerManager::sendToViewable(sock, (void*)&platResponse, P_FE2CL_PC_MOVEPLATFORM, sizeof(sP_FE2CL_PC_MOVEPLATFORM)); +} + +static void moveSliderPlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_MOVETRANSPORTATION)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_MOVETRANSPORTATION* sliderData = (sP_CL2FE_REQ_PC_MOVETRANSPORTATION*)data->buf; + PlayerManager::updatePlayerPosition(sock, sliderData->iX, sliderData->iY, sliderData->iZ, plr->instanceID, sliderData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_MOVETRANSPORTATION, sliderResponse); + + sliderResponse.iPC_ID = plr->iID; + sliderResponse.iCliTime = sliderData->iCliTime; + sliderResponse.iSvrTime = tm; + sliderResponse.iX = sliderData->iX; + sliderResponse.iY = sliderData->iY; + sliderResponse.iZ = sliderData->iZ; + sliderResponse.iAngle = sliderData->iAngle; + sliderResponse.fVX = sliderData->fVX; + sliderResponse.fVY = sliderData->fVY; + sliderResponse.fVZ = sliderData->fVZ; + sliderResponse.iLcX = sliderData->iLcX; + sliderResponse.iLcY = sliderData->iLcY; + sliderResponse.iLcZ = sliderData->iLcZ; + sliderResponse.iSpeed = sliderData->iSpeed; + sliderResponse.cKeyValue = sliderData->cKeyValue; + sliderResponse.iT_ID = sliderData->iT_ID; + + PlayerManager::sendToViewable(sock, (void*)&sliderResponse, P_FE2CL_PC_MOVETRANSPORTATION, sizeof(sP_FE2CL_PC_MOVETRANSPORTATION)); +} + +static void moveSlopePlayer(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_PC_SLOPE)) + return; // ignore the malformed packet + + Player* plr = PlayerManager::getPlayer(sock); + + sP_CL2FE_REQ_PC_SLOPE* slopeData = (sP_CL2FE_REQ_PC_SLOPE*)data->buf; + PlayerManager::updatePlayerPosition(sock, slopeData->iX, slopeData->iY, slopeData->iZ, plr->instanceID, slopeData->iAngle); + + uint64_t tm = getTime(); + + INITSTRUCT(sP_FE2CL_PC_SLOPE, slopeResponse); + + slopeResponse.iPC_ID = plr->iID; + slopeResponse.iCliTime = slopeData->iCliTime; + slopeResponse.iSvrTime = tm; + slopeResponse.iX = slopeData->iX; + slopeResponse.iY = slopeData->iY; + slopeResponse.iZ = slopeData->iZ; + slopeResponse.iAngle = slopeData->iAngle; + slopeResponse.fVX = slopeData->fVX; + slopeResponse.fVY = slopeData->fVY; + slopeResponse.fVZ = slopeData->fVZ; + slopeResponse.iSpeed = slopeData->iSpeed; + slopeResponse.cKeyValue = slopeData->cKeyValue; + slopeResponse.iSlopeID = slopeData->iSlopeID; + + PlayerManager::sendToViewable(sock, (void*)&slopeResponse, P_FE2CL_PC_SLOPE, sizeof(sP_FE2CL_PC_SLOPE)); +} + +void PlayerMovement::init() { + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVE, movePlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_STOP, stopPlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_JUMP, jumpPlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_JUMPPAD, jumppadPlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_LAUNCHER, launchPlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_ZIPLINE, ziplinePlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVEPLATFORM, movePlatformPlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_MOVETRANSPORTATION, moveSliderPlayer); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_SLOPE, moveSlopePlayer); +} diff --git a/src/PlayerMovement.hpp b/src/PlayerMovement.hpp new file mode 100644 index 0000000..1e55e5f --- /dev/null +++ b/src/PlayerMovement.hpp @@ -0,0 +1,5 @@ +#pragma once + +namespace PlayerMovement { + void init(); +}; diff --git a/src/main.cpp b/src/main.cpp index 1e2511e..0f69a16 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include "CNLoginServer.hpp" #include "CNShardServer.hpp" #include "PlayerManager.hpp" +#include "PlayerMovement.hpp" #include "BuiltinCommands.hpp" #include "ChatManager.hpp" #include "CustomCommands.hpp" @@ -95,6 +96,7 @@ int main() { std::cout << "[INFO] Intializing Packet Managers..." << std::endl; TableData::init(); PlayerManager::init(); + PlayerMovement::init(); BuiltinCommands::init(); ChatManager::init(); CustomCommands::init();