Переглянути джерело

- Some more cleanups that should prevent the double-login issue even further.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10286 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 18 роки тому
батько
коміт
2e8efbd2c2
2 змінених файлів з 11 додано та 9 видалено
  1. 9 7
      src/map/map.c
  2. 2 2
      src/map/pc.c

+ 9 - 7
src/map/map.c

@@ -1672,11 +1672,15 @@ void map_deliddb(struct block_list *bl) {
 int map_quit(struct map_session_data *sd) {
 
 	if(!sd->state.auth) { //Removing a player that hasn't even finished loading
+		TBL_PC *sd2 = map_id2sd(sd->status.account_id);
 		if (sd->pd) unit_free(&sd->pd->bl,-1);
 		if (sd->hd) unit_free(&sd->hd->bl,-1);
+		//Double login, let original do the cleanups below.
+		if (sd2 && sd2 != sd)
+			return 0;
+		idb_remove(id_db,sd->bl.id);
 		idb_remove(pc_db,sd->status.account_id);
 		idb_remove(charid_db,sd->status.char_id);
-		idb_remove(id_db,sd->bl.id);
 		return 0;
 	}
 	if(!sd->state.waitingdisconnect) {
@@ -1692,13 +1696,11 @@ int map_quit(struct map_session_data *sd) {
 		chrif_save(sd,1);
 	} else { //Try to free some data, without saving anything (this could be invoked on map server change. [Skotlex]
 		if (sd->bl.prev != NULL)
-		{	//Remove from map...
 			unit_remove_map(&sd->bl, 0);
-			if (sd->pd && sd->pd->bl.prev != NULL)
-				unit_remove_map(&sd->pd->bl, 0);
-			if (sd->hd && sd->hd->bl.prev != NULL)
-			  	unit_remove_map(&sd->hd->bl, 0);
-		}
+		if (sd->pd && sd->pd->bl.prev != NULL)
+			unit_remove_map(&sd->pd->bl, 0);
+		if (sd->hd && sd->hd->bl.prev != NULL)
+			unit_remove_map(&sd->hd->bl, 0);
 	}
 
 	//Do we really need to remove the name?

+ 2 - 2
src/map/pc.c

@@ -580,8 +580,9 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
 		ShowDebug("pc_authok: Received auth ok for already authorized client (account id %d)!\n", sd->bl.id);
 		return 1;
 	}
-		
+
 	sd->login_id2 = login_id2;
+	memcpy(&sd->status, st, sizeof(*st));
 
 	if (st->sex != sd->status.sex) {
 		clif_authfail_fd(sd->fd, 0);
@@ -598,7 +599,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
 		clif_authfail_fd(sd->fd, 8); // still recognizes last connection
 		return 1;
 	}
-	memcpy(&sd->status, st, sizeof(*st));
 
 	//Set the map-server used job id. [Skotlex]
 	i = pc_jobid2mapid(sd->status.class_);