Browse Source

Fixed login on 2017-03-15 and later

Lemongrass3110 8 years ago
parent
commit
52ac564215
1 changed files with 26 additions and 10 deletions
  1. 26 10
      src/login/loginclif.c

+ 26 - 10
src/login/loginclif.c

@@ -53,6 +53,16 @@ static void logclif_auth_ok(struct login_session_data* sd) {
 	struct auth_node* node;
 	int i;
 
+#if PACKETVER < 20170315
+	int cmd = 0x69; // AC_ACCEPT_LOGIN
+	int header = 47;
+	int size = 32;
+#else
+	int cmd = 0xac4; // AC_ACCEPT_LOGIN3
+	int header = 64;
+	int size = 160;
+#endif
+
 	if( runflag != LOGINSERVER_ST_RUNNING ){
 		// players can only login while running
 		logclif_sent_auth_result(fd,1); // server closed
@@ -111,9 +121,9 @@ static void logclif_auth_ok(struct login_session_data* sd) {
 	login_log(ip, sd->userid, 100, "login ok");
 	ShowStatus("Connection of the account '%s' accepted.\n", sd->userid);
 
-	WFIFOHEAD(fd,47+32*server_num);
-	WFIFOW(fd,0) = 0x69;
-	WFIFOW(fd,2) = 47+32*server_num;
+	WFIFOHEAD(fd,header+size*server_num);
+	WFIFOW(fd,0) = cmd;
+	WFIFOW(fd,2) = header+size*server_num;
 	WFIFOL(fd,4) = sd->login_id1;
 	WFIFOL(fd,8) = sd->account_id;
 	WFIFOL(fd,12) = sd->login_id2;
@@ -122,19 +132,25 @@ static void logclif_auth_ok(struct login_session_data* sd) {
 	memset(WFIFOP(fd,20), 0, 24);
 	WFIFOW(fd,44) = 0; // unknown
 	WFIFOB(fd,46) = sex_str2num(sd->sex);
+#if PACKETVER >= 20170315
+	memset(WFIFOP(fd,47),0,17); // Unknown
+#endif
 	for( i = 0, n = 0; i < ARRAYLENGTH(ch_server); ++i ) {
 		if( !session_isValid(ch_server[i].fd) )
 			continue;
 		subnet_char_ip = lan_subnetcheck(ip); // Advanced subnet check [LuzZza]
-		WFIFOL(fd,47+n*32) = htonl((subnet_char_ip) ? subnet_char_ip : ch_server[i].ip);
-		WFIFOW(fd,47+n*32+4) = ntows(htons(ch_server[i].port)); // [!] LE byte order here [!]
-		memcpy(WFIFOP(fd,47+n*32+6), ch_server[i].name, 20);
-		WFIFOW(fd,47+n*32+26) = ch_server[i].users;
-		WFIFOW(fd,47+n*32+28) = ch_server[i].type;
-		WFIFOW(fd,47+n*32+30) = ch_server[i].new_;
+		WFIFOL(fd,header+n*size) = htonl((subnet_char_ip) ? subnet_char_ip : ch_server[i].ip);
+		WFIFOW(fd,header+n*size+4) = ntows(htons(ch_server[i].port)); // [!] LE byte order here [!]
+		memcpy(WFIFOP(fd,header+n*size+6), ch_server[i].name, 20);
+		WFIFOW(fd,header+n*size+26) = ch_server[i].users;
+		WFIFOW(fd,header+n*size+28) = ch_server[i].type;
+		WFIFOW(fd,header+n*size+30) = ch_server[i].new_;
+#if PACKETVER >= 20170315
+		memset(WFIFOP(fd, header+n*size+32), 0, 128); // Unknown
+#endif
 		n++;
 	}
-	WFIFOSET(fd,47+32*server_num);
+	WFIFOSET(fd,header+size*server_num);
 
 	// create temporary auth entry
 	CREATE(node, struct auth_node, 1);