From 45ed99ae35f7cdfeb73e1c2cc40bf3db51299543 Mon Sep 17 00:00:00 2001 From: kamilprzyb Date: Thu, 22 Oct 2020 11:09:50 +0200 Subject: [PATCH] implemented player debuff --- src/NPCManager.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++--- src/NPCManager.hpp | 3 ++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 4eea30e..782e676 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -19,8 +19,8 @@ std::map NPCManager::NPCs; std::map NPCManager::Warps; std::vector NPCManager::RespawnPoints; -/// Player Id, CBFlag -> remaining time -std::map, time_t> NPCManager::EggBuffs; +/// sock, CBFlag -> remaining time +std::map, time_t> NPCManager::EggBuffs; nlohmann::json NPCManager::NPCData; /* @@ -43,6 +43,8 @@ void NPCManager::init() { REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_VENDOR_ITEM_RESTORE_BUY, npcVendorBuyback); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_VENDOR_BATTERY_BUY, npcVendorBuyBattery); REGISTER_SHARD_PACKET(P_CL2FE_REQ_PC_ITEM_COMBINATION, npcCombineItems); + + REGISTER_SHARD_TIMER(buffStep, 1000); } void NPCManager::removeNPC(std::vector viewableChunks, int32_t id) { @@ -672,7 +674,7 @@ int NPCManager::eggBuffPlayer(CNSocket* sock, int skillId, int duration) { if (CBFlag < 0) return -1; - std::pair key = std::make_pair(plr->iID, CBFlag); + std::pair key = std::make_pair(sock, CBFlag); // if player doesn't have this buff yet if (EggBuffs.find(key) == EggBuffs.end()) @@ -697,3 +699,51 @@ int NPCManager::eggBuffPlayer(CNSocket* sock, int skillId, int duration) { return 0; } + +void NPCManager::buffStep(CNServer* serv, time_t currTime) { + + auto it = EggBuffs.begin(); + while (it != EggBuffs.end()) { + // decrement remaining time + it->second --; + if (it->second > 0) + it++; + + // if time reached 0 + else{ + CNSocket* sock = it->first.first; + Player* plr = PlayerManager::getPlayer(sock); + + // if player is still on the server + if (plr != nullptr) { + int32_t CBFlag = it->first.second; + int32_t CSTB = -1, iValue; + + // find CSTB Value + for (auto pwr : NanoManager::PassivePowers) { + if (pwr.iCBFlag == CBFlag) { + CSTB = pwr.eCharStatusTimeBuffID; + iValue = pwr.iValue; + break; + } + } + + if (CSTB >= 0) { + // update CBFlag serverside + plr->iEggConditionBitFlag &= ~CBFlag; + // send buff update packet + INITSTRUCT(sP_FE2CL_PC_BUFF_UPDATE, updatePacket); + updatePacket.eCSTB = CSTB; // eCharStatusTimeBuffID + updatePacket.eTBU = 2; // eTimeBuffUpdate 2 means remove + updatePacket.eTBT = 3; // eTimeBuffType 3 means egg + updatePacket.iConditionBitFlag = plr->iConditionBitFlag | plr->iGroupConditionBitFlag | plr->iEggConditionBitFlag; + updatePacket.TimeBuff.iValue = iValue; + sock->sendPacket((void*)&updatePacket, P_FE2CL_PC_BUFF_UPDATE, sizeof(sP_FE2CL_PC_BUFF_UPDATE)); + } + } + // remove buff from the map + it = EggBuffs.erase(it); + } + + } +} diff --git a/src/NPCManager.hpp b/src/NPCManager.hpp index 24f5f44..6a0d593 100644 --- a/src/NPCManager.hpp +++ b/src/NPCManager.hpp @@ -20,7 +20,7 @@ namespace NPCManager { extern std::map NPCs; extern std::map Warps; extern std::vector RespawnPoints; - extern std::map, time_t> EggBuffs; + extern std::map, time_t> EggBuffs; extern nlohmann::json NPCData; extern int32_t nextId; void init(); @@ -54,4 +54,5 @@ namespace NPCManager { /// returns -1 on fail int eggBuffPlayer(CNSocket* sock, int skillId, int duration); + void buffStep(CNServer* serv, time_t currTime); }