Procházet zdrojové kódy

Added support for clients up to 2018-03-07bRagexeRE (#2975)

Thanks to @4144 as always
Credits to @dastgir and the leaked 2015 dump for the quest packets
Thanks to @idamonli for testing and feedback
Lemongrass3110 před 7 roky
rodič
revize
f338d53c2c

+ 4 - 0
src/char/char.cpp

@@ -2064,10 +2064,14 @@ int char_loadName(uint32 char_id, char* name){
 		safestrncpy(name, data, NAME_LENGTH);
 		safestrncpy(name, data, NAME_LENGTH);
 		return 1;
 		return 1;
 	}
 	}
+#if PACKETVER < 20180221
 	else
 	else
 	{
 	{
 		safestrncpy(name, charserv_config.char_config.unknown_char_name, NAME_LENGTH);
 		safestrncpy(name, charserv_config.char_config.unknown_char_name, NAME_LENGTH);
 	}
 	}
+#else
+	name[0] = '\0';
+#endif
 	return 0;
 	return 0;
 }
 }
 
 

+ 132 - 30
src/map/clif.cpp

@@ -6509,13 +6509,23 @@ void clif_wis_end(int fd, int result)
 
 
 /// Returns character name requested by char_id (ZC_ACK_REQNAME_BYGID).
 /// Returns character name requested by char_id (ZC_ACK_REQNAME_BYGID).
 /// 0194 <char id>.L <name>.24B
 /// 0194 <char id>.L <name>.24B
+/// 0af7 <flag>.W <char id>.L <name>.24B
 void clif_solved_charname(int fd, int charid, const char* name)
 void clif_solved_charname(int fd, int charid, const char* name)
 {
 {
+#if PACKETVER >= 20180221
+	WFIFOHEAD(fd,packet_len(0xaf7));
+	WFIFOW(fd,0) = 0xaf7;
+	WFIFOW(fd,2) = name[0] ? 3 : 2;
+	WFIFOL(fd,4) = charid;
+	safestrncpy(WFIFOCP(fd, 8), name, NAME_LENGTH);
+	WFIFOSET(fd,packet_len(0x0af7));
+#else
 	WFIFOHEAD(fd,packet_len(0x194));
 	WFIFOHEAD(fd,packet_len(0x194));
 	WFIFOW(fd,0)=0x194;
 	WFIFOW(fd,0)=0x194;
 	WFIFOL(fd,2)=charid;
 	WFIFOL(fd,2)=charid;
 	safestrncpy(WFIFOCP(fd,6), name, NAME_LENGTH);
 	safestrncpy(WFIFOCP(fd,6), name, NAME_LENGTH);
 	WFIFOSET(fd,packet_len(0x194));
 	WFIFOSET(fd,packet_len(0x194));
+#endif
 }
 }
 
 
 
 
@@ -12278,6 +12288,7 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uin
 /// Request to use a ground skill.
 /// Request to use a ground skill.
 /// 0116 <skill lv>.W <skill id>.W <x>.W <y>.W (CZ_USE_SKILL_TOGROUND)
 /// 0116 <skill lv>.W <skill id>.W <x>.W <y>.W (CZ_USE_SKILL_TOGROUND)
 /// 0366 <skill lv>.W <skill id>.W <x>.W <y>.W (CZ_USE_SKILL_TOGROUND2)
 /// 0366 <skill lv>.W <skill id>.W <x>.W <y>.W (CZ_USE_SKILL_TOGROUND2)
+/// 0AF4 <skill lv>.W <skill id>.W <x>.W <y>.W <unknown>.B (CZ_USE_SKILL_TOGROUND3)
 /// There are various variants of this packet, some of them have padding between fields.
 /// There are various variants of this packet, some of them have padding between fields.
 void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd)
 void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd)
 {
 {
@@ -12292,6 +12303,8 @@ void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd)
 		RFIFOW(fd,info->pos[1]), //skill num
 		RFIFOW(fd,info->pos[1]), //skill num
 		RFIFOW(fd,info->pos[2]), //pos x
 		RFIFOW(fd,info->pos[2]), //pos x
 		RFIFOW(fd,info->pos[3]), //pos y
 		RFIFOW(fd,info->pos[3]), //pos y
+		// TODO: find out what this is intended to do
+		//RFIFOB(fd, info->pos[4])
 		-1	//Skill more info.
 		-1	//Skill more info.
 	);
 	);
 }
 }
