From 2305a6610103b1b475017bef516b53268cdd825e Mon Sep 17 00:00:00 2001 From: aleos89 Date: Wed, 6 Apr 2016 09:09:39 -0400 Subject: [PATCH] Resolved a flag overlap for status_change_clear_buffs * Small follow up to 894d6f2. * Resolves Chemical Protection flag coinciding with the Lux Anima flag. * Changed all bitmask values to readable constants. --- doc/script_commands.txt | 2 +- src/map/skill.c | 10 +++++----- src/map/status.c | 35 ++++++++++++++++++----------------- src/map/status.h | 11 ++++++++++- 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index c8d0f900a5..0e3a73420a 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -5396,7 +5396,7 @@ Flags (bitmask): 8 : Remove when player logs out. 16 : Removeable by Banishing Buster. 32 : Removable by Refresh. - 64 : Removable by Luxanima. + 64 : Removable by Lux Anima. 128 : Remove when Madogear is activated or deactivated. 256 : Remove when receive damage. 512 : Script is permanent, cannot be cleared by bonus_script_clear. diff --git a/src/map/skill.c b/src/map/skill.c index 8d50036c90..ef860ab23d 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -8398,7 +8398,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src,bl,SC_INCMATKRATE,100,-50,skill_get_time2(skill_id,skill_lv)); break; case 2: // all buffs removed - status_change_clear_buffs(bl,9); + status_change_clear_buffs(bl, SCCB_BUFFS|SCCB_CHEM_PROTECT); break; case 3: // 1000 damage, random armor destroyed { @@ -8850,7 +8850,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); status_heal(bl,heal,0,1); - status_change_clear_buffs(bl,4); + status_change_clear_buffs(bl, SCCB_REFRESH); } break; @@ -8921,7 +8921,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } else if( skill_area_temp[5]&0x20 ) { i = status_get_max_hp(bl) * 25 / 100; - status_change_clear_buffs(bl,4); + status_change_clear_buffs(bl, SCCB_REFRESH); skill_area_temp[5] &= ~0x20; status_heal(bl,i,0,1); type = SC_REFRESH; @@ -13151,7 +13151,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un case UNT_HERMODE: if (sg->src_id!=bl->id && battle_check_target(&unit->bl,bl,BCT_PARTY|BCT_GUILD) > 0) - status_change_clear_buffs(bl,1); //Should dispell only allies. + status_change_clear_buffs(bl, SCCB_BUFFS); //Should dispell only allies. case UNT_RICHMANKIM: case UNT_ETERNALCHAOS: case UNT_DRUMBATTLEFIELD: @@ -13682,7 +13682,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns status_heal(bl,heal,0,0); break; case 1: // End all negative status - status_change_clear_buffs(bl,6); + status_change_clear_buffs(bl, SCCB_DEBUFFS|SCCB_REFRESH); if (tsd) clif_gospel_info(tsd, 0x15); break; case 2: // Immunity to all status diff --git a/src/map/status.c b/src/map/status.c index 5078f3445f..b75c5d912d 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -9245,7 +9245,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if(val4 == BCT_SELF) { // Self effect val2 = tick/10000; tick_time = 10000; // [GodLesZ] tick time - status_change_clear_buffs(bl,11); // Remove buffs/debuffs + status_change_clear_buffs(bl, SCCB_BUFFS|SCCB_DEBUFFS|SCCB_CHEM_PROTECT); // Remove buffs/debuffs } break; @@ -9996,7 +9996,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val3 = status_get_lv(bl) / 10 + val2 / 5; //All stat bonus val4 = tick / 5000; tick_time = 5000; // [GodLesZ] tick time - status_change_clear_buffs(bl,3); // Remove buffs/debuffs + status_change_clear_buffs(bl, SCCB_BUFFS|SCCB_DEBUFFS); // Remove buffs/debuffs break; case SC_CRESCENTELBOW: val2 = (sd?sd->status.job_level:50) / 2 + (50 + 5 * val1); @@ -12837,12 +12837,13 @@ int status_change_timer_sub(struct block_list* bl, va_list ap) * Clears buffs/debuffs on an object * @param bl: Object to clear [PC|MOB|HOM|MER|ELEM] * @param type: Type to remove - * &1: Clear Buffs - * &2: Clear Debuffs - * &4: Specific debuffs with a refresh - * &8: Clear chemical protection + * SCCB_BUFFS: Clear Buffs + * SCCB_DEBUFFS: Clear Debuffs + * SCCB_REFRESH: Clear specific debuffs through RK_REFRESH + * SCCB_CHEM_PROTECT: Clear AM_CP_ARMOR/HELM/SHIELD/WEAPON + * SCCB_LUXANIMA: Bonus Script removed through RK_LUXANIMA */ -void status_change_clear_buffs (struct block_list* bl, int type) +void status_change_clear_buffs(struct block_list* bl, uint8 type) { int i; struct status_change *sc= status_get_sc(bl); @@ -12850,7 +12851,7 @@ void status_change_clear_buffs (struct block_list* bl, int type) if (!sc || !sc->count) return; - if (type&6) // Debuffs + if (type&(SCCB_DEBUFFS|SCCB_REFRESH)) // Debuffs for (i = SC_COMMON_MIN; i <= SC_COMMON_MAX; i++) status_change_end(bl, (sc_type)i, INVALID_TIMER); @@ -12965,7 +12966,7 @@ void status_change_clear_buffs (struct block_list* bl, int type) case SC_CP_SHIELD: case SC_CP_ARMOR: case SC_CP_HELM: - if(!(type&8)) + if(!(type&SCCB_CHEM_PROTECT)) continue; break; // Debuffs that can be removed. @@ -12983,7 +12984,7 @@ void status_change_clear_buffs (struct block_list* bl, int type) case SC_LEECHESEND: case SC_MARSHOFABYSS: case SC_MANDRAGORA: - if(!(type&4)) + if(!(type&SCCB_REFRESH)) continue; break; case SC_HALLUCINATION: @@ -13005,18 +13006,18 @@ void status_change_clear_buffs (struct block_list* bl, int type) case SC_FEAR: case SC_MAGNETICFIELD: case SC_NETHERWORLD: - if (!(type&2)) + if (!(type&SCCB_DEBUFFS)) continue; break; // The rest are buffs that can be removed. case SC_BERSERK: case SC_SATURDAYNIGHTFEVER: - if (!(type&1)) + if (!(type&SCCB_BUFFS)) continue; sc->data[i]->val2 = 0; break; default: - if (!(type&1)) + if (!(type&SCCB_BUFFS)) continue; break; } @@ -13026,10 +13027,10 @@ void status_change_clear_buffs (struct block_list* bl, int type) //Removes bonus_script if (bl->type == BL_PC) { i = 0; - if (type&1) i |= BSF_REM_BUFF; - if (type&2) i |= BSF_REM_DEBUFF; - if (type&4) i |= BSF_REM_ON_REFRESH; - if (type&8) i |= BSF_REM_ON_LUXANIMA; + if (type&SCCB_BUFFS) i |= BSF_REM_BUFF; + if (type&SCCB_DEBUFFS) i |= BSF_REM_DEBUFF; + if (type&SCCB_REFRESH) i |= BSF_REM_ON_REFRESH; + if (type&SCCB_LUXANIMA) i |= BSF_REM_ON_LUXANIMA; pc_bonus_script_clear(BL_CAST(BL_PC,bl),i); } diff --git a/src/map/status.h b/src/map/status.h index e4b9a393d2..cd1ae774a7 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -1908,6 +1908,15 @@ enum e_status_change_start_flags { SCSTART_NOICON = 0x10, /// Status icon won't be sent to client }; +/// Enum for status_change_clear_buffs +enum e_status_change_clear_buffs_flags { + SCCB_BUFFS = 0x01, + SCCB_DEBUFFS = 0x02, + SCCB_REFRESH = 0x04, + SCCB_CHEM_PROTECT = 0x08, + SCCB_LUXANIMA = 0x10, +}; + ///Enum for bonus_script's flag [Cydh] enum e_bonus_script_flags { BSF_REM_ON_DEAD = 0x001, ///< Removed when dead @@ -2200,7 +2209,7 @@ int kaahi_heal_timer(int tid, unsigned int tick, int id, intptr_t data); int status_change_timer(int tid, unsigned int tick, int id, intptr_t data); int status_change_timer_sub(struct block_list* bl, va_list ap); int status_change_clear(struct block_list* bl, int type); -void status_change_clear_buffs(struct block_list* bl, int type); +void status_change_clear_buffs(struct block_list* bl, uint8 type); void status_change_clear_onChangeMap(struct block_list *bl, struct status_change *sc); #define status_calc_bl(bl, flag) status_calc_bl_(bl, (enum scb_flag)(flag), SCO_NONE)