Cleaned up status_change_end (#7211)

* Removed leftover old debug info that made it necessary to the hide the real function behind a define.
* Introduced a C++ default argument for timer id, as the timer id is only needed a single time, when the status expires naturally.
* Replaced all currently existing calls that had INVALID_TIMER as argument and made use of the new default argument.
This commit is contained in:
Lemongrass3110 2022-08-27 04:23:40 +02:00 committed by GitHub
parent a03644fc53
commit b1b371f4b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 512 additions and 513 deletions

View File

@ -7444,7 +7444,7 @@ ACMD_FUNC(unmute)
} }
pl_sd->status.manner = 0; pl_sd->status.manner = 0;
status_change_end(&pl_sd->bl, SC_NOCHAT, INVALID_TIMER); status_change_end(&pl_sd->bl, SC_NOCHAT);
clif_displaymessage(sd->fd,msg_txt(sd,1236)); // Player unmuted. clif_displaymessage(sd->fd,msg_txt(sd,1236)); // Player unmuted.
return 0; return 0;
@ -7551,7 +7551,7 @@ ACMD_FUNC(mute)
sc_start(NULL,&pl_sd->bl,SC_NOCHAT,100,0,0); sc_start(NULL,&pl_sd->bl,SC_NOCHAT,100,0,0);
} else { } else {
pl_sd->status.manner = 0; pl_sd->status.manner = 0;
status_change_end(&pl_sd->bl, SC_NOCHAT, INVALID_TIMER); status_change_end(&pl_sd->bl, SC_NOCHAT);
} }
clif_GM_silence(sd, pl_sd, (manner > 0 ? 1 : 0)); clif_GM_silence(sd, pl_sd, (manner > 0 ? 1 : 0));
@ -8438,7 +8438,7 @@ static int atcommand_mutearea_sub(struct block_list *bl,va_list ap)
if (pl_sd->status.manner < 0) if (pl_sd->status.manner < 0)
sc_start(NULL,&pl_sd->bl,SC_NOCHAT,100,0,0); sc_start(NULL,&pl_sd->bl,SC_NOCHAT,100,0,0);
else else
status_change_end(&pl_sd->bl, SC_NOCHAT, INVALID_TIMER); status_change_end(&pl_sd->bl, SC_NOCHAT);
} }
return 0; return 0;
} }
@ -9738,7 +9738,7 @@ ACMD_FUNC(mount2) {
sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INFINITE_TICK); sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INFINITE_TICK);
} else { } else {
clif_displaymessage(sd->fd,msg_txt(sd,1364)); // You have released your mount. clif_displaymessage(sd->fd,msg_txt(sd,1364)); // You have released your mount.
status_change_end(&sd->bl, SC_ALL_RIDING, INVALID_TIMER); status_change_end(&sd->bl, SC_ALL_RIDING);
} }
return 0; return 0;
} }
@ -10333,7 +10333,7 @@ ACMD_FUNC(changedress){
for( sc_type type : name2id ) { for( sc_type type : name2id ) {
if( sd->sc.data[type] ) { if( sd->sc.data[type] ) {
status_change_end( &sd->bl, type, INVALID_TIMER ); status_change_end( &sd->bl, type );
// You should only be able to have one - so we cancel here // You should only be able to have one - so we cancel here
break; break;
} }
@ -10366,7 +10366,7 @@ ACMD_FUNC(costume) {
if( sd->sc.data[name2id[k]] ) { if( sd->sc.data[name2id[k]] ) {
sprintf(atcmd_output, msg_txt(sd, 727), names[k]); // '%s' Costume removed. sprintf(atcmd_output, msg_txt(sd, 727), names[k]); // '%s' Costume removed.
clif_displaymessage(sd->fd, atcmd_output); clif_displaymessage(sd->fd, atcmd_output);
status_change_end(&sd->bl, (sc_type)name2id[k], INVALID_TIMER); status_change_end(&sd->bl, (sc_type)name2id[k]);
return 0; return 0;
} }
} }

View File

@ -503,12 +503,12 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
damage *= 2; damage *= 2;
#endif #endif
//Remove a unit group or end whole status change //Remove a unit group or end whole status change
status_change_end(target, SC_SPIDERWEB, INVALID_TIMER); status_change_end(target, SC_SPIDERWEB);
} }
if (tsc->data[SC_THORNSTRAP] && battle_getcurrentskill(src) != GN_CARTCANNON) if (tsc->data[SC_THORNSTRAP] && battle_getcurrentskill(src) != GN_CARTCANNON)
status_change_end(target, SC_THORNSTRAP, INVALID_TIMER); status_change_end(target, SC_THORNSTRAP);
if (tsc->data[SC_CRYSTALIZE]) if (tsc->data[SC_CRYSTALIZE])
status_change_end(target, SC_CRYSTALIZE, INVALID_TIMER); status_change_end(target, SC_CRYSTALIZE);
if (tsc->data[SC_EARTH_INSIGNIA]) if (tsc->data[SC_EARTH_INSIGNIA])
#ifdef RENEWAL #ifdef RENEWAL
ratio += 50; ratio += 50;
@ -521,7 +521,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
#else #else
damage *= 2; damage *= 2;
#endif #endif
status_change_end(target,SC_WIDEWEB,INVALID_TIMER); status_change_end(target,SC_WIDEWEB);
} }
if( tsc->data[SC_BURNT] ) { if( tsc->data[SC_BURNT] ) {
#ifdef RENEWAL #ifdef RENEWAL
@ -587,7 +587,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
#else #else
damage += (int64)(damage * 50 / 100); damage += (int64)(damage * 50 / 100);
#endif #endif
status_change_end(target, SC_MAGNETICFIELD, INVALID_TIMER); //freed if received earth dmg status_change_end(target, SC_MAGNETICFIELD); //freed if received earth dmg
break; break;
case ELE_NEUTRAL: case ELE_NEUTRAL:
if (tsc->data[SC_ANTI_M_BLAST]) if (tsc->data[SC_ANTI_M_BLAST])
@ -1123,7 +1123,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
damage = -sce->val2; damage = -sce->val2;
} }
if ((--sce->val3) <= 0 || (sce->val2 <= 0) || skill_id == AL_HOLYLIGHT) if ((--sce->val3) <= 0 || (sce->val2 <= 0) || skill_id == AL_HOLYLIGHT)
status_change_end(target, SC_KYRIE, INVALID_TIMER); status_change_end(target, SC_KYRIE);
} }
if ((sce = sc->data[SC_P_ALTER]) && damage > 0) { if ((sce = sc->data[SC_P_ALTER]) && damage > 0) {
@ -1134,7 +1134,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
else else
damage = -sce->val3; damage = -sce->val3;
if (sce->val3 <= 0) if (sce->val3 <= 0)
status_change_end(target, SC_P_ALTER, INVALID_TIMER); status_change_end(target, SC_P_ALTER);
} }
if ((sce = sc->data[SC_TUNAPARTY]) && damage > 0) { if ((sce = sc->data[SC_TUNAPARTY]) && damage > 0) {
@ -1144,20 +1144,20 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
else else
damage = -sce->val2; damage = -sce->val2;
if (sce->val2 <= 0) if (sce->val2 <= 0)
status_change_end(target, SC_TUNAPARTY, INVALID_TIMER); status_change_end(target, SC_TUNAPARTY);
} }
if ((sce = sc->data[SC_DIMENSION1]) && damage > 0) { if ((sce = sc->data[SC_DIMENSION1]) && damage > 0) {
sce->val2 -= static_cast<int>(cap_value(damage, INT_MIN, INT_MAX)); sce->val2 -= static_cast<int>(cap_value(damage, INT_MIN, INT_MAX));
if (sce->val2 <= 0) if (sce->val2 <= 0)
status_change_end(target, SC_DIMENSION1, INVALID_TIMER); status_change_end(target, SC_DIMENSION1);
return false; return false;
} }
if ((sce = sc->data[SC_DIMENSION2]) && damage > 0) { if ((sce = sc->data[SC_DIMENSION2]) && damage > 0) {
sce->val2 -= static_cast<int>(cap_value(damage, INT_MIN, INT_MAX)); sce->val2 -= static_cast<int>(cap_value(damage, INT_MIN, INT_MAX));
if (sce->val2 <= 0) if (sce->val2 <= 0)
status_change_end(target, SC_DIMENSION2, INVALID_TIMER); status_change_end(target, SC_DIMENSION2);
return false; return false;
} }
@ -1171,7 +1171,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
damage = -sce->val2; damage = -sce->val2;
} }
if (sce->val2 <= 0) if (sce->val2 <= 0)
status_change_end(target, SC_GUARDIAN_S, INVALID_TIMER); status_change_end(target, SC_GUARDIAN_S);
} }
// Weapon Blocking can be triggered while the above statuses are active. // Weapon Blocking can be triggered while the above statuses are active.
@ -1218,7 +1218,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
} }
return false; return false;
} }
status_change_end(target, SC_SAFETYWALL, INVALID_TIMER); status_change_end(target, SC_SAFETYWALL);
} }
if ((sc->data[SC_PNEUMA] && (flag&(BF_MAGIC | BF_LONG)) == BF_LONG) || if ((sc->data[SC_PNEUMA] && (flag&(BF_MAGIC | BF_LONG)) == BF_LONG) ||
@ -1248,7 +1248,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
{ {
if (skill_id == WL_SOULEXPANSION) if (skill_id == WL_SOULEXPANSION)
damage <<= 1; // If used against a player in White Imprison, the skill deals double damage. damage <<= 1; // If used against a player in White Imprison, the skill deals double damage.
status_change_end(target, SC_WHITEIMPRISON, INVALID_TIMER); // Those skills do damage and removes effect status_change_end(target, SC_WHITEIMPRISON); // Those skills do damage and removes effect
} else { } else {
d->dmg_lv = ATK_BLOCK; d->dmg_lv = ATK_BLOCK;
return false; return false;
@ -1264,7 +1264,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
clif_millenniumshield(target, sce->val2); clif_millenniumshield(target, sce->val2);
sce->val3 = 1000; // Next shield sce->val3 = 1000; // Next shield
} else } else
status_change_end(target, SC_MILLENNIUMSHIELD, INVALID_TIMER); // All shields down status_change_end(target, SC_MILLENNIUMSHIELD); // All shields down
status_change_start(src, target, SC_STUN, 10000, 0, 0, 0, 0, 1000, SCSTART_NOTICKDEF); status_change_start(src, target, SC_STUN, 10000, 0, 0, 0, 0, 1000, SCSTART_NOTICKDEF);
} }
return false; return false;
@ -1332,7 +1332,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
unit_setdir(target, dir); unit_setdir(target, dir);
} }
d->dmg_lv = ATK_DEF; d->dmg_lv = ATK_DEF;
status_change_end(target, SC_LIGHTNINGWALK, INVALID_TIMER); status_change_end(target, SC_LIGHTNINGWALK);
return false; return false;
} }
@ -1371,7 +1371,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
if (skill_id != ASC_BREAKER || !(flag&BF_WEAPON)) if (skill_id != ASC_BREAKER || !(flag&BF_WEAPON))
#endif #endif
if (--sce->val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time. if (--sce->val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time.
status_change_end(target, SC_KAUPE, INVALID_TIMER); status_change_end(target, SC_KAUPE);
return false; return false;
} }
@ -1390,9 +1390,9 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe
} }
//Both need to be consumed if they are active. //Both need to be consumed if they are active.
if (sce && --sce->val2 <= 0) if (sce && --sce->val2 <= 0)
status_change_end(target, SC_UTSUSEMI, INVALID_TIMER); status_change_end(target, SC_UTSUSEMI);
if ((sce = sc->data[SC_BUNSINJYUTSU]) && --sce->val2 <= 0) if ((sce = sc->data[SC_BUNSINJYUTSU]) && --sce->val2 <= 0)
status_change_end(target, SC_BUNSINJYUTSU, INVALID_TIMER); status_change_end(target, SC_BUNSINJYUTSU);
return false; return false;
} }
@ -1493,7 +1493,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
#ifndef RENEWAL #ifndef RENEWAL
if( skill_id != ASC_BREAKER || !(flag&BF_WEAPON) ) if( skill_id != ASC_BREAKER || !(flag&BF_WEAPON) )
#endif #endif
status_change_end(bl, SC_AETERNA, INVALID_TIMER); //Shouldn't end until Breaker's non-weapon part connects. status_change_end(bl, SC_AETERNA); //Shouldn't end until Breaker's non-weapon part connects.
} }
#ifdef RENEWAL #ifdef RENEWAL
@ -1508,7 +1508,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if( damage ) { if( damage ) {
if( sc->data[SC_DEEPSLEEP] ) { if( sc->data[SC_DEEPSLEEP] ) {
damage += damage / 2; // 1.5 times more damage while in Deep Sleep. damage += damage / 2; // 1.5 times more damage while in Deep Sleep.
status_change_end(bl,SC_DEEPSLEEP,INVALID_TIMER); status_change_end(bl,SC_DEEPSLEEP);
} }
if( tsd && sd && sc->data[SC_CRYSTALIZE] && flag&BF_WEAPON ) { if( tsd && sd && sc->data[SC_CRYSTALIZE] && flag&BF_WEAPON ) {
switch(tsd->status.weapon) { switch(tsd->status.weapon) {
@ -1536,7 +1536,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
} }
} }
if( sc->data[SC_VOICEOFSIREN] ) if( sc->data[SC_VOICEOFSIREN] )
status_change_end(bl,SC_VOICEOFSIREN,INVALID_TIMER); status_change_end(bl,SC_VOICEOFSIREN);
} }
if (sc->data[SC_SOUNDOFDESTRUCTION]) if (sc->data[SC_SOUNDOFDESTRUCTION])
@ -1669,7 +1669,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
per /=20; //Uses 20% SP intervals. per /=20; //Uses 20% SP intervals.
//SP Cost: 1% + 0.5% per every 20% SP //SP Cost: 1% + 0.5% per every 20% SP
if (!status_charge(bl, 0, (10+5*per)*status->max_sp/1000)) if (!status_charge(bl, 0, (10+5*per)*status->max_sp/1000))
status_change_end(bl, SC_ENERGYCOAT, INVALID_TIMER); status_change_end(bl, SC_ENERGYCOAT);
damage -= damage * 6 * (1 + per) / 100; //Reduction: 6% + 6% every 20% damage -= damage * 6 * (1 + per) / 100; //Reduction: 6% + 6% every 20%
} }
@ -1706,9 +1706,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
//Finally added to remove the status of immobile when Aimed Bolt is used. [Jobbie] //Finally added to remove the status of immobile when Aimed Bolt is used. [Jobbie]
if( skill_id == RA_AIMEDBOLT && (sc->data[SC_BITE] || sc->data[SC_ANKLE] || sc->data[SC_ELECTRICSHOCKER]) ) { if( skill_id == RA_AIMEDBOLT && (sc->data[SC_BITE] || sc->data[SC_ANKLE] || sc->data[SC_ELECTRICSHOCKER]) ) {
status_change_end(bl, SC_BITE, INVALID_TIMER); status_change_end(bl, SC_BITE);
status_change_end(bl, SC_ANKLE, INVALID_TIMER); status_change_end(bl, SC_ANKLE);
status_change_end(bl, SC_ELECTRICSHOCKER, INVALID_TIMER); status_change_end(bl, SC_ELECTRICSHOCKER);
} }
if (!damage) if (!damage)
@ -2804,7 +2804,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
if(sc && !sc->data[SC_AUTOCOUNTER]) if(sc && !sc->data[SC_AUTOCOUNTER])
break; break;
clif_specialeffect(src, EF_AUTOCOUNTER, AREA); clif_specialeffect(src, EF_AUTOCOUNTER, AREA);
status_change_end(src, SC_AUTOCOUNTER, INVALID_TIMER); status_change_end(src, SC_AUTOCOUNTER);
case KN_AUTOCOUNTER: case KN_AUTOCOUNTER:
if(battle_config.auto_counter_type && if(battle_config.auto_counter_type &&
(battle_config.auto_counter_type&src->type)) (battle_config.auto_counter_type&src->type))
@ -3953,7 +3953,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
skillratio += -100 + sd->inventory_data[index]->weight / 10 + sd->inventory_data[index]->atk + skillratio += -100 + sd->inventory_data[index]->weight / 10 + sd->inventory_data[index]->atk +
100 * sd->inventory_data[index]->weapon_level * (sd->inventory.u.items_inventory[index].refine + 6); 100 * sd->inventory_data[index]->weapon_level * (sd->inventory.u.items_inventory[index].refine + 6);
} }
status_change_end(src,SC_CRUSHSTRIKE,INVALID_TIMER); status_change_end(src,SC_CRUSHSTRIKE);
skill_break_equip(src,src,EQP_WEAPON,2000,BCT_SELF); skill_break_equip(src,src,EQP_WEAPON,2000,BCT_SELF);
} else { } else {
if (sc->data[SC_GIANTGROWTH] && (sd->class_&MAPID_THIRDMASK) == MAPID_RUNE_KNIGHT) { // Increase damage again if Crush Strike is not active if (sc->data[SC_GIANTGROWTH] && (sd->class_&MAPID_THIRDMASK) == MAPID_RUNE_KNIGHT) { // Increase damage again if Crush Strike is not active
@ -5877,7 +5877,7 @@ static void battle_calc_attack_plant(struct Damage* wd, struct block_list *src,s
bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false); bool attack_hits = is_attack_hitting(wd, src, target, skill_id, skill_lv, false);
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM) if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER); status_change_end(src, SC_CAMOUFLAGE);
//Plants receive 1 damage when hit //Plants receive 1 damage when hit
if( attack_hits || wd->damage > 0 ) if( attack_hits || wd->damage > 0 )
@ -6102,7 +6102,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
status_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD); status_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD);
clif_skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_REJECTSWORD]->val1,1); clif_skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_REJECTSWORD]->val1,1);
if( --(tsc->data[SC_REJECTSWORD]->val3) <= 0 ) if( --(tsc->data[SC_REJECTSWORD]->val3) <= 0 )
status_change_end(target, SC_REJECTSWORD, INVALID_TIMER); status_change_end(target, SC_REJECTSWORD);
} }
if( tsc && tsc->data[SC_CRESCENTELBOW] && wd->flag&BF_SHORT && rnd()%100 < tsc->data[SC_CRESCENTELBOW]->val2 ) { if( tsc && tsc->data[SC_CRESCENTELBOW] && wd->flag&BF_SHORT && rnd()%100 < tsc->data[SC_CRESCENTELBOW]->val2 ) {
@ -6118,7 +6118,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false); clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false);
status_damage(target, src, rdamage, 0, 0, 0, 0); status_damage(target, src, rdamage, 0, 0, 0, 0);
status_damage(src, target, rdamage/10, 0, 0, 1, 0); status_damage(src, target, rdamage/10, 0, 0, 1, 0);
status_change_end(target, SC_CRESCENTELBOW, INVALID_TIMER); status_change_end(target, SC_CRESCENTELBOW);
} }
if( sc ) { if( sc ) {
@ -6151,7 +6151,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo
} }
} }
if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM) if (skill_id != SN_SHARPSHOOTING && skill_id != RA_ARROWSTORM)
status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER); status_change_end(src, SC_CAMOUFLAGE);
} }
#ifndef RENEWAL #ifndef RENEWAL
@ -8440,7 +8440,7 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src,
*dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage. *dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage.
clif_skill_damage(src, tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->data[SC_DEATHBOUND]->val1, DMG_SINGLE); clif_skill_damage(src, tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->data[SC_DEATHBOUND]->val1, DMG_SINGLE);
skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->data[SC_DEATHBOUND]->val1), unit_getdir(src), BLOWN_NONE); skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->data[SC_DEATHBOUND]->val1), unit_getdir(src), BLOWN_NONE);
status_change_end(tbl, SC_DEATHBOUND, INVALID_TIMER); status_change_end(tbl, SC_DEATHBOUND);
rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech] rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
} }
} }
@ -8767,11 +8767,11 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
} }
if (sc && sc->count) { if (sc && sc->count) {
if (sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4 & 2)) if (sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4 & 2))
status_change_end(src, SC_CLOAKING, INVALID_TIMER); status_change_end(src, SC_CLOAKING);
else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4 & 2)) else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4 & 2))
status_change_end(src, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(src, SC_CLOAKINGEXCEED);
else if (sc->data[SC_NEWMOON] && --(sc->data[SC_NEWMOON]->val2) <= 0) else if (sc->data[SC_NEWMOON] && --(sc->data[SC_NEWMOON]->val2) <= 0)
status_change_end(src, SC_NEWMOON, INVALID_TIMER); status_change_end(src, SC_NEWMOON);
} }
if (tsc && tsc->data[SC_AUTOCOUNTER] && status_check_skilluse(target, src, KN_AUTOCOUNTER, 1)) { if (tsc && tsc->data[SC_AUTOCOUNTER] && status_check_skilluse(target, src, KN_AUTOCOUNTER, 1)) {
uint8 dir = map_calc_dir(target,src->x,src->y); uint8 dir = map_calc_dir(target,src->x,src->y);
@ -8783,7 +8783,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
clif_skillcastcancel(target); //Remove the casting bar. [Skotlex] clif_skillcastcancel(target); //Remove the casting bar. [Skotlex]
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
status_change_end(target, SC_AUTOCOUNTER, INVALID_TIMER); status_change_end(target, SC_AUTOCOUNTER);
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0); skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
return ATK_BLOCK; return ATK_BLOCK;
} }
@ -8802,7 +8802,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (status_get_class_(src) == CLASS_BOSS) if (status_get_class_(src) == CLASS_BOSS)
duration = 2000; // Only lasts 2 seconds for Boss monsters duration = 2000; // Only lasts 2 seconds for Boss monsters
#endif #endif
status_change_end(target, SC_BLADESTOP_WAIT, INVALID_TIMER); status_change_end(target, SC_BLADESTOP_WAIT);
if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration)) if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration))
{ //Target locked. { //Target locked.
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS.
@ -8821,7 +8821,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if (sc && sc->data[SC_SKILLRATE_UP] && sc->data[SC_SKILLRATE_UP]->val1 == MO_TRIPLEATTACK) { if (sc && sc->data[SC_SKILLRATE_UP] && sc->data[SC_SKILLRATE_UP]->val1 == MO_TRIPLEATTACK) {
triple_rate+= triple_rate*(sc->data[SC_SKILLRATE_UP]->val2)/100; triple_rate+= triple_rate*(sc->data[SC_SKILLRATE_UP]->val2)/100;
status_change_end(src, SC_SKILLRATE_UP, INVALID_TIMER); status_change_end(src, SC_SKILLRATE_UP);
} }
if (rnd()%100 < triple_rate) { if (rnd()%100 < triple_rate) {
//Need to apply canact_tick here because it doesn't go through skill_castend_id //Need to apply canact_tick here because it doesn't go through skill_castend_id
@ -8838,7 +8838,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
damage_lv ret_val; damage_lv ret_val;
if( --sc->data[SC_SACRIFICE]->val2 <= 0 ) if( --sc->data[SC_SACRIFICE]->val2 <= 0 )
status_change_end(src, SC_SACRIFICE, INVALID_TIMER); status_change_end(src, SC_SACRIFICE);
/** /**
* We need to calculate the DMG before the hp reduction, because it can kill the source. * We need to calculate the DMG before the hp reduction, because it can kill the source.
@ -8895,7 +8895,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if( sc && sc->count ) { if( sc && sc->count ) {
if (sc->data[SC_EXEEDBREAK]) if (sc->data[SC_EXEEDBREAK])
status_change_end(src, SC_EXEEDBREAK, INVALID_TIMER); status_change_end(src, SC_EXEEDBREAK);
if( sc->data[SC_SPELLFIST] && !vellum_damage ){ if( sc->data[SC_SPELLFIST] && !vellum_damage ){
if (status_charge(src, 0, 20)) { if (status_charge(src, 0, 20)) {
if (!is_infinite_defense(target, wd.flag)) { if (!is_infinite_defense(target, wd.flag)) {
@ -8908,7 +8908,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
DAMAGE_DIV_FIX(wd.damage, wd.div_); DAMAGE_DIV_FIX(wd.damage, wd.div_);
} }
} else } else
status_change_end(src,SC_SPELLFIST,INVALID_TIMER); status_change_end(src,SC_SPELLFIST);
} }
if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage)
wd.damage += wd.damage * 150 / 100; // 2.5 times damage wd.damage += wd.damage * 150 / 100; // 2.5 times damage
@ -8996,7 +8996,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
} }
} }
else else
status_change_end(target, SC_DEVOTION, INVALID_TIMER); status_change_end(target, SC_DEVOTION);
} }
if (target->type == BL_PC && (wd.flag&BF_SHORT) && tsc->data[SC_CIRCLE_OF_FIRE_OPTION]) { if (target->type == BL_PC && (wd.flag&BF_SHORT) && tsc->data[SC_CIRCLE_OF_FIRE_OPTION]) {
s_elemental_data *ed = ((TBL_PC*)target)->ed; s_elemental_data *ed = ((TBL_PC*)target)->ed;
@ -9205,7 +9205,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
--sce->val2; --sce->val2;
} }
if (sce->val2 <= 0) if (sce->val2 <= 0)
status_change_end(target, SC_POISONREACT, INVALID_TIMER); status_change_end(target, SC_POISONREACT);
} }
} }

View File

@ -11192,8 +11192,8 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
clif_changeoption(&sd->bl); clif_changeoption(&sd->bl);
if ((sd->sc.data[SC_MONSTER_TRANSFORM] || sd->sc.data[SC_ACTIVE_MONSTER_TRANSFORM]) && battle_config.mon_trans_disable_in_gvg && mapdata_flag_gvg2(mapdata)) { if ((sd->sc.data[SC_MONSTER_TRANSFORM] || sd->sc.data[SC_ACTIVE_MONSTER_TRANSFORM]) && battle_config.mon_trans_disable_in_gvg && mapdata_flag_gvg2(mapdata)) {
status_change_end(&sd->bl, SC_MONSTER_TRANSFORM, INVALID_TIMER); status_change_end(&sd->bl, SC_MONSTER_TRANSFORM);
status_change_end(&sd->bl, SC_ACTIVE_MONSTER_TRANSFORM, INVALID_TIMER); status_change_end(&sd->bl, SC_ACTIVE_MONSTER_TRANSFORM);
clif_displaymessage(sd->fd, msg_txt(sd,731)); // Transforming into monster is not allowed in Guild Wars. clif_displaymessage(sd->fd, msg_txt(sd,731)); // Transforming into monster is not allowed in Guild Wars.
} }
@ -11459,8 +11459,8 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd)
// not when you move each cell. This is official behaviour. // not when you move each cell. This is official behaviour.
if (sd->sc.data[SC_CLOAKING]) if (sd->sc.data[SC_CLOAKING])
skill_check_cloaking(&sd->bl, sd->sc.data[SC_CLOAKING]); skill_check_cloaking(&sd->bl, sd->sc.data[SC_CLOAKING]);
status_change_end(&sd->bl, SC_ROLLINGCUTTER, INVALID_TIMER); // If you move, you lose your counters. [malufett] status_change_end(&sd->bl, SC_ROLLINGCUTTER); // If you move, you lose your counters. [malufett]
status_change_end(&sd->bl, SC_CRESCIVEBOLT, INVALID_TIMER); status_change_end(&sd->bl, SC_CRESCIVEBOLT);
pc_delinvincibletimer(sd); pc_delinvincibletimer(sd);
@ -19590,7 +19590,7 @@ int clif_autoshadowspell_list(struct map_session_data *sd) {
sd->menuskill_id = SC_AUTOSHADOWSPELL; sd->menuskill_id = SC_AUTOSHADOWSPELL;
sd->menuskill_val = c; sd->menuskill_val = c;
} else { } else {
status_change_end(&sd->bl,SC_STOP,INVALID_TIMER); status_change_end(&sd->bl,SC_STOP);
clif_skill_fail(sd,SC_AUTOSHADOWSPELL,USESKILL_FAIL_IMITATION_SKILL_NONE,0); clif_skill_fail(sd,SC_AUTOSHADOWSPELL,USESKILL_FAIL_IMITATION_SKILL_NONE,0);
} }

View File

@ -1038,11 +1038,11 @@ int guild_member_withdraw(int guild_id, uint32 account_id, uint32 char_id, int f
} }
clif_name_area(&sd->bl); //Update display name [Skotlex] clif_name_area(&sd->bl); //Update display name [Skotlex]
status_change_end(&sd->bl,SC_LEADERSHIP,INVALID_TIMER); status_change_end(&sd->bl,SC_LEADERSHIP);
status_change_end(&sd->bl,SC_GLORYWOUNDS,INVALID_TIMER); status_change_end(&sd->bl,SC_GLORYWOUNDS);
status_change_end(&sd->bl,SC_SOULCOLD,INVALID_TIMER); status_change_end(&sd->bl,SC_SOULCOLD);
status_change_end(&sd->bl,SC_HAWKEYES,INVALID_TIMER); status_change_end(&sd->bl,SC_HAWKEYES);
status_change_end(&sd->bl,SC_EMERGENCY_MOVE,INVALID_TIMER); status_change_end(&sd->bl,SC_EMERGENCY_MOVE);
//@TODO: Send emblem update to self and people around //@TODO: Send emblem update to self and people around
} }
return 0; return 0;
@ -1534,7 +1534,7 @@ void guild_guildaura_refresh(struct map_session_data *sd, uint16 skill_id, uint1
if (type == SC_NONE) if (type == SC_NONE)
return; return;
status_change_end(&sd->bl, type, INVALID_TIMER); status_change_end(&sd->bl, type);
std::shared_ptr<s_skill_unit_group> group = skill_unitsetting(&sd->bl,skill_id,skill_lv,sd->bl.x,sd->bl.y,0); std::shared_ptr<s_skill_unit_group> group = skill_unitsetting(&sd->bl,skill_id,skill_lv,sd->bl.x,sd->bl.y,0);
@ -1914,11 +1914,11 @@ int guild_broken(int guild_id,int flag) {
sd->state.gmaster_flag = 0; sd->state.gmaster_flag = 0;
clif_guild_broken(g->member[i].sd,0); clif_guild_broken(g->member[i].sd,0);
clif_name_area(&sd->bl); // [LuzZza] clif_name_area(&sd->bl); // [LuzZza]
status_change_end(&sd->bl,SC_LEADERSHIP,INVALID_TIMER); status_change_end(&sd->bl,SC_LEADERSHIP);
status_change_end(&sd->bl,SC_GLORYWOUNDS,INVALID_TIMER); status_change_end(&sd->bl,SC_GLORYWOUNDS);
status_change_end(&sd->bl,SC_SOULCOLD,INVALID_TIMER); status_change_end(&sd->bl,SC_SOULCOLD);
status_change_end(&sd->bl,SC_HAWKEYES,INVALID_TIMER); status_change_end(&sd->bl,SC_HAWKEYES);
status_change_end(&sd->bl,SC_EMERGENCY_MOVE,INVALID_TIMER); status_change_end(&sd->bl,SC_EMERGENCY_MOVE);
} }
} }

View File

@ -270,7 +270,7 @@ int hom_dead(struct homun_data *hd)
clif_emotion(&sd->bl, ET_CRY); clif_emotion(&sd->bl, ET_CRY);
#ifdef RENEWAL #ifdef RENEWAL
status_change_end(&sd->bl, SC_HOMUN_TIME, INVALID_TIMER); status_change_end(&sd->bl, SC_HOMUN_TIME);
#endif #endif
//Remove from map (if it has no intimacy, it is auto-removed from memory) //Remove from map (if it has no intimacy, it is auto-removed from memory)
@ -310,7 +310,7 @@ int hom_vaporize(struct map_session_data *sd, int flag)
hom_save(hd); hom_save(hd);
#ifdef RENEWAL #ifdef RENEWAL
status_change_end(&sd->bl, SC_HOMUN_TIME, INVALID_TIMER); status_change_end(&sd->bl, SC_HOMUN_TIME);
#endif #endif
return unit_remove_map(&hd->bl, CLR_OUTSIGHT); return unit_remove_map(&hd->bl, CLR_OUTSIGHT);

View File

@ -443,17 +443,17 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
skill_unit_move(bl,tick,2); skill_unit_move(bl,tick,2);
if ( sc && sc->count ) //at least one to cancel if ( sc && sc->count ) //at least one to cancel
{ {
status_change_end(bl, SC_CLOSECONFINE, INVALID_TIMER); status_change_end(bl, SC_CLOSECONFINE);
status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER); status_change_end(bl, SC_CLOSECONFINE2);
status_change_end(bl, SC_TINDER_BREAKER, INVALID_TIMER); status_change_end(bl, SC_TINDER_BREAKER);
status_change_end(bl, SC_TINDER_BREAKER2, INVALID_TIMER); status_change_end(bl, SC_TINDER_BREAKER2);
// status_change_end(bl, SC_BLADESTOP, INVALID_TIMER); //Won't stop when you are knocked away, go figure... // status_change_end(bl, SC_BLADESTOP); //Won't stop when you are knocked away, go figure...
status_change_end(bl, SC_TATAMIGAESHI, INVALID_TIMER); status_change_end(bl, SC_TATAMIGAESHI);
status_change_end(bl, SC_MAGICROD, INVALID_TIMER); status_change_end(bl, SC_MAGICROD);
status_change_end(bl, SC_SU_STOOP, INVALID_TIMER); status_change_end(bl, SC_SU_STOOP);
if (sc->data[SC_PROPERTYWALK] && if (sc->data[SC_PROPERTYWALK] &&
sc->data[SC_PROPERTYWALK]->val3 >= skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) ) sc->data[SC_PROPERTYWALK]->val3 >= skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) )
status_change_end(bl,SC_PROPERTYWALK,INVALID_TIMER); status_change_end(bl,SC_PROPERTYWALK);
} }
} else } else
if (bl->type == BL_NPC) if (bl->type == BL_NPC)
@ -481,7 +481,7 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
struct block_list *d_bl; struct block_list *d_bl;
if( (d_bl = map_id2bl(((TBL_PC*)bl)->shadowform_id)) == NULL || !check_distance_bl(bl,d_bl,10) ) { if( (d_bl = map_id2bl(((TBL_PC*)bl)->shadowform_id)) == NULL || !check_distance_bl(bl,d_bl,10) ) {
if( d_bl ) if( d_bl )
status_change_end(d_bl,SC__SHADOWFORM,INVALID_TIMER); status_change_end(d_bl,SC__SHADOWFORM);
((TBL_PC*)bl)->shadowform_id = 0; ((TBL_PC*)bl)->shadowform_id = 0;
} }
} }
@ -491,7 +491,7 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
skill_unit_move_unit_group(skill_id2group(sc->data[SC_DANCING]->val2), bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_DANCING]->val2), bl->m, x1-x0, y1-y0);
else { else {
if (sc->data[SC_CLOAKING] && sc->data[SC_CLOAKING]->val1 < 3 && !skill_check_cloaking(bl, NULL)) if (sc->data[SC_CLOAKING] && sc->data[SC_CLOAKING]->val1 < 3 && !skill_check_cloaking(bl, NULL))
status_change_end(bl, SC_CLOAKING, INVALID_TIMER); status_change_end(bl, SC_CLOAKING);
if (sc->data[SC_WARM]) if (sc->data[SC_WARM])
skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0);
if (sc->data[SC_BANDING]) if (sc->data[SC_BANDING])
@ -505,7 +505,7 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick)
if( sc->data[SC__SHADOWFORM] ) {//Shadow Form Caster Moving if( sc->data[SC__SHADOWFORM] ) {//Shadow Form Caster Moving
struct block_list *d_bl; struct block_list *d_bl;
if( (d_bl = map_id2bl(sc->data[SC__SHADOWFORM]->val2)) == NULL || !check_distance_bl(bl,d_bl,10) ) if( (d_bl = map_id2bl(sc->data[SC__SHADOWFORM]->val2)) == NULL || !check_distance_bl(bl,d_bl,10) )
status_change_end(bl,SC__SHADOWFORM,INVALID_TIMER); status_change_end(bl,SC__SHADOWFORM);
} }
if (sc->data[SC_PROPERTYWALK] if (sc->data[SC_PROPERTYWALK]
@ -2095,20 +2095,20 @@ int map_quit(struct map_session_data *sd) {
//No need to save infinite status //No need to save infinite status
if (flag[SCF_NOSAVEINFINITE] && sd->sc.data[it.first] && sd->sc.data[it.first]->val4 > 0) { if (flag[SCF_NOSAVEINFINITE] && sd->sc.data[it.first] && sd->sc.data[it.first]->val4 > 0) {
status_change_end(&sd->bl, static_cast<sc_type>(it.first), INVALID_TIMER); status_change_end(&sd->bl, static_cast<sc_type>(it.first));
continue; continue;
} }
//Status that are not saved //Status that are not saved
if (flag[SCF_NOSAVE]) { if (flag[SCF_NOSAVE]) {
status_change_end(&sd->bl, static_cast<sc_type>(it.first), INVALID_TIMER); status_change_end(&sd->bl, static_cast<sc_type>(it.first));
continue; continue;
} }
//Removes status by config //Removes status by config
if (battle_config.debuff_on_logout&1 && flag[SCF_DEBUFF] || //Removes debuffs if (battle_config.debuff_on_logout&1 && flag[SCF_DEBUFF] || //Removes debuffs
(battle_config.debuff_on_logout&2 && !(flag[SCF_DEBUFF]))) //Removes buffs (battle_config.debuff_on_logout&2 && !(flag[SCF_DEBUFF]))) //Removes buffs
{ {
status_change_end(&sd->bl, static_cast<sc_type>(it.first), INVALID_TIMER); status_change_end(&sd->bl, static_cast<sc_type>(it.first));
continue; continue;
} }
} }

View File

@ -281,7 +281,7 @@ int mercenary_delete(s_mercenary_data *md, int reply) {
if( md->devotion_flag ) if( md->devotion_flag )
{ {
md->devotion_flag = 0; md->devotion_flag = 0;
status_change_end(&sd->bl, SC_DEVOTION, INVALID_TIMER); status_change_end(&sd->bl, SC_DEVOTION);
} }
switch( reply ) switch( reply )

View File

@ -3357,8 +3357,8 @@ int mob_class_change (struct mob_data *md, int mob_id)
else else
memcpy(md->name,md->db->jname.c_str(),NAME_LENGTH); memcpy(md->name,md->db->jname.c_str(),NAME_LENGTH);
status_change_end(&md->bl,SC_KEEPING,INVALID_TIMER); // End before calling status_calc_mob(). status_change_end(&md->bl,SC_KEEPING); // End before calling status_calc_mob().
status_change_end(&md->bl,SC_BARRIER,INVALID_TIMER); status_change_end(&md->bl,SC_BARRIER);
mob_stop_attack(md); mob_stop_attack(md);
mob_stop_walking(md, 0); mob_stop_walking(md, 0);
unit_skillcastcancel(&md->bl, 0); unit_skillcastcancel(&md->bl, 0);

View File

@ -781,7 +781,7 @@ int pc_delsoulball(map_session_data *sd, int count, bool type)
}else{ }else{
sd->soulball -= cap_value(count, 0, sd->soulball); sd->soulball -= cap_value(count, 0, sd->soulball);
if (sd->soulball == 0) if (sd->soulball == 0)
status_change_end(&sd->bl, SC_SOULENERGY, INVALID_TIMER); status_change_end(&sd->bl, SC_SOULENERGY);
else else
sc->data[SC_SOULENERGY]->val1 = sd->soulball; sc->data[SC_SOULENERGY]->val1 = sd->soulball;
} }
@ -2654,9 +2654,9 @@ void pc_updateweightstatus(struct map_session_data *sd)
// stop old status change // stop old status change
if( old_overweight == 1 ) if( old_overweight == 1 )
status_change_end(&sd->bl, SC_WEIGHT50, INVALID_TIMER); status_change_end(&sd->bl, SC_WEIGHT50);
else if( old_overweight == 2 ) else if( old_overweight == 2 )
status_change_end(&sd->bl, SC_WEIGHT90, INVALID_TIMER); status_change_end(&sd->bl, SC_WEIGHT90);
// start new status change // start new status change
if( new_overweight == 1 ) if( new_overweight == 1 )
@ -6432,7 +6432,7 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in
for (const auto &it : status_db) { for (const auto &it : status_db) {
if (sc->data[it.first]) { if (sc->data[it.first]) {
if (it.second->flag[SCF_REMOVEONMAPWARP]) if (it.second->flag[SCF_REMOVEONMAPWARP])
status_change_end(&sd->bl, static_cast<sc_type>(it.first), INVALID_TIMER); status_change_end(&sd->bl, static_cast<sc_type>(it.first));
if (it.second->flag[SCF_RESTARTONMAPWARP] && it.second->skill_id > 0) { if (it.second->flag[SCF_RESTARTONMAPWARP] && it.second->skill_id > 0) {
status_change_entry *sce = sd->sc.data[it.first]; status_change_entry *sce = sd->sc.data[it.first];
@ -6875,12 +6875,12 @@ static void pc_checkallowskill(struct map_session_data *sd)
if (status == SC_DANCING && !battle_config.dancing_weaponswitch_fix) if (status == SC_DANCING && !battle_config.dancing_weaponswitch_fix)
continue; continue;
if (sd->sc.data[status] && !pc_check_weapontype(sd, skill_get_weapontype(it.second->skill_id))) if (sd->sc.data[status] && !pc_check_weapontype(sd, skill_get_weapontype(it.second->skill_id)))
status_change_end(&sd->bl, status, INVALID_TIMER); status_change_end(&sd->bl, status);
} }
if (flag[SCF_REQUIRESHIELD]) { // Skills requiring a shield if (flag[SCF_REQUIRESHIELD]) { // Skills requiring a shield
if (sd->sc.data[status] && sd->status.shield <= 0) if (sd->sc.data[status] && sd->status.shield <= 0)
status_change_end(&sd->bl, status, INVALID_TIMER); status_change_end(&sd->bl, status);
} }
} }
} }
@ -8886,9 +8886,9 @@ int pc_resetskill(struct map_session_data* sd, int flag)
hom_vaporize(sd, HOM_ST_ACTIVE); hom_vaporize(sd, HOM_ST_ACTIVE);
if (sd->sc.data[SC_SPRITEMABLE] && pc_checkskill(sd, SU_SPRITEMABLE)) if (sd->sc.data[SC_SPRITEMABLE] && pc_checkskill(sd, SU_SPRITEMABLE))
status_change_end(&sd->bl, SC_SPRITEMABLE, INVALID_TIMER); status_change_end(&sd->bl, SC_SPRITEMABLE);
if (sd->sc.data[SC_SOULATTACK] && pc_checkskill(sd, SU_SOULATTACK)) if (sd->sc.data[SC_SOULATTACK] && pc_checkskill(sd, SU_SOULATTACK))
status_change_end(&sd->bl, SC_SOULATTACK, INVALID_TIMER); status_change_end(&sd->bl, SC_SOULATTACK);
} }
for (const auto &skill : skill_db) { for (const auto &skill : skill_db) {
@ -9209,7 +9209,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
if (sd->devotion[k]){ if (sd->devotion[k]){
struct map_session_data *devsd = map_id2sd(sd->devotion[k]); struct map_session_data *devsd = map_id2sd(sd->devotion[k]);
if (devsd) if (devsd)
status_change_end(&devsd->bl, SC_DEVOTION, INVALID_TIMER); status_change_end(&devsd->bl, SC_DEVOTION);
sd->devotion[k] = 0; sd->devotion[k] = 0;
} }
} }
@ -9219,7 +9219,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
struct map_session_data *smarksd = map_id2sd(sd->stellar_mark[k]); struct map_session_data *smarksd = map_id2sd(sd->stellar_mark[k]);
if (smarksd) if (smarksd)
status_change_end(&smarksd->bl, SC_FLASHKICK, INVALID_TIMER); status_change_end(&smarksd->bl, SC_FLASHKICK);
sd->stellar_mark[k] = 0; sd->stellar_mark[k] = 0;
} }
} }
@ -9229,7 +9229,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
struct map_session_data *usoulsd = map_id2sd(sd->united_soul[k]); struct map_session_data *usoulsd = map_id2sd(sd->united_soul[k]);
if (usoulsd) if (usoulsd)
status_change_end(&usoulsd->bl, SC_SOULUNITY, INVALID_TIMER); status_change_end(&usoulsd->bl, SC_SOULUNITY);
sd->united_soul[k] = 0; sd->united_soul[k] = 0;
} }
} }
@ -9239,13 +9239,13 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
struct map_session_data *ssignsd = map_id2sd(sd->servant_sign[k]); struct map_session_data *ssignsd = map_id2sd(sd->servant_sign[k]);
if (ssignsd) if (ssignsd)
status_change_end(&ssignsd->bl, SC_SERVANT_SIGN, INVALID_TIMER); status_change_end(&ssignsd->bl, SC_SERVANT_SIGN);
sd->servant_sign[k] = 0; sd->servant_sign[k] = 0;
} }
} }
if(sd->shadowform_id) { //if we were target of shadowform if(sd->shadowform_id) { //if we were target of shadowform
status_change_end(map_id2bl(sd->shadowform_id), SC__SHADOWFORM, INVALID_TIMER); status_change_end(map_id2bl(sd->shadowform_id), SC__SHADOWFORM);
sd->shadowform_id = 0; //should be remove on status end anyway sd->shadowform_id = 0; //should be remove on status end anyway
} }
@ -9591,7 +9591,7 @@ bool pc_revive_item(struct map_session_data *sd) {
return false; return false;
if (item_position < 0) if (item_position < 0)
status_change_end(&sd->bl, SC_LIGHT_OF_REGENE, INVALID_TIMER); status_change_end(&sd->bl, SC_LIGHT_OF_REGENE);
else else
pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME); pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
@ -9965,7 +9965,7 @@ bool pc_setparam(struct map_session_data *sd,int64 type,int64 val_tmp)
if( val < 0 ) if( val < 0 )
sc_start(NULL, &sd->bl, SC_NOCHAT, 100, 0, 0); sc_start(NULL, &sd->bl, SC_NOCHAT, 100, 0, 0);
else { else {
status_change_end(&sd->bl, SC_NOCHAT, INVALID_TIMER); status_change_end(&sd->bl, SC_NOCHAT);
clif_manner_message(sd, 5); clif_manner_message(sd, 5);
} }
return true; // status_change_start/status_change_end already sends packets warning the client return true; // status_change_start/status_change_end already sends packets warning the client
@ -10458,11 +10458,11 @@ bool pc_jobchange(struct map_session_data *sd,int job, char upper)
hom_vaporize(sd, HOM_ST_ACTIVE); hom_vaporize(sd, HOM_ST_ACTIVE);
if (sd->sc.data[SC_SPRITEMABLE] && !pc_checkskill(sd, SU_SPRITEMABLE)) if (sd->sc.data[SC_SPRITEMABLE] && !pc_checkskill(sd, SU_SPRITEMABLE))
status_change_end(&sd->bl, SC_SPRITEMABLE, INVALID_TIMER); status_change_end(&sd->bl, SC_SPRITEMABLE);
if (sd->sc.data[SC_SOULATTACK] && !pc_checkskill(sd, SU_SOULATTACK)) if (sd->sc.data[SC_SOULATTACK] && !pc_checkskill(sd, SU_SOULATTACK))
status_change_end(&sd->bl, SC_SOULATTACK, INVALID_TIMER); status_change_end(&sd->bl, SC_SOULATTACK);
if( sd->sc.data[SC_SPIRIT] ){ if( sd->sc.data[SC_SPIRIT] ){
status_change_end( &sd->bl, SC_SPIRIT, INVALID_TIMER ); status_change_end( &sd->bl, SC_SPIRIT );
} }
if(sd->status.manner < 0) if(sd->status.manner < 0)
@ -10637,7 +10637,7 @@ void pc_setoption(struct map_session_data *sd,int type, int subtype)
if( type&OPTION_MADOGEAR && !(p_type&OPTION_MADOGEAR) ) { if( type&OPTION_MADOGEAR && !(p_type&OPTION_MADOGEAR) ) {
sc_start(&sd->bl, &sd->bl, SC_MADOGEAR, 100, subtype, INFINITE_TICK); sc_start(&sd->bl, &sd->bl, SC_MADOGEAR, 100, subtype, INFINITE_TICK);
} else if( !(type&OPTION_MADOGEAR) && p_type&OPTION_MADOGEAR ) { } else if( !(type&OPTION_MADOGEAR) && p_type&OPTION_MADOGEAR ) {
status_change_end(&sd->bl, SC_MADOGEAR, INVALID_TIMER); status_change_end(&sd->bl, SC_MADOGEAR);
} }
if (type&OPTION_FLYING && !(p_type&OPTION_FLYING)) if (type&OPTION_FLYING && !(p_type&OPTION_FLYING))
@ -10686,7 +10686,7 @@ bool pc_setcart(struct map_session_data *sd,int type) {
case 0: case 0:
if( !sd->sc.data[SC_PUSH_CART] ) if( !sd->sc.data[SC_PUSH_CART] )
return 0; return 0;
status_change_end(&sd->bl,SC_PUSH_CART,INVALID_TIMER); status_change_end(&sd->bl,SC_PUSH_CART);
clif_clearcart(sd->fd); clif_clearcart(sd->fd);
break; break;
default:/* everything else is an allowed ID so we can move on */ default:/* everything else is an allowed ID so we can move on */
@ -11754,7 +11754,7 @@ static void pc_unequipitem_sub(struct map_session_data *sd, int n, int flag) {
} }
if (sd->sc.data[SC_SIGNUMCRUCIS] && !battle_check_undead(sd->battle_status.race, sd->battle_status.def_ele)) if (sd->sc.data[SC_SIGNUMCRUCIS] && !battle_check_undead(sd->battle_status.race, sd->battle_status.def_ele))
status_change_end(&sd->bl, SC_SIGNUMCRUCIS, INVALID_TIMER); status_change_end(&sd->bl, SC_SIGNUMCRUCIS);
//OnUnEquip script [Skotlex] //OnUnEquip script [Skotlex]
if (sd->inventory_data[n]) { if (sd->inventory_data[n]) {
@ -11827,13 +11827,13 @@ bool pc_unequipitem(struct map_session_data *sd, int n, int flag) {
pc_calcweapontype(sd); pc_calcweapontype(sd);
clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon); clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
if( !battle_config.dancing_weaponswitch_fix ) if( !battle_config.dancing_weaponswitch_fix )
status_change_end(&sd->bl, SC_DANCING, INVALID_TIMER); // Unequipping => stop dancing. status_change_end(&sd->bl, SC_DANCING); // Unequipping => stop dancing.
#ifdef RENEWAL #ifdef RENEWAL
if (battle_config.switch_remove_edp&2) { if (battle_config.switch_remove_edp&2) {
#else #else
if (battle_config.switch_remove_edp&1) { if (battle_config.switch_remove_edp&1) {
#endif #endif
status_change_end(&sd->bl, SC_EDP, INVALID_TIMER); status_change_end(&sd->bl, SC_EDP);
} }
} }
if(pos & EQP_HAND_L) { if(pos & EQP_HAND_L) {
@ -11888,12 +11888,12 @@ bool pc_unequipitem(struct map_session_data *sd, int n, int flag) {
// On equipment change // On equipment change
#ifndef RENEWAL #ifndef RENEWAL
if (!(flag&4)) if (!(flag&4))
status_change_end(&sd->bl, SC_CONCENTRATION, INVALID_TIMER); status_change_end(&sd->bl, SC_CONCENTRATION);
#endif #endif
// On ammo change // On ammo change
if (sd->inventory_data[n]->type == IT_AMMO && (sd->inventory_data[n]->nameid != ITEMID_SILVER_BULLET || sd->inventory_data[n]->nameid != ITEMID_PURIFICATION_BULLET || sd->inventory_data[n]->nameid != ITEMID_SILVER_BULLET_)) if (sd->inventory_data[n]->type == IT_AMMO && (sd->inventory_data[n]->nameid != ITEMID_SILVER_BULLET || sd->inventory_data[n]->nameid != ITEMID_PURIFICATION_BULLET || sd->inventory_data[n]->nameid != ITEMID_SILVER_BULLET_))
status_change_end(&sd->bl, SC_P_ALTER, INVALID_TIMER); status_change_end(&sd->bl, SC_P_ALTER);
pc_unequipitem_sub(sd, n, flag); pc_unequipitem_sub(sd, n, flag);
@ -12508,7 +12508,7 @@ bool pc_setstand(struct map_session_data *sd, bool force){
if (!force && (sd->sc.data[SC_SITDOWN_FORCE] || sd->sc.data[SC_BANANA_BOMB_SITDOWN])) if (!force && (sd->sc.data[SC_SITDOWN_FORCE] || sd->sc.data[SC_BANANA_BOMB_SITDOWN]))
return false; return false;
status_change_end(&sd->bl, SC_TENSIONRELAX, INVALID_TIMER); status_change_end(&sd->bl, SC_TENSIONRELAX);
clif_status_load(&sd->bl,EFST_SIT,0); clif_status_load(&sd->bl,EFST_SIT,0);
clif_standing(&sd->bl); //Inform area PC is standing clif_standing(&sd->bl); //Inform area PC is standing
//Reset sitting tick. //Reset sitting tick.
@ -12535,8 +12535,8 @@ void pc_overheat(map_session_data &sd, int16 heat) {
sce->val1 = cap_value(sce->val1, 0, 1000); sce->val1 = cap_value(sce->val1, 0, 1000);
if (heat < 0 && sce->val1 == 0) { // Cooling device used. if (heat < 0 && sce->val1 == 0) { // Cooling device used.
status_change_end(&sd.bl, SC_OVERHEAT_LIMITPOINT, INVALID_TIMER); status_change_end(&sd.bl, SC_OVERHEAT_LIMITPOINT);
status_change_end(&sd.bl, SC_OVERHEAT, INVALID_TIMER); status_change_end(&sd.bl, SC_OVERHEAT);
} }
} else if (heat > 0) } else if (heat > 0)
sc_start(&sd.bl, &sd.bl, SC_OVERHEAT_LIMITPOINT, 100, heat, 1000); sc_start(&sd.bl, &sd.bl, SC_OVERHEAT_LIMITPOINT, 100, heat, 1000);
@ -14291,7 +14291,7 @@ void pc_crimson_marker_clear(struct map_session_data *sd) {
for (i = 0; i < MAX_SKILL_CRIMSON_MARKER; i++) { for (i = 0; i < MAX_SKILL_CRIMSON_MARKER; i++) {
struct block_list *bl = NULL; struct block_list *bl = NULL;
if (sd->c_marker[i] && (bl = map_id2bl(sd->c_marker[i]))) if (sd->c_marker[i] && (bl = map_id2bl(sd->c_marker[i])))
status_change_end(bl,SC_C_MARKER,INVALID_TIMER); status_change_end(bl,SC_C_MARKER);
sd->c_marker[i] = 0; sd->c_marker[i] = 0;
} }
} }
@ -14537,7 +14537,7 @@ void pc_cell_basilica(struct map_session_data *sd) {
if (!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKBASILICA)) { if (!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKBASILICA)) {
if (sd->sc.data[type]) if (sd->sc.data[type])
status_change_end(&sd->bl, type,INVALID_TIMER); status_change_end(&sd->bl, type);
} }
else if (!sd->sc.data[type]) else if (!sd->sc.data[type])
sc_start(&sd->bl,&sd->bl, type,100,0,INFINITE_TICK); sc_start(&sd->bl,&sd->bl, type,100,0,INFINITE_TICK);

View File

@ -2069,7 +2069,7 @@ TIMER_FUNC(pet_recovery_timer){
//Display a heal animation? //Display a heal animation?
//Detoxify is chosen for now. //Detoxify is chosen for now.
clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1); clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1);
status_change_end(&sd->bl, pd->recovery->type, INVALID_TIMER); status_change_end(&sd->bl, pd->recovery->type);
clif_emotion(&pd->bl, ET_OK); clif_emotion(&pd->bl, ET_OK);
} }

View File

@ -12170,7 +12170,7 @@ BUILDIN_FUNC(sc_end)
//This should help status_change_end force disabling the SC in case it has no limit. //This should help status_change_end force disabling the SC in case it has no limit.
sce->val1 = sce->val2 = sce->val3 = sce->val4 = 0; sce->val1 = sce->val2 = sce->val3 = sce->val4 = 0;
status_change_end(bl, (sc_type)type, INVALID_TIMER); status_change_end(bl, (sc_type)type);
} else } else
status_change_clear(bl, 3); // remove all effects status_change_clear(bl, 3); // remove all effects
@ -22201,7 +22201,7 @@ BUILDIN_FUNC(setmounting) {
script_pushint(st, 0); // Silent failure script_pushint(st, 0); // Silent failure
} else { } else {
if( sd->sc.data[SC_ALL_RIDING] ) if( sd->sc.data[SC_ALL_RIDING] )
status_change_end(&sd->bl, SC_ALL_RIDING, INVALID_TIMER); //release mount status_change_end(&sd->bl, SC_ALL_RIDING); //release mount
else else
sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INFINITE_TICK); //mount sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INFINITE_TICK); //mount
script_pushint(st,1);//in both cases, return 1. script_pushint(st,1);//in both cases, return 1.
@ -23107,10 +23107,10 @@ BUILDIN_FUNC(montransform) {
} }
if (!strcmp(script_getfuncname(st), "active_transform")) { if (!strcmp(script_getfuncname(st), "active_transform")) {
status_change_end(&sd->bl, SC_ACTIVE_MONSTER_TRANSFORM, INVALID_TIMER); // Clear previous status_change_end(&sd->bl, SC_ACTIVE_MONSTER_TRANSFORM); // Clear previous
sc_start2(NULL, &sd->bl, SC_ACTIVE_MONSTER_TRANSFORM, 100, mob_id, type, tick); sc_start2(NULL, &sd->bl, SC_ACTIVE_MONSTER_TRANSFORM, 100, mob_id, type, tick);
} else { } else {
status_change_end(&sd->bl, SC_MONSTER_TRANSFORM, INVALID_TIMER); // Clear previous status_change_end(&sd->bl, SC_MONSTER_TRANSFORM); // Clear previous
sc_start2(NULL, &sd->bl, SC_MONSTER_TRANSFORM, 100, mob_id, type, tick); sc_start2(NULL, &sd->bl, SC_MONSTER_TRANSFORM, 100, mob_id, type, tick);
} }
if (type != SC_NONE) if (type != SC_NONE)

