From 080865faa2ecd8f3bd9ef4c8a410413a8410f3bd Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Mon, 26 Aug 2024 21:27:29 -0400 Subject: [PATCH] [Feature] Add Optional Return to EVENT_DAMAGE_TAKEN (#4454) * [Feature] Add Optional Return to EVENT_DAMAGE_TAKEN # Description - Allows operators to return a value from `EVENT_DAMAGE_TAKEN` to override the amount of damage taken based on any arbitrary criteria they'd like to apply. * Update attack.cpp --- zone/attack.cpp | 59 +++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 3c63a71a0..e7fefe799 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4287,8 +4287,6 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons //final damage has been determined. int old_hp_ratio = (int)GetHPRatio(); - SetHP(int64(GetHP() - damage)); - const auto has_bot_given_event = parse->BotHasQuestSub(EVENT_DAMAGE_GIVEN); const auto has_bot_taken_event = parse->BotHasQuestSub(EVENT_DAMAGE_TAKEN); @@ -4334,30 +4332,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons ); std::vector args; - - if (has_taken_event) { - const auto export_string = fmt::format( - "{} {} {} {} {} {} {} {} {}", - attacker ? attacker->GetID() : 0, - damage, - spell_id, - static_cast(skill_used), - FromDamageShield ? 1 : 0, - avoidable ? 1 : 0, - buffslot, - iBuffTic ? 1 : 0, - static_cast(special) - ); - - if (IsBot() && has_bot_taken_event) { - parse->EventBot(EVENT_DAMAGE_TAKEN, CastToBot(), attacker ? attacker : nullptr, export_string, 0); - } else if (IsClient() && has_player_taken_event) { - args.push_back(attacker ? attacker : nullptr); - parse->EventPlayer(EVENT_DAMAGE_TAKEN, CastToClient(), export_string, 0, &args); - } else if (IsNPC() && has_npc_taken_event) { - parse->EventNPC(EVENT_DAMAGE_TAKEN, CastToNPC(), attacker ? attacker : nullptr, export_string, 0); - } - } + int64 damage_override = 0; if (has_given_event && attacker) { const auto export_string = fmt::format( @@ -4383,6 +4358,38 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons } } + if (has_taken_event) { + const auto export_string = fmt::format( + "{} {} {} {} {} {} {} {} {}", + attacker ? attacker->GetID() : 0, + damage, + spell_id, + static_cast(skill_used), + FromDamageShield ? 1 : 0, + avoidable ? 1 : 0, + buffslot, + iBuffTic ? 1 : 0, + static_cast(special) + ); + + if (IsBot() && has_bot_taken_event) { + damage_override = parse->EventBot(EVENT_DAMAGE_TAKEN, CastToBot(), attacker ? attacker : nullptr, export_string, 0); + } else if (IsClient() && has_player_taken_event) { + args.push_back(attacker ? attacker : nullptr); + damage_override = parse->EventPlayer(EVENT_DAMAGE_TAKEN, CastToClient(), export_string, 0, &args); + } else if (IsNPC() && has_npc_taken_event) { + damage_override = parse->EventNPC(EVENT_DAMAGE_TAKEN, CastToNPC(), attacker ? attacker : nullptr, export_string, 0); + } + } + + if (damage_override > 0) { + damage = damage_override; + } else if (damage_override < 0) { + damage = 0; + } + + SetHP(int64(GetHP() - damage)); + if (HasDied()) { bool IsSaved = false;