diff --git a/src/map/clif.c b/src/map/clif.c index c73f3d8..0c793c8 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -2804,7 +2804,8 @@ void clif_updatestatus(struct map_session_data *sd,int type) case SP_HP: WFIFOL(fd,4)=sd->battle_status.hp; // TODO: Won't these overwrite the current packet? - clif_hpmeter(sd); + if( map[sd->bl.m].hpmeter_visible ) + clif_hpmeter(sd); if( !battle_config.party_hp_mode && sd->status.party_id ) clif_party_hp(sd); if( sd->bg_id ) @@ -9397,6 +9398,11 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) clif_broadcast(&sd->bl, output, strlen(output) + 1, 0x10, SELF); } + if( pc_has_permission(sd,PC_PERM_VIEW_HPMETER) ) { + map[sd->bl.m].hpmeter_visible++; + sd->state.hpmeter_visible = 1; + } + map_iwall_get(sd); // Updates Walls Info on this Map to Client status_calc_pc(sd, false); // Some conditions are map-dependent so we must recalculate sd->state.changemap = false; diff --git a/src/map/map.h b/src/map/map.h index 462fed8..420b7e8 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -638,6 +638,9 @@ struct map_data { /* rAthena Local Chat */ struct Channel *channel; + + /* speeds up clif_updatestatus processing by causing hpmeter to run only when someone with the permission can view it */ + unsigned short hpmeter_visible; }; /// Stores information about a remote map (for multi-mapserver setups). diff --git a/src/map/pc.h b/src/map/pc.h index 6f9f4f9..68c7887 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -192,6 +192,7 @@ struct map_session_data { unsigned int prevend : 1;//used to flag wheather you've spent 40sp to open the vending or not. unsigned int warping : 1;//states whether you're in the middle of a warp processing unsigned int permanent_speed : 1; // When 1, speed cannot be changed through status_calc_pc(). + unsigned int hpmeter_visible : 1; } state; struct { unsigned char no_weapon_damage, no_magic_damage, no_misc_damage; diff --git a/src/map/unit.c b/src/map/unit.c index 281c9e6..be77cbf 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -2227,6 +2227,10 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, {// decrement the number of active pvp players on the map --map[bl->m].users_pvp; } + if( sd->state.hpmeter_visible ) { + map[bl->m].hpmeter_visible--; + sd->state.hpmeter_visible = 0; + } sd->state.debug_remove_map = 1; // temporary state to track double remove_map's [FlavioJS] sd->debug_file = file; sd->debug_line = line;