File diff suppressed because it is too large Load Diff

View File

@ -1049,7 +1049,7 @@ void StatusDatabase::changeSkillTree(map_session_data *sd, int32 class_) {
sc_type sc = skill_get_sc(skill_id); sc_type sc = skill_get_sc(skill_id);
if (sc > SC_COMMON_MAX && sc < SC_MAX && sd->sc.data[sc]) if (sc > SC_COMMON_MAX && sc < SC_MAX && sd->sc.data[sc])
status_change_end(&sd->bl, sc, INVALID_TIMER); status_change_end(&sd->bl, sc);
} }
} }
@ -1086,7 +1086,7 @@ void StatusDatabase::removeByStatusFlag(block_list *bl, std::vector<e_status_cha
if (sc->data[type]) { if (sc->data[type]) {
for (const auto &flag_it : flag) { for (const auto &flag_it : flag) {
if (status->flag[flag_it]) if (status->flag[flag_it])
status_change_end(bl, type, INVALID_TIMER); status_change_end(bl, type);
} }
} }
} }
@ -1402,7 +1402,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
sc->lastEffectTimer = add_timer(gettick() + 10, status_clear_lastEffect_timer, target->id, 0); sc->lastEffectTimer = add_timer(gettick() + 10, status_clear_lastEffect_timer, target->id, 0);
sc->lastEffect = type; sc->lastEffect = type;
} }
status_change_end(target, type, INVALID_TIMER); status_change_end(target, type);
} }
} }
if ((sce=sc->data[SC_ENDURE]) && !sce->val4) { if ((sce=sc->data[SC_ENDURE]) && !sce->val4) {
@ -1411,7 +1411,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
* val4 signals infinite endure. * val4 signals infinite endure.
**/ **/
if (src && src->type != BL_PC && !map_flag_gvg2(target->m) && !map_getmapflag(target->m, MF_BATTLEGROUND) && --(sce->val2) <= 0) if (src && src->type != BL_PC && !map_flag_gvg2(target->m) && !map_getmapflag(target->m, MF_BATTLEGROUND) && --(sce->val2) <= 0)
status_change_end(target, SC_ENDURE, INVALID_TIMER); status_change_end(target, SC_ENDURE);
} }
#ifndef RENEWAL #ifndef RENEWAL
if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF) { if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF) {
@ -1420,16 +1420,16 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
if (sg) { if (sg) {
skill_delunitgroup(sg); skill_delunitgroup(sg);
sce->val4 = 0; sce->val4 = 0;
status_change_end(target, SC_GRAVITATION, INVALID_TIMER); status_change_end(target, SC_GRAVITATION);
} }
} }
#endif #endif
if(sc->data[SC_DANCING] && (unsigned int)hp > status->max_hp>>2) if(sc->data[SC_DANCING] && (unsigned int)hp > status->max_hp>>2)
status_change_end(target, SC_DANCING, INVALID_TIMER); status_change_end(target, SC_DANCING);
if(sc->data[SC_CLOAKINGEXCEED] && --(sc->data[SC_CLOAKINGEXCEED]->val2) <= 0) if(sc->data[SC_CLOAKINGEXCEED] && --(sc->data[SC_CLOAKINGEXCEED]->val2) <= 0)
status_change_end(target, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(target, SC_CLOAKINGEXCEED);
if(sc->data[SC_KAGEMUSYA] && --(sc->data[SC_KAGEMUSYA]->val3) <= 0) if(sc->data[SC_KAGEMUSYA] && --(sc->data[SC_KAGEMUSYA]->val3) <= 0)
status_change_end(target, SC_KAGEMUSYA, INVALID_TIMER); status_change_end(target, SC_KAGEMUSYA);
} }
if (target->type == BL_PC) if (target->type == BL_PC)
@ -1447,11 +1447,11 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in
status->hp < status->max_hp>>2) status->hp < status->max_hp>>2)
sc_start4(src,target,SC_PROVOKE,100,10,0,0,1,0); sc_start4(src,target,SC_PROVOKE,100,10,0,0,1,0);
if (sc->data[SC_BERSERK] && status->hp <= 100) if (sc->data[SC_BERSERK] && status->hp <= 100)
status_change_end(target, SC_BERSERK, INVALID_TIMER); status_change_end(target, SC_BERSERK);
if( sc->data[SC_RAISINGDRAGON] && status->hp <= 1000 ) if( sc->data[SC_RAISINGDRAGON] && status->hp <= 1000 )
status_change_end(target, SC_RAISINGDRAGON, INVALID_TIMER); status_change_end(target, SC_RAISINGDRAGON);
if (sc->data[SC_SATURDAYNIGHTFEVER] && status->hp <= 100) if (sc->data[SC_SATURDAYNIGHTFEVER] && status->hp <= 100)
status_change_end(target, SC_SATURDAYNIGHTFEVER, INVALID_TIMER); status_change_end(target, SC_SATURDAYNIGHTFEVER);
} }
switch (target->type) { switch (target->type) {
@ -1664,7 +1664,7 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag)
sc->data[SC_PROVOKE]->val4==1 && sc->data[SC_PROVOKE]->val4==1 &&
status->hp>=status->max_hp>>2 status->hp>=status->max_hp>>2
) // End auto berserk. ) // End auto berserk.
status_change_end(bl, SC_PROVOKE, INVALID_TIMER); status_change_end(bl, SC_PROVOKE);
// Send HP update to client // Send HP update to client
switch(bl->type) { switch(bl->type) {
@ -4029,7 +4029,7 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt)
if (sc->data[SC_ENDURE]) { if (sc->data[SC_ENDURE]) {
if (sc->data[SC_ENDURE]->val4) if (sc->data[SC_ENDURE]->val4)
sc->data[SC_ENDURE]->val4 = 0; sc->data[SC_ENDURE]->val4 = 0;
status_change_end(&sd->bl, SC_ENDURE, INVALID_TIMER); status_change_end(&sd->bl, SC_ENDURE);
} }
clif_status_load(&sd->bl, EFST_ENDURE, 1); clif_status_load(&sd->bl, EFST_ENDURE, 1);
base_status->mdef++; base_status->mdef++;
@ -9670,7 +9670,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
sc_type rem_sc = it; sc_type rem_sc = it;
if (sc->data[rem_sc]) { if (sc->data[rem_sc]) {
status_change_end(bl, rem_sc, INVALID_TIMER); status_change_end(bl, rem_sc);
isRemoved = true; isRemoved = true;
} }
} }
@ -9763,7 +9763,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (val3) mode = static_cast<e_mode>(mode | val3); // Add mode if (val3) mode = static_cast<e_mode>(mode | val3); // Add mode
if (mode == bstatus->mode) { // No change. if (mode == bstatus->mode) { // No change.
if (sc->data[type]) // Abort previous status if (sc->data[type]) // Abort previous status
return status_change_end(bl, type, INVALID_TIMER); return status_change_end(bl, type);
return 0; return 0;
} }
} }
@ -9942,7 +9942,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break; break;
case SC_MADNESSCANCEL: case SC_MADNESSCANCEL:
if (sc->data[type]) { // Toggle the status but still consume requirements. if (sc->data[type]) { // Toggle the status but still consume requirements.
status_change_end(bl, type, INVALID_TIMER); status_change_end(bl, type);
return 0; return 0;
} }
break; break;
@ -9960,7 +9960,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (sc->data[i] && sc->data[i]->val3 == 1) // It doesn't stack or even renew on the target if (sc->data[i] && sc->data[i]->val3 == 1) // It doesn't stack or even renew on the target
return 0; return 0;
else if (sc->data[i] && sc->data[i]->val3 == 0) else if (sc->data[i] && sc->data[i]->val3 == 0)
status_change_end(bl, static_cast<sc_type>(i), INVALID_TIMER); // End the bonus part on the caster status_change_end(bl, static_cast<sc_type>(i)); // End the bonus part on the caster
} }
break; break;
case SC_SPIRIT: case SC_SPIRIT:
@ -10052,7 +10052,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
sc_type opt1_type = status_it.second->type; sc_type opt1_type = status_it.second->type;
if (sc->data[opt1_type] && status_it.second->opt1 > OPT1_NONE) if (sc->data[opt1_type] && status_it.second->opt1 > OPT1_NONE)
status_change_end(bl, opt1_type, INVALID_TIMER); status_change_end(bl, opt1_type);
} }
} }
@ -10075,7 +10075,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_SATURDAYNIGHTFEVER: case SC_SATURDAYNIGHTFEVER:
sc->data[rem_sc]->val2 = 0; // Mark to not lose hp sc->data[rem_sc]->val2 = 0; // Mark to not lose hp
default: default:
status_change_end(bl, rem_sc, INVALID_TIMER); status_change_end(bl, rem_sc);
break; break;
} }
} }
@ -10088,31 +10088,31 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
if (bl->type == BL_PC) { if (bl->type == BL_PC) {
// Remove Curse first, Stone is only removed if the target is not cursed // Remove Curse first, Stone is only removed if the target is not cursed
if (sc->data[SC_CURSE]) { if (sc->data[SC_CURSE]) {
status_change_end(bl, SC_CURSE, INVALID_TIMER); status_change_end(bl, SC_CURSE);
return 1; // End Curse and do not give stat boost return 1; // End Curse and do not give stat boost
} else if (sc->data[SC_STONE]) { } else if (sc->data[SC_STONE]) {
status_change_end(bl, SC_STONE, INVALID_TIMER); status_change_end(bl, SC_STONE);
return 1; // End Stone and do not give stat boost return 1; // End Stone and do not give stat boost
} }
} }
if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH)
status_change_end(bl, SC_SPIRIT, INVALID_TIMER); status_change_end(bl, SC_SPIRIT);
break; break;
case SC_INCREASEAGI: case SC_INCREASEAGI:
if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH)
status_change_end(bl, SC_SPIRIT, INVALID_TIMER); status_change_end(bl, SC_SPIRIT);
break; break;
case SC_DELUGE: case SC_DELUGE:
if (sc->data[SC_FOGWALL] && sc->data[SC_BLIND]) if (sc->data[SC_FOGWALL] && sc->data[SC_BLIND])
status_change_end(bl, SC_BLIND, INVALID_TIMER); status_change_end(bl, SC_BLIND);
break; break;
case SC_SILENCE: case SC_SILENCE:
if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF)
status_change_end(bl, SC_GOSPEL, INVALID_TIMER); status_change_end(bl, SC_GOSPEL);
break; break;
case SC_IMPOSITIO: case SC_IMPOSITIO:
if (sc->data[SC_IMPOSITIO] && sc->data[SC_IMPOSITIO]->val1 > val1) //Replace higher level effect for lower. if (sc->data[SC_IMPOSITIO] && sc->data[SC_IMPOSITIO]->val1 > val1) //Replace higher level effect for lower.
status_change_end(bl,SC_IMPOSITIO,INVALID_TIMER); status_change_end(bl,SC_IMPOSITIO);
break; break;
case SC_ENDURE: case SC_ENDURE:
if (sd && sd->special_state.no_walk_delay) if (sd && sd->special_state.no_walk_delay)
@ -12450,7 +12450,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_STONE: case SC_STONE:
if (sc->data[SC_DANCING]) { if (sc->data[SC_DANCING]) {
unit_stop_walking(bl, 1); unit_stop_walking(bl, 1);
status_change_end(bl, SC_DANCING, INVALID_TIMER); status_change_end(bl, SC_DANCING);
} }
break; break;
default: default:
@ -12711,7 +12711,7 @@ int status_change_clear(struct block_list* bl, int type)
if (type == 3 && it.second->flag[SCF_NOCLEARBUFF]) if (type == 3 && it.second->flag[SCF_NOCLEARBUFF])
continue; continue;
status_change_end(bl, status, INVALID_TIMER); status_change_end(bl, status);
if( type == 1 && sc->data[status] ) { // If for some reason status_change_end decides to still keep the status when quitting. [Skotlex] if( type == 1 && sc->data[status] ) { // If for some reason status_change_end decides to still keep the status when quitting. [Skotlex]
(sc->count)--; (sc->count)--;
if (sc->data[status]->timer != INVALID_TIMER) if (sc->data[status]->timer != INVALID_TIMER)
@ -12740,7 +12740,7 @@ int status_change_clear(struct block_list* bl, int type)
* @param line: Used for dancing save * @param line: Used for dancing save
* @return 1: Success 0: Fail * @return 1: Success 0: Fail
*/ */
int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const char* file, int line) int status_change_end(struct block_list* bl, enum sc_type type, int tid)
{ {
struct map_session_data *sd; struct map_session_data *sd;
struct status_change *sc; struct status_change *sc;
@ -12859,7 +12859,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
break; break;
case SC_AUTOBERSERK: case SC_AUTOBERSERK:
if (sc->data[SC_PROVOKE] && sc->data[SC_PROVOKE]->val4 == 1) if (sc->data[SC_PROVOKE] && sc->data[SC_PROVOKE]->val4 == 1)
status_change_end(bl, SC_PROVOKE, INVALID_TIMER); status_change_end(bl, SC_PROVOKE);
break; break;
case SC_ENDURE: case SC_ENDURE:
@ -12872,13 +12872,13 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
int i; int i;
for( i = 0; i < MAX_DEVOTION; i++ ) { for( i = 0; i < MAX_DEVOTION; i++ ) {
if( sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])) && tsd->sc.data[type] ) if( sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])) && tsd->sc.data[type] )
status_change_end(&tsd->bl, type, INVALID_TIMER); status_change_end(&tsd->bl, type);
} }
} }
else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag ) { // Clear Status from Master else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag ) { // Clear Status from Master
tsd = ((TBL_MER*)bl)->master; tsd = ((TBL_MER*)bl)->master;
if( tsd && tsd->sc.data[type] ) if( tsd && tsd->sc.data[type] )
status_change_end(&tsd->bl, type, INVALID_TIMER); status_change_end(&tsd->bl, type);
} }
} }
break; break;
@ -12893,10 +12893,10 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
clif_devotion(d_bl, NULL); clif_devotion(d_bl, NULL);
} }
status_change_end(bl, SC_AUTOGUARD, INVALID_TIMER); status_change_end(bl, SC_AUTOGUARD);
status_change_end(bl, SC_DEFENDER, INVALID_TIMER); status_change_end(bl, SC_DEFENDER);
status_change_end(bl, SC_REFLECTSHIELD, INVALID_TIMER); status_change_end(bl, SC_REFLECTSHIELD);
status_change_end(bl, SC_ENDURE, INVALID_TIMER); status_change_end(bl, SC_ENDURE);
} }
break; break;
@ -12928,7 +12928,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
sce->val4 = 0; sce->val4 = 0;
if(tbl && tsc && tsc->data[SC_BLADESTOP]) { if(tbl && tsc && tsc->data[SC_BLADESTOP]) {
tsc->data[SC_BLADESTOP]->val4 = 0; tsc->data[SC_BLADESTOP]->val4 = 0;
status_change_end(tbl, SC_BLADESTOP, INVALID_TIMER); status_change_end(tbl, SC_BLADESTOP);
} }
clif_bladestop(bl, tid2, 0); clif_bladestop(bl, tid2, 0);
} }
@ -12944,7 +12944,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
// This will prevent recursive loops. // This will prevent recursive loops.
dsc->val2 = 0; dsc->val2 = 0;
dsc->val4 = BCT_SELF; dsc->val4 = BCT_SELF;
status_change_end(&dsd->bl, SC_DANCING, INVALID_TIMER); status_change_end(&dsd->bl, SC_DANCING);
} }
} }
@ -12960,9 +12960,9 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
clif_status_change(bl,EFST_MOON,0,0,0,0,0); clif_status_change(bl,EFST_MOON,0,0,0,0,0);
#ifdef RENEWAL #ifdef RENEWAL
status_change_end(bl, SC_ENSEMBLEFATIGUE, INVALID_TIMER); status_change_end(bl, SC_ENSEMBLEFATIGUE);
#else #else
status_change_end(bl, SC_LONGING, INVALID_TIMER); status_change_end(bl, SC_LONGING);
#endif #endif
} }
break; break;
@ -12990,7 +12990,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
// If status was already ended, do nothing. // If status was already ended, do nothing.
// Decrease count // Decrease count
if (--(sc2->data[SC_CLOSECONFINE]->val1) <= 0) // No more holds, free him up. if (--(sc2->data[SC_CLOSECONFINE]->val1) <= 0) // No more holds, free him up.
status_change_end(src, SC_CLOSECONFINE, INVALID_TIMER); status_change_end(src, SC_CLOSECONFINE);
} }
} }
case SC_CLOSECONFINE: case SC_CLOSECONFINE:
@ -13015,24 +13015,24 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
if (sc2 && sc2->data[type2]) { if (sc2 && sc2->data[type2]) {
sc2->data[type2]->val1 = 0; sc2->data[type2]->val1 = 0;
status_change_end(pbl, type2, INVALID_TIMER); status_change_end(pbl, type2);
} }
} }
break; break;
case SC_CONCENTRATION: case SC_CONCENTRATION:
if (sc->data[SC_ENDURE] && !sc->data[SC_ENDURE]->val4) if (sc->data[SC_ENDURE] && !sc->data[SC_ENDURE]->val4)
status_change_end(bl, SC_ENDURE, INVALID_TIMER); status_change_end(bl, SC_ENDURE);
break; break;
case SC_BERSERK: case SC_BERSERK:
if(status->hp > 200 && sc && sc->data[SC__BLOODYLUST]) { if(status->hp > 200 && sc && sc->data[SC__BLOODYLUST]) {
status_percent_heal(bl, 100, 0); status_percent_heal(bl, 100, 0);
status_change_end(bl, SC__BLOODYLUST, INVALID_TIMER); status_change_end(bl, SC__BLOODYLUST);
} else if (status->hp > 100 && sce->val2) // If val2 is removed, no HP penalty (dispelled?) [Skotlex] } else if (status->hp > 100 && sce->val2) // If val2 is removed, no HP penalty (dispelled?) [Skotlex]
status_set_hp(bl, 100, 0); status_set_hp(bl, 100, 0);
if(sc->data[SC_ENDURE] && sc->data[SC_ENDURE]->val4) { if(sc->data[SC_ENDURE] && sc->data[SC_ENDURE]->val4) {
sc->data[SC_ENDURE]->val4 = 0; sc->data[SC_ENDURE]->val4 = 0;
status_change_end(bl, SC_ENDURE, INVALID_TIMER); status_change_end(bl, SC_ENDURE);
} }
sc_start4(bl, bl, SC_REGENERATION, 100, 10,0,0,(RGN_HP|RGN_SP), skill_get_time(LK_BERSERK, sce->val1)); sc_start4(bl, bl, SC_REGENERATION, 100, 10,0,0,(RGN_HP|RGN_SP), skill_get_time(LK_BERSERK, sce->val1));
break; break;
@ -13107,7 +13107,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
struct block_list* tbl = map_id2bl(sce->val2); struct block_list* tbl = map_id2bl(sce->val2);
sce->val2 = 0; sce->val2 = 0;
if( tbl && (sc = status_get_sc(tbl)) && sc->data[SC_STOP] && sc->data[SC_STOP]->val2 == bl->id ) if( tbl && (sc = status_get_sc(tbl)) && sc->data[SC_STOP] && sc->data[SC_STOP]->val2 == bl->id )
status_change_end(tbl, SC_STOP, INVALID_TIMER); status_change_end(tbl, SC_STOP);
} }
break; break;
case SC_TENSIONRELAX: case SC_TENSIONRELAX:
@ -13117,7 +13117,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
case SC_MONSTER_TRANSFORM: case SC_MONSTER_TRANSFORM:
case SC_ACTIVE_MONSTER_TRANSFORM: case SC_ACTIVE_MONSTER_TRANSFORM:
if (sce->val2) if (sce->val2)
status_change_end(bl, (sc_type)sce->val2, INVALID_TIMER); status_change_end(bl, (sc_type)sce->val2);
break; break;
/* 3rd Stuff */ /* 3rd Stuff */
@ -13173,7 +13173,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
if( sd && !pc_isdead(sd) ) { if( sd && !pc_isdead(sd) ) {
int i = min(sd->spiritball,5); int i = min(sd->spiritball,5);
pc_delspiritball(sd, sd->spiritball, 0); pc_delspiritball(sd, sd->spiritball, 0);
status_change_end(bl, SC_EXPLOSIONSPIRITS, INVALID_TIMER); status_change_end(bl, SC_EXPLOSIONSPIRITS);
while( i > 0 ) { while( i > 0 ) {
pc_addspiritball(sd, skill_get_time(MO_CALLSPIRITS, pc_checkskill(sd,MO_CALLSPIRITS)), 5); pc_addspiritball(sd, skill_get_time(MO_CALLSPIRITS, pc_checkskill(sd,MO_CALLSPIRITS)), 5);
--i; --i;
@ -13187,12 +13187,12 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
if( sc2 && sc2->data[SC_CURSEDCIRCLE_ATKER] && --(sc2->data[SC_CURSEDCIRCLE_ATKER]->val2) == 0 ) { if( sc2 && sc2->data[SC_CURSEDCIRCLE_ATKER] && --(sc2->data[SC_CURSEDCIRCLE_ATKER]->val2) == 0 ) {
clif_bladestop(bl, sce->val2, 0); clif_bladestop(bl, sce->val2, 0);
status_change_end(src, SC_CURSEDCIRCLE_ATKER, INVALID_TIMER); status_change_end(src, SC_CURSEDCIRCLE_ATKER);
} }
} }
break; break;
case SC_TEARGAS: case SC_TEARGAS:
status_change_end(bl,SC_TEARGAS_SOB,INVALID_TIMER); status_change_end(bl,SC_TEARGAS_SOB);
break; break;
case SC_SITDOWN_FORCE: case SC_SITDOWN_FORCE:
case SC_BANANA_BOMB_SITDOWN: case SC_BANANA_BOMB_SITDOWN:
@ -13208,23 +13208,23 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
break; break;
case SC_SUNSTANCE: case SC_SUNSTANCE:
status_change_end(bl, SC_LIGHTOFSUN, INVALID_TIMER); status_change_end(bl, SC_LIGHTOFSUN);
break; break;
case SC_LUNARSTANCE: case SC_LUNARSTANCE:
status_change_end(bl, SC_NEWMOON, INVALID_TIMER); status_change_end(bl, SC_NEWMOON);
status_change_end(bl, SC_LIGHTOFMOON, INVALID_TIMER); status_change_end(bl, SC_LIGHTOFMOON);
break; break;
case SC_STARSTANCE: case SC_STARSTANCE:
status_change_end(bl, SC_FALLINGSTAR, INVALID_TIMER); status_change_end(bl, SC_FALLINGSTAR);
status_change_end(bl, SC_LIGHTOFSTAR, INVALID_TIMER); status_change_end(bl, SC_LIGHTOFSTAR);
break; break;
case SC_UNIVERSESTANCE: case SC_UNIVERSESTANCE:
status_change_end(bl, SC_LIGHTOFSUN, INVALID_TIMER); status_change_end(bl, SC_LIGHTOFSUN);
status_change_end(bl, SC_NEWMOON, INVALID_TIMER); status_change_end(bl, SC_NEWMOON);
status_change_end(bl, SC_LIGHTOFMOON, INVALID_TIMER); status_change_end(bl, SC_LIGHTOFMOON);
status_change_end(bl, SC_FALLINGSTAR, INVALID_TIMER); status_change_end(bl, SC_FALLINGSTAR);
status_change_end(bl, SC_LIGHTOFSTAR, INVALID_TIMER); status_change_end(bl, SC_LIGHTOFSTAR);
status_change_end(bl, SC_DIMENSION, INVALID_TIMER); status_change_end(bl, SC_DIMENSION);
break; break;
case SC_GRAVITYCONTROL: case SC_GRAVITYCONTROL:
status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0); status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
@ -13304,7 +13304,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
case SC_GOLDENMACECLAN: case SC_GOLDENMACECLAN:
case SC_CROSSBOWCLAN: case SC_CROSSBOWCLAN:
case SC_JUMPINGCLAN: case SC_JUMPINGCLAN:
status_change_end(bl,SC_CLAN_INFO,INVALID_TIMER); status_change_end(bl,SC_CLAN_INFO);
break; break;
case SC_DIMENSION1: case SC_DIMENSION1:
case SC_DIMENSION2: case SC_DIMENSION2:
@ -13344,7 +13344,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
} }
break; break;
case SC_CHARGINGPIERCE: case SC_CHARGINGPIERCE:
status_change_end(bl, SC_CHARGINGPIERCE_COUNT, INVALID_TIMER); status_change_end(bl, SC_CHARGINGPIERCE_COUNT);
break; break;
case SC_ABYSSFORCEWEAPON: case SC_ABYSSFORCEWEAPON:
if( sd ){ if( sd ){
@ -13918,7 +13918,7 @@ TIMER_FUNC(status_change_timer){
if( !status_charge(bl, 0, sce->val2) ) { if( !status_charge(bl, 0, sce->val2) ) {
int i; int i;
for(i = SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) // Also remove stored spell as well. for(i = SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) // Also remove stored spell as well.
status_change_end(bl, (sc_type)i, INVALID_TIMER); status_change_end(bl, (sc_type)i);
break; break;
} }
sc_timer_next(10000 + tick); sc_timer_next(10000 + tick);
@ -14059,7 +14059,7 @@ TIMER_FUNC(status_change_timer){
if (sce->val1 > limit[skill_lv]) if (sce->val1 > limit[skill_lv])
sce->val2 = 1; sce->val2 = 1;
} else { } else {
status_change_end(bl, SC_OVERHEAT, INVALID_TIMER); status_change_end(bl, SC_OVERHEAT);
if (sce->val2 > 0) if (sce->val2 > 0)
sc_start(bl, bl, SC_OVERHEAT, 100, sce->val1, 975); sc_start(bl, bl, SC_OVERHEAT, 100, sce->val1, 975);
} }
@ -14154,8 +14154,8 @@ TIMER_FUNC(status_change_timer){
if (bl->type == BL_ELEM) if (bl->type == BL_ELEM)
elemental_change_mode(BL_CAST(BL_ELEM, bl), EL_MODE_PASSIVE); elemental_change_mode(BL_CAST(BL_ELEM, bl), EL_MODE_PASSIVE);
if( s_bl ) if( s_bl )
status_change_end(s_bl,static_cast<sc_type>(type+1),INVALID_TIMER); status_change_end(s_bl,static_cast<sc_type>(type+1));
status_change_end(bl,type,INVALID_TIMER); status_change_end(bl,type);
break; break;
} }
sc_timer_next(sce->val3 + tick); sc_timer_next(sce->val3 + tick);
@ -14520,29 +14520,29 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
switch( type ) { switch( type ) {
case SC_SIGHT: // Reveal hidden ennemy on 3*3 range case SC_SIGHT: // Reveal hidden ennemy on 3*3 range
case SC_CONCENTRATE: case SC_CONCENTRATE:
status_change_end(bl, SC_HIDING, INVALID_TIMER); status_change_end(bl, SC_HIDING);
status_change_end(bl, SC_CLOAKING, INVALID_TIMER); status_change_end(bl, SC_CLOAKING);
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(bl, SC_CLOAKINGEXCEED);
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER); status_change_end(bl, SC_CAMOUFLAGE);
status_change_end(bl, SC_NEWMOON, INVALID_TIMER); status_change_end(bl, SC_NEWMOON);
if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking
rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] %
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); status_change_end(bl, SC__SHADOWFORM);
break; break;
case SC_RUWACH: // Reveal hidden target and deal little dammages if enemy case SC_RUWACH: // Reveal hidden target and deal little dammages if enemy
if (tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] || if (tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] ||
tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_NEWMOON] || tsc->data[SC_CLOAKINGEXCEED])) { tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_NEWMOON] || tsc->data[SC_CLOAKINGEXCEED])) {
status_change_end(bl, SC_HIDING, INVALID_TIMER); status_change_end(bl, SC_HIDING);
status_change_end(bl, SC_CLOAKING, INVALID_TIMER); status_change_end(bl, SC_CLOAKING);
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER); status_change_end(bl, SC_CAMOUFLAGE);
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(bl, SC_CLOAKINGEXCEED);
status_change_end(bl, SC_NEWMOON, INVALID_TIMER); status_change_end(bl, SC_NEWMOON);
if(battle_check_target( src, bl, BCT_ENEMY ) > 0) if(battle_check_target( src, bl, BCT_ENEMY ) > 0)
skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,1,tick,0); skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,1,tick,0);
} }
if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking
rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10 ) { // [100 - (Skill Level x 10)] % rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10 ) { // [100 - (Skill Level x 10)] %
status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); status_change_end(bl, SC__SHADOWFORM);
if (battle_check_target(src, bl, BCT_ENEMY) > 0) if (battle_check_target(src, bl, BCT_ENEMY) > 0)
skill_attack(BF_MAGIC, src, src, bl, status_db.getSkill(type), 1, tick, 0); skill_attack(BF_MAGIC, src, src, bl, status_db.getSkill(type), 1, tick, 0);
} }
@ -14569,13 +14569,13 @@ int status_change_timer_sub(struct block_list* bl, va_list ap)
// Lock char has released the hold on everyone... // Lock char has released the hold on everyone...
if (tsc && tsc->data[SC_CLOSECONFINE2] && tsc->data[SC_CLOSECONFINE2]->val2 == src->id) { if (tsc && tsc->data[SC_CLOSECONFINE2] && tsc->data[SC_CLOSECONFINE2]->val2 == src->id) {
tsc->data[SC_CLOSECONFINE2]->val2 = 0; tsc->data[SC_CLOSECONFINE2]->val2 = 0;
status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER); status_change_end(bl, SC_CLOSECONFINE2);
} }
break; break;
case SC_CURSEDCIRCLE_TARGET: case SC_CURSEDCIRCLE_TARGET:
if( tsc && tsc->data[SC_CURSEDCIRCLE_TARGET] && tsc->data[SC_CURSEDCIRCLE_TARGET]->val2 == src->id ) { if( tsc && tsc->data[SC_CURSEDCIRCLE_TARGET] && tsc->data[SC_CURSEDCIRCLE_TARGET]->val2 == src->id ) {
clif_bladestop(bl, tsc->data[SC_CURSEDCIRCLE_TARGET]->val2, 0); clif_bladestop(bl, tsc->data[SC_CURSEDCIRCLE_TARGET]->val2, 0);
status_change_end(bl, type, INVALID_TIMER); status_change_end(bl, type);
} }
break; break;
} }
@ -14624,7 +14624,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type)
continue; continue;
if (status == SC_SATURDAYNIGHTFEVER || status == SC_BERSERK) // Mark to not lose HP if (status == SC_SATURDAYNIGHTFEVER || status == SC_BERSERK) // Mark to not lose HP
sc->data[status]->val2 = 0; sc->data[status]->val2 = 0;
status_change_end(bl, status, INVALID_TIMER); status_change_end(bl, status);
} }
//Removes bonus_script //Removes bonus_script
@ -14988,7 +14988,7 @@ void status_change_clear_onChangeMap(struct block_list *bl, struct status_change
continue; continue;
if (status_change_isDisabledOnMap_(type, mapIsVS, mapIsPVP, mapIsGVG, mapIsBG, mapdata->zone, mapIsTE)) if (status_change_isDisabledOnMap_(type, mapIsVS, mapIsPVP, mapIsGVG, mapIsBG, mapdata->zone, mapIsTE))
status_change_end(bl, type, INVALID_TIMER); status_change_end(bl, type);
} }
} }
} }

