From 776755bd02919ea4a5101671c0d86534a2ce8674 Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sat, 2 May 2020 04:21:49 +0200 Subject: Implement status icon display for SC_ARMOR_RESIST --- src/map/status.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index d3e85e5be..c502086cf 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -8699,6 +8699,32 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl //associated, and yet are not wrong/unknown. [Skotlex] //break; } + case SC_ARMOR_RESIST: + if (val1 > 0) { + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); + clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } + + if (val2 > 0) { + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); + clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } + + if (val3 > 0) { + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); + clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } + + if (val4 > 0) { + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); + clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } + + break; case SC_MER_FLEE: case SC_MER_ATK: case SC_MER_HIT: @@ -11056,6 +11082,20 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, break; } break; + case SC_ARMOR_RESIST: + if (sce->val1 > 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); + + if (sce->val2 > 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); + + if (sce->val3 > 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); + + if (sce->val4 > 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); + + break; } opt_flag = 1; -- cgit v1.2.3-60-g2f50 From 8194350f0bad88086edf0e7a001b9f41df904099 Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sat, 2 May 2020 04:52:55 +0200 Subject: Implement SC_RESIST_PROPERTY_WATER logic --- src/map/status.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index c502086cf..4f2ebe3db 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -865,6 +865,7 @@ static void initChangeTables(void) status->dbs->ChangeFlagTable[SC_WEDDING] |= SCB_SPEED; status->dbs->ChangeFlagTable[SC_ARMORPROPERTY] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_ARMOR_RESIST] |= SCB_ALL; + status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_WATER] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_ATKER_BLOOD] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_WALKSPEED] |= SCB_SPEED; status->dbs->ChangeFlagTable[SC_TARGET_BLOOD] |= SCB_ALL; @@ -3029,6 +3030,10 @@ static int status_calc_pc_(struct map_session_data *sd, enum e_status_calc_opt o sd->subele[ELE_FIRE] += sc->data[SC_ARMOR_RESIST]->val3; sd->subele[ELE_WIND] += sc->data[SC_ARMOR_RESIST]->val4; } + if (sc->data[SC_RESIST_PROPERTY_WATER] != NULL) { // Coldproof Potion + sd->subele[ELE_WATER] += sc->data[SC_RESIST_PROPERTY_WATER]->val1; + sd->subele[ELE_WIND] += sc->data[SC_RESIST_PROPERTY_WATER]->val2; + } if (sc->data[SC_FIRE_CLOAK_OPTION]) { i = sc->data[SC_FIRE_CLOAK_OPTION]->val2; sd->subele[ELE_FIRE] += i; @@ -7753,6 +7758,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl case SC_ENCHANTARMS: case SC_ARMORPROPERTY: case SC_ARMOR_RESIST: + case SC_RESIST_PROPERTY_WATER: break; case SC_GOSPEL: //Must not override a casting gospel char. @@ -8724,6 +8730,11 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); } + break; + case SC_RESIST_PROPERTY_WATER: + if (val1 <= 0) + flag |= SCFLAG_NOICON; + break; case SC_MER_FLEE: case SC_MER_ATK: -- cgit v1.2.3-60-g2f50 From 5bb28472659689a517dc14fcbcc5041a9f2e9224 Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sat, 2 May 2020 04:59:53 +0200 Subject: Implement SC_RESIST_PROPERTY_GROUND logic --- src/map/status.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index 4f2ebe3db..069fd0580 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -866,6 +866,7 @@ static void initChangeTables(void) status->dbs->ChangeFlagTable[SC_ARMORPROPERTY] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_ARMOR_RESIST] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_WATER] |= SCB_ALL; + status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_GROUND] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_ATKER_BLOOD] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_WALKSPEED] |= SCB_SPEED; status->dbs->ChangeFlagTable[SC_TARGET_BLOOD] |= SCB_ALL; @@ -3034,6 +3035,10 @@ static int status_calc_pc_(struct map_session_data *sd, enum e_status_calc_opt o sd->subele[ELE_WATER] += sc->data[SC_RESIST_PROPERTY_WATER]->val1; sd->subele[ELE_WIND] += sc->data[SC_RESIST_PROPERTY_WATER]->val2; } + if (sc->data[SC_RESIST_PROPERTY_GROUND] != NULL) { // Earthproof Potion + sd->subele[ELE_EARTH] += sc->data[SC_RESIST_PROPERTY_GROUND]->val1; + sd->subele[ELE_FIRE] += sc->data[SC_RESIST_PROPERTY_GROUND]->val2; + } if (sc->data[SC_FIRE_CLOAK_OPTION]) { i = sc->data[SC_FIRE_CLOAK_OPTION]->val2; sd->subele[ELE_FIRE] += i; @@ -7759,6 +7764,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl case SC_ARMORPROPERTY: case SC_ARMOR_RESIST: case SC_RESIST_PROPERTY_WATER: + case SC_RESIST_PROPERTY_GROUND: break; case SC_GOSPEL: //Must not override a casting gospel char. @@ -8732,6 +8738,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl break; case SC_RESIST_PROPERTY_WATER: + case SC_RESIST_PROPERTY_GROUND: if (val1 <= 0) flag |= SCFLAG_NOICON; -- cgit v1.2.3-60-g2f50 From 49988ac53690a0194d111a57603db68941ae3558 Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sat, 2 May 2020 05:05:12 +0200 Subject: Implement SC_RESIST_PROPERTY_FIRE logic --- src/map/status.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index 069fd0580..41805b1e2 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -867,6 +867,7 @@ static void initChangeTables(void) status->dbs->ChangeFlagTable[SC_ARMOR_RESIST] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_WATER] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_GROUND] |= SCB_ALL; + status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_FIRE] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_ATKER_BLOOD] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_WALKSPEED] |= SCB_SPEED; status->dbs->ChangeFlagTable[SC_TARGET_BLOOD] |= SCB_ALL; @@ -3039,6 +3040,10 @@ static int status_calc_pc_(struct map_session_data *sd, enum e_status_calc_opt o sd->subele[ELE_EARTH] += sc->data[SC_RESIST_PROPERTY_GROUND]->val1; sd->subele[ELE_FIRE] += sc->data[SC_RESIST_PROPERTY_GROUND]->val2; } + if (sc->data[SC_RESIST_PROPERTY_FIRE] != NULL) { // Fireproof Potion + sd->subele[ELE_FIRE] += sc->data[SC_RESIST_PROPERTY_FIRE]->val1; + sd->subele[ELE_WATER] += sc->data[SC_RESIST_PROPERTY_FIRE]->val2; + } if (sc->data[SC_FIRE_CLOAK_OPTION]) { i = sc->data[SC_FIRE_CLOAK_OPTION]->val2; sd->subele[ELE_FIRE] += i; @@ -7765,6 +7770,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl case SC_ARMOR_RESIST: case SC_RESIST_PROPERTY_WATER: case SC_RESIST_PROPERTY_GROUND: + case SC_RESIST_PROPERTY_FIRE: break; case SC_GOSPEL: //Must not override a casting gospel char. @@ -8739,6 +8745,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl break; case SC_RESIST_PROPERTY_WATER: case SC_RESIST_PROPERTY_GROUND: + case SC_RESIST_PROPERTY_FIRE: if (val1 <= 0) flag |= SCFLAG_NOICON; -- cgit v1.2.3-60-g2f50 From ad5506fb804ded1435390707c52f6c040aee3a49 Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sat, 2 May 2020 05:09:53 +0200 Subject: Implement SC_RESIST_PROPERTY_WIND logic --- src/map/status.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index 41805b1e2..72c382496 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -868,6 +868,7 @@ static void initChangeTables(void) status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_WATER] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_GROUND] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_FIRE] |= SCB_ALL; + status->dbs->ChangeFlagTable[SC_RESIST_PROPERTY_WIND] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_ATKER_BLOOD] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_WALKSPEED] |= SCB_SPEED; status->dbs->ChangeFlagTable[SC_TARGET_BLOOD] |= SCB_ALL; @@ -3044,6 +3045,10 @@ static int status_calc_pc_(struct map_session_data *sd, enum e_status_calc_opt o sd->subele[ELE_FIRE] += sc->data[SC_RESIST_PROPERTY_FIRE]->val1; sd->subele[ELE_WATER] += sc->data[SC_RESIST_PROPERTY_FIRE]->val2; } + if (sc->data[SC_RESIST_PROPERTY_WIND] != NULL) { // Thunderproof Potion + sd->subele[ELE_WIND] += sc->data[SC_RESIST_PROPERTY_WIND]->val1; + sd->subele[ELE_EARTH] += sc->data[SC_RESIST_PROPERTY_WIND]->val2; + } if (sc->data[SC_FIRE_CLOAK_OPTION]) { i = sc->data[SC_FIRE_CLOAK_OPTION]->val2; sd->subele[ELE_FIRE] += i; @@ -7771,6 +7776,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl case SC_RESIST_PROPERTY_WATER: case SC_RESIST_PROPERTY_GROUND: case SC_RESIST_PROPERTY_FIRE: + case SC_RESIST_PROPERTY_WIND: break; case SC_GOSPEL: //Must not override a casting gospel char. @@ -8746,6 +8752,7 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl case SC_RESIST_PROPERTY_WATER: case SC_RESIST_PROPERTY_GROUND: case SC_RESIST_PROPERTY_FIRE: + case SC_RESIST_PROPERTY_WIND: if (val1 <= 0) flag |= SCFLAG_NOICON; -- cgit v1.2.3-60-g2f50 From 686c575eef6dfbd34ed5d4cbebef6f739d52fdca Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sat, 2 May 2020 16:39:34 +0200 Subject: Apply, remove and re-apply status icons shared by SC_RESIST_PROPERTY_* and SC_ARMOR_RESIST --- src/map/status.c | 364 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 344 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index 72c382496..8faee80d5 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -8723,40 +8723,186 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl //associated, and yet are not wrong/unknown. [Skotlex] //break; } - case SC_ARMOR_RESIST: - if (val1 > 0) { + case SC_ARMOR_RESIST: { + struct status_change_entry *sce_water = sc->data[SC_RESIST_PROPERTY_WATER]; + struct status_change_entry *sce_ground = sc->data[SC_RESIST_PROPERTY_GROUND]; + struct status_change_entry *sce_fire = sc->data[SC_RESIST_PROPERTY_FIRE]; + struct status_change_entry *sce_wind = sc->data[SC_RESIST_PROPERTY_WIND]; + + // Water + int sum_water = val1 + ((sce_fire != NULL) ? sce_fire->val2 : 0); + bool show_icon = true; + if (sce_water != NULL) { + sum_water += sce_water->val1; + int left = (int)DIFF_TICK(timer->get(sce_water->timer)->tick, timer->gettick()); + if (left > total_tick && sum_water - val1 > 0) + show_icon = false; + } + if (val1 > 0 && sum_water > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } else if (sum_water <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); } - if (val2 > 0) { + // Ground + int sum_ground = val2 + ((sce_wind != NULL) ? sce_wind->val2 : 0); + show_icon = true; + if (sce_ground != NULL) { + sum_ground += sce_ground->val1; + int left = (int)DIFF_TICK(timer->get(sce_ground->timer)->tick, timer->gettick()); + if (left > total_tick && sum_ground - val2 > 0) + show_icon = false; + } + if (val2 > 0 && sum_ground > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } else if (sum_ground <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); } - if (val3 > 0) { + // Fire + int sum_fire = val3 + ((sce_ground != NULL) ? sce_ground->val2 : 0); + show_icon = true; + if (sce_fire != NULL) { + sum_fire += sce_fire->val1; + int left = (int)DIFF_TICK(timer->get(sce_fire->timer)->tick, timer->gettick()); + if (left > total_tick && sum_fire - val3 > 0) + show_icon = false; + } + if (val3 > 0 && sum_fire > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } else if (sum_fire <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); } - if (val4 > 0) { + // Wind + int sum_wind = val4 + ((sce_water != NULL) ? sce_water->val2 : 0); + show_icon = true; + if (sce_wind != NULL) { + sum_wind += sce_wind->val1; + int left = (int)DIFF_TICK(timer->get(sce_wind->timer)->tick, timer->gettick()); + if (left > total_tick && sum_wind - val4 > 0) + show_icon = false; + } + if (val4 > 0 && sum_wind > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); clif->status_change(bl, sc_icn, sc_typ, 1, total_tick, 0, 0, 0); + } else if (sum_wind <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); } break; - case SC_RESIST_PROPERTY_WATER: - case SC_RESIST_PROPERTY_GROUND: - case SC_RESIST_PROPERTY_FIRE: - case SC_RESIST_PROPERTY_WIND: - if (val1 <= 0) + } + case SC_RESIST_PROPERTY_WATER: { + struct status_change_entry *sce_all = sc->data[SC_ARMOR_RESIST]; + struct status_change_entry *sce_fire = sc->data[SC_RESIST_PROPERTY_FIRE]; + struct status_change_entry *sce_wind = sc->data[SC_RESIST_PROPERTY_WIND]; + + // Water + int sum_water = val1 + ((sce_fire != NULL) ? sce_fire->val2 : 0); + if (sce_all != NULL) { + sum_water += sce_all->val1; + int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); + if (left > total_tick && sum_water - val1 > 0) + flag |= SCFLAG_NOICON; + } + if (sum_water <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); + flag |= SCFLAG_NOICON; + } + + // Wind + int sum_wind = val2 + ((sce_wind != NULL) ? sce_wind->val1 : 0); + sum_wind += (sce_all != NULL) ? sce_all->val4 : 0; + if (sum_wind <= 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); + + break; + } + case SC_RESIST_PROPERTY_GROUND: { + struct status_change_entry *sce_all = sc->data[SC_ARMOR_RESIST]; + struct status_change_entry *sce_wind = sc->data[SC_RESIST_PROPERTY_WIND]; + struct status_change_entry *sce_fire = sc->data[SC_RESIST_PROPERTY_FIRE]; + + // Ground + int sum_ground = val1 + ((sce_wind != NULL) ? sce_wind->val2 : 0); + if (sce_all != NULL) { + sum_ground += sce_all->val2; + int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); + if (left > total_tick && sum_ground - val1 > 0) + flag |= SCFLAG_NOICON; + } + if (sum_ground <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); + flag |= SCFLAG_NOICON; + } + + // Fire + int sum_fire = val2 + ((sce_fire != NULL) ? sce_fire->val1 : 0); + sum_fire += (sce_all != NULL) ? sce_all->val3 : 0; + if (sum_fire <= 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); + + break; + } + case SC_RESIST_PROPERTY_FIRE: { + struct status_change_entry *sce_all = sc->data[SC_ARMOR_RESIST]; + struct status_change_entry *sce_ground = sc->data[SC_RESIST_PROPERTY_GROUND]; + struct status_change_entry *sce_water = sc->data[SC_RESIST_PROPERTY_WATER]; + + // Fire + int sum_fire = val1 + ((sce_ground != NULL) ? sce_ground->val2 : 0); + if (sce_all != NULL) { + sum_fire += sce_all->val3; + int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); + if (left > total_tick && sum_fire - val1 > 0) + flag |= SCFLAG_NOICON; + } + if (sum_fire <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); flag |= SCFLAG_NOICON; + } + + // Water + int sum_water = val2 + ((sce_water != NULL) ? sce_water->val1 : 0); + sum_water += (sce_all != NULL) ? sce_all->val1 : 0; + if (sum_water <= 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); + + break; + } + case SC_RESIST_PROPERTY_WIND: { + struct status_change_entry *sce_all = sc->data[SC_ARMOR_RESIST]; + struct status_change_entry *sce_water = sc->data[SC_RESIST_PROPERTY_WATER]; + struct status_change_entry *sce_ground = sc->data[SC_RESIST_PROPERTY_GROUND]; + + // Wind + int sum_wind = val1 + ((sce_water != NULL) ? sce_water->val2 : 0); + if (sce_all != NULL) { + sum_wind += sce_all->val4; + int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); + if (left > total_tick && sum_wind - val1 > 0) + flag |= SCFLAG_NOICON; + } + if (sum_wind <= 0) { + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); + flag |= SCFLAG_NOICON; + } + + // Ground + int sum_ground = val2 + ((sce_ground != NULL) ? sce_ground->val1 : 0); + sum_ground += (sce_all != NULL) ? sce_all->val2 : 0; + if (sum_ground <= 0) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); break; + } case SC_MER_FLEE: case SC_MER_ATK: case SC_MER_HIT: @@ -10683,6 +10829,9 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, vd = status->get_viewdata(bl); calc_flag = status->dbs->ChangeFlagTable[type]; + + bool remove_icon = true; + switch(type) { case SC_GRANITIC_ARMOR: { @@ -11114,18 +11263,192 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, break; } break; - case SC_ARMOR_RESIST: - if (sce->val1 > 0) - clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); + case SC_ARMOR_RESIST: { + struct status_change_entry *sce_water = sc->data[SC_RESIST_PROPERTY_WATER]; + struct status_change_entry *sce_ground = sc->data[SC_RESIST_PROPERTY_GROUND]; + struct status_change_entry *sce_fire = sc->data[SC_RESIST_PROPERTY_FIRE]; + struct status_change_entry *sce_wind = sc->data[SC_RESIST_PROPERTY_WIND]; - if (sce->val2 > 0) - clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); + // Water + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); + if (sce_water != NULL) { + int sum_water = sce_water->val1 + ((sce_fire != NULL) ? sce_fire->val2 : 0); + if (sce_water->val1 > 0 && sum_water > 0) { + const struct TimerData *td = timer->get(sce_water->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sce_water->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } - if (sce->val3 > 0) - clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); + // Ground + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); + if (sce_ground != NULL) { + int sum_ground = sce_ground->val1 + ((sce_wind != NULL) ? sce_wind->val2 : 0); + if (sce_ground->val1 > 0 && sum_ground > 0) { + const struct TimerData *td = timer->get(sce_ground->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sce_ground->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } - if (sce->val4 > 0) - clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); + // Fire + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); + if (sce_fire != NULL) { + int sum_fire = sce_fire->val1 + ((sce_ground != NULL) ? sce_ground->val2 : 0); + if (sce_fire->val1 > 0 && sum_fire > 0) { + const struct TimerData *td = timer->get(sce_fire->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sce_fire->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } + + // Wind + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); + if (sce_wind != NULL) { + int sum_wind = sce_wind->val1 + ((sce_water != NULL) ? sce_water->val2 : 0); + if (sce_wind->val1 > 0 && sum_wind > 0) { + const struct TimerData *td = timer->get(sce_wind->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sce_wind->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } + + break; + } + case SC_RESIST_PROPERTY_WATER: + if (sc->data[SC_ARMOR_RESIST] != NULL) { + // Water + int sum_water = sc->data[SC_ARMOR_RESIST]->val1; + if (sc->data[SC_RESIST_PROPERTY_FIRE] != NULL) + sum_water += sc->data[SC_RESIST_PROPERTY_FIRE]->val2; + if (sc->data[SC_ARMOR_RESIST]->val1 > 0 && sum_water > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + remove_icon = false; + } + + // Wind + int sum_wind = sc->data[SC_ARMOR_RESIST]->val4; + if (sc->data[SC_RESIST_PROPERTY_WIND] != NULL) + sum_wind += sc->data[SC_RESIST_PROPERTY_WIND]->val1; + if (sc->data[SC_ARMOR_RESIST]->val4 > 0 && sum_wind > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } + + break; + case SC_RESIST_PROPERTY_GROUND: + if (sc->data[SC_ARMOR_RESIST] != NULL) { + // Ground + int sum_ground = sc->data[SC_ARMOR_RESIST]->val2; + if (sc->data[SC_RESIST_PROPERTY_WIND] != NULL) + sum_ground += sc->data[SC_RESIST_PROPERTY_WIND]->val2; + if (sc->data[SC_ARMOR_RESIST]->val2 > 0 && sum_ground > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + remove_icon = false; + } + + // Fire + int sum_fire = sc->data[SC_ARMOR_RESIST]->val3; + if (sc->data[SC_RESIST_PROPERTY_FIRE] != NULL) + sum_fire += sc->data[SC_RESIST_PROPERTY_FIRE]->val1; + if (sc->data[SC_ARMOR_RESIST]->val3 > 0 && sum_fire > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } + + break; + case SC_RESIST_PROPERTY_FIRE: + if (sc->data[SC_ARMOR_RESIST] != NULL) { + // Fire + int sum_fire = sc->data[SC_ARMOR_RESIST]->val3; + if (sc->data[SC_RESIST_PROPERTY_GROUND] != NULL) + sum_fire += sc->data[SC_RESIST_PROPERTY_GROUND]->val2; + if (sc->data[SC_ARMOR_RESIST]->val3 > 0 && sum_fire > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + remove_icon = false; + } + + // Water + int sum_water = sc->data[SC_ARMOR_RESIST]->val1; + if (sc->data[SC_RESIST_PROPERTY_WATER] != NULL) + sum_water += sc->data[SC_RESIST_PROPERTY_WATER]->val1; + if (sc->data[SC_ARMOR_RESIST]->val1 > 0 && sum_water > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } + + break; + case SC_RESIST_PROPERTY_WIND: + if (sc->data[SC_ARMOR_RESIST] != NULL) { + // Wind + int sum_wind = sc->data[SC_ARMOR_RESIST]->val4; + if (sc->data[SC_RESIST_PROPERTY_WATER] != NULL) + sum_wind += sc->data[SC_RESIST_PROPERTY_WATER]->val2; + if (sc->data[SC_ARMOR_RESIST]->val4 > 0 && sum_wind > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + remove_icon = false; + } + + // Ground + int sum_ground = sc->data[SC_ARMOR_RESIST]->val2; + if (sc->data[SC_RESIST_PROPERTY_GROUND] != NULL) + sum_ground += sc->data[SC_RESIST_PROPERTY_GROUND]->val1; + if (sc->data[SC_ARMOR_RESIST]->val2 > 0 && sum_ground > 0) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); + int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); + int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); + int sc_ttl = sc->data[SC_ARMOR_RESIST]->total_tick; + clif->status_change_sub(bl, sc_icn, sc_typ, 1, sc_tck, sc_ttl, 0, 0, 0); + } + } break; } @@ -11341,7 +11664,8 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, #endif //On Aegis, when turning off a status change, first goes the sc packet, then the option packet. - clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(type)); + if (remove_icon) + clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(type)); if( opt_flag&8 ) //bugreport:681 clif->changeoption2(bl); -- cgit v1.2.3-60-g2f50 From f165d0c080d25559e7fbc4439e52b376acf4c77f Mon Sep 17 00:00:00 2001 From: Kenpachi Developer Date: Sun, 3 May 2020 06:41:05 +0200 Subject: Add timer data verification --- src/map/status.c | 160 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 96 insertions(+), 64 deletions(-) (limited to 'src') diff --git a/src/map/status.c b/src/map/status.c index 8faee80d5..5ea4d880d 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -8732,11 +8732,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Water int sum_water = val1 + ((sce_fire != NULL) ? sce_fire->val2 : 0); bool show_icon = true; - if (sce_water != NULL) { - sum_water += sce_water->val1; - int left = (int)DIFF_TICK(timer->get(sce_water->timer)->tick, timer->gettick()); - if (left > total_tick && sum_water - val1 > 0) - show_icon = false; + if (sce_water != NULL && sce_water->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_water->timer); + if (td != NULL) { + sum_water += sce_water->val1; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_water - val1 > 0) + show_icon = false; + } } if (val1 > 0 && sum_water > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); @@ -8749,11 +8752,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Ground int sum_ground = val2 + ((sce_wind != NULL) ? sce_wind->val2 : 0); show_icon = true; - if (sce_ground != NULL) { - sum_ground += sce_ground->val1; - int left = (int)DIFF_TICK(timer->get(sce_ground->timer)->tick, timer->gettick()); - if (left > total_tick && sum_ground - val2 > 0) - show_icon = false; + if (sce_ground != NULL && sce_ground->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_ground->timer); + if (td != NULL) { + sum_ground += sce_ground->val1; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_ground - val2 > 0) + show_icon = false; + } } if (val2 > 0 && sum_ground > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); @@ -8766,11 +8772,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Fire int sum_fire = val3 + ((sce_ground != NULL) ? sce_ground->val2 : 0); show_icon = true; - if (sce_fire != NULL) { - sum_fire += sce_fire->val1; - int left = (int)DIFF_TICK(timer->get(sce_fire->timer)->tick, timer->gettick()); - if (left > total_tick && sum_fire - val3 > 0) - show_icon = false; + if (sce_fire != NULL && sce_fire->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_fire->timer); + if (td != NULL) { + sum_fire += sce_fire->val1; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_fire - val3 > 0) + show_icon = false; + } } if (val3 > 0 && sum_fire > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); @@ -8783,11 +8792,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Wind int sum_wind = val4 + ((sce_water != NULL) ? sce_water->val2 : 0); show_icon = true; - if (sce_wind != NULL) { - sum_wind += sce_wind->val1; - int left = (int)DIFF_TICK(timer->get(sce_wind->timer)->tick, timer->gettick()); - if (left > total_tick && sum_wind - val4 > 0) - show_icon = false; + if (sce_wind != NULL && sce_wind->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_wind->timer); + if (td != NULL) { + sum_wind += sce_wind->val1; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_wind - val4 > 0) + show_icon = false; + } } if (val4 > 0 && sum_wind > 0 && show_icon) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); @@ -8806,11 +8818,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Water int sum_water = val1 + ((sce_fire != NULL) ? sce_fire->val2 : 0); - if (sce_all != NULL) { - sum_water += sce_all->val1; - int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); - if (left > total_tick && sum_water - val1 > 0) - flag |= SCFLAG_NOICON; + if (sce_all != NULL && sce_all->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_all->timer); + if (td != NULL) { + sum_water += sce_all->val1; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_water - val1 > 0) + flag |= SCFLAG_NOICON; + } } if (sum_water <= 0) { clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); @@ -8832,11 +8847,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Ground int sum_ground = val1 + ((sce_wind != NULL) ? sce_wind->val2 : 0); - if (sce_all != NULL) { - sum_ground += sce_all->val2; - int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); - if (left > total_tick && sum_ground - val1 > 0) - flag |= SCFLAG_NOICON; + if (sce_all != NULL && sce_all->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_all->timer); + if (td != NULL) { + sum_ground += sce_all->val2; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_ground - val1 > 0) + flag |= SCFLAG_NOICON; + } } if (sum_ground <= 0) { clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); @@ -8858,11 +8876,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Fire int sum_fire = val1 + ((sce_ground != NULL) ? sce_ground->val2 : 0); - if (sce_all != NULL) { - sum_fire += sce_all->val3; - int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); - if (left > total_tick && sum_fire - val1 > 0) - flag |= SCFLAG_NOICON; + if (sce_all != NULL && sce_all->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_all->timer); + if (td != NULL) { + sum_fire += sce_all->val3; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_fire - val1 > 0) + flag |= SCFLAG_NOICON; + } } if (sum_fire <= 0) { clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); @@ -8884,11 +8905,14 @@ static int status_change_start_sub(struct block_list *src, struct block_list *bl // Wind int sum_wind = val1 + ((sce_water != NULL) ? sce_water->val2 : 0); - if (sce_all != NULL) { - sum_wind += sce_all->val4; - int left = (int)DIFF_TICK(timer->get(sce_all->timer)->tick, timer->gettick()); - if (left > total_tick && sum_wind - val1 > 0) - flag |= SCFLAG_NOICON; + if (sce_all != NULL && sce_all->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sce_all->timer); + if (td != NULL) { + sum_wind += sce_all->val4; + int left = (int)DIFF_TICK(td->tick, timer->gettick()); + if (left > total_tick && sum_wind - val1 > 0) + flag |= SCFLAG_NOICON; + } } if (sum_wind <= 0) { clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); @@ -11271,10 +11295,10 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, // Water clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WATER)); - if (sce_water != NULL) { + if (sce_water != NULL && sce_water->timer != INVALID_TIMER) { int sum_water = sce_water->val1 + ((sce_fire != NULL) ? sce_fire->val2 : 0); - if (sce_water->val1 > 0 && sum_water > 0) { - const struct TimerData *td = timer->get(sce_water->timer); + const struct TimerData *td = timer->get(sce_water->timer); + if (td != NULL && sce_water->val1 > 0 && sum_water > 0) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11285,10 +11309,10 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, // Ground clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_GROUND)); - if (sce_ground != NULL) { + if (sce_ground != NULL && sce_ground->timer != INVALID_TIMER) { int sum_ground = sce_ground->val1 + ((sce_wind != NULL) ? sce_wind->val2 : 0); - if (sce_ground->val1 > 0 && sum_ground > 0) { - const struct TimerData *td = timer->get(sce_ground->timer); + const struct TimerData *td = timer->get(sce_ground->timer); + if (td != NULL && sce_ground->val1 > 0 && sum_ground > 0) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11299,10 +11323,10 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, // Fire clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_FIRE)); - if (sce_fire != NULL) { + if (sce_fire != NULL && sce_fire->timer != INVALID_TIMER) { int sum_fire = sce_fire->val1 + ((sce_ground != NULL) ? sce_ground->val2 : 0); - if (sce_fire->val1 > 0 && sum_fire > 0) { - const struct TimerData *td = timer->get(sce_fire->timer); + const struct TimerData *td = timer->get(sce_fire->timer); + if (td != NULL && sce_fire->val1 > 0 && sum_fire > 0) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11313,10 +11337,10 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, // Wind clif->sc_end(bl, bl->id, AREA, status->get_sc_icon(SC_RESIST_PROPERTY_WIND)); - if (sce_wind != NULL) { + if (sce_wind != NULL && sce_wind->timer != INVALID_TIMER) { int sum_wind = sce_wind->val1 + ((sce_water != NULL) ? sce_water->val2 : 0); - if (sce_wind->val1 > 0 && sum_wind > 0) { - const struct TimerData *td = timer->get(sce_wind->timer); + const struct TimerData *td = timer->get(sce_wind->timer); + if (td != NULL && sce_wind->val1 > 0 && sum_wind > 0) { int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11328,13 +11352,16 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, break; } case SC_RESIST_PROPERTY_WATER: - if (sc->data[SC_ARMOR_RESIST] != NULL) { + if (sc->data[SC_ARMOR_RESIST] != NULL && sc->data[SC_ARMOR_RESIST]->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + if (td == NULL) + break; + // Water int sum_water = sc->data[SC_ARMOR_RESIST]->val1; if (sc->data[SC_RESIST_PROPERTY_FIRE] != NULL) sum_water += sc->data[SC_RESIST_PROPERTY_FIRE]->val2; if (sc->data[SC_ARMOR_RESIST]->val1 > 0 && sum_water > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11348,7 +11375,6 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, if (sc->data[SC_RESIST_PROPERTY_WIND] != NULL) sum_wind += sc->data[SC_RESIST_PROPERTY_WIND]->val1; if (sc->data[SC_ARMOR_RESIST]->val4 > 0 && sum_wind > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11359,13 +11385,16 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, break; case SC_RESIST_PROPERTY_GROUND: - if (sc->data[SC_ARMOR_RESIST] != NULL) { + if (sc->data[SC_ARMOR_RESIST] != NULL && sc->data[SC_ARMOR_RESIST]->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + if (td == NULL) + break; + // Ground int sum_ground = sc->data[SC_ARMOR_RESIST]->val2; if (sc->data[SC_RESIST_PROPERTY_WIND] != NULL) sum_ground += sc->data[SC_RESIST_PROPERTY_WIND]->val2; if (sc->data[SC_ARMOR_RESIST]->val2 > 0 && sum_ground > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11379,7 +11408,6 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, if (sc->data[SC_RESIST_PROPERTY_FIRE] != NULL) sum_fire += sc->data[SC_RESIST_PROPERTY_FIRE]->val1; if (sc->data[SC_ARMOR_RESIST]->val3 > 0 && sum_fire > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11390,13 +11418,16 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, break; case SC_RESIST_PROPERTY_FIRE: - if (sc->data[SC_ARMOR_RESIST] != NULL) { + if (sc->data[SC_ARMOR_RESIST] != NULL && sc->data[SC_ARMOR_RESIST]->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + if (td == NULL) + break; + // Fire int sum_fire = sc->data[SC_ARMOR_RESIST]->val3; if (sc->data[SC_RESIST_PROPERTY_GROUND] != NULL) sum_fire += sc->data[SC_RESIST_PROPERTY_GROUND]->val2; if (sc->data[SC_ARMOR_RESIST]->val3 > 0 && sum_fire > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_FIRE); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_FIRE); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11410,7 +11441,6 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, if (sc->data[SC_RESIST_PROPERTY_WATER] != NULL) sum_water += sc->data[SC_RESIST_PROPERTY_WATER]->val1; if (sc->data[SC_ARMOR_RESIST]->val1 > 0 && sum_water > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WATER); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WATER); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11421,13 +11451,16 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, break; case SC_RESIST_PROPERTY_WIND: - if (sc->data[SC_ARMOR_RESIST] != NULL) { + if (sc->data[SC_ARMOR_RESIST] != NULL && sc->data[SC_ARMOR_RESIST]->timer != INVALID_TIMER) { + const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); + if (td == NULL) + break; + // Wind int sum_wind = sc->data[SC_ARMOR_RESIST]->val4; if (sc->data[SC_RESIST_PROPERTY_WATER] != NULL) sum_wind += sc->data[SC_RESIST_PROPERTY_WATER]->val2; if (sc->data[SC_ARMOR_RESIST]->val4 > 0 && sum_wind > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_WIND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_WIND); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); @@ -11441,7 +11474,6 @@ static int status_change_end_(struct block_list *bl, enum sc_type type, int tid, if (sc->data[SC_RESIST_PROPERTY_GROUND] != NULL) sum_ground += sc->data[SC_RESIST_PROPERTY_GROUND]->val1; if (sc->data[SC_ARMOR_RESIST]->val2 > 0 && sum_ground > 0) { - const struct TimerData *td = timer->get(sc->data[SC_ARMOR_RESIST]->timer); int sc_icn = status->get_sc_icon(SC_RESIST_PROPERTY_GROUND); int sc_typ = status->get_sc_relevant_bl_types(SC_RESIST_PROPERTY_GROUND); int sc_tck = (int)DIFF_TICK(td->tick, timer->gettick()); -- cgit v1.2.3-60-g2f50