summaryrefslogtreecommitdiff
path: root/src/map/pc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/pc.c')
-rw-r--r--src/map/pc.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index f7c93c94f..3396de798 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -7093,25 +7093,38 @@ int pc_setsavepoint(struct map_session_data *sd, short mapindex,int x,int y)
* 自動セ?ブ 各クライアント
*------------------------------------------
*/
-static int last_save_fd,save_flag;
-static int pc_autosave_sub(struct map_session_data *sd,va_list ap)
+static int last_save_id=0,save_flag=0;
+static int pc_autosave_sub(DBKey key,void * data,va_list app)
{
- nullpo_retr(0, sd);
+ struct map_session_data *sd = (TBL_PC*)data;
+
+ if(sd->bl.id == last_save_id) {
+ save_flag = 1;
+ return 1;
+ }
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
+ if(save_flag != 1) //Not our turn to save yet.
+ return 0;
- if(save_flag==0 && sd->fd>last_save_fd && !sd->state.waitingdisconnect)
- {
- // pet
- if(sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id,&sd->pet);
+ if (sd->state.waitingdisconnect) //Invalid char to save.
+ return 0;
- chrif_save(sd,0);
- save_flag=1;
- last_save_fd = sd->fd;
- }
+ //Save char.
+ last_save_id = sd->bl.id;
+ save_flag=2;
- return 0;
+ // pet
+ if(sd->status.pet_id > 0 && sd->pd)
+ intif_save_petdata(sd->status.account_id,&sd->pet);
+
+ if(sd->state.finalsave)
+ { //Save ack hasn't returned from char-server yet? Retry.
+ ShowDebug("pc_autosave: Resending to save logging out char %d:%d (save ack from char-server hasn't arrived yet)\n", sd->status.account_id, sd->status.char_id);
+ sd->state.finalsave = 0;
+ chrif_save(sd,1);
+ } else
+ chrif_save(sd,0);
+ return 1;
}
/*==========================================
@@ -7122,10 +7135,11 @@ int pc_autosave(int tid,unsigned int tick,int id,int data)
{
int interval;
- save_flag=0;
- clif_foreachclient(pc_autosave_sub);
- if(save_flag==0)
- last_save_fd=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);
if (autosave_interval < 0)
return 0; //Fixed interval for saving. [Skotlex]