@@ -14303,6 +14316,7 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd)
 
 
 /// Toggles a single friend online/offline [Skotlex] (ZC_FRIENDS_STATE).
 /// Toggles a single friend online/offline [Skotlex] (ZC_FRIENDS_STATE).
 /// 0206 <account id>.L <char id>.L <state>.B
 /// 0206 <account id>.L <char id>.L <state>.B
+/// 0206 <account id>.L <char id>.L <state>.B <name>.24B >= 20180221
 /// state:
 /// state:
 ///     0 = online
 ///     0 = online
 ///     1 = offline
 ///     1 = offline
@@ -14322,6 +14336,9 @@ void clif_friendslist_toggle(struct map_session_data *sd,uint32 account_id, uint
 	WFIFOL(fd, 2) = sd->status.friends[i].account_id;
 	WFIFOL(fd, 2) = sd->status.friends[i].account_id;
 	WFIFOL(fd, 6) = sd->status.friends[i].char_id;
 	WFIFOL(fd, 6) = sd->status.friends[i].char_id;
 	WFIFOB(fd,10) = !online; //Yeah, a 1 here means "logged off", go figure...
 	WFIFOB(fd,10) = !online; //Yeah, a 1 here means "logged off", go figure...
+#if PACKETVER >= 20180221
+	safestrncpy(WFIFOCP(fd, 11), sd->status.friends[i].name, NAME_LENGTH);
+#endif
 	WFIFOSET(fd, packet_len(0x206));
 	WFIFOSET(fd, packet_len(0x206));
 }
 }
 
 
@@ -14340,21 +14357,29 @@ int clif_friendslist_toggle_sub(struct map_session_data *sd,va_list ap)
 
 
 /// Sends the whole friends list (ZC_FRIENDS_LIST).
 /// Sends the whole friends list (ZC_FRIENDS_LIST).
 /// 0201 <packet len>.W { <account id>.L <char id>.L <name>.24B }*
 /// 0201 <packet len>.W { <account id>.L <char id>.L <name>.24B }*
