浏览代码

Ported over several TXT online code fixes from charmerge (autotrading chars couldn't be kicked due to a missing update).

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14091 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage 15 年之前
父节点
当前提交
6c8293ed15
共有 1 个文件被更改,包括 35 次插入14 次删除
  1. 35 14
      src/char/char.c

+ 35 - 14
src/char/char.c

@@ -192,6 +192,33 @@ static void* create_online_char_data(DBKey key, va_list args)
 	return character;
 }
 
+void set_char_charselect(int account_id)
+{
+	struct online_char_data* character;
+
+	character = (struct online_char_data*)idb_ensure(online_char_db, account_id, create_online_char_data);
+
+	if( character->server > -1 )
+		server[character->server].users--;
+
+	character->char_id = -1;
+	character->server = -1;
+
+	if(character->waiting_disconnect != -1) {
+		delete_timer(character->waiting_disconnect, chardb_waiting_disconnect);
+		character->waiting_disconnect = -1;
+	}
+
+	if (login_fd > 0 && !session[login_fd]->flag.eof)
+	{
+		WFIFOHEAD(login_fd,6);
+		WFIFOW(login_fd,0) = 0x272b;
+		WFIFOL(login_fd,2) = account_id;
+		WFIFOSET(login_fd,6);
+	}
+
+}
+
 void set_char_online(int map_id, int char_id, int account_id)
 {
 	struct online_char_data* character;
@@ -199,15 +226,15 @@ void set_char_online(int map_id, int char_id, int account_id)
 	character = (struct online_char_data*)idb_ensure(online_char_db, account_id, create_online_char_data);
 	if( character->char_id != -1 && character->server > -1 && character->server != map_id )
 	{
-		//char == 99 <- Character logging in, so someone has logged in while one
-		//char is still on map-server, so kick him out, but don't print "error"
-		//as this is normal behaviour. [Skotlex]
-		if (char_id != 99)
-			ShowNotice("set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
-				character->account_id, character->char_id, character->server, map_id, account_id, char_id);
+		ShowNotice("set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
+			character->account_id, character->char_id, character->server, map_id, account_id, char_id);
 		mapif_disconnectplayer(server[character->server].fd, character->account_id, character->char_id, 2);
 	}
 
+	//Update state data
+	character->char_id = char_id;
+	character->server = map_id;
+
 	if( character->server > -1 )
 		server[character->server].users++;
 
@@ -216,12 +243,6 @@ void set_char_online(int map_id, int char_id, int account_id)
 		character->waiting_disconnect = -1;
 	}
 
-	//If user is NOT at char screen, delete entry [Kevin]
-	if(character->char_id != -1)
-	{
-		idb_remove(online_char_db, account_id);
-	}
-
 	if (login_fd > 0 && !session[login_fd]->flag.eof)
 	{	
 		WFIFOHEAD(login_fd,6);
@@ -1916,7 +1937,7 @@ static void char_auth_ok(int fd, struct char_session_data *sd)
 	sd->auth = true;
 
 	// set char online on charserver
-	set_char_online(-1, 99, sd->account_id);
+	set_char_charselect(sd->account_id);
 
 	// continues when account data is received...
 }
@@ -2764,7 +2785,7 @@ int parse_frommap(int fd)
 			idb_put(auth_db, account_id, node);
 
 			//Set char to "@ char select" in online db [Kevin]
-			set_char_online(-3, 99, account_id);
+			set_char_charselect(account_id);
 
 			WFIFOHEAD(fd,7);
 			WFIFOW(fd,0) = 0x2b03;