diff options
Diffstat (limited to 'src/map/pc.c')
-rw-r--r-- | src/map/pc.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/src/map/pc.c b/src/map/pc.c index 57f68f201..24e7be3b9 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4735,17 +4735,21 @@ int pc_skillheal_bonus(struct map_session_data *sd, int skill_num) return 0; } -static int pc_respawn(int tid,unsigned int tick,int id,int data) +void pc_respawn(struct map_session_data* sd, uint8 clrtype) { - struct map_session_data *sd = map_id2sd(id); - if (sd && pc_isdead(sd)) - { //Auto-respawn [Skotlex] - pc_setstand(sd); - pc_setrestartvalue(sd,3); - if(pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 0)) - clif_resurrection(&sd->bl, 1); //If warping fails, send a normal stand up packet. + if( !pc_isdead(sd) ) + return; // not applicable - } + pc_setstand(sd); + pc_setrestartvalue(sd,3); + if(pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, clrtype)) + clif_resurrection(&sd->bl, 1); //If warping fails, send a normal stand up packet. +} + +static int pc_respawn_timer(int tid,unsigned int tick,int id,int data) +{ + struct map_session_data *sd = map_id2sd(id); + pc_respawn(sd,0); return 0; } @@ -5064,13 +5068,13 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) } if( sd->pvp_point < 0 ){ sd->pvp_point=0; - add_timer(tick+1000, pc_respawn,sd->bl.id,0); + add_timer(tick+1000, pc_respawn_timer,sd->bl.id,0); return 1; } } //GvG if(map_flag_gvg(sd->bl.m)){ - add_timer(tick+1000, pc_respawn,sd->bl.id,0); + add_timer(tick+1000, pc_respawn_timer,sd->bl.id,0); return 1; } @@ -6807,41 +6811,38 @@ int pc_setsavepoint(struct map_session_data *sd, short mapindex,int x,int y) } /*========================================== - * 自動セ?ブ 各クライアント - *------------------------------------------*/ -static int last_save_id=0,save_flag=0; -static int pc_autosave_sub(DBKey key,void * data,va_list ap) -{ - struct map_session_data *sd = (TBL_PC*)data; - - if(sd->bl.id == last_save_id && save_flag != 1) { - save_flag = 1; - return 1; - } - - if(save_flag != 1) //Not our turn to save yet. - return 0; - - //Save char. - last_save_id = sd->bl.id; - save_flag=2; - - chrif_save(sd,0); - return 1; -} - -/*========================================== * 自動セ?ブ (timer??) *------------------------------------------*/ int pc_autosave(int tid,unsigned int tick,int id,int data) { int interval; + struct s_mapiterator* iter; + struct map_session_data* sd; + static int last_save_id = 0, save_flag = 0; if(save_flag == 2) //Someone was saved on last call, normal cycle save_flag = 0; else save_flag = 1; //Noone was saved, so save first found char. - map_foreachpc(pc_autosave_sub); + + iter = mapit_getallusers(); + for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) + { + if(sd->bl.id == last_save_id) { + save_flag = 1; + continue; + } + + if(save_flag != 1) //Not our turn to save yet. + continue; + + //Save char. + last_save_id = sd->bl.id; + save_flag = 2; + + chrif_save(sd,0); + } + mapit_free(iter); interval = autosave_interval/(clif_countusers()+1); if(interval < minsave_interval) |