From 2acb90f2d2fab4ff555991900a33e99e6c61f6c0 Mon Sep 17 00:00:00 2001 From: Jade Date: Sat, 7 Nov 2020 23:22:48 +0000 Subject: [PATCH] Initial tabledata implementation --- src/NanoManager.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++ src/NanoManager.hpp | 9 +++++++ src/TableData.cpp | 16 +++++++++++ 3 files changed, 91 insertions(+) diff --git a/src/NanoManager.cpp b/src/NanoManager.cpp index 2bcf105..1f1d170 100644 --- a/src/NanoManager.cpp +++ b/src/NanoManager.cpp @@ -47,6 +47,7 @@ std::set TreasureFinderPowers = {26, 40, 74}; std::map NanoManager::NanoTable; std::map NanoManager::NanoTunings; +std::map NanoManager::SkillTable; void NanoManager::init() { REGISTER_SHARD_PACKET(P_CL2FE_REQ_NANO_ACTIVE, nanoSummonHandler); @@ -60,6 +61,71 @@ void NanoManager::init() { REGISTER_SHARD_PACKET(P_CL2FE_REQ_CHARGE_NANO_STAMINA, nanoPotionHandler); } +void NanoManager::doNanoSkill(CNSocket* sock, int eSkillType, int eCT, int target[]) { + size_t resplen = sizeof(sP_FE2CL_NANO_SKILL_USE); + uint8_t respbuf[4096]; + + if (eSkillType == 1) { //damage + if (!validOutVarPacket(sizeof(sP_FE2CL_NANO_SKILL_USE), target.size(), sizeof(sSkillResult_Damage))) { + std::cout << "[WARN] bad sP_FE2CL_NANO_SKILL_USE packet size\n"; + return; + } + + resplen += target.size() * sizeof(sSkillResult_Damage); + + + } else if + + } + + if (!validOutVarPacket(sizeof(sP_FE2CL_NANO_SKILL_USE), pkt->iTargetCnt, sizeof(sSkillResult_Damage_N_Debuff))) { + std::cout << "[WARN] bad sP_FE2CL_NANO_SKILL_USE packet size\n"; + return; + } + + + + + memset(respbuf, 0, resplen); + + sP_FE2CL_NANO_SKILL_USE *resp = (sP_FE2CL_NANO_SKILL_USE*)respbuf; + sSkillResult_Damage_N_Debuff *respdata = (sSkillResult_Damage_N_Debuff*)(respbuf+sizeof(sP_FE2CL_NANO_SKILL_USE)); + + Player *plr = PlayerManager::getPlayer(sock); + + resp->iPC_ID = plr->iID; + resp->iSkillID = skillId; + resp->iNanoID = nanoId; + resp->iNanoStamina = 150; + resp->eST = eSkillType; + resp->iTargetCnt = pkt->iTargetCnt; + + for (int i = 0; i < pkt->iTargetCnt; i++) { + if (NPCManager::NPCs.find(pktdata[i]) == NPCManager::NPCs.end()) { + // not sure how to best handle this + std::cout << "[WARN] nanoDebuffEnemy: mob ID not found" << std::endl; + return; + } + BaseNPC& mob = NPCManager::NPCs[pktdata[i]]; + + mob.appearanceData.iHP -= damageAmount; + + if (mob.appearanceData.iHP <= 0) + CombatManager::giveReward(sock); + + respdata[i].eCT = 4; + respdata[i].iDamage = damageAmount; + respdata[i].iID = mob.appearanceData.iNPC_ID; + respdata[i].iHP = mob.appearanceData.iHP; + respdata[i].iConditionBitFlag = iCBFlag; + std::cout << (int)mob.appearanceData.iNPC_ID << " was debuffed" << std::endl; + } + + sock->sendPacket((void*)&respbuf, P_FE2CL_NANO_SKILL_USE_SUCC, resplen); + for (CNSocket* s : PlayerManager::players[sock].viewable) + s->sendPacket((void*)&respbuf, P_FE2CL_NANO_SKILL_USE, resplen); +} + void NanoManager::nanoEquipHandler(CNSocket* sock, CNPacketData* data) { if (data->size != sizeof(sP_CL2FE_REQ_NANO_EQUIP)) return; // malformed packet diff --git a/src/NanoManager.hpp b/src/NanoManager.hpp index b59b34a..848024e 100644 --- a/src/NanoManager.hpp +++ b/src/NanoManager.hpp @@ -44,11 +44,20 @@ struct NanoTuning { int reqItems; }; +struct SkillData { + int skillType; + int targetType; + int batteryUse[4]; + int durationTime[4]; + int powerIntensity[4]; +}; + namespace NanoManager { extern std::vector ActivePowers; extern std::vector PassivePowers; extern std::map NanoTable; extern std::map NanoTunings; + extern std::map SkillTable; void init(); void nanoSummonHandler(CNSocket* sock, CNPacketData* data); diff --git a/src/TableData.cpp b/src/TableData.cpp index 387c7a9..ab89f03 100644 --- a/src/TableData.cpp +++ b/src/TableData.cpp @@ -190,6 +190,22 @@ void TableData::init() { std::cout << "[INFO] Loaded " << NanoManager::NanoTable.size() << " nano tunings" << std::endl; + // load nano powers + nlohmann::json skills = xdtData["m_pSkillTable"]["m_pSkillData"]; + + for (nlohmann::json::iterator _skills = skills.begin(); _skills != skills.end(); _skills++) { + auto skills = _skills.value(); + SkillData skillData = {skills["m_iSkillType"], skills["m_iTargetType"]}; + for (int i = 0; i < 4; i++) { + skillData.batteryUse[i] = skills["m_iBatteryDrainUse"][i]; + skillData.durationTime[i] = skills["m_iDurationTime"][i]; + skillData.powerIntensity[i] = skills["m_iValueA"][i]; + } + NanoManager::SkillTable[skills["m_iSkillNumber"]] = skillData; + } + + std::cout << "[INFO] Loaded " << NanoManager::SkillTable.size() << " nano skills" << std::endl; + } catch (const std::exception& err) { std::cerr << "[FATAL] Malformed xdt.json file! Reason:" << err.what() << std::endl;