From 0104bc93294b8168ee9c5d87b666e108ca8a2b70 Mon Sep 17 00:00:00 2001 From: Jade Date: Wed, 16 Dec 2020 16:58:23 +0000 Subject: [PATCH] Enemy ability tweaks - Battery drain does not set your battery below 0. - Debuffs cast by enemies take into account intensity now. (Snare will work) - Used int_max to replace arbitrary 20000, added more comments. --- src/MobManager.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/MobManager.cpp b/src/MobManager.cpp index 52f3e9e..534a3b3 100644 --- a/src/MobManager.cpp +++ b/src/MobManager.cpp @@ -557,7 +557,7 @@ void MobManager::combatStep(Mob *mob, time_t currTime) { return; } - int distanceToTravel = 20000; + int distanceToTravel = INT_MAX; int speed = mob->data["m_iRunSpeed"]; // movement logic: move when out of range but don't move while casting a skill if (distance > mobRange && mob->skillStyle == -1) { @@ -598,7 +598,10 @@ void MobManager::combatStep(Mob *mob, time_t currTime) { NPCManager::sendToViewable(mob, &pkt, P_FE2CL_NPC_MOVE, sizeof(sP_FE2CL_NPC_MOVE)); } - // attack logic + /* attack logic + * 2/5 represents 400 ms which is the time interval mobs use per movement logic step + * if the mob is one move interval away, we should just start attacking anyways. + */ if (distance <= mobRange || distanceToTravel < speed*2/5) { if (mob->nextAttack == 0 || currTime >= mob->nextAttack) { mob->nextAttack = currTime + (int)mob->data["m_iDelayTime"] * 100; @@ -1681,6 +1684,7 @@ bool doDamageNDebuff(Mob *mob, sSkillResult_Damage_N_Debuff *respdata, int i, in pkt.eTBU = 1; // eTimeBuffUpdate pkt.eTBT = 2; pkt.iConditionBitFlag = plr->iConditionBitFlag |= bitFlag; + pkt.TimeBuff.iValue = amount; sock->sendPacket((void*)&pkt, P_FE2CL_PC_BUFF_UPDATE, sizeof(sP_FE2CL_PC_BUFF_UPDATE)); } @@ -1834,8 +1838,8 @@ bool doBatteryDrain(Mob *mob, sSkillResult_BatteryDrain *respdata, int i, int32_ respdata[i].iDrainN = amount * (18 + (int)mob->data["m_iNpcLevel"]) / 36; } - respdata[i].iBatteryW = plr->batteryW -= respdata[i].iDrainW; - respdata[i].iBatteryN = plr->batteryN -= respdata[i].iDrainN; + respdata[i].iBatteryW = plr->batteryW -= (respdata[i].iDrainW < plr->batteryW) ? respdata[i].iDrainW : plr->batteryW; + respdata[i].iBatteryN = plr->batteryN -= (respdata[i].iDrainN < plr->batteryN) ? respdata[i].iDrainN : plr->batteryN; respdata[i].iStamina = plr->Nanos[plr->activeNano].iStamina; respdata[i].iConditionBitFlag = plr->iConditionBitFlag;