From a6f6b34df65d36fb7609b93c2305c8507dc79e8d Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Thu, 28 Jun 2018 00:00:13 +0300
Subject: Add support for new auth error packet in zero.

Add support for known auth error packets in map server (before was used only old packet).
---
 src/login/lclif.c        |  5 ++++-
 src/login/lclif.p.h      |  1 +
 src/map/clif.c           | 23 +++++++++++++++++++----
 src/map/clif.h           |  1 +
 src/map/packets_struct.h | 17 +++++++++++++++++
 5 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/login/lclif.c b/src/login/lclif.c
index ae9f035e3..f514932a2 100644
--- a/src/login/lclif.c
+++ b/src/login/lclif.c
@@ -311,7 +311,10 @@ bool lclif_send_server_list(struct login_session_data *sd)
 /// @copydoc lclif_interface::auth_failed()
 void lclif_send_auth_failed(int fd, time_t ban, uint32 error)
 {
-#if PACKETVER >= 20120000 /* not sure when this started */
+#if PACKETVER_ZERO_NUM >= 20180627
+	struct packet_AC_REFUSE_LOGIN_R2 *packet = NULL;
+	int packet_id = PACKET_ID_AC_REFUSE_LOGIN_R3;
+#elif PACKETVER >= 20101123
 	struct packet_AC_REFUSE_LOGIN_R2 *packet = NULL;
 	int packet_id = PACKET_ID_AC_REFUSE_LOGIN_R2;
 #else
diff --git a/src/login/lclif.p.h b/src/login/lclif.p.h
index 6456914db..7fa8475f4 100644
--- a/src/login/lclif.p.h
+++ b/src/login/lclif.p.h
@@ -64,6 +64,7 @@ enum login_packet_id {
 	PACKET_ID_SC_NOTIFY_BAN           = 0x0081,
 	PACKET_ID_AC_ACK_HASH             = 0x01dc,
 	PACKET_ID_AC_REFUSE_LOGIN_R2      = 0x083e,
+	PACKET_ID_AC_REFUSE_LOGIN_R3      = 0x0b02,
 };
 
 /* Packets Structs */
diff --git a/src/map/clif.c b/src/map/clif.c
index 7ba070409..dfd49914a 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -713,6 +713,7 @@ void clif_authok(struct map_session_data *sd)
 	clif->send(&p,sizeof(p),&sd->bl,SELF);
 }
 
+/// [4144] Packet not using error_code anymore. Works for fixed error only (MsgString: 9 - Rejected from Server)
 /// Notifies the client, that it's connection attempt was refused (ZC_REFUSE_ENTER).
 /// 0074 <error code>.B
 /// error code:
@@ -9524,6 +9525,22 @@ void clif_channel_msg2(struct channel_data *chan, char *msg)
 	dbi_destroy(iter);
 }
 
+// TODO: [4144] same packet with login server. need somehow use one function for both servers
+// 3 - Rejected by server
+void clif_auth_error(int fd, int errorCode)
+{
+	struct packet_ZC_REFUSE_LOGIN p;
+	const int len = sizeof(p);
+
+	p.PacketType = authError;
+	p.error_code = errorCode;
+	p.block_date[0] = '\0';
+
+	WFIFOHEAD(fd, len);
+	memcpy(WFIFOP(fd, 0), &p, len);
+	WFIFOSET(fd, len);
+}
+
 // ------------
 // clif_parse_*
 // ------------
@@ -9562,10 +9579,7 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) {
 	bl = map->id2bl(account_id);
 	if(bl && bl->type != BL_PC) {
 		ShowError("clif_parse_WantToConnection: a non-player object already has id %d, please increase the starting account number\n", account_id);
-		WFIFOHEAD(fd,packet_len(0x6a));
-		WFIFOW(fd,0) = 0x6a;
-		WFIFOB(fd,2) = 3; // Rejected by server
-		WFIFOSET(fd,packet_len(0x6a));
+		clif->auth_error(fd, 3);  // Rejected by server
 		sockt->eof(fd);
 
 		return;
@@ -21365,6 +21379,7 @@ void clif_defaults(void) {
 	clif->packet = clif_packet;
 	/* auth */
 	clif->authok = clif_authok;
+	clif->auth_error = clif_auth_error;
 	clif->authrefuse = clif_authrefuse;
 	clif->authfail_fd = clif_authfail_fd;
 	clif->charselectok = clif_charselectok;
diff --git a/src/map/clif.h b/src/map/clif.h
index e7db9a9b8..63eaeff49 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -698,6 +698,7 @@ struct clif_interface {
 	unsigned short (*decrypt_cmd) ( int cmd, struct map_session_data *sd );
 	/* auth */
 	void (*authok) (struct map_session_data *sd);
+	void (*auth_error) (int fd, int errorCode);
 	void (*authrefuse) (int fd, uint8 error_code);
 	void (*authfail_fd) (int fd, int type);
 	void (*charselectok) (int id, uint8 ok);
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index bcdf1061a..f1cb408ba 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -373,6 +373,13 @@ enum packet_headers {
 #elif PACKETVER >= 20150128
 	openUiType = 0xA38,
 #endif
+#if PACKETVER_ZERO_NUM >= 20180627
+	authError = 0xb02,
+#elif PACKETVER >= 20101123
+	authError = 0x83e,
+#else
+	authError = 0x6a,
+#endif
 };
 
 #if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
@@ -1774,6 +1781,16 @@ struct PACKET_CZ_PET_EVOLUTION {
 	// struct pet_evolution_items items[];
 } __attribute__((packed));
 
+struct packet_ZC_REFUSE_LOGIN {
+	int16 PacketType;
+#if PACKETVER >= 20101123
+	uint32 error_code;
+#else
+	uint8 error_code;
+#endif
+	char block_date[20];
+} __attribute__((packed));
+
 #if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
 #pragma pack(pop)
 #endif // not NetBSD < 6 / Solaris
-- 
cgit v1.2.3-70-g09d2