+/// 0201 <packet len>.W { <account id>.L <char id>.L }* >= 20180221
 void clif_friendslist_send(struct map_session_data *sd)
 void clif_friendslist_send(struct map_session_data *sd)
 {
 {
 	int i = 0, n, fd = sd->fd;
 	int i = 0, n, fd = sd->fd;
+#if PACKETVER >= 20180221
+	const int size = 8;
+#else
+	const int size = 8 + NAME_LENGTH;
+#endif
 
 
 	// Send friends list
 	// Send friends list
-	WFIFOHEAD(fd, MAX_FRIENDS * 32 + 4);
+	WFIFOHEAD(fd, MAX_FRIENDS * size + 4);
 	WFIFOW(fd, 0) = 0x201;
 	WFIFOW(fd, 0) = 0x201;
 	for(i = 0; i < MAX_FRIENDS && sd->status.friends[i].char_id; i++) {
 	for(i = 0; i < MAX_FRIENDS && sd->status.friends[i].char_id; i++) {
-		WFIFOL(fd, 4 + 32 * i + 0) = sd->status.friends[i].account_id;
-		WFIFOL(fd, 4 + 32 * i + 4) = sd->status.friends[i].char_id;
-		safestrncpy(WFIFOCP(fd, 4 + 32 * i + 8), sd->status.friends[i].name, NAME_LENGTH);
+		WFIFOL(fd, 4 + size * i + 0) = sd->status.friends[i].account_id;
+		WFIFOL(fd, 4 + size * i + 4) = sd->status.friends[i].char_id;
+#if PACKETVER < 20180221
+		safestrncpy(WFIFOCP(fd, 4 + size * i + 8), sd->status.friends[i].name, NAME_LENGTH);
+#endif
 	}
 	}
 
 
 	if (i) {
 	if (i) {
-		WFIFOW(fd,2) = 4 + 32 * i;
+		WFIFOW(fd,2) = 4 + size * i;
 		WFIFOSET(fd, WFIFOW(fd,2));
 		WFIFOSET(fd, WFIFOW(fd,2));
 	}
 	}
 
 
@@ -16561,10 +16586,10 @@ static void clif_quest_len(int def_len, int info_len, int avail_quests, int *lim
 	(*len_out) = ((*limit_out) * info_len) + def_len;
 	(*len_out) = ((*limit_out) * info_len) + def_len;
 }
 }
 
 
-/// Sends list of all quest states (ZC_ALL_QUEST_LIST).
-/// 02b1 <packet len>.W <num>.L { <quest id>.L <active>.B }*num
+/// Sends list of all quest states
+/// 02b1 <packet len>.W <num>.L { <quest id>.L <active>.B }*num (ZC_ALL_QUEST_LIST)
 /// 097a <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <mob_id>.L <killed>.W <total>.W <mob name>.24B }*count }*num (ZC_ALL_QUEST_LIST2)
 /// 097a <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <mob_id>.L <killed>.W <total>.W <mob name>.24B }*count }*num (ZC_ALL_QUEST_LIST2)
-/// 09f8 <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <mob_id>.L <killed>.W <total>.W <mob name>.24B }*count }*num (ZC_ALL_QUEST_LIST3)	// TODO!
+/// 09f8 <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <hunt identification>.L <mob type>.L <mob_id>.L <min level>.W <max level>.W <killed>.W <total>.W <mob name>.24B }*count }*num  (ZC_ALL_QUEST_LIST3)
 void clif_quest_send_list(struct map_session_data *sd)
 void clif_quest_send_list(struct map_session_data *sd)
 {
 {
 	int fd = sd->fd;
 	int fd = sd->fd;
@@ -16573,9 +16598,19 @@ void clif_quest_send_list(struct map_session_data *sd)
 	int limit = 0;
 	int limit = 0;
 
 
 #if PACKETVER >= 20141022
 #if PACKETVER >= 20141022
-	clif_quest_len(offset, 15 + ((10 + NAME_LENGTH) * MAX_QUEST_OBJECTIVES), sd->avail_quests, &limit, &i);
+#if PACKETVER >= 20150513
+	int size = 22 + NAME_LENGTH;
+#else
+	int size = 10 + NAME_LENGTH;
+#endif
+
+	clif_quest_len(offset, 15 + ( size * MAX_QUEST_OBJECTIVES), sd->avail_quests, &limit, &i);
 	WFIFOHEAD(fd,i);
 	WFIFOHEAD(fd,i);
+#if PACKETVER >= 20150513
+	WFIFOW(fd, 0) = 0x9f8;
+#else
 	WFIFOW(fd, 0) = 0x97a;
 	WFIFOW(fd, 0) = 0x97a;
+#endif
 	WFIFOL(fd, 4) = limit;
 	WFIFOL(fd, 4) = limit;
 
 
 	for (i = 0; i < limit; i++) {
 	for (i = 0; i < limit; i++) {
@@ -16599,8 +16634,20 @@ void clif_quest_send_list(struct map_session_data *sd)
 			for( j = 0; j < qi->objectives_count; j++ ){
 			for( j = 0; j < qi->objectives_count; j++ ){
 				mob = mob_db(qi->objectives[j].mob);
 				mob = mob_db(qi->objectives[j].mob);
 
 
+#if PACKETVER >= 20150513
+				WFIFOL(fd, offset) = sd->quest_log[i].quest_id * 1000 + j;
+				offset += 4;
+				WFIFOL(fd, offset) = 0; // TODO: Find info - mobType
+				offset += 4;
+#endif
 				WFIFOL(fd, offset) = qi->objectives[j].mob;
 				WFIFOL(fd, offset) = qi->objectives[j].mob;
 				offset += 4;
 				offset += 4;
+#if PACKETVER >= 20150513
+				WFIFOW(fd, offset) = 0; // TODO: Find info - levelMin
+				offset += 2;
+				WFIFOW(fd, offset) = 0; // TODO: Find info - levelMax
+				offset += 2;
+#endif
 				WFIFOW(fd, offset) = sd->quest_log[i].count[j];
 				WFIFOW(fd, offset) = sd->quest_log[i].count[j];
 				offset += 2;
 				offset += 2;
 				WFIFOW(fd, offset) = qi->objectives[j].count;
 				WFIFOW(fd, offset) = qi->objectives[j].count;
@@ -16666,31 +16713,71 @@ void clif_quest_send_mission(struct map_session_data *sd)
 }
 }
 
 
 
 
-/// Notification about a new quest (ZC_ADD_QUEST).
-/// 02b3 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3
+/// Notification about a new quest
+/// 02b3 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3 (ZC_ADD_QUEST)
+/// 08fe <packet len>.W  { <quest id>.L <mob id>.L <total count>.W <current count>.W }*3 (ZC_HUNTING_QUEST_INFO)
+/// 09f9 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <hunt identification>.L <mob type>.L <mob id>.L <min level>.W <max level>.W <mob count>.W <mob name>.24B }*3 (ZC_ADD_QUEST_EX)
 void clif_quest_add(struct map_session_data *sd, struct quest *qd)
 void clif_quest_add(struct map_session_data *sd, struct quest *qd)
 {
 {
 	int fd = sd->fd;
 	int fd = sd->fd;
-	int i;
+	int i, offset;
 	struct quest_db *qi = quest_search(qd->quest_id);
 	struct quest_db *qi = quest_search(qd->quest_id);
+#if PACKETVER >= 20150513
+	int cmd = 0x9f9;
+#else
+	int cmd = 0x2b3;
+#endif
 
 
-	WFIFOHEAD(fd, packet_len(0x2b3));
-	WFIFOW(fd, 0) = 0x2b3;
+	WFIFOHEAD(fd, packet_len(cmd));
+	WFIFOW(fd, 0) = cmd;
 	WFIFOL(fd, 2) = qd->quest_id;
 	WFIFOL(fd, 2) = qd->quest_id;
 	WFIFOB(fd, 6) = qd->state;
 	WFIFOB(fd, 6) = qd->state;
 	WFIFOB(fd, 7) = qd->time - qi->time;
 	WFIFOB(fd, 7) = qd->time - qi->time;
 	WFIFOL(fd, 11) = qd->time;
 	WFIFOL(fd, 11) = qd->time;
 	WFIFOW(fd, 15) = qi->objectives_count;
 	WFIFOW(fd, 15) = qi->objectives_count;
 
 
-	for (i = 0; i < qi->objectives_count; i++) {
+	for (i = 0, offset = 17; i < qi->objectives_count; i++) {
 		struct mob_db *mob;
 		struct mob_db *mob;
-		WFIFOL(fd, i*30+17) = qi->objectives[i].mob;
-		WFIFOW(fd, i*30+21) = qd->count[i];
+#if PACKETVER >= 20150513
+		WFIFOL(fd, offset) = qd->quest_id * 1000 + i;
+		offset += 4;
+		WFIFOL(fd, offset) = 0; // TODO: Find info - mobType
+		offset += 4;
+#endif
+		WFIFOL(fd, offset) = qi->objectives[i].mob;
+		offset += 4;
+#if PACKETVER >= 20150513
+		WFIFOW(fd, offset) = 0; // TODO: Find info - levelMin
+		offset += 2;
+		WFIFOW(fd, offset) = 0; // TODO: Find info - levelMax
+		offset += 2;
+#endif
+		WFIFOW(fd, offset) = qd->count[i];
+		offset += 2;
 		mob = mob_db(qi->objectives[i].mob);
 		mob = mob_db(qi->objectives[i].mob);
-		safestrncpy(WFIFOCP(fd, i*30+23), mob->jname, NAME_LENGTH);
+		safestrncpy(WFIFOCP(fd, offset), mob->jname, NAME_LENGTH);
+		offset += NAME_LENGTH;
+	}
+
+	WFIFOSET(fd, packet_len(cmd));
+
+#if PACKETVER >= 20150513
+	int len = 4 + qi->objectives_count * 12;
+
+	WFIFOHEAD(fd, len);
+	WFIFOW(fd, 0) = 0x8fe;
+	WFIFOW(fd, 2) = len;
+
+	for( i = 0, offset = 4; i < qi->objectives_count; i++, offset += 12 ){
+		WFIFOL(fd, offset) = qd->quest_id * 1000 + i;
+		WFIFOL(fd, offset+4) = qi->objectives[i].mob;
+		WFIFOW(fd, offset + 10) = qi->objectives[i].count;
+		WFIFOW(fd, offset + 12) = qd->count[i];
 	}
 	}
 
 
-	WFIFOSET(fd, packet_len(0x2b3));
+	WFIFOSET(fd, len);
+
+#endif
 }
 }
 
 
 
 
@@ -16707,30 +16794,45 @@ void clif_quest_delete(struct map_session_data *sd, int quest_id)
 }
 }
 
 
 
 
-/// Notification of an update to the hunting mission counter (ZC_UPDATE_MISSION_HUNT).
-/// 02b5 <packet len>.W <mobs>.W { <quest id>.L <mob id>.L <total count>.W <current count>.W }*3
+/// Notification of an update to the hunting mission counter
+/// 02b5 <packet len>.W <mobs>.W { <quest id>.L <mob id>.L <total count>.W <current count>.W }*3 (ZC_UPDATE_MISSION_HUNT)
+/// 09fa <packet len>.W <mobs>.W { <quest id>.L <hunt identification>.L <total count>.W <current count>.W }*3 (ZC_UPDATE_MISSION_HUNT_EX)
 void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd, int mobid)
 void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd, int mobid)
 {
 {
 	int fd = sd->fd;
 	int fd = sd->fd;
-	int i;
+	int i, offset;
 	struct quest_db *qi = quest_search(qd->quest_id);
 	struct quest_db *qi = quest_search(qd->quest_id);
 	int len = qi->objectives_count * 12 + 6;
 	int len = qi->objectives_count * 12 + 6;
+#if PACKETVER >= 20150513
+	int cmd = 0x9fa;
+#else
+	int cmd = 0x2b5;
+#endif
 
 
 	WFIFOHEAD(fd, len);
 	WFIFOHEAD(fd, len);
-	WFIFOW(fd, 0) = 0x2b5;
-	WFIFOW(fd, 2) = len;
+	WFIFOW(fd, 0) = cmd;
 	WFIFOW(fd, 4) = qi->objectives_count;
 	WFIFOW(fd, 4) = qi->objectives_count;
 
 
-	for (i = 0; i < qi->objectives_count; i++) {
+	for (i = 0, offset = 6; i < qi->objectives_count; i++) {
 		if (mobid == 0 || mobid == qi->objectives[i].mob) {
 		if (mobid == 0 || mobid == qi->objectives[i].mob) {
-			WFIFOL(fd, i * 12 + 6) = qd->quest_id;
-			WFIFOL(fd, i * 12 + 10) = qi->objectives[i].mob;
-			WFIFOW(fd, i * 12 + 14) = qi->objectives[i].count;
-			WFIFOW(fd, i * 12 + 16) = qd->count[i];
+			WFIFOL(fd, offset) = qd->quest_id;
+			offset += 4;
+#if PACKETVER >= 20150513
+			WFIFOL(fd, offset) = qd->quest_id * 1000 + i;
+			offset += 4;
+#else
+			WFIFOL(fd, offset) = qi->objectives[i].mob;
+			offset += 4;
+#endif
+			WFIFOW(fd, offset) = qi->objectives[i].count;
+			offset += 2;
+			WFIFOW(fd, offset) = qd->count[i];
+			offset += 2;
 		}
 		}
 	}
 	}
 
 
-	WFIFOSET(fd, len);
+	WFIFOW(fd, 2) = offset;
+	WFIFOSET(fd, offset);
 }
 }
 
 
 
 

+ 4 - 0
src/map/clif_obfuscation.hpp

@@ -414,6 +414,10 @@
 		packet_keys(0x45AA1B44,0x20E716B7,0x5388105C);
 		packet_keys(0x45AA1B44,0x20E716B7,0x5388105C);
 	#elif PACKETVER == 20180213 // 2018-02-13aRagexeRE
 	#elif PACKETVER == 20180213 // 2018-02-13aRagexeRE
 		packet_keys(0x189D69B2,0x43B85EAD,0x2B7A687E);
 		packet_keys(0x189D69B2,0x43B85EAD,0x2B7A687E);
+	#elif PACKETVER == 20180221 // 2018-02-21aRagexeRE or 2018-02-21bRagexeRE
+		packet_keys(0x6E2F6233,0x193B0A66,0x0D1D2CA5);
+	#elif PACKETVER == 20180307 // 2018-03-07bRagexeRE
+		packet_keys(0x47DA10EB,0x4B922CCF,0x765C5055);
 	#elif PACKETVER > 20110817
 	#elif PACKETVER > 20110817
 		#error Unsupported packet version.
 		#error Unsupported packet version.
 	#endif
 	#endif

+ 25 - 1
src/map/clif_packetdb.hpp

@@ -2222,7 +2222,6 @@
 	packet(0x09FD,-1); // ZC_NOTIFY_MOVEENTRY11
 	packet(0x09FD,-1); // ZC_NOTIFY_MOVEENTRY11
 	packet(0x09FE,-1); // ZC_NOTIFY_NEWENTRY11
 	packet(0x09FE,-1); // ZC_NOTIFY_NEWENTRY11
 	packet(0x09FF,-1); // ZC_NOTIFY_STANDENTRY11
 	packet(0x09FF,-1); // ZC_NOTIFY_STANDENTRY11
-	//packet(0x09F8,-1); // ZC_ALL_QUEST_LIST3
 #endif
 #endif
 
 
 // 2015-02-25aRagexeRE
 // 2015-02-25aRagexeRE
@@ -2282,6 +2281,12 @@
 	// Pet Evolution System
 	// Pet Evolution System
 	parseable_packet(0x09FB,-1,clif_parse_dull,0); // CZ_PET_EVOLUTION
 	parseable_packet(0x09FB,-1,clif_parse_dull,0); // CZ_PET_EVOLUTION
 	packet(0x09FC,6); // ZC_PET_EVOLUTION_RESULT
 	packet(0x09FC,6); // ZC_PET_EVOLUTION_RESULT
+
+	// Quest UI
+	packet(0x08FE,-1); // ZC_HUNTING_QUEST_INFO
+	packet(0x09F8,-1); // ZC_ALL_QUEST_LIST3
+	packet(0x09F9,143); // ZC_ADD_QUEST_EX
+	packet(0x09FA,-1); // ZC_UPDATE_MISSION_HUNT_EX
 #endif
 #endif
 
 
 // 2015-05-20aRagexe
 // 2015-05-20aRagexe
@@ -2353,4 +2358,23 @@
 	packet(0x0ACC,18);
 	packet(0x0ACC,18);
 #endif
 #endif
 
 
+// 2018-02-07bRagexeRE
+#if PACKETVER >= 20180207
+	parseable_packet(0x0AF4,11,clif_parse_UseSkillToPos,2,4,6,8,10);
+#endif
+
+// 2018-02-21aRagexeRE or 2018-02-21bRagexeRE
+#if PACKETVER >= 20180221
+	packet(0x0206,35); // ZC_FRIENDS_STATE
+	packet(0x0af7,32);
+#endif
+
+// 2018-03-07bRagexeRE
+#if PACKETVER >= 20180307
+	parseable_packet(0x0A68,3,clif_parse_dull,0);
+	packet(0x0AE2,7);
+	parseable_packet(0x0AEF,2,clif_parse_dull,0);
+	packet(0x0AF0,10);
+#endif
+
 #endif /* _CLIF_PACKETDB_HPP_ */
 #endif /* _CLIF_PACKETDB_HPP_ */

+ 62 - 0
src/map/clif_shuffle.hpp

@@ -4656,6 +4656,68 @@
 	parseable_packet(0x0955,8,clif_parse_MoveToKafra,2,4);
 	parseable_packet(0x0955,8,clif_parse_MoveToKafra,2,4);
 	parseable_packet(0x095A,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
 	parseable_packet(0x095A,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
 	parseable_packet(0x0962,5,clif_parse_HomMenu,2,4);
 	parseable_packet(0x0962,5,clif_parse_HomMenu,2,4);
+// 2018-02-21aRagexeRE or 2018-02-21bRagexeRE
+#elif PACKETVER == 20180221
+	parseable_packet(0x0202,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	//parseable_packet(0x0366,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0436,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x0838,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0867,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x086C,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x086F,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0871,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0876,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0879,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x087D,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0880,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0881,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0883,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x088F,6,clif_parse_SolveCharName,2);
+	//parseable_packet(0x0891,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0897,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0899,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x089D,6,clif_parse_TickSend,2);
+	parseable_packet(0x0917,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x091E,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0929,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x093D,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x094B,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x094D,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x094E,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0957,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x0964,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x096A,7,clif_parse_ActionRequest,2,6);
+// 2018-03-07bRagexeRE
+#elif PACKETVER == 20180307
+	parseable_packet(0x035F,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0437,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x07E4,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0861,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0862,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0864,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x086C,6,clif_parse_TickSend,2);
+	parseable_packet(0x0870,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0872,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0877,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x088D,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0893,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x089B,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x08A6,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x08AA,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x08AB,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0917,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0920,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0937,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0939,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x093D,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0941,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x0944,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0948,26,clif_parse_PartyInvite2,2);
+	//parseable_packet(0x0951,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0954,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0957,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0969,7,clif_parse_ActionRequest,2,6);
+	//parseable_packet(0x0281,4,NULL,0); // CZ_GANGSI_RANK
 #endif
 #endif
 
 
 #endif /* _CLIF_SHUFFLE_HPP_ */
 #endif /* _CLIF_SHUFFLE_HPP_ */