From 18633124ac162d9a2e3ec872efa8ccde97679698 Mon Sep 17 00:00:00 2001 From: Onii-chan Date: Sat, 22 Aug 2020 13:49:32 +0200 Subject: [PATCH] Test: Add nano power feature Nano powers are set to the first power in its selection by default. --- src/NanoManager.cpp | 110 ++++++++++++++++++++++++++++++++++++++---- src/PlayerManager.cpp | 10 ++++ 2 files changed, 110 insertions(+), 10 deletions(-) diff --git a/src/NanoManager.cpp b/src/NanoManager.cpp index 4e773d0..82c8df3 100644 --- a/src/NanoManager.cpp +++ b/src/NanoManager.cpp @@ -4,20 +4,110 @@ #include "PlayerManager.hpp" void NanoManager::init() { - REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_ACTIVE, nanoSummonHandler); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_ACTIVE, nanoSummonHandler); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_EQUIP, nanoEquipHandler); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_TUNE, nanoSkillSetHandler); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_SKILL_USE, nanoSkillUseHandler); +} + +void NanoManager::nanoEquipHandler(CNSocket* sock, CNPacketData* data) { + sP_CL2FE_REQ_NANO_EQUIP* nano = (sP_CL2FE_REQ_NANO_EQUIP*)data->buf; + sP_FE2CL_REP_NANO_EQUIP_SUCC* resp = (sP_FE2CL_REP_NANO_EQUIP_SUCC*)xmalloc(sizeof(sP_FE2CL_REP_NANO_EQUIP_SUCC)); + resp->iNanoID = nano->iNanoID; + resp->iNanoSlotNum = nano->iNanoSlotNum; + + sock->sendPacket(new CNPacketData((void*)resp, P_FE2CL_REP_NANO_EQUIP_SUCC, sizeof(sP_FE2CL_REP_NANO_EQUIP_SUCC), sock->getFEKey())); + REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_ACTIVE, nanoSummonHandler); } void NanoManager::nanoSummonHandler(CNSocket* sock, CNPacketData* data) { - if (data->size != sizeof(sP_CL2FE_REQ_NANO_ACTIVE)) - return; // malformed packet + if (data->size != sizeof(sP_CL2FE_REQ_NANO_ACTIVE)) + return; // malformed packet - sP_CL2FE_REQ_NANO_ACTIVE* nano = (sP_CL2FE_REQ_NANO_ACTIVE*)data->buf; - PlayerView plr = PlayerManager::players[sock]; + sP_CL2FE_REQ_NANO_ACTIVE* nano = (sP_CL2FE_REQ_NANO_ACTIVE*)data->buf; + PlayerView plr = PlayerManager::players[sock]; - // Send to client - sP_FE2CL_REP_NANO_ACTIVE_SUCC* resp = (sP_FE2CL_REP_NANO_ACTIVE_SUCC*)xmalloc(sizeof(sP_FE2CL_REP_NANO_ACTIVE_SUCC)); - resp->iActiveNanoSlotNum = nano->iNanoSlotNum; - sock->sendPacket(new CNPacketData((void*)resp, P_FE2CL_REP_NANO_ACTIVE_SUCC, sizeof(sP_FE2CL_REP_NANO_ACTIVE_SUCC), sock->getFEKey())); + // Send to client + sP_FE2CL_REP_NANO_ACTIVE_SUCC* resp = (sP_FE2CL_REP_NANO_ACTIVE_SUCC*)xmalloc(sizeof(sP_FE2CL_REP_NANO_ACTIVE_SUCC)); + resp->iActiveNanoSlotNum = nano->iNanoSlotNum; + sock->sendPacket(new CNPacketData((void*)resp, P_FE2CL_REP_NANO_ACTIVE_SUCC, sizeof(sP_FE2CL_REP_NANO_ACTIVE_SUCC), sock->getFEKey())); - std::cout << U16toU8(plr.plr.PCStyle.szFirstName) << U16toU8(plr.plr.PCStyle.szLastName) << " requested to summon nano slot: " << nano->iNanoSlotNum << std::endl; + std::cout << U16toU8(plr.plr.PCStyle.szFirstName) << U16toU8(plr.plr.PCStyle.szLastName) << " requested to summon nano slot: " << nano->iNanoSlotNum << std::endl; } + +void NanoManager::nanoSkillUseHandler(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_NANO_ACTIVE)) + return; // malformed packet + + sP_CL2FE_REQ_NANO_SKILL_USE* skill = (sP_CL2FE_REQ_NANO_SKILL_USE*)data->buf; + PlayerView plr = PlayerManager::players[sock]; + + // Send to client + sP_FE2CL_NANO_SKILL_USE_SUCC* resp = (sP_FE2CL_NANO_SKILL_USE_SUCC*)xmalloc(sizeof(sP_FE2CL_NANO_SKILL_USE_SUCC)); + resp->iArg1 = skill->iArg1; + resp->iArg2 = skill->iArg2; + resp->iArg3 = skill->iArg3; + resp->iBulletID = skill->iBulletID; + resp->iTargetCnt = skill->iTargetCnt; + resp->iPC_ID = plr.plr.iID; + resp->iNanoStamina = 150; // Hardcoded for now + + sock->sendPacket(new CNPacketData((void*)resp, P_FE2CL_NANO_SKILL_USE_SUCC, sizeof(sP_FE2CL_NANO_SKILL_USE_SUCC), sock->getFEKey())); + + std::cout << U16toU8(plr.plr.PCStyle.szFirstName) << U16toU8(plr.plr.PCStyle.szLastName) << " requested to summon nano skill " << std::endl; +} + +void NanoManager::nanoSkillSetHandler(CNSocket* sock, CNPacketData* data) { + if (data->size != sizeof(sP_CL2FE_REQ_NANO_ACTIVE)) + return; // malformed packet + + sP_CL2FE_REQ_NANO_TUNE* skill = (sP_CL2FE_REQ_NANO_TUNE*)data->buf; + setNanoSkill(sock, skill->iNanoID, skill->iTuneID); +} + +void NanoManager::addNano(CNSocket* sock, int16_t nanoId, int16_t slot) { + Player plr = PlayerManager::getPlayer(sock); + + // Send to client + sP_FE2CL_REP_PC_NANO_CREATE_SUCC* resp = new sP_FE2CL_REP_PC_NANO_CREATE_SUCC(); + resp->Nano.iID = nanoId; + resp->Nano.iStamina = 150; + resp->iQuestItemSlotNum = slot; + + sock->sendPacket(new CNPacketData((void*)resp, P_FE2CL_REP_PC_NANO_CREATE_SUCC, sizeof(sP_FE2CL_REP_PC_NANO_CREATE_SUCC), sock->getFEKey())); + + // Update player + plr.Nanos[nanoId] = resp->Nano; + PlayerManager::updatePlayer(sock, plr); +} + +void NanoManager::setNanoSkill(CNSocket* sock, int16_t nanoId, int16_t skillId) { + Player plr = PlayerManager::getPlayer(sock); + sNano nano = plr.Nanos[nanoId]; + + nano.iSkillID = skillId; + plr.Nanos[nanoId] = nano; + + // Send to client + sP_FE2CL_REP_NANO_TUNE_SUCC* resp = (sP_FE2CL_REP_NANO_TUNE_SUCC*)xmalloc(sizeof(sP_FE2CL_REP_NANO_TUNE_SUCC)); + resp->iNanoID = nanoId; + resp->iSkillID = skillId; + + sock->sendPacket(new CNPacketData((void*)resp, P_FE2CL_REP_NANO_TUNE_SUCC, sizeof(sP_FE2CL_REP_NANO_TUNE_SUCC), sock->getFEKey())); + + std::cout << U16toU8(plr.PCStyle.szFirstName) << U16toU8(plr.PCStyle.szLastName) << " set skill id " << skillId << " for nano: " << nanoId << std::endl; + + // Update the player + PlayerManager::updatePlayer(sock, plr); +} + +void NanoManager::resetNanoSkill(CNSocket* sock, int16_t nanoId) { + Player plr = PlayerManager::getPlayer(sock); + sNano nano = plr.Nanos[nanoId]; + + nano.iSkillID = 0; + plr.Nanos[nanoId] = nano; + + // Update the player + PlayerManager::updatePlayer(sock, plr); +} \ No newline at end of file diff --git a/src/PlayerManager.cpp b/src/PlayerManager.cpp index ef41df3..4776f25 100644 --- a/src/PlayerManager.cpp +++ b/src/PlayerManager.cpp @@ -559,3 +559,13 @@ void PlayerManager::exitGame(CNSocket* sock, CNPacketData* data) { sock->sendPacket(new CNPacketData((void*)response, P_FE2CL_REP_PC_EXIT_SUCC, sizeof(sP_FE2CL_REP_PC_EXIT_SUCC), sock->getFEKey())); } + +void PlayerManager::updatePlayer(CNSocket* key, Player plr) { + PlayerView plrv = players[key]; + plrv.plr = plr; + + players[key] = plrv; +} + +void PlayerManager::onPlayerSpawn(CNSocket* sock, CNPacketData* data) { +} \ No newline at end of file