summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/map/atcommand.c21
-rw-r--r--src/map/clif.c6
-rw-r--r--src/map/map.h1
-rw-r--r--src/map/pc.c15
-rw-r--r--src/map/unit.c4
5 files changed, 44 insertions, 3 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 03c92c07a..0ab76c6b0 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -1233,10 +1233,31 @@ ACMD_FUNC(hide)
else
status_set_viewdata(&sd->bl, sd->status.class_);
clif_displaymessage(fd, msg_txt(10)); // Invisible: Off
+
+ if( map[sd->bl.m].flag.pvp )
+ {// increment the number of pvp players on the map
+ map[sd->bl.m].users_pvp++;
+
+ if( !map[sd->bl.m].flag.pvp_nocalcrank )
+ {// register the player for ranking calculations
+ sd->pvp_timer = add_timer( gettick() + 200, pc_calc_pvprank_timer, sd->bl.id, 0 );
+ }
+ }
} else {
sd->sc.option |= OPTION_INVISIBLE;
sd->vd.class_ = INVISIBLE_CLASS;
clif_displaymessage(fd, msg_txt(11)); // Invisible: On
+
+ if( map[sd->bl.m].flag.pvp )
+ {// decrement the number of pvp players on the map
+ map[sd->bl.m].users_pvp--;
+
+ if( !map[sd->bl.m].flag.pvp_nocalcrank && sd->pvp_timer != INVALID_TIMER )
+ {// unregister the player for ranking
+ delete_timer( sd->pvp_timer, pc_calc_pvprank_timer );
+ sd->pvp_timer = INVALID_TIMER;
+ }
+ }
}
clif_changeoption(&sd->bl);
diff --git a/src/map/clif.c b/src/map/clif.c
index 75c00187e..eab61ca4e 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -8661,6 +8661,10 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
if( map[sd->bl.m].users++ == 0 && battle_config.dynamic_mobs )
map_spawnmobs(sd->bl.m);
+ if( !(sd->sc.option&OPTION_INVISIBLE) )
+ {// increment the number of pvp players on the map
+ map[sd->bl.m].users_pvp++;
+ }
if( map[sd->bl.m].instance_id )
{
instance[map[sd->bl.m].instance_id].users++;
@@ -8680,7 +8684,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
if( sd->bg_id ) clif_bg_hp(sd); // BattleGround System
- if(map[sd->bl.m].flag.pvp) {
+ if(map[sd->bl.m].flag.pvp && !(sd->sc.option&OPTION_INVISIBLE)) {
if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris]
if (!map[sd->bl.m].flag.pvp_nocalcrank)
sd->pvp_timer = add_timer(gettick()+200, pc_calc_pvprank_timer, sd->bl.id, 0);
diff --git a/src/map/map.h b/src/map/map.h
index 51678d590..9b31c39b6 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -473,6 +473,7 @@ struct map_data {
short bgscore_lion, bgscore_eagle; // Battleground ScoreBoard
int npc_num;
int users;
+ int users_pvp;
int iwall_num; // Total of invisible walls in this map
struct map_flag {
unsigned town : 1; // [Suggestion to protect Mail System]
diff --git a/src/map/pc.c b/src/map/pc.c
index 21588a12d..e6ef6ff83 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -7628,6 +7628,11 @@ int pc_calc_pvprank_sub(struct block_list *bl,va_list ap)
sd1=(struct map_session_data *)bl;
sd2=va_arg(ap,struct map_session_data *);
+ if( sd1->sc.option&OPTION_INVISIBLE || sd2->sc.option&OPTION_INVISIBLE )
+ {// cannot register pvp rank for hidden GMs
+ return 0;
+ }
+
if( sd1->pvp_point > sd2->pvp_point )
sd2->pvp_rank++;
return 0;
@@ -7643,8 +7648,8 @@ int pc_calc_pvprank(struct map_session_data *sd)
old=sd->pvp_rank;
sd->pvp_rank=1;
map_foreachinmap(pc_calc_pvprank_sub,sd->bl.m,BL_PC,sd);
- if(old!=sd->pvp_rank || sd->pvp_lastusers!=m->users)
- clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=m->users,0);
+ if(old!=sd->pvp_rank || sd->pvp_lastusers!=m->users_pvp)
+ clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=m->users_pvp,0);
return sd->pvp_rank;
}
/*==========================================
@@ -7658,6 +7663,12 @@ int pc_calc_pvprank_timer(int tid, unsigned int tick, int id, intptr_t data)
if(sd==NULL)
return 0;
sd->pvp_timer = INVALID_TIMER;
+
+ if( sd->sc.option&OPTION_INVISIBLE )
+ {// do not calculate the pvp rank for a hidden GM
+ return 0;
+ }
+
if( pc_calc_pvprank(sd) > 0 )
sd->pvp_timer = add_timer(gettick()+PVP_CALCRANK_INTERVAL,pc_calc_pvprank_timer,id,data);
return 0;
diff --git a/src/map/unit.c b/src/map/unit.c
index 44296ca51..9cb198c3c 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -2002,6 +2002,10 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
else
if (--map[bl->m].users == 0 && battle_config.dynamic_mobs) //[Skotlex]
map_removemobs(bl->m);
+ if( !(sd->sc.option&OPTION_INVISIBLE) )
+ {// decrement the number of active pvp players on the map
+ --map[bl->m].users_pvp;
+ }
if( map[bl->m].instance_id )
{
instance[map[bl->m].instance_id].users--;