From 323db7e6618b53d4c2c2f0ddfe9b4b5709becf7b Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 19 Oct 2020 16:03:48 -0400 Subject: [PATCH] Fixes Overheat behavior (#5455) * Fixes #5395. * Fixes Overheat not properly accounting for the Mechanic during battle calculations. * Minor cleanups and improvements. Thanks to @LotusRO! Co-authored-by: Lemongrass3110 --- src/map/battle.cpp | 9 +++------ src/map/pc.cpp | 12 ++++++------ src/map/status.cpp | 6 +++--- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 6f8da4f042..abf5d2fc62 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1351,7 +1351,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe */ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Damage *d,int64 damage,uint16 skill_id,uint16 skill_lv) { - struct map_session_data *sd = NULL; + struct map_session_data *sd = NULL, *tsd = BL_CAST(BL_PC, src); struct status_change *sc; struct status_change_entry *sce; int div_ = d->div_, flag = d->flag; @@ -1435,7 +1435,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam #endif if( damage ) { - struct map_session_data *tsd = BL_CAST(BL_PC, src); if( sc->data[SC_DEEPSLEEP] ) { damage += damage / 2; // 1.5 times more damage while in Deep Sleep. status_change_end(bl,SC_DEEPSLEEP,INVALID_TIMER); @@ -1689,8 +1688,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (sc->data[SC_UNLIMITEDHUMMINGVOICE] && flag&BF_MAGIC) damage += damage * sc->data[SC_UNLIMITEDHUMMINGVOICE]->val3 / 100; - map_session_data *tsd = (map_session_data *)src; - if (tsd && (sce = sc->data[SC_SOULREAPER])) { if (rnd()%100 < sce->val2 && tsd->soulball < MAX_SOUL_BALL) { clif_specialeffect(src, 1208, AREA); @@ -1725,7 +1722,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage = div_; } - if (sd && pc_ismadogear(sd)) { + if (tsd && pc_ismadogear(tsd)) { short element = skill_get_ele(skill_id, skill_lv); if( !skill_id || element == ELE_WEAPON ) { //Take weapon's element @@ -1739,7 +1736,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam element = status_get_attack_sc_element(src,status_get_sc(src)); else if( element == ELE_RANDOM ) //Use random element element = rnd()%ELE_ALL; - pc_overheat(sd, (element == ELE_FIRE ? 3 : 1)); + pc_overheat(tsd, (element == ELE_FIRE ? 3 : 1)); } return damage; diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 670b2bf02e..e9247938ff 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -11503,14 +11503,14 @@ bool pc_setstand(struct map_session_data *sd, bool force){ * @param heat: Amount of Heat to adjust **/ void pc_overheat(struct map_session_data *sd, int16 heat) { - struct status_change_entry *sce = NULL; - int16 limit[] = { 150, 200, 280, 360, 450 }; - uint16 skill_lv; - nullpo_retv(sd); - skill_lv = cap_value(pc_checkskill(sd, NC_MAINFRAME), 0, 4); - if ((sce = sd->sc.data[SC_OVERHEAT_LIMITPOINT])) { + status_change_entry *sce = sd->sc.data[SC_OVERHEAT_LIMITPOINT]; + + if (sce) { + static std::vector limit = { 150, 200, 280, 360, 450 }; + uint16 skill_lv = cap_value(pc_checkskill(sd, NC_MAINFRAME), 0, limit.size()-1); + sce->val1 += heat; sce->val1 = cap_value(sce->val1, 0, 1000); if (sd->sc.data[SC_OVERHEAT]) diff --git a/src/map/status.cpp b/src/map/status.cpp index 434223ddec..2a7dce6d2f 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -14440,8 +14440,8 @@ TIMER_FUNC(status_change_timer){ case SC_OVERHEAT_LIMITPOINT: if (--(sce->val1) >= 0) { // Cooling - int16 limit[] = { 150, 200, 280, 360, 450 }; - uint16 skill_lv = (sd ? pc_checkskill(sd, NC_MAINFRAME) : 0); + static std::vector limit = { 150, 200, 280, 360, 450 }; + uint16 skill_lv = (sd ? cap_value(pc_checkskill(sd, NC_MAINFRAME), 0, limit.size()-1) : 0); if (sc && sc->data[SC_OVERHEAT]) status_change_end(bl,SC_OVERHEAT,INVALID_TIMER); @@ -14453,7 +14453,7 @@ TIMER_FUNC(status_change_timer){ break; case SC_OVERHEAT: { - int damage = status->max_hp / 100; // Suggestion 1% each second + uint32 damage = status->max_hp / 100; // Suggestion 1% each second if (damage >= status->hp) damage = status->hp - 1; // Do not kill, just keep you with 1 hp minimum