Просмотр исходного кода

- Reviewed the client and the shorts at 104 and 106 are part of the char structure. And a correction on what i said: 0x6d is the packet that sends the new char data, 0x67 is the request to create the new char.
(updated code accordingly)

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

FlavioJS 18 лет назад
Родитель
Сommit
e74a5e2456
3 измененных файлов с 69 добавлено и 96 удалено
  1. 1 1
      Changelog-Trunk.txt
  2. 34 47
      src/char/char.c
  3. 34 48
      src/char_sql/char.c

+ 1 - 1
Changelog-Trunk.txt

@@ -4,7 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/02/16
-	* Fixed the structure of packet 0x67 (new char info). It's the same as the 
+	* Fixed the structure of packet 0x6d (new char info). It's the same as the 
 	  one used for packet 0x6b (chars info). [FlavioJS]
 	* Updated script commands startnpctimer, stopnpctimer, initnpctimer so you
 	  can attach a player to them, this is done because the attach/detach

+ 34 - 47
src/char/char.c

@@ -1660,12 +1660,12 @@ int count_users(void) {
 }
 
 /// Writes char data to the buffer in the format used by the client.
-/// Used in packets 0x6b (chars info) and 0x67 (new char info)
-/// size = 104
-int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
+/// Used in packets 0x6b (chars info) and 0x6d (new char info)
+/// Returns the size (106 or 108)
+int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p, int new_charscreen)
 {
-	if( p == NULL || buf == NULL )
-		return 1;// Fail
+	if( buf == NULL || p == NULL )
+		return 0;
 
 	WBUFL(buf,0) = p->char_id;
 	WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
@@ -1707,7 +1707,14 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
 	WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
 	WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
 
-	return 0;
+	//Updated packet structure with rename-button included. Credits to Sara-chan
+	WBUFW(buf,104) = p->char_num;
+	if( new_charscreen )
+	{
+		WBUFW(buf,106) = 1;// Rename bit (0=rename,1=no rename)
+		return 108;
+	}
+	return 106;
 }
 
 //----------------------------------------
@@ -1715,54 +1722,39 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
 //----------------------------------------
 int mmo_char_send006b(int fd, struct char_session_data *sd) {
 	int i, j, found_num;
-	struct mmo_charstatus *p;
-	const int offset = 24;
-	WFIFOHEAD(fd, offset + 9*108);
 
-	set_char_online(-1, 99,sd->account_id);
+	set_char_online(-1, 99, sd->account_id);
 
 	found_num = 0;
 	for(i = 0; i < char_num; i++) {
 		if (char_dat[i].status.account_id == sd->account_id) {
 			sd->found_char[found_num] = i;
-			found_num++;
-			if (found_num == 9)
+			if( ++found_num == 9 )
 				break;
 		}
 	}
 	for(i = found_num; i < 9; i++)
 		sd->found_char[i] = -1;
 
-#if PACKETVER > 7
-	//Updated packet structure with rename-button included. Credits to Sara-chan
-	memset(WFIFOP(fd,0), 0, offset + found_num * 108);
-	WFIFOW(fd,2) = offset + found_num * 108;
-#else
-	memset(WFIFOP(fd,0), 0, offset + found_num * 106);
-	WFIFOW(fd,2) = offset + found_num * 106;
-#endif
-	WFIFOW(fd,0) = 0x6b;
-
-	for(i = 0; i < found_num; i++) {
-		p = &char_dat[sd->found_char[i]].status;
-#if PACKETVER > 7
-		j = offset + (i * 108); // increase speed of code
-#else
-		j = offset + (i * 106); // increase speed of code
-#endif
 
-		mmo_char_tobuf(WFIFOP(fd,j), p);
+	j = 24;// offset
+	{
+		WFIFOHEAD(fd, j + found_num*108);
+		WFIFOW(fd,0) = 0x6b;
+		memset(WFIFOP(fd,4), 0, 20);// unknown bytes
 
-#if PACKETVER > 7
-		WFIFOW(fd,j+104) = p->char_num;
-		WFIFOW(fd,j+106) = 1; //TODO: Handle this rename bit: 0 to enable renaming
+		for(i = 0; i < found_num; i++)
+		{
+#if PACKETVER > 7 
+			j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat[sd->found_char[i]].status, 1);
 #else
-		WFIFOB(fd,j+104) = p->char_num;
+			j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat[sd->found_char[i]].status, 0);
 #endif
+		}
+		WFIFOW(fd,2) = j;// packet len
+		WFIFOSET(fd,j);
 	}
 
-	WFIFOSET(fd,WFIFOW(fd,2));
-
 	return 0;
 }
 