View File

@ -3285,8 +3285,7 @@ static int sc_start2(block_list *src, block_list *bl, sc_type type, int32 rate,
static int sc_start4(block_list *src, block_list *bl, sc_type type, int32 rate, int32 val1, int32 val2, int32 val3, int32 val4, t_tick duration, int32 delay = 0) { static int sc_start4(block_list *src, block_list *bl, sc_type type, int32 rate, int32 val1, int32 val2, int32 val3, int32 val4, t_tick duration, int32 delay = 0) {
return status_change_start(src, bl, type, 100 * rate, val1, val2, val3, val4, duration, SCSTART_NONE, delay); return status_change_start(src, bl, type, 100 * rate, val1, val2, val3, val4, duration, SCSTART_NONE, delay);
} }
int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const char* file, int line); int status_change_end(struct block_list* bl, enum sc_type type, int tid = INVALID_TIMER);
#define status_change_end(bl,type,tid) status_change_end_(bl,type,tid,__FILE__,__LINE__)
TIMER_FUNC(status_change_timer); TIMER_FUNC(status_change_timer);
int status_change_timer_sub(struct block_list* bl, va_list ap); int status_change_timer_sub(struct block_list* bl, va_list ap);
int status_change_clear(struct block_list* bl, int type); int status_change_clear(struct block_list* bl, int type);

