diff --git a/src/Abilities.cpp b/src/Abilities.cpp index 0859220..2e4f44d 100644 --- a/src/Abilities.cpp +++ b/src/Abilities.cpp @@ -76,12 +76,20 @@ static SkillResult handleSkillDamageNDebuff(SkillData* skill, int power, ICombat } sSkillResult_Damage_N_Debuff result{}; + result.iDamage = duration / 10; // we use the duration as the damage number (why?) result.iHP = target->getCurrentHP(); result.eCT = target->getCharType(); result.iID = target->getID(); result.bProtected = blocked; result.iConditionBitFlag = target->getCompositeCondition(); + + // for player targets, make sure to update Nano stamina + if (target->getCharType() == 1) { + Player *plr = dynamic_cast(target); + result.iStamina = plr->getActiveNano()->iStamina; + } + return SkillResult(sizeof(sSkillResult_Damage_N_Debuff), &result); } @@ -112,7 +120,8 @@ static SkillResult handleSkillBuff(SkillData* skill, int power, ICombatant* sour int duration = skill->durationTime[power]; int strength = skill->values[0][power]; BuffStack passiveBuff = { - skill->drainType == SkillDrainType::PASSIVE ? 1 : (duration * 100) / MS_PER_COMBAT_TICK, // ticks + // if the duration is 0, it needs to be recast every tick + duration == 0 ? 1 : (duration * 100) / MS_PER_COMBAT_TICK, // ticks strength, // value source->getRef(), // source source == target ? BuffClass::NANO : BuffClass::GROUP_NANO, // buff class @@ -123,7 +132,7 @@ static SkillResult handleSkillBuff(SkillData* skill, int power, ICombatant* sour int combatLifetime = 0; if(!target->addBuff(timeBuffId, [drainType](EntityRef self, Buff* buff, int status, BuffStack* stack) { - if(buff->id == ECSB_BOUNDINGBALL) { + if(buff->id == ECSB_BOUNDINGBALL && status == ETBU_ADD) { // drain ICombatant* combatant = dynamic_cast(self.getEntity()); combatant->takeDamage(buff->getLastSource(), 0); // aggro @@ -138,7 +147,7 @@ static SkillResult handleSkillBuff(SkillData* skill, int power, ICombatant* sour Buffs::tickDrain(self, buff, COMBAT_TICKS_PER_DRAIN_PROC); // drain combatLifetime++; }, - &passiveBuff)) return SkillResult(); // no result if already buffed + &passiveBuff)) return SkillResult(); sSkillResult_Buff result{}; result.eCT = target->getCharType(); diff --git a/src/Abilities.hpp b/src/Abilities.hpp index 2470516..100dadf 100644 --- a/src/Abilities.hpp +++ b/src/Abilities.hpp @@ -15,12 +15,12 @@ constexpr size_t MAX_SKILLRESULT_SIZE = sizeof(sSkillResult_BatteryDrain); enum class SkillType { DAMAGE = 1, HEAL_HP = 2, - KNOCKDOWN = 3, // dnd - SLEEP = 4, // dnd - SNARE = 5, // dnd + KNOCKDOWN = 3, // uses DamageNDebuff + SLEEP = 4, // uses DamageNDebuff + SNARE = 5, // uses DamageNDebuff HEAL_STAMINA = 6, STAMINA_SELF = 7, - STUN = 8, // dnd + STUN = 8, // uses DamageNDebuff WEAPONSLOW = 9, JUMP = 10, RUN = 11, diff --git a/src/Combat.cpp b/src/Combat.cpp index 80fbab1..87c10a7 100644 --- a/src/Combat.cpp +++ b/src/Combat.cpp @@ -175,10 +175,13 @@ void Player::step(time_t currTime) { #pragma endregion #pragma region CombatNPC -bool CombatNPC::addBuff(int buffId, BuffCallback onUpdate, BuffCallback onTick, BuffStack* stack) { /* stubbed */ +bool CombatNPC::addBuff(int buffId, BuffCallback onUpdate, BuffCallback onTick, BuffStack* stack) { if(!isAlive()) return false; + if (this->state != AIState::COMBAT && this->state != AIState::ROAMING) + return false; + if(!hasBuff(buffId)) { buffs[buffId] = new Buff(buffId, getRef(), onUpdate, onTick, stack); return true; @@ -189,7 +192,7 @@ bool CombatNPC::addBuff(int buffId, BuffCallback onUpdate, Buff return false; } -Buff* CombatNPC::getBuff(int buffId) { /* stubbed */ +Buff* CombatNPC::getBuff(int buffId) { if(hasBuff(buffId)) { return buffs[buffId]; }