diff --git a/src/ItemManager.cpp b/src/ItemManager.cpp index 648eec5..6235ad2 100644 --- a/src/ItemManager.cpp +++ b/src/ItemManager.cpp @@ -286,13 +286,7 @@ void ItemManager::itemUseHandler(CNSocket* sock, CNPacketData* data) { resp->RemainItem = gumball; resp->iTargetCnt = 1; resp->eST = EST_NANOSTIMPAK; - - if (request->iNanoSlot == 1) - resp->iSkillID = 191; - else if (request->iNanoSlot == 2) - resp->iSkillID = 197; - else - resp->iSkillID = 144; + resp->iSkillID = 144; int value1 = CSB_BIT_STIMPAKSLOT1 << request->iNanoSlot; int value2 = ECSB_STIMPAKSLOT1 + request->iNanoSlot; @@ -312,8 +306,8 @@ void ItemManager::itemUseHandler(CNSocket* sock, CNPacketData* data) { // update inventory serverside player->Inven[resp->iSlotNum] = resp->RemainItem; - std::pair key = std::make_pair(sock, resp->iSkillID); - time_t until = getTime() + (time_t)NanoManager::SkillTable[resp->iSkillID].durationTime[0] * 10; + std::pair key = std::make_pair(sock, value1); + time_t until = getTime() + (time_t)NanoManager::SkillTable[144].durationTime[0] * 10; NPCManager::EggBuffs[key] = until; } diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 05a3abd..527f842 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -578,12 +578,14 @@ int NPCManager::eggBuffPlayer(CNSocket* sock, int skillId, int eggId) { if (otherPlr == nullptr) return -1; - std::pair key = std::make_pair(sock, skillId); + int CBFlag = 0; int bitFlag = GroupManager::getGroupFlags(otherPlr); - if (EggBuffs.find(key) == EggBuffs.end()) - if (!NanoManager::applyBuff(sock, skillId, 1, 3, bitFlag)) - return -1; + CBFlag = NanoManager::applyBuff(sock, skillId, 1, 3, bitFlag); + if (CBFlag == 0) + return -1; + + std::pair key = std::make_pair(sock, CBFlag); // save the buff serverside; // if you get the same buff again, new duration will override the previous one @@ -629,15 +631,25 @@ void NPCManager::eggStep(CNServer* serv, time_t currTime) { // if time reached 0 else { CNSocket* sock = it->first.first; - int32_t skillId = it->first.second; + int32_t CBFlag = it->first.second; Player* plr = PlayerManager::getPlayer(sock); Player* otherPlr = PlayerManager::getPlayerFromID(plr->iIDGroup); if (otherPlr == nullptr) - return; + continue; - int bitFlag = GroupManager::getGroupFlags(otherPlr); - NanoManager::applyBuff(sock, skillId, 2, 3, bitFlag); + int groupFlags = GroupManager::getGroupFlags(otherPlr); + for (auto& pwr : NanoManager::NanoPowers) { + if (pwr.bitFlag == CBFlag) { + INITSTRUCT(sP_FE2CL_PC_BUFF_UPDATE, resp); + resp.eCSTB = pwr.timeBuffID; + resp.eTBU = 2; + resp.eTBT = 3; // for egg buffs + plr->iConditionBitFlag &= ~CBFlag; + resp.iConditionBitFlag = plr->iConditionBitFlag |= groupFlags | plr->iSelfConditionBitFlag; + sock->sendPacket((void*)&resp, P_FE2CL_PC_BUFF_UPDATE, sizeof(sP_FE2CL_PC_BUFF_UPDATE)); + } + } // remove buff from the map it = EggBuffs.erase(it); } diff --git a/src/NanoManager.cpp b/src/NanoManager.cpp index 7c21f4a..5287f9d 100644 --- a/src/NanoManager.cpp +++ b/src/NanoManager.cpp @@ -305,15 +305,9 @@ void NanoManager::summonNano(CNSocket *sock, int slot) { if (SkillTable[skillID].drainType == 2) { int *targetData = findTargets(plr, skillID); - int boost = 0; - for (int i = 0; i < 3; i++) - if (plr->equippedNanos[i] == plr->activeNano) - if (plr->iConditionBitFlag & (CSB_BIT_STIMPAKSLOT1 << i)) - boost = 1; - - for (auto& pwr : NanoPowers) - if (pwr.skillType == SkillTable[skillID].skillType) - nanoUnbuff(sock, targetData, pwr.bitFlag, pwr.timeBuffID, SkillTable[skillID].powerIntensity[boost],(SkillTable[skillID].targetType == 3)); + for (auto& pwr : NanoPowers) + if (pwr.skillType == SkillTable[skillID].skillType) + nanoUnbuff(sock, targetData, pwr.bitFlag, pwr.timeBuffID, 0,(SkillTable[skillID].targetType == 3)); } int16_t nanoID = slot == -1 ? 0 : plr->equippedNanos[slot]; @@ -480,9 +474,9 @@ void NanoManager::nanoUnbuff(CNSocket* sock, int targetData[], int32_t bitFlag, } } -bool NanoManager::applyBuff(CNSocket* sock, int skillID, int eTBU, int eTBT, int32_t groupFlags) { +int NanoManager::applyBuff(CNSocket* sock, int skillID, int eTBU, int eTBT, int32_t groupFlags) { if (SkillTable[skillID].drainType == 1) - return false; + return 0; int32_t bitFlag = 0; @@ -496,30 +490,20 @@ bool NanoManager::applyBuff(CNSocket* sock, int skillID, int eTBU, int eTBT, int resp.eTBU = eTBU; resp.eTBT = eTBT; - if (skillID == 191) { // dealing with gumballs - resp.eCSTB = pwr.timeBuffID + 1; - bitFlag = bitFlag << 1; - } else if (skillID == 197) { - resp.eCSTB = pwr.timeBuffID + 2; - bitFlag = bitFlag << 2; - } - if (eTBU == 1) plr->iConditionBitFlag |= bitFlag; else plr->iConditionBitFlag &= ~bitFlag; resp.iConditionBitFlag = plr->iConditionBitFlag |= groupFlags | plr->iSelfConditionBitFlag; - resp.TimeBuff.iValue = SkillTable[skillID].powerIntensity[0]; - sock->sendPacket((void*)&resp, P_FE2CL_PC_BUFF_UPDATE, sizeof(sP_FE2CL_PC_BUFF_UPDATE)); } - return true; + return bitFlag; } } - return false; + return 0; } // 0=A 1=B 2=C -1=Not found diff --git a/src/NanoManager.hpp b/src/NanoManager.hpp index a7de27c..8c93dd4 100644 --- a/src/NanoManager.hpp +++ b/src/NanoManager.hpp @@ -65,7 +65,7 @@ namespace NanoManager { void setNanoSkill(CNSocket* sock, sP_CL2FE_REQ_NANO_TUNE* skill); void resetNanoSkill(CNSocket* sock, int16_t nanoID); void nanoUnbuff(CNSocket* sock, int* targetData, int32_t bitFlag, int16_t timeBuffID, int16_t amount, bool groupPower); - bool applyBuff(CNSocket* sock, int skillID, int eTBU, int eTBT, int32_t groupFlags); + int applyBuff(CNSocket* sock, int skillID, int eTBU, int eTBT, int32_t groupFlags); int nanoStyle(int nanoID); int* findTargets(Player* plr, int skillID, CNPacketData* data = nullptr); }