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.
This commit is contained in:
aleos89 2016-04-06 09:09:39 -04:00
parent 486495cab8
commit 2305a66101
4 changed files with 34 additions and 24 deletions

View File

@ -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.

View File

@ -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

View File

@ -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);
}

View File

@ -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)