@@ -3642,21 +3634,16 @@ int parse_char(int fd) {
 				break;
 			}
 		{	//Send to player.
+			int len;
 			WFIFOHEAD(fd, 110);
 			WFIFOW(fd,0) = 0x6d;
-			memset(WFIFOP(fd,2), 0, 108);
-
-			mmo_char_tobuf(WFIFOP(fd,2), &char_dat[i].status);
-
 #if PACKETVER > 7
-			//Updated packet structure with rename-button included. Credits to Sara-chan
-			WFIFOW(fd,2+104) = char_dat[i].status.char_num;
-			WFIFOB(fd,2+106) = 1; //Rename bit.
-			WFIFOSET(fd,110);
+			len = 2 + mmo_char_tobuf(WFIFOP(fd,2), &char_dat[i].status, 1);
 #else
-			WFIFOB(fd,2+104) = char_dat[i].status.char_num;
-			WFIFOSET(fd,108);
-#endif	
+			len = 2 + mmo_char_tobuf(WFIFOP(fd,2), &char_dat[i].status, 0);
+#endif
+			WFIFOSET(fd,len);
+
 			RFIFOSKIP(fd,37);
 		}
 			for(ch = 0; ch < 9; ch++) {

+ 34 - 48
src/char_sql/char.c

@@ -1683,12 +1683,12 @@ int count_users(void) {
 }
 
 /// Writes char data to the buffer in the format used by the client.
-/// Used in packets 0x6b (chars info) and 0x67 (new char info)
-/// size = 104
-int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
+/// Used in packets 0x6b (chars info) and 0x6d (new char info)
+/// Returns the size (106 or 108)
+int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p, int new_charscreen)
 {
-	if( p == NULL || buf == NULL )
-		return 1;// Fail
+	if( buf == NULL || p == NULL )
+		return 0;
 
 	WBUFL(buf,0) = p->char_id;
 	WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
@@ -1730,15 +1730,20 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
 	WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
 	WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
 
-	return 0;
+	//Updated packet structure with rename-button included. Credits to Sara-chan
+	WBUFW(buf,104) = p->char_num;
+	if( new_charscreen )
+	{
+		WBUFW(buf,106) = 1;// Rename bit (0=rename,1=no rename)
+		return 108;
+	}
+	return 106;
 }
 
 int mmo_char_send006b(int fd, struct char_session_data *sd) {
 	int i, j, found_num = 0;
 	struct mmo_charstatus *p = NULL;
-	const int offset = 24;
-	WFIFOHEAD(fd, offset +9*108);
-    
+
 	set_char_online(-1, 99,sd->account_id);
 
 	//search char.
@@ -1762,42 +1767,29 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
 	for(i = found_num; i < 9; i++)
 		sd->found_char[i] = -1;
 
-#if PACKETVER > 7
-	//Updated packet structure with rename-button included. Credits to Sara-chan
-	memset(WFIFOP(fd, 0), 0, offset + found_num * 108);
-	WFIFOW(fd, 2) = offset + found_num * 108;
-#else
-	memset(WFIFOP(fd, 0), 0, offset + found_num * 106);
-	WFIFOW(fd, 2) = offset + found_num * 106;
-#endif
-	WFIFOW(fd, 0) = 0x6b;
-
 	if (save_log)
 		ShowInfo("Loading Char Data ("CL_BOLD"%d"CL_RESET")\n",sd->account_id);
 
-	for(i = 0; i < found_num; i++) {
-		mmo_char_fromsql_short(sd->found_char[i], &char_dat);
-
-		p = &char_dat;
-
-#if PACKETVER > 7
-		j = offset + (i * 108);
-#else
-		j = offset + (i * 106); // increase speed of code
-#endif
 
-		mmo_char_tobuf(WFIFOP(fd,j), p);
+	j = 24;// offset
+	{
+		WFIFOHEAD(fd, j + found_num*108);
+		WFIFOW(fd,0) = 0x6b;
+		memset(WFIFOP(fd,4), 0, 20);// unknown bytes
 
-#if PACKETVER > 7
-		//Updated packet structure with rename-button included. Credits to Sara-chan
-		WFIFOW(fd,j+104) = p->char_num;
-		WFIFOW(fd,j+106) = 1; //TODO: Handle this rename bit: 0 to enable renaming
+		for(i = 0; i < found_num; i++)
+		{
+			mmo_char_fromsql_short(sd->found_char[i], &char_dat);
+#if PACKETVER > 7 
+			j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat, 1);
 #else
-		WFIFOB(fd,j+104) = p->char_num;
+			j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat, 0);
 #endif
+		}
+		WFIFOW(fd,2) = j;// packet len
+		WFIFOSET(fd,j);
 	}
-	WFIFOSET(fd,WFIFOW(fd,2));
-//	printf("mmo_char_send006b end..\n");
+
 	return 0;
 }
 
@@ -3450,23 +3442,17 @@ int parse_char(int fd) {
 				break;
 			}
 		{	//Send data.
+			int len;
 			WFIFOHEAD(fd, 110);
 			WFIFOW(fd, 0) = 0x6d;
-			memset(WFIFOP(fd, 2), 0x00, 108);
-
 			mmo_char_fromsql_short(i, &char_dat); //Only the short data is needed.
-
-			mmo_char_tobuf(WFIFOP(fd,2), &char_dat);
-
 #if PACKETVER > 7
-			//Updated packet structure with rename-button included. Credits to Sara-chan
-			WFIFOW(fd,2+104) = char_dat.char_num;
-			WFIFOB(fd,2+106) = 1; //Rename bit.
-			WFIFOSET(fd, 110);
+			len = 2 + mmo_char_tobuf(WFIFOP(fd,2), &char_dat, 1);
 #else
-			WFIFOB(fd,2+104) = char_dat.char_num;
-			WFIFOSET(fd, 108);
+			len = 2 + mmo_char_tobuf(WFIFOP(fd,2), &char_dat, 0);
 #endif	
+			WFIFOSET(fd, len);
+
 			RFIFOSKIP(fd, 37);
 		}	
 			//to do