View File

@ -911,7 +911,7 @@ void unit_run_hit(struct block_list *bl, struct status_change *sc, struct map_se
// Set running to 0 beforehand so status_change_end knows not to enable spurt [Kevin] // Set running to 0 beforehand so status_change_end knows not to enable spurt [Kevin]
unit_bl2ud(bl)->state.running = 0; unit_bl2ud(bl)->state.running = 0;
status_change_end(bl, type, INVALID_TIMER); status_change_end(bl, type);
if (type == SC_RUN) { if (type == SC_RUN) {
skill_blown(bl, bl, skill_get_blewcount(TK_RUN, lv), unit_getdir(bl), BLOWN_NONE); skill_blown(bl, bl, skill_get_blewcount(TK_RUN, lv), unit_getdir(bl), BLOWN_NONE);
@ -943,7 +943,7 @@ bool unit_run(struct block_list *bl, struct map_session_data *sd, enum sc_type t
return false; return false;
if (!unit_can_move(bl)) { if (!unit_can_move(bl)) {
status_change_end(bl, type, INVALID_TIMER); status_change_end(bl, type);
return false; return false;
} }
@ -1408,8 +1408,8 @@ int unit_stop_walking(struct block_list *bl,int type)
// Re-added, the check in unit_set_walkdelay means dmg during running won't fall through to this place in code [Kevin] // Re-added, the check in unit_set_walkdelay means dmg during running won't fall through to this place in code [Kevin]
if (ud->state.running) { if (ud->state.running) {
status_change_end(bl, SC_RUN, INVALID_TIMER); status_change_end(bl, SC_RUN);
status_change_end(bl, SC_WUGDASH, INVALID_TIMER); status_change_end(bl, SC_WUGDASH);
} }
return 1; return 1;
@ -2049,17 +2049,17 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
if( sc ) { if( sc ) {
// These 3 status do not stack, so it's efficient to use if-else // These 3 status do not stack, so it's efficient to use if-else
if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING && skill_id != SHC_SHADOW_STAB) { if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING && skill_id != SHC_SHADOW_STAB) {
status_change_end(src, SC_CLOAKING, INVALID_TIMER); status_change_end(src, SC_CLOAKING);
if (!src->prev) if (!src->prev)
return 0; // Warped away! return 0; // Warped away!
} else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED && skill_id != SHC_SHADOW_STAB) { } else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED && skill_id != SHC_SHADOW_STAB) {
status_change_end(src,SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(src,SC_CLOAKINGEXCEED);
if (!src->prev) if (!src->prev)
return 0; return 0;
} else if (sc->data[SC_NEWMOON] && skill_id != SJ_NEWMOONKICK) { } else if (sc->data[SC_NEWMOON] && skill_id != SJ_NEWMOONKICK) {
status_change_end(src, SC_NEWMOON, INVALID_TIMER); status_change_end(src, SC_NEWMOON);
if (!src->prev) if (!src->prev)
return 0; // Warped away! return 0; // Warped away!
} }
@ -2231,17 +2231,17 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
if( sc ) { if( sc ) {
// These 3 status do not stack, so it's efficient to use if-else // These 3 status do not stack, so it's efficient to use if-else
if (sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4)) { if (sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4)) {
status_change_end(src, SC_CLOAKING, INVALID_TIMER); status_change_end(src, SC_CLOAKING);
if (!src->prev) if (!src->prev)
return 0; // Warped away! return 0; // Warped away!
} else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4)) { } else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4)) {
status_change_end(src, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(src, SC_CLOAKINGEXCEED);
if (!src->prev) if (!src->prev)
return 0; return 0;
} else if (sc->data[SC_NEWMOON]) { } else if (sc->data[SC_NEWMOON]) {
status_change_end(src, SC_NEWMOON, INVALID_TIMER); status_change_end(src, SC_NEWMOON);
if (!src->prev) if (!src->prev)
return 0; return 0;
@ -2475,7 +2475,7 @@ int unit_cancel_combo(struct block_list *bl)
{ {
struct unit_data *ud; struct unit_data *ud;
if (!status_change_end(bl, SC_COMBO, INVALID_TIMER)) if (!status_change_end(bl, SC_COMBO))
return 0; // Combo wasn't active. return 0; // Combo wasn't active.
ud = unit_bl2ud(bl); ud = unit_bl2ud(bl);
@ -3065,13 +3065,13 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
// Ensure the bl is a PC; if so, we'll handle the removal of cloaking and cloaking exceed later // Ensure the bl is a PC; if so, we'll handle the removal of cloaking and cloaking exceed later
if ( bl->type != BL_PC ) { if ( bl->type != BL_PC ) {
status_change_end(bl, SC_CLOAKING, INVALID_TIMER); status_change_end(bl, SC_CLOAKING);
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(bl, SC_CLOAKINGEXCEED);
} }
if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF)
status_change_end(bl, SC_GOSPEL, INVALID_TIMER); status_change_end(bl, SC_GOSPEL);
if (sc->data[SC_PROVOKE] && sc->data[SC_PROVOKE]->val4 == 1) if (sc->data[SC_PROVOKE] && sc->data[SC_PROVOKE]->val4 == 1)
status_change_end(bl, SC_PROVOKE, INVALID_TIMER); //End infinite provoke to prevent exploit status_change_end(bl, SC_PROVOKE); //End infinite provoke to prevent exploit
} }
switch( bl->type ) { switch( bl->type ) {
@ -3082,7 +3082,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
struct block_list *d_bl = map_id2bl(sd->shadowform_id); struct block_list *d_bl = map_id2bl(sd->shadowform_id);
if( d_bl ) if( d_bl )
status_change_end(d_bl,SC__SHADOWFORM,INVALID_TIMER); status_change_end(d_bl,SC__SHADOWFORM);
} }
// Leave/reject all invitations. // Leave/reject all invitations.
@ -3122,8 +3122,8 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
// Check if warping and not changing the map. // Check if warping and not changing the map.
if ( sd->state.warping && !sd->state.changemap ) { if ( sd->state.warping && !sd->state.changemap ) {
status_change_end(bl, SC_CLOAKING, INVALID_TIMER); status_change_end(bl, SC_CLOAKING);
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER); status_change_end(bl, SC_CLOAKINGEXCEED);
} }
sd->npc_shopid = 0; sd->npc_shopid = 0;
@ -3552,7 +3552,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
sd->status.hom_id = 0; sd->status.hom_id = 0;
#ifdef RENEWAL #ifdef RENEWAL
status_change_end(&sd->bl, SC_HOMUN_TIME, INVALID_TIMER); status_change_end(&sd->bl, SC_HOMUN_TIME);
#endif #endif
} }