Fixes SCB calculations (#6733)
Follow up to d739e8f.
Resolves issues with status calculations getting improperly checked.
Thanks to @mazvi, @kaninhot004, and @Rayvakarian!
This commit is contained in:
@@ -1012,7 +1012,7 @@ ACMD_FUNC(speed)
|
||||
} else
|
||||
clif_displaymessage(fd, msg_txt(sd,389)); // Speed returned to normal.
|
||||
|
||||
status_calc_bl(&sd->bl, SCB_SPEED);
|
||||
status_calc_bl(&sd->bl, { SCB_SPEED });
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -10961,7 +10961,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
clif_hominfo(sd,sd->hd,0); //for some reason, at least older clients want this sent twice
|
||||
clif_homskillinfoblock(sd);
|
||||
if( battle_config.hom_setting&HOMSET_COPY_SPEED )
|
||||
status_calc_bl(&sd->hd->bl, SCB_SPEED); //Homunc mimic their master's speed on each map change
|
||||
status_calc_bl(&sd->hd->bl, { SCB_SPEED }); //Homunc mimic their master's speed on each map change
|
||||
if( !(battle_config.hom_setting&HOMSET_NO_INSTANT_LAND_SKILL) )
|
||||
skill_unit_move(&sd->hd->bl,gettick(),1); // apply land skills immediately
|
||||
}
|
||||
@@ -10972,7 +10972,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
clif_spawn(&sd->md->bl);
|
||||
clif_mercenary_info(sd);
|
||||
clif_mercenary_skillblock(sd);
|
||||
status_calc_bl(&sd->md->bl, SCB_SPEED); // Mercenary mimic their master's speed on each map change
|
||||
status_calc_bl(&sd->md->bl, { SCB_SPEED }); // Mercenary mimic their master's speed on each map change
|
||||
}
|
||||
|
||||
if( sd->ed ) {
|
||||
@@ -10983,7 +10983,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
clif_elemental_updatestatus(sd,SP_HP);
|
||||
clif_hpmeter_single(sd->fd,sd->ed->bl.id,sd->ed->battle_status.hp,sd->ed->battle_status.max_hp);
|
||||
clif_elemental_updatestatus(sd,SP_SP);
|
||||
status_calc_bl(&sd->ed->bl, SCB_SPEED); //Elemental mimic their master's speed on each map change
|
||||
status_calc_bl(&sd->ed->bl, { SCB_SPEED }); //Elemental mimic their master's speed on each map change
|
||||
}
|
||||
|
||||
if(sd->state.connect_new) {
|
||||
@@ -11096,7 +11096,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
struct map_data *pmap = map_getmapdata(sd->state.pmap);
|
||||
|
||||
if ((pmap != nullptr && (mapdata_flag_gvg(pmap) || pmap->flag[MF_BATTLEGROUND])) || (mapdata != nullptr && (mapdata_flag_gvg(mapdata) || mapdata->flag[MF_BATTLEGROUND])))
|
||||
status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty
|
||||
status_calc_bl(&sd->bl, { SCB_FLEE }); //Refresh flee penalty
|
||||
}
|
||||
|
||||
if( night_flag && mapdata->flag[MF_NIGHTENABLED] )
|
||||
|
||||
@@ -1176,7 +1176,7 @@ bool hom_call(struct map_session_data *sd)
|
||||
clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
|
||||
clif_homskillinfoblock(sd);
|
||||
if (battle_config.hom_setting&HOMSET_COPY_SPEED)
|
||||
status_calc_bl(&hd->bl, SCB_SPEED);
|
||||
status_calc_bl(&hd->bl, { SCB_SPEED });
|
||||
hom_save(hd);
|
||||
} else
|
||||
//Warp him to master.
|
||||
|
||||
@@ -18790,7 +18790,7 @@ BUILDIN_FUNC(setunitdata)
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
if (calc_status)
|
||||
status_calc_bl(&md->bl, status_db.getSCB_BATTLE());
|
||||
status_calc_bl_(&md->bl, status_db.getSCB_BATTLE());
|
||||
break;
|
||||
|
||||
case BL_HOM:
|
||||
@@ -18857,7 +18857,7 @@ BUILDIN_FUNC(setunitdata)
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
if (calc_status)
|
||||
status_calc_bl(&hd->bl, status_db.getSCB_BATTLE());
|
||||
status_calc_bl_(&hd->bl, status_db.getSCB_BATTLE());
|
||||
break;
|
||||
|
||||
case BL_PET:
|
||||
@@ -18971,7 +18971,7 @@ BUILDIN_FUNC(setunitdata)
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
if (calc_status)
|
||||
status_calc_bl(&mc->bl, status_db.getSCB_BATTLE());
|
||||
status_calc_bl_(&mc->bl, status_db.getSCB_BATTLE());
|
||||
break;
|
||||
|
||||
case BL_ELEM:
|
||||
@@ -19038,7 +19038,7 @@ BUILDIN_FUNC(setunitdata)
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
if (calc_status)
|
||||
status_calc_bl(&ed->bl, status_db.getSCB_BATTLE());
|
||||
status_calc_bl_(&ed->bl, status_db.getSCB_BATTLE());
|
||||
break;
|
||||
|
||||
case BL_NPC:
|
||||
|
||||
@@ -12635,7 +12635,7 @@ TIMER_FUNC(skill_castend_id){
|
||||
if( sd && ud->skilltimer != INVALID_TIMER && (pc_checkskill(sd,SA_FREECAST) > 0 || ud->skill_id == LG_EXEEDBREAK) )
|
||||
{// restore original walk speed
|
||||
ud->skilltimer = INVALID_TIMER;
|
||||
status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
|
||||
status_calc_bl(&sd->bl, { SCB_SPEED, SCB_ASPD });
|
||||
} else
|
||||
ud->skilltimer = INVALID_TIMER;
|
||||
}
|
||||
@@ -12965,7 +12965,7 @@ TIMER_FUNC(skill_castend_pos){
|
||||
if( sd && ud->skilltimer != INVALID_TIMER && ( pc_checkskill(sd,SA_FREECAST) > 0 || ud->skill_id == LG_EXEEDBREAK ) )
|
||||
{// restore original walk speed
|
||||
ud->skilltimer = INVALID_TIMER;
|
||||
status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
|
||||
status_calc_bl(&sd->bl, { SCB_SPEED, SCB_ASPD });
|
||||
} else
|
||||
ud->skilltimer = INVALID_TIMER;
|
||||
|
||||
@@ -19797,12 +19797,12 @@ bool skill_check_cloaking(struct block_list *bl, struct status_change_entry *sce
|
||||
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
||||
else if( sce->val4&1 ) { //Remove wall bonus
|
||||
sce->val4&=~1;
|
||||
status_calc_bl(bl,SCB_SPEED);
|
||||
status_calc_bl(bl, { SCB_SPEED });
|
||||
}
|
||||
} else {
|
||||
if( !(sce->val4&1) ) { //Add wall speed bonus
|
||||
sce->val4|=1;
|
||||
status_calc_bl(bl,SCB_SPEED);
|
||||
status_calc_bl(bl, { SCB_SPEED });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19876,7 +19876,7 @@ bool skill_check_camouflage(struct block_list *bl, struct status_change_entry *s
|
||||
if( sce ) {
|
||||
if( !wall && sce->val1 < 3 ) //End camouflage.
|
||||
status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
|
||||
status_calc_bl(bl,SCB_SPEED);
|
||||
status_calc_bl(bl, { SCB_SPEED });
|
||||
}
|
||||
|
||||
return wall;
|
||||
@@ -21879,7 +21879,7 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id)
|
||||
status_change_end(bl, SC_MAGICPOWER, INVALID_TIMER);
|
||||
} else {
|
||||
sc->data[SC_MAGICPOWER]->val4 = 1;
|
||||
status_calc_bl(bl, status_db.getCalcFlag(SC_MAGICPOWER));
|
||||
status_calc_bl_(bl, status_db.getCalcFlag(SC_MAGICPOWER));
|
||||
if(bl->type == BL_PC){// update current display.
|
||||
clif_updatestatus(((TBL_PC *)bl),SP_MATK1);
|
||||
clif_updatestatus(((TBL_PC *)bl),SP_MATK2);
|
||||
|
||||
@@ -12074,11 +12074,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
status_calc_bl_(bl, calc_flag, SCO_FORCE);
|
||||
break;
|
||||
default:
|
||||
status_calc_bl(bl, calc_flag);
|
||||
status_calc_bl_(bl, calc_flag);
|
||||
break;
|
||||
}
|
||||
} else
|
||||
status_calc_bl(bl, calc_flag);
|
||||
status_calc_bl_(bl, calc_flag);
|
||||
}
|
||||
|
||||
// Non-zero
|
||||
@@ -12962,7 +12962,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
status_calc_bl_(bl, calc_flag, SCO_FORCE);
|
||||
} else
|
||||
#endif
|
||||
status_calc_bl(bl, calc_flag);
|
||||
status_calc_bl_(bl, calc_flag);
|
||||
}
|
||||
|
||||
if(opt_flag[SCF_UNITMOVE]) // Out of hiding, invoke on place.
|
||||
@@ -13096,7 +13096,7 @@ TIMER_FUNC(status_change_timer){
|
||||
clif_changeoption(bl);
|
||||
sc_timer_next(min(sce->val4, interval) + tick);
|
||||
sce->val4 -= interval; //Remaining time
|
||||
status_calc_bl(bl, scdb->calc_flag);
|
||||
status_calc_bl_(bl, scdb->calc_flag);
|
||||
return 0;
|
||||
}
|
||||
if (sce->val4 >= 0 && !(sce->val3) && status->hp > status->max_hp / 4) {
|
||||
|
||||
@@ -3225,7 +3225,6 @@ int status_change_clear(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, flag, SCO_NONE)
|
||||
#define status_calc_mob(md, opt) status_calc_bl_(&(md)->bl, status_db.getSCB_ALL(), opt)
|
||||
#define status_calc_pet(pd, opt) status_calc_bl_(&(pd)->bl, status_db.getSCB_ALL(), opt)
|
||||
#define status_calc_pc(sd, opt) status_calc_bl_(&(sd)->bl, status_db.getSCB_ALL(), opt)
|
||||
@@ -3236,7 +3235,7 @@ void status_change_clear_onChangeMap(struct block_list *bl, struct status_change
|
||||
|
||||
bool status_calc_weight(struct map_session_data *sd, enum e_status_calc_weight_opt flag);
|
||||
bool status_calc_cart_weight(struct map_session_data *sd, enum e_status_calc_weight_opt flag);
|
||||
void status_calc_bl_(struct block_list *bl, std::bitset<SCB_MAX> flag, uint8 opt);
|
||||
void status_calc_bl_(struct block_list *bl, std::bitset<SCB_MAX> flag, uint8 opt = SCO_NONE);
|
||||
int status_calc_mob_(struct mob_data* md, uint8 opt);
|
||||
void status_calc_pet_(struct pet_data* pd, uint8 opt);
|
||||
int status_calc_pc_(struct map_session_data* sd, uint8 opt);
|
||||
@@ -3245,6 +3244,17 @@ int status_calc_mercenary_(s_mercenary_data *md, uint8 opt);
|
||||
int status_calc_elemental_(s_elemental_data *ed, uint8 opt);
|
||||
int status_calc_npc_(struct npc_data *nd, uint8 opt);
|
||||
|
||||
static void status_calc_bl(block_list *bl, std::vector<e_scb_flag> flags) {
|
||||
static std::bitset<SCB_MAX> temp;
|
||||
|
||||
temp.reset();
|
||||
for (const auto &scb : flags) {
|
||||
temp.set(scb);
|
||||
}
|
||||
|
||||
status_calc_bl_(bl, temp);
|
||||
}
|
||||
|
||||
void status_calc_misc(struct block_list *bl, struct status_data *status, int level);
|
||||
void status_calc_regen(struct block_list *bl, struct status_data *status, struct regen_data *regen);
|
||||
void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, struct status_change *sc);
|
||||
|
||||
@@ -2064,7 +2064,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
ud->skilltimer = add_timer( tick+casttime, skill_castend_id, src->id, 0 );
|
||||
|
||||
if( sd && (pc_checkskill(sd,SA_FREECAST) > 0 || skill_id == LG_EXEEDBREAK) )
|
||||
status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
|
||||
status_calc_bl(&sd->bl, { SCB_SPEED, SCB_ASPD });
|
||||
} else
|
||||
skill_castend_id(ud->skilltimer,tick,src->id,0);
|
||||
|
||||
@@ -2256,7 +2256,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
|
||||
ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 );
|
||||
|
||||
if( (sd && pc_checkskill(sd,SA_FREECAST) > 0) || skill_id == LG_EXEEDBREAK)
|
||||
status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
|
||||
status_calc_bl(&sd->bl, { SCB_SPEED, SCB_ASPD });
|
||||
} else {
|
||||
ud->skilltimer = INVALID_TIMER;
|
||||
skill_castend_pos(ud->skilltimer,tick,src->id,0);
|
||||
@@ -2912,7 +2912,7 @@ int unit_skillcastcancel(struct block_list *bl, char type)
|
||||
ud->skilltimer = INVALID_TIMER;
|
||||
|
||||
if( sd && (pc_checkskill(sd,SA_FREECAST) > 0 || skill_id == LG_EXEEDBREAK) )
|
||||
status_calc_bl(&sd->bl, SCB_SPEED|SCB_ASPD);
|
||||
status_calc_bl(&sd->bl, { SCB_SPEED, SCB_ASPD });
|
||||
|
||||
if( sd ) {
|
||||
switch( skill_id ) {
|
||||
|
||||
Reference in New Issue
Block a user