Browse Source

Fixed charserver unable to reestablish link to login server after a disconnect (yet another problem caused by r11826).
Copied code from TXT to SQL to perform a graceful shutdown of all login server sockets while exiting.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11848 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage 17 năm trước cách đây
mục cha
commit
b9a9c76f2b
3 tập tin đã thay đổi với 35 bổ sung22 xóa
  1. 7 4
      src/login/login.c
  2. 17 6
      src/login_sql/login.c
  3. 11 12
      src/map/clif.c

+ 7 - 4
src/login/login.c

@@ -1233,9 +1233,9 @@ int parse_fromchar(int fd)
 	if( session[fd]->eof )
 	{
 		ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
-		server[id].fd = -1;
-		memset(&server[id], 0, sizeof(struct mmo_char_server));
 		online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char server to offline.
+		memset(&server[id], 0, sizeof(struct mmo_char_server));
+		server[id].fd = -1;
 		do_close(fd);
 		return 0;
 	}
@@ -2606,7 +2606,8 @@ void login_set_defaults()
 void do_final(void)
 {
 	int i, fd;
-	ShowInfo("Terminating...\n");
+	ShowStatus("Terminating...\n");
+
 	mmo_auth_sync();
 	online_db->destroy(online_db, NULL);
 
@@ -2615,10 +2616,11 @@ void do_final(void)
 	if(access_ladmin_allow) aFree(access_ladmin_allow);
 	if(access_allow) aFree(access_allow);
 	if(access_deny) aFree(access_deny);
+
 	for (i = 0; i < MAX_SERVERS; i++) {
 		if ((fd = server[i].fd) >= 0) {
-			server[i].fd = -1;
 			memset(&server[i], 0, sizeof(struct mmo_char_server));
+			server[i].fd = -1;
 			do_close(fd);
 		}
 	}
@@ -2626,6 +2628,7 @@ void do_final(void)
 
 	if(log_fp)
 		fclose(log_fp);
+
 	ShowStatus("Finished.\n");
 }
 

+ 17 - 6
src/login_sql/login.c

@@ -621,11 +621,11 @@ int parse_fromchar(int fd)
 	if( session[fd]->eof )
 	{
 		ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
-		server[id].fd = -1;
-		memset(&server[id], 0, sizeof(struct mmo_char_server));
 		online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char server to offline.
 		if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `sstatus` WHERE `index`='%d'", id) )
 			Sql_ShowDebug(sql_handle);
+		memset(&server[id], 0, sizeof(struct mmo_char_server));
+		server[id].fd = -1;
 		do_close(fd);
 		return 0;
 	}
@@ -1863,13 +1863,24 @@ void login_set_defaults()
 //--------------------------------------
 void do_final(void)
 {
-	//sync account when terminating.
-	//but no need when you using DBMS (mysql)
+	int i, fd;
 	ShowStatus("Terminating...\n");
+
 	mmo_db_close();
 	online_db->destroy(online_db, NULL);
-	if (gm_account_db)
-		aFree(gm_account_db);
+
+	if(gm_account_db) aFree(gm_account_db);
+
+	for (i = 0; i < MAX_SERVERS; i++) {
+		if ((fd = server[i].fd) >= 0) {
+			memset(&server[i], 0, sizeof(struct mmo_char_server));
+			server[i].fd = -1;
+			do_close(fd);
+		}
+	}
+	do_close(login_fd);
+
+	ShowStatus("Finished.\n");
 }
 
 //------------------------------

+ 11 - 12
src/map/clif.c

@@ -946,7 +946,6 @@ static int clif_set_unit_spawned(struct block_list* bl, unsigned char* buf)
 	}
 	else
 	{	// npc/mob/pet/homun spawn packet
-		memset(buf,0,sizeof(buf));
 		WBUFW(buf, 0) = 0x7c;
 		WBUFL(buf, 2) = bl->id;
 		WBUFW(buf, 6) = status_get_speed(bl);
@@ -954,20 +953,20 @@ static int clif_set_unit_spawned(struct block_list* bl, unsigned char* buf)
 		WBUFW(buf,10) = (sc)? sc->opt2 : 0;
 		WBUFW(buf,12) = (sc)? sc->option : 0;
 		WBUFW(buf,14) = vd->hair_style; //Required for pets (removes attack cursor)
-		//16W: Weapon
+		WBUFW(buf,16) = 0; // Weapon
 		WBUFW(buf,18) = vd->head_bottom; //Pet armor (ignored by client)
 		WBUFW(buf,20) = vd->class_;
-		//22W: Shield
-		//24W: Head top
-		//26W: Head mid
-		//28W: Hair color
-		//30W: Cloth color
-		//32W: Head dir
-		//34B: karma
-		//35B: Sex
+		WBUFW(buf,22) = 0; // Shield
+		WBUFW(buf,24) = 0; // Head top
+		WBUFW(buf,26) = 0; // Head mid
+		WBUFW(buf,28) = 0; // Hair color
+		WBUFW(buf,30) = 0; // Cloth color
+		WBUFW(buf,32) = 0; // Head dir
+		WBUFB(buf,34) = 0; // karma
+		WBUFB(buf,35) = 0; // Sex
 		WBUFPOS(buf,36,bl->x,bl->y,unit_getdir(bl));
-		//39B: ???
-		//40B: ???
+		WBUFB(buf,39) = 0; // ???
+		WBUFB(buf,40) = 0; // ???
 
 #if PACKETVER < 9
 		return packet_len(0x7c);