Browse Source

Merge branch 'master' into refactor/StatusChangeDisplay

Jey 7 years ago
parent
commit
a73da61129

+ 4 - 0
conf/battle/misc.conf

@@ -18,6 +18,10 @@
 //   config to adjust how this will affect players)
 //   config to adjust how this will affect players)
 pk_mode: 0
 pk_mode: 0
 
 
+// Displays a message when the player enters a pk zone.
+// Only during pk_mode (Note 1)
+pk_mode_mes: yes
+
 // Manner/karma system configuration. Specifies how does negative manner
 // Manner/karma system configuration. Specifies how does negative manner
 // (red no chat bubble) affects players (add as needed):
 // (red no chat bubble) affects players (add as needed):
 //  0: No penalties.
 //  0: No penalties.

+ 5 - 1
conf/msg_conf/map_msg.conf

@@ -423,7 +423,7 @@
 404: War of Emperium SE is currently in progress.
 404: War of Emperium SE is currently in progress.
 405: War of Emperium SE has been ended.
 405: War of Emperium SE has been ended.
 406: War of Emperium SE is currently not in progress.
 406: War of Emperium SE is currently not in progress.
-//407 free
+//407: free
 //chrif related
 //chrif related
 408: Need disconnection to perform change-sex request...
 408: Need disconnection to perform change-sex request...
 409: Your sex has been changed (need disconnection by the server)...
 409: Your sex has been changed (need disconnection by the server)...
@@ -1662,5 +1662,9 @@
 1501: Spying on the %s clan.
 1501: Spying on the %s clan.
 1502: Incorrect clan name/ID.
 1502: Incorrect clan name/ID.
 
 
+// PK Mode msgs
+1503: You've entered a PK Zone.
+1504: You've entered a PK Zone (safe until level %d).
+
 //Custom translations
 //Custom translations
 //import: conf/msg_conf/import/map_msg_eng_conf.txt
 //import: conf/msg_conf/import/map_msg_eng_conf.txt

+ 1 - 1
db/re/item_db.txt

@@ -2110,7 +2110,7 @@
 2904,Naqsh,Naqsi,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ skill "BS_MAXIMIZE",5; skill "BS_WEAPONPERFECT",5; skill "WL_RECOGNIZEDSPELL",5; skill "ECL_SNOWFLIP",1; skill "ECL_PEONYMAMY",1; skill "ECL_SADAGUI",1; skill "ECL_SEQUOIADUST",1; bonus2 bSkillCooldown,"WL_RECOGNIZEDSPELL",-180000; bonus bDelayRate,-100; },{},{}
 2904,Naqsh,Naqsi,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{ skill "BS_MAXIMIZE",5; skill "BS_WEAPONPERFECT",5; skill "WL_RECOGNIZEDSPELL",5; skill "ECL_SNOWFLIP",1; skill "ECL_PEONYMAMY",1; skill "ECL_SADAGUI",1; skill "ECL_SEQUOIADUST",1; bonus2 bSkillCooldown,"WL_RECOGNIZEDSPELL",-180000; bonus bDelayRate,-100; },{},{}
 2905,Super_Ora_Ora,Super Ora Ora,4,0,,1000,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{},{},{}
 2905,Super_Ora_Ora,Super Ora Ora,4,0,,1000,,0,,0,0xFFFFFFFF,63,2,136,,0,0,0,{},{},{}
 2906,Happy_Gauntlet,Happy Gauntlet,4,20,,1000,,3,,1,0xFFFFFFFF,63,2,136,,70,0,0,{ bonus bMdef,3; },{},{}
 2906,Happy_Gauntlet,Happy Gauntlet,4,20,,1000,,3,,1,0xFFFFFFFF,63,2,136,,70,0,0,{ bonus bMdef,3; },{},{}
-2907,Buwaya_Tattoo,Bawaya Agimat Tattoo,4,20,,100,,0,,0,0xFFFFFFFF,63,2,136,,1,0,0,{ bonus bMatkRate,7; bonus bVariableCastrate,-7; },{},{}
+2907,Buwaya_Tattoo,Bawaya Agimat Tattoo,4,20,,100,,0,,0,0xFFFFFFFF,63,2,136,,1,0,0,{ bonus bMatkRate,7; bonus bFixedCastrate,-7; },{},{}
 2908,Light_Ring,Light Ring,4,20,,100,,0,,1,0xFFFFFFFF,63,2,136,,0,0,0,{},{},{}
 2908,Light_Ring,Light Ring,4,20,,100,,0,,1,0xFFFFFFFF,63,2,136,,0,0,0,{},{},{}
 2909,Darkness_Ring,Darkness Ring,4,20,,100,,0,,1,0xFFFFFFFF,63,2,136,,0,0,0,{},{},{}
 2909,Darkness_Ring,Darkness Ring,4,20,,100,,0,,1,0xFFFFFFFF,63,2,136,,0,0,0,{},{},{}
 2910,Bakonawa_Tattoo,Bakunawa Agimat Tattoo,4,20,,100,,0,,0,0xFFFFFFFF,63,2,136,,1,0,0,{ bonus2 bAddClass,Class_All,7; bonus bAspdRate,10; },{},{}
 2910,Bakonawa_Tattoo,Bakunawa Agimat Tattoo,4,20,,100,,0,,0,0xFFFFFFFF,63,2,136,,1,0,0,{ bonus2 bAddClass,Class_All,7; bonus bAspdRate,10; },{},{}

+ 9 - 1
doc/script_commands.txt

@@ -2760,6 +2760,9 @@ Valid information types are:
 REFINE_ZENY_COST       - Zeny
 REFINE_ZENY_COST       - Zeny
 REFINE_MATERIAL_ID     - Material Item ID
 REFINE_MATERIAL_ID     - Material Item ID
 
 
+This function will return -1 on failure. The function fails if the cost type
+is invalid or if there is no item in the equipment slot. 
+
 ---------------------------------------
 ---------------------------------------
 
 
 *getareadropitem("<map name>",<x1>,<y1>,<x2>,<y2>,<item>)
 *getareadropitem("<map name>",<x1>,<y1>,<x2>,<y2>,<item>)
@@ -3868,10 +3871,13 @@ by default green
 
 
 ---------------------------------------
 ---------------------------------------
 
 
-*showscript "<message>"{,<GID>};
+*showscript "<message>"{,<GID>, <flag>};
 
 
 Makes attached player or GID says a message like shouting a skill name, the message
 Makes attached player or GID says a message like shouting a skill name, the message
 will be seen to everyone around but not in chat window.
 will be seen to everyone around but not in chat window.
+flag: Specify target
+   AREA - Message is sent to players in the vicinity of the source (default).
+   SELF - Message is sent only to player attached.
 
 
 ---------------------------------------
 ---------------------------------------
 
 
@@ -6534,6 +6540,8 @@ The options are:
 	1 = The buy window
 	1 = The buy window
 	2 = The sell window
 	2 = The sell window
 
 
+Note: The <option> parameter only works on the 'shop' type NPC.
+
 A shop called with this command will trigger the labels "OnBuyItem" and "OnSellItem"
 A shop called with this command will trigger the labels "OnBuyItem" and "OnSellItem"
 (as long as an npcshop* command is executed from that NPC, see note below). These
 (as long as an npcshop* command is executed from that NPC, see note below). These
 labels, if used, will replace how the shop handles the buying and selling of items,
 labels, if used, will replace how the shop handles the buying and selling of items,

+ 15 - 6
npc/re/merchants/shadow_refiner.txt

@@ -15,12 +15,12 @@
 	mes "Do you want to refine a shadow item? Pick yer poison!";
 	mes "Do you want to refine a shadow item? Pick yer poison!";
 	next;
 	next;
 	setarray .@indices[1], EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L;
 	setarray .@indices[1], EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L;
-	for(.@i = 1; .@i <= EQI_SHADOW_ACC_L; .@i++)
+	.@indlen = getarraysize(.@indices) - 1;
+	for(.@i = 1; .@i <= .@indlen; .@i++)
 		.@menu$ = .@menu$ + (getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) +"-[Not equipped]") +":";
 		.@menu$ = .@menu$ + (getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) +"-[Not equipped]") +":";
 	.@menu$ = .@menu$ + "Refine info";
 	.@menu$ = .@menu$ + "Refine info";
-	.@part = .@indices[select(.@menu$)];
-
-	if (.@part == EQI_SHADOW_ACC_L + 1) { // Refine info
+	.@choice = select(.@menu$);
+	if (.@choice == .@indlen + 1) { // Refine info
 		mes "[Shadow Blacksmith]";
 		mes "[Shadow Blacksmith]";
 		mes "When a shadow item is refined, it gains extra bonuses very much like normal items.";
 		mes "When a shadow item is refined, it gains extra bonuses very much like normal items.";
 		next;
 		next;
@@ -35,6 +35,15 @@
 		mes "HD ores can be used for gear that is at least refine level +7 and will prevent breaking as long as you stay talking to me.";
 		mes "HD ores can be used for gear that is at least refine level +7 and will prevent breaking as long as you stay talking to me.";
 		close;
 		close;
 	}
 	}
+	
+	.@part = .@indices[.@choice];
+	
+	if (!getequipisequiped(.@part)) {
+		mes "[Shadow Blacksmith]";
+		mes "There's nothing here!";
+		close;
+	}
+	
 	while(1) {
 	while(1) {
 		mes "[Shadow Blacksmith]";
 		mes "[Shadow Blacksmith]";
 		mes "I require " + callfunc("F_InsertComma", .@zeny_cost) + " zeny as a fee for EACH refine attempt.";
 		mes "I require " + callfunc("F_InsertComma", .@zeny_cost) + " zeny as a fee for EACH refine attempt.";
@@ -84,7 +93,7 @@
 		.@choose = .@material[.@option-1];
 		.@choose = .@material[.@option-1];
 		if (!countitem(.@choose)) {
 		if (!countitem(.@choose)) {
 			mes "[Shadow Blacksmith]";
 			mes "[Shadow Blacksmith]";
-			mes "You do not have enough "+ getitemname(.@choose) +" / "+ getitemname(.@choose) +".";
+			mes "You do not have enough "+ getitemname(.@choose) +".";
 			close;
 			close;
 		}
 		}
 		if (Zeny < .@zeny_cost) {
 		if (Zeny < .@zeny_cost) {
@@ -140,4 +149,4 @@
 }
 }
 
 
 //moc_paraup,45,185,5	duplicate(ShadowBlacksmith)	Shadow Blacksmith#eden1	4_F_JOB_BLACKSMITH // Commented out until it's added to the map index
 //moc_paraup,45,185,5	duplicate(ShadowBlacksmith)	Shadow Blacksmith#eden1	4_F_JOB_BLACKSMITH // Commented out until it's added to the map index
-prt_in,59,54,3	duplicate(ShadowBlacksmith)	Shadow Blacksmith#itemmall	4_F_JOB_BLACKSMITH
+prt_in,61,54,3	duplicate(ShadowBlacksmith)	Shadow Blacksmith#itemmall	4_F_JOB_BLACKSMITH

+ 1 - 1
sql-files/item_db_re.sql

@@ -2142,7 +2142,7 @@ REPLACE INTO `item_db_re` VALUES (2903,'Morpheus\'s_Armlet_','Morpheus\'s Armlet
 REPLACE INTO `item_db_re` VALUES (2904,'Naqsh','Naqsi',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'skill "BS_MAXIMIZE",5; skill "BS_WEAPONPERFECT",5; skill "WL_RECOGNIZEDSPELL",5; skill "ECL_SNOWFLIP",1; skill "ECL_PEONYMAMY",1; skill "ECL_SADAGUI",1; skill "ECL_SEQUOIADUST",1; bonus2 bSkillCooldown,"WL_RECOGNIZEDSPELL",-180000; bonus bDelayRate,-100;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2904,'Naqsh','Naqsi',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,'skill "BS_MAXIMIZE",5; skill "BS_WEAPONPERFECT",5; skill "WL_RECOGNIZEDSPELL",5; skill "ECL_SNOWFLIP",1; skill "ECL_PEONYMAMY",1; skill "ECL_SADAGUI",1; skill "ECL_SEQUOIADUST",1; bonus2 bSkillCooldown,"WL_RECOGNIZEDSPELL",-180000; bonus bDelayRate,-100;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2905,'Super_Ora_Ora','Super Ora Ora',4,0,NULL,1000,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,NULL,NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2905,'Super_Ora_Ora','Super Ora Ora',4,0,NULL,1000,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,0,NULL,NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2906,'Happy_Gauntlet','Happy Gauntlet',4,20,NULL,1000,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,'70',0,0,'bonus bMdef,3;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2906,'Happy_Gauntlet','Happy Gauntlet',4,20,NULL,1000,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,'70',0,0,'bonus bMdef,3;',NULL,NULL);
-REPLACE INTO `item_db_re` VALUES (2907,'Buwaya_Tattoo','Bawaya Agimat Tattoo',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'bonus bMatkRate,7; bonus bVariableCastrate,-7;',NULL,NULL);
+REPLACE INTO `item_db_re` VALUES (2907,'Buwaya_Tattoo','Bawaya Agimat Tattoo',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'bonus bMatkRate,7; bonus bFixedCastrate,-7;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2908,'Light_Ring','Light Ring',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'0',0,0,NULL,NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2908,'Light_Ring','Light Ring',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'0',0,0,NULL,NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2909,'Darkness_Ring','Darkness Ring',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'0',0,0,NULL,NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2909,'Darkness_Ring','Darkness Ring',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'0',0,0,NULL,NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2910,'Bakonawa_Tattoo','Bakunawa Agimat Tattoo',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'bonus2 bAddClass,Class_All,7; bonus bAspdRate,10;',NULL,NULL);
 REPLACE INTO `item_db_re` VALUES (2910,'Bakonawa_Tattoo','Bakunawa Agimat Tattoo',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'bonus2 bAddClass,Class_All,7; bonus bAspdRate,10;',NULL,NULL);

+ 12 - 0
src/char/char.cpp

@@ -1763,9 +1763,21 @@ int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
 
 
 	buf = WBUFP(buffer,0);
 	buf = WBUFP(buffer,0);
 	WBUFL(buf,0) = p->char_id;
 	WBUFL(buf,0) = p->char_id;
+#if PACKETVER >= 20170830
+	WBUFQ(buf,4) = u64min((uint64)p->base_exp, INT64_MAX);
+	offset += 4;
+	buf = WBUFP(buffer, offset);
+#else
 	WBUFL(buf,4) = umin(p->base_exp, INT32_MAX);
 	WBUFL(buf,4) = umin(p->base_exp, INT32_MAX);
+#endif
 	WBUFL(buf,8) = p->zeny;
 	WBUFL(buf,8) = p->zeny;
+#if PACKETVER >= 20170830
+	WBUFQ(buf,12) = u64min((uint64)p->job_exp, INT64_MAX);
+	offset += 4;
+	buf = WBUFP(buffer, offset);
+#else
 	WBUFL(buf,12) = umin(p->job_exp, INT32_MAX);
 	WBUFL(buf,12) = umin(p->job_exp, INT32_MAX);
+#endif
 	WBUFL(buf,16) = p->job_level;
 	WBUFL(buf,16) = p->job_level;
 	WBUFL(buf,20) = 0; // probably opt1
 	WBUFL(buf,20) = 0; // probably opt1
 	WBUFL(buf,24) = 0; // probably opt2
 	WBUFL(buf,24) = 0; // probably opt2

+ 1 - 0
src/map/battle.c

@@ -8182,6 +8182,7 @@ static const struct _battle_data {
 	{ "equip_self_break_rate",              &battle_config.equip_self_break_rate,           100,    0,      INT_MAX,        },
 	{ "equip_self_break_rate",              &battle_config.equip_self_break_rate,           100,    0,      INT_MAX,        },
 	{ "equip_skill_break_rate",             &battle_config.equip_skill_break_rate,          100,    0,      INT_MAX,        },
 	{ "equip_skill_break_rate",             &battle_config.equip_skill_break_rate,          100,    0,      INT_MAX,        },
 	{ "pk_mode",                            &battle_config.pk_mode,                         0,      0,      2,              },
 	{ "pk_mode",                            &battle_config.pk_mode,                         0,      0,      2,              },
+	{ "pk_mode_mes",                        &battle_config.pk_mode_mes,                     1,      0,      1,              },
 	{ "pk_level_range",                     &battle_config.pk_level_range,                  0,      0,      INT_MAX,        },
 	{ "pk_level_range",                     &battle_config.pk_level_range,                  0,      0,      INT_MAX,        },
 	{ "manner_system",                      &battle_config.manner_system,                   0xFFF,  0,      0xFFF,          },
 	{ "manner_system",                      &battle_config.manner_system,                   0xFFF,  0,      0xFFF,          },
 	{ "pet_equip_required",                 &battle_config.pet_equip_required,              0,      0,      1,              },
 	{ "pet_equip_required",                 &battle_config.pet_equip_required,              0,      0,      1,              },

+ 1 - 0
src/map/battle.h

@@ -349,6 +349,7 @@ extern struct Battle_Config
 	int multi_level_up;
 	int multi_level_up;
 	int max_exp_gain_rate; //Max amount of exp bar % you can get in one go.
 	int max_exp_gain_rate; //Max amount of exp bar % you can get in one go.
 	int pk_mode;
 	int pk_mode;
+	int pk_mode_mes;
 	int pk_level_range;
 	int pk_level_range;
 
 
 	int manner_system; // end additions [Valaris]
 	int manner_system; // end additions [Valaris]

+ 70 - 9
src/map/clif.cpp

@@ -3141,6 +3141,7 @@ static int clif_hpmeter(struct map_session_data *sd)
 /// 0121 <current count>.W <max count>.W <current weight>.L <max weight>.L (ZC_NOTIFY_CARTITEM_COUNTINFO)
 /// 0121 <current count>.W <max count>.W <current weight>.L <max weight>.L (ZC_NOTIFY_CARTITEM_COUNTINFO)
 /// 013a <atk range>.W (ZC_ATTACK_RANGE)
 /// 013a <atk range>.W (ZC_ATTACK_RANGE)
 /// 0141 <status id>.L <base status>.L <plus status>.L (ZC_COUPLESTATUS)
 /// 0141 <status id>.L <base status>.L <plus status>.L (ZC_COUPLESTATUS)
+/// 0acb <var id>.W <value>.Q (ZC_LONGPAR_CHANGE2)
 /// TODO: Extract individual packets.
 /// TODO: Extract individual packets.
 /// FIXME: Packet lengths from packet_len(cmd)
 /// FIXME: Packet lengths from packet_len(cmd)
 void clif_updatestatus(struct map_session_data *sd,int type)
 void clif_updatestatus(struct map_session_data *sd,int type)
@@ -3257,6 +3258,28 @@ void clif_updatestatus(struct map_session_data *sd,int type)
 		WFIFOW(fd,0)=0xb1;
 		WFIFOW(fd,0)=0xb1;
 		WFIFOL(fd,4)=sd->status.zeny;
 		WFIFOL(fd,4)=sd->status.zeny;
 		break;
 		break;
+#if PACKETVER >= 20170830
+	case SP_BASEEXP:
+		WFIFOW(fd,0)=0xacb;
+		WFIFOQ(fd,4)=sd->status.base_exp;
+		len = packet_len(0xacb);
+		break;
+	case SP_JOBEXP:
+		WFIFOW(fd,0)=0xacb;
+		WFIFOQ(fd,4)=sd->status.job_exp;
+		len = packet_len(0xacb);
+		break;
+	case SP_NEXTBASEEXP:
+		WFIFOW(fd,0)=0xacb;
+		WFIFOQ(fd,4)=pc_nextbaseexp(sd);
+		len = packet_len(0xacb);
+		break;
+	case SP_NEXTJOBEXP:
+		WFIFOW(fd,0)=0xacb;
+		WFIFOQ(fd,4)=pc_nextjobexp(sd);
+		len = packet_len(0xacb);
+		break;
+#else
 	case SP_BASEEXP:
 	case SP_BASEEXP:
 		WFIFOW(fd,0)=0xb1;
 		WFIFOW(fd,0)=0xb1;
 		WFIFOL(fd,4)=sd->status.base_exp;
 		WFIFOL(fd,4)=sd->status.base_exp;
@@ -3273,6 +3296,7 @@ void clif_updatestatus(struct map_session_data *sd,int type)
 		WFIFOW(fd,0)=0xb1;
 		WFIFOW(fd,0)=0xb1;
 		WFIFOL(fd,4)=pc_nextjobexp(sd);
 		WFIFOL(fd,4)=pc_nextjobexp(sd);
 		break;
 		break;
+#endif
 
 
 	/**
 	/**
 	 * SP_U<STAT> are used to update the amount of points necessary to increase that stat
 	 * SP_U<STAT> are used to update the amount of points necessary to increase that stat
@@ -10010,6 +10034,28 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat
 	return true;
 	return true;
 }
 }
 
 
+/**
+ * Displays a message if the player enters a PK Zone (during pk_mode)
+ * @param sd: Player data
+ */
+inline void clif_pk_mode_message(struct map_session_data * sd)
+{
+	if (battle_config.pk_mode && battle_config.pk_mode_mes &&
+		sd && map[sd->bl.m].flag.pvp) {
+		if( (int)sd->status.base_level < battle_config.pk_min_level ) {
+			char output[CHAT_SIZE_MAX];
+			// 1504: You've entered a PK Zone (safe until level %d).
+			safesnprintf(output, CHAT_SIZE_MAX, msg_txt(sd,1504), 
+						 battle_config.pk_min_level);
+			clif_showscript(&sd->bl, output, SELF);
+		} else {
+			// 1503: You've entered a PK Zone.
+			clif_showscript(&sd->bl, msg_txt(sd,1503), SELF);
+		}
+	}
+	return;
+}
+
 // ---------------------
 // ---------------------
 // clif_parse_wanttoconnect
 // clif_parse_wanttoconnect
 // ---------------------
 // ---------------------
@@ -10445,6 +10491,8 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		// Instances do not need their own channels
 		// Instances do not need their own channels
 		if( channel_config.map_tmpl.name != NULL && (channel_config.map_tmpl.opt&CHAN_OPT_AUTOJOIN) && !map[sd->bl.m].flag.chmautojoin && !map[sd->bl.m].instance_id )
 		if( channel_config.map_tmpl.name != NULL && (channel_config.map_tmpl.opt&CHAN_OPT_AUTOJOIN) && !map[sd->bl.m].flag.chmautojoin && !map[sd->bl.m].instance_id )
 			channel_mjoin(sd); //join new map
 			channel_mjoin(sd); //join new map
+
+		clif_pk_mode_message(sd);
 	} else if (sd->guild && (battle_config.guild_notice_changemap == 2 || guild_notice))
 	} else if (sd->guild && (battle_config.guild_notice_changemap == 2 || guild_notice))
 		clif_guild_notice(sd); // Displays at end
 		clif_guild_notice(sd); // Displays at end
 
 
@@ -17238,8 +17286,9 @@ void clif_party_show_picker(struct map_session_data * sd, struct item * item_dat
 }
 }
 
 
 
 
-/** Display gained exp (ZC_NOTIFY_EXP).
- * 07f6 <account id>.L <amount>.L <var id>.W <exp type>.W
+/** Display gained exp.
+ * 07f6 <account id>.L <amount>.L <var id>.W <exp type>.W (ZC_NOTIFY_EXP)
+ * 0acc <account id>.L <amount>.Q <var id>.W <exp type>.W (ZC_NOTIFY_EXP2)
  * amount: INT32_MIN ~ INT32_MAX
  * amount: INT32_MIN ~ INT32_MAX
  * var id:
  * var id:
  *     SP_BASEEXP, SP_JOBEXP
  *     SP_BASEEXP, SP_JOBEXP
@@ -17255,18 +17304,30 @@ void clif_party_show_picker(struct map_session_data * sd, struct item * item_dat
 void clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, bool quest, bool lost)
 void clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, bool quest, bool lost)
 {
 {
 	int fd;
 	int fd;
+	int offset;
+#if PACKETVER >= 20170830
+	int cmd = 0xacc;
+#else
+	int cmd = 0x7f6;
+#endif
 
 
 	nullpo_retv(sd);
 	nullpo_retv(sd);
 
 
 	fd = sd->fd;
 	fd = sd->fd;
 
 
-	WFIFOHEAD(fd, packet_len(0x7f6));
-	WFIFOW(fd,0) = 0x7f6;
+	WFIFOHEAD(fd, packet_len(cmd));
+	WFIFOW(fd,0) = cmd;
 	WFIFOL(fd,2) = sd->bl.id;
 	WFIFOL(fd,2) = sd->bl.id;
+#if PACKETVER >= 20170830
+	WFIFOQ(fd,6) = (int64)u64min((uint64)exp, INT_MAX) * (lost ? -1 : 1);
+	offset = 4;
+#else
 	WFIFOL(fd,6) = (int)umin(exp, INT_MAX) * (lost ? -1 : 1);
 	WFIFOL(fd,6) = (int)umin(exp, INT_MAX) * (lost ? -1 : 1);
-	WFIFOW(fd,10) = type;
-	WFIFOW(fd,12) = (quest && type != SP_JOBEXP) ? 1 : 0; // NOTE: Somehow JobEXP always in yellow color
-	WFIFOSET(fd,packet_len(0x7f6));
+	offset = 0;
+#endif
+	WFIFOW(fd,10+offset) = type;
+	WFIFOW(fd,12+offset) = (quest && type != SP_JOBEXP) ? 1 : 0; // NOTE: Somehow JobEXP always in yellow color
+	WFIFOSET(fd,packet_len(cmd));
 }
 }
 
 
 
 
@@ -18738,7 +18799,7 @@ void clif_notify_bindOnEquip(struct map_session_data *sd, int n) {
 * [Ind/Hercules]
 * [Ind/Hercules]
 * 08b3 <Length>.W <id>.L <message>.?B (ZC_SHOWSCRIPT)
 * 08b3 <Length>.W <id>.L <message>.?B (ZC_SHOWSCRIPT)
 **/
 **/
-void clif_showscript(struct block_list* bl, const char* message) {
+void clif_showscript(struct block_list* bl, const char* message, enum send_target flag) {
 	char buf[256];
 	char buf[256];
 	size_t len;
 	size_t len;
 	nullpo_retv(bl);
 	nullpo_retv(bl);
@@ -18757,7 +18818,7 @@ void clif_showscript(struct block_list* bl, const char* message) {
 	WBUFW(buf,2) = (uint16)(len+8);
 	WBUFW(buf,2) = (uint16)(len+8);
 	WBUFL(buf,4) = bl->id;
 	WBUFL(buf,4) = bl->id;
 	safestrncpy(WBUFCP(buf,8), message, len);
 	safestrncpy(WBUFCP(buf,8), message, len);
-	clif_send((unsigned char *) buf, WBUFW(buf,2), bl, AREA);
+	clif_send((unsigned char *) buf, WBUFW(buf,2), bl, flag);
 }
 }
 
 
 /**
 /**

+ 1 - 1
src/map/clif.h

@@ -1038,7 +1038,7 @@ void clif_update_rankingpoint(struct map_session_data *sd, int rankingtype, int
 
 
 void clif_crimson_marker(struct map_session_data *sd, struct block_list *bl, bool remove);
 void clif_crimson_marker(struct map_session_data *sd, struct block_list *bl, bool remove);
 
 
-void clif_showscript(struct block_list* bl, const char* message);
+void clif_showscript(struct block_list* bl, const char* message, enum send_target flag);
 void clif_party_leaderchanged(struct map_session_data *sd, int prev_leader_aid, int new_leader_aid);
 void clif_party_leaderchanged(struct map_session_data *sd, int prev_leader_aid, int new_leader_aid);
 
 
 void clif_account_name(int fd, uint32 account_id, const char* accname);
 void clif_account_name(int fd, uint32 account_id, const char* accname);

+ 34 - 3
src/map/clif_obfuscation.h

@@ -181,17 +181,25 @@
 		packet_keys(0x3C6447A8,0x032170D7,0x6490476C);
 		packet_keys(0x3C6447A8,0x032170D7,0x6490476C);
 	#elif PACKETVER == 20151014 // 2015-10-14bRagexeRE
 	#elif PACKETVER == 20151014 // 2015-10-14bRagexeRE
 		packet_keys(0x402728A8,0x5D0E309F,0x240018FD);
 		packet_keys(0x402728A8,0x5D0E309F,0x240018FD);
+	#elif PACKETVER == 20151022 // 2015-10-22aRagexeRE
+		packet_keys(0x0311104D,0x46C326D6,0x00E82720);
 	#elif PACKETVER == 20151028 // 2015-10-28cRagexeRE
 	#elif PACKETVER == 20151028 // 2015-10-28cRagexeRE
 		packet_keys(0x45B945B9,0x45B945B9,0x45B945B9);
 		packet_keys(0x45B945B9,0x45B945B9,0x45B945B9);
 	#elif PACKETVER == 20151029 // 2015-10-29aRagexe
 	#elif PACKETVER == 20151029 // 2015-10-29aRagexe
 		packet_keys(0x45B945B9,0x45B945B9,0x45B945B9);
 		packet_keys(0x45B945B9,0x45B945B9,0x45B945B9);
 	#elif PACKETVER == 20151104 // 2015-11-04aRagexe
 	#elif PACKETVER == 20151104 // 2015-11-04aRagexe
 		packet_keys(0x4C17382A,0x7ED174C9,0x29961E4F);
 		packet_keys(0x4C17382A,0x7ED174C9,0x29961E4F);
+	#elif PACKETVER == 20151111 // 2015-11-11aRagexeRE
+		packet_keys(0x46097C77,0x5F193871,0x29140A21);
 	#elif PACKETVER == 20151118 // 2015-11-18aRagexeRE
 	#elif PACKETVER == 20151118 // 2015-11-18aRagexeRE
 		packet_keys(0x734C3241,0x6E846F34,0x731C06D6);
 		packet_keys(0x734C3241,0x6E846F34,0x731C06D6);
+	#elif PACKETVER == 20151125 // 2015-11-25dRagexeRE
+		packet_keys(0x237446C0,0x5EFB343A,0x0EDF06C5);
 	#elif PACKETVER == 20151202 // 2015-12-02bRagexeRE
 	#elif PACKETVER == 20151202 // 2015-12-02bRagexeRE
 		packet_keys(0x4EDE52DE,0x52DE52DE,0x52DE52DE);
 		packet_keys(0x4EDE52DE,0x52DE52DE,0x52DE52DE);
-	#elif PACKETVER == 20151216 // 2015-12-16aRagexe
+	#elif PACKETVER == 20151209 // 2015-12-09aRagexeRE
+		packet_keys(0x652C5898,0x7A351FB3,0x67EA2886);
+	#elif PACKETVER == 20151216 // 2015-12-16aRagexeRE
 		packet_keys(0x25DD643D,0x61AC39DE,0x77A8206D);
 		packet_keys(0x25DD643D,0x61AC39DE,0x77A8206D);
 	#elif PACKETVER == 20151223 // 2015-12-23bRagexeRE
 	#elif PACKETVER == 20151223 // 2015-12-23bRagexeRE
 		packet_keys(0x347D68D0,0x2C705320,0x7B4A199D);
 		packet_keys(0x347D68D0,0x2C705320,0x7B4A199D);
@@ -245,7 +253,7 @@
 		packet_keys(0x062C5C26,0x6CF47E82,0x4DD53480);
 		packet_keys(0x062C5C26,0x6CF47E82,0x4DD53480);
 	#elif PACKETVER == 20160622 // 2016-06-22aRagexeRE
 	#elif PACKETVER == 20160622 // 2016-06-22aRagexeRE
 		packet_keys(0x426548AB,0x5C0F5DD4,0x03022710);
 		packet_keys(0x426548AB,0x5C0F5DD4,0x03022710);
-	#elif PACKETVER == 20160630 // 2016-06-30aRagexeRE
+	#elif PACKETVER == 20160629 || PACKETVER == 20160630 // 2016-06-29aRagexeRE or 2016-06-30aRagexeRE
 		packet_keys(0x0DF31CCC,0x54281606,0x5C4C6855);
 		packet_keys(0x0DF31CCC,0x54281606,0x5C4C6855);
 	#elif PACKETVER == 20160706 // 2016-07-06cRagexeRE
 	#elif PACKETVER == 20160706 // 2016-07-06cRagexeRE
 		packet_keys(0x33A766D0,0x743F04F8,0x0FA0276C);
 		packet_keys(0x33A766D0,0x743F04F8,0x0FA0276C);
@@ -277,7 +285,7 @@
 		packet_keys(0x34882F11,0x7C870E70,0x7E61350D);
 		packet_keys(0x34882F11,0x7C870E70,0x7E61350D);
 	#elif PACKETVER == 20161026 // 2016-10-26bRagexeRE
 	#elif PACKETVER == 20161026 // 2016-10-26bRagexeRE
 		packet_keys(0x2CB86AE6,0x7D12660E,0x1B004DEB);
 		packet_keys(0x2CB86AE6,0x7D12660E,0x1B004DEB);
-	#elif PACKETVER == 20161103 // 2016-11-03aRagexeRE
+	#elif PACKETVER == 20161102 || PACKETVER == 20161103 // 2016-11-02aRagexeRE or 2016-11-03aRagexeRE
 		packet_keys(0x76725C17,0x72FE4EC1,0x07A91BFD);
 		packet_keys(0x76725C17,0x72FE4EC1,0x07A91BFD);
 	#elif PACKETVER == 20161109 // 2016-11-09bRagexeRE
 	#elif PACKETVER == 20161109 // 2016-11-09bRagexeRE
 		packet_keys(0x0A5277C0,0x2DB17506,0x0E8F26DA);
 		packet_keys(0x0A5277C0,0x2DB17506,0x0E8F26DA);
@@ -345,6 +353,29 @@
 		packet_keys(0x155F34EC,0x2D943FA9,0x3D9170EB);
 		packet_keys(0x155F34EC,0x2D943FA9,0x3D9170EB);
 	#elif PACKETVER == 20170628 // 2017-06-28bRagexeRE
 	#elif PACKETVER == 20170628 // 2017-06-28bRagexeRE
 		packet_keys(0x04691C86,0x43C210E2,0x2FE277E2);
 		packet_keys(0x04691C86,0x43C210E2,0x2FE277E2);
+	#elif PACKETVER == 20170705 // 2017-07-05aRagexeRE
+		packet_keys(0x7EB000AE,0x02FB1DBC,0x5CB131E6);
+	#elif PACKETVER == 20170712 // 2017-07-12bRagexeRE
+		packet_keys(0x2C3C202C,0x3F2C2F2C,0x2F2C2F2C);
+	#elif PACKETVER == 20170719 // 2017-07-19aRagexeRE
+		packet_keys(0x46465C88,0x10116F66,0x200866F9);
+	#elif PACKETVER == 20170726 // 2017-07-26cRagexeRE
+		packet_keys(0x102F23DB,0x7E767751,0x3BC172EF);
+	#elif PACKETVER == 20170801 // 2017-08-01aRagexeRE
+		packet_keys(0x26B52A7F,0x5377619D,0x4F580AC4);
+	//#elif PACKETVER == 20170809 // 2017-08-09cRagexeRE
+	#elif PACKETVER == 20170816 // 2017-08-16dRagexeRE
+		packet_keys(0x78914673,0x3F8B7634,0x55B814BC);
+	#elif PACKETVER == 20170823 // 2017-08-23aRagexeRE
+		packet_keys(0x22677205,0x393D1002,0x58DC6BB4);
+	#elif PACKETVER == 20170830 // 2017-08-30bRagexeRE
+		packet_keys(0x1D49592B,0x00970C17,0x1E640103);
+	#elif PACKETVER == 20170906 // 2017-09-06cRagexeRE
+		packet_keys(0x7DEF7677,0x351F36E6,0x52303485);
+	#elif PACKETVER == 20170913 // 2017-09-13bRagexeRE
+		packet_keys(0x7A645935,0x1DA05062,0x5A7A4C43);
+	#elif PACKETVER == 20170920 // 2017-09-20bRagexeRE
+		packet_keys(0x53024DA5,0x04EC212D,0x0BF87CD4);
 	#elif PACKETVER > 20110817
 	#elif PACKETVER > 20110817
 		#error Unsupported packet version.
 		#error Unsupported packet version.
 	#endif
 	#endif

+ 6 - 0
src/map/clif_packetdb.h

@@ -2346,4 +2346,10 @@
 	packet(0x0ABD,10);
 	packet(0x0ABD,10);
 #endif
 #endif
 
 
+// 2017-08-30bRagexeRE
+#if PACKETVER >= 20170830
+	packet(0x0ACB,12);
+	packet(0x0ACC,18);
+#endif
+
 #endif /* _CLIF_PACKETDB_H_ */
 #endif /* _CLIF_PACKETDB_H_ */

+ 472 - 4
src/map/clif_shuffle.h

@@ -1058,6 +1058,37 @@
 	parseable_packet(0x095e,8,clif_parse_MoveToKafra,2,4);
 	parseable_packet(0x095e,8,clif_parse_MoveToKafra,2,4);
 	parseable_packet(0x0961,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x0961,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x0964,19,clif_parse_WantToConnection,2,6,10,14,18);
 	parseable_packet(0x0964,19,clif_parse_WantToConnection,2,6,10,14,18);
+// 2015-10-22aRagexeRE
+#elif PACKETVER == 20151022
+	parseable_packet(0x023B,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0281,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x02C4,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0361,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0362,6,clif_parse_DropItem,2,4);
+	//parseable_packet(0x0363,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0364,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0365,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0366,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,7,clif_parse_ActionRequest,2,6);
+	//parseable_packet(0x0436,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x07E4,6,clif_parse_TakeItem,2);
+	parseable_packet(0x07EC,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x086A,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x091D,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0940,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
 // 2015-10-28cRagexeRE
 // 2015-10-28cRagexeRE
 #elif PACKETVER == 20151028
 #elif PACKETVER == 20151028
 	parseable_packet(0x0202,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x0202,5,clif_parse_ChangeDir,2,4);
@@ -1151,6 +1182,37 @@
 	parseable_packet(0x093A,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
 	parseable_packet(0x093A,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
 	parseable_packet(0x0940,36,clif_parse_StoragePassword,2,4,20);
 	parseable_packet(0x0940,36,clif_parse_StoragePassword,2,4,20);
 	parseable_packet(0x0964,6,clif_parse_TakeItem,2);
 	parseable_packet(0x0964,6,clif_parse_TakeItem,2);
+// 2015-11-11aRagexeRE
+#elif PACKETVER == 20151111
+	parseable_packet(0x02C4,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0362,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0366,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	//parseable_packet(0x0802,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x085D,-1,clif_parse_ItemListWindowSelected,2,4,8,8,12);
+	parseable_packet(0x0862,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0871,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x0885,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x089C,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0942,18,clif_parse_PartyBookingRegisterReq,2,4,6);
+	parseable_packet(0x094A,6,clif_parse_TakeItem,2);
+	//parseable_packet(0x0958,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0966,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0967,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0969,36,clif_parse_StoragePassword,2,4,20);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
 // 2015-11-18aRagexeRE
 // 2015-11-18aRagexeRE
 #elif PACKETVER == 20151118
 #elif PACKETVER == 20151118
 	parseable_packet(0x022d,6,clif_parse_TickSend,2);
 	parseable_packet(0x022d,6,clif_parse_TickSend,2);
@@ -1182,6 +1244,37 @@
 	//parseable_packet(0x0957,4,NULL,0); // CZ_GANGSI_RANK
 	//parseable_packet(0x0957,4,NULL,0); // CZ_GANGSI_RANK
 	parseable_packet(0x095c,18,clif_parse_PartyBookingRegisterReq,2,4,6);
 	parseable_packet(0x095c,18,clif_parse_PartyBookingRegisterReq,2,4,6);
 	parseable_packet(0x096a,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x096a,6,clif_parse_GetCharNameRequest,2);
+// 2015-11-25dRagexeRE
+#elif PACKETVER == 20151125
+	parseable_packet(0x0361,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0365,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0366,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0368,-1,clif_parse_ItemListWindowSelected,2,4,8,8,12);
+	parseable_packet(0x0438,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0802,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0838,18,clif_parse_PartyBookingRegisterReq,2,4,6);
+	parseable_packet(0x085E,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x085F,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0863,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0883,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0884,36,clif_parse_StoragePassword,2,4,20);
+	//parseable_packet(0x0885,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x088C,6,clif_parse_TickSend,2);
+	parseable_packet(0x088D,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0899,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x089C,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x089F,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x08A9,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x08AD,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0920,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x092A,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x092E,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0939,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x093E,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x0951,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0956,26,clif_parse_PartyInvite2,2);
+	//parseable_packet(0x0957,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0959,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
 // 2015-12-02bRagexeRE
 // 2015-12-02bRagexeRE
 #elif PACKETVER == 20151202
 #elif PACKETVER == 20151202
 	parseable_packet(0x0202,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x0202,5,clif_parse_ChangeDir,2,4);
@@ -1213,6 +1306,38 @@
 	parseable_packet(0x083c,10,clif_parse_UseSkillToId,2,4,6);
 	parseable_packet(0x083c,10,clif_parse_UseSkillToId,2,4,6);
 	parseable_packet(0x0870,36,clif_parse_StoragePassword,2,4,20);
 	parseable_packet(0x0870,36,clif_parse_StoragePassword,2,4,20);
 	parseable_packet(0x096a,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x096a,6,clif_parse_GetCharNameRequest,2);
+// 2015-12-09aRagexeRE
+#elif PACKETVER == 20151209
+	parseable_packet(0x0365,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0369,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x07E4,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x07EC,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0811,6,clif_parse_TickSend,2);
+	parseable_packet(0x0819,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x085B,36,clif_parse_StoragePassword,2,4,20);
+	parseable_packet(0x085D,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x085E,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0861,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0866,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0875,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x087A,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x087F,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x088E,10,clif_parse_UseSkillToId,2,4,6);
+	//parseable_packet(0x088F,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0894,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x08A1,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0920,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x092D,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0930,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0932,-1,clif_parse_ItemListWindowSelected,2,4,8,8,12);
+	parseable_packet(0x093B,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0948,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x094A,18,clif_parse_PartyBookingRegisterReq,2,4,6);
+	parseable_packet(0x0956,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	//parseable_packet(0x095C,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0961,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0964,26,clif_parse_FriendsListAdd,2);
+// 2015-12-16aRagexeRE
 #elif PACKETVER == 20151216
 #elif PACKETVER == 20151216
 	parseable_packet(0x022D,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x022D,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x0361,6,clif_parse_ReqClickBuyingStore,2);
 	parseable_packet(0x0361,6,clif_parse_ReqClickBuyingStore,2);
@@ -2049,8 +2174,8 @@
 	parseable_packet(0x0959,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x0959,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x0965,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x0965,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x0969,6,clif_parse_DropItem,2,4);
 	parseable_packet(0x0969,6,clif_parse_DropItem,2,4);
-// 2016-06-30aRagexeRE
-#elif PACKETVER == 20160630
+// 2016-06-29aRagexeRE or 2016-06-30aRagexeRE
+#elif PACKETVER == 20160629 || PACKETVER == 20160630
 	parseable_packet(0x0202,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
 	parseable_packet(0x0202,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
 	parseable_packet(0x022d,5,clif_parse_WalkToXY,2);
 	parseable_packet(0x022d,5,clif_parse_WalkToXY,2);
 	//parseable_packet(0x035f,4,NULL,0); // CZ_GANGSI_RANK
 	//parseable_packet(0x035f,4,NULL,0); // CZ_GANGSI_RANK
@@ -2545,8 +2670,8 @@
 	parseable_packet(0x095c,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
 	parseable_packet(0x095c,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
 	parseable_packet(0x095e,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
 	parseable_packet(0x095e,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
 	parseable_packet(0x0962,5,clif_parse_ChangeDir,2,4);
 	parseable_packet(0x0962,5,clif_parse_ChangeDir,2,4);
-// 2016-11-03aRagexeRE
-#elif PACKETVER == 20161103
+// 2016-11-02aRagexeRE or 2016-11-03aRagexeRE
+#elif PACKETVER == 20161102 || PACKETVER == 20161103
 	parseable_packet(0x0361,8,clif_parse_MoveFromKafra,2,4);
 	parseable_packet(0x0361,8,clif_parse_MoveFromKafra,2,4);
 	//parseable_packet(0x0367,4,NULL,0); // CZ_GANGSI_RANK
 	//parseable_packet(0x0367,4,NULL,0); // CZ_GANGSI_RANK
 	parseable_packet(0x0436,7,clif_parse_ActionRequest,2,6);
 	parseable_packet(0x0436,7,clif_parse_ActionRequest,2,6);
@@ -3599,6 +3724,349 @@
 	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
 	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
 	parseable_packet(0x0863,36,clif_parse_StoragePassword,0);
 	parseable_packet(0x0863,36,clif_parse_StoragePassword,0);
 	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
+// 2017-07-05aRagexeRE
+#elif PACKETVER == 20170705
+	parseable_packet(0x0202,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x02C4,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0366,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0879,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0886,26,clif_parse_FriendsListAdd,2);
+	//parseable_packet(0x088D,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x088E,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x089A,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x089D,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x091A,5,clif_parse_ChangeDir,2,4);
+	//parseable_packet(0x092F,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0930,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0932,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0934,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x094C,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
+// 2017-07-12bRagexeRE
+#elif PACKETVER == 20170712
+	parseable_packet(0x0202,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x022D,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x023B,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x0281,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0361,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0362,6,clif_parse_DropItem,2,4);
+	//parseable_packet(0x0363,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0364,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0365,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0366,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,7,clif_parse_ActionRequest,2,6);
+	//parseable_packet(0x0436,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x07E4,6,clif_parse_TakeItem,2);
+	parseable_packet(0x07EC,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0802,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0944,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
+// 2017-07-19aRagexeRE
+#elif PACKETVER == 20170719
+	parseable_packet(0x022D,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0367,2,clif_parse_ReqCloseBuyingStore,0);
+	//parseable_packet(0x0368,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0369,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x07E4,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x085A,6,clif_parse_TickSend,2);
+	parseable_packet(0x085E,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0863,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x086E,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x087D,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0881,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0882,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x0885,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0891,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0898,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x089A,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x089D,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x08A6,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x08A8,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x091B,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x091F,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x092C,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x092E,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x092F,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x093D,5,clif_parse_WalkToXY,2);
+	//parseable_packet(0x093E,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0944,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0946,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x0966,8,clif_parse_MoveToKafra,2,4);
+// 2017-07-26cRagexeRE
+#elif PACKETVER == 20170726
+	parseable_packet(0x0363,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0364,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0366,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0369,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0438,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0838,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0873,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0874,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0878,7,clif_parse_ActionRequest,2,6);
+	//parseable_packet(0x0881,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0888,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x088E,5,clif_parse_WalkToXY,2);
+	//parseable_packet(0x08A3,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x08A7,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x08AA,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x08AB,6,clif_parse_TakeItem,2);
+	parseable_packet(0x08AC,6,clif_parse_TickSend,2);
+	parseable_packet(0x091D,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x091E,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x091F,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0921,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0923,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0943,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x094F,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0950,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0952,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0954,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x095A,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0963,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+// 2017-08-01aRagexeRE
+#elif PACKETVER == 20170801
+	parseable_packet(0x022D,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0281,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0361,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0362,5,clif_parse_HomMenu,2,4);
+	//parseable_packet(0x0363,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0364,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0365,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0366,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x07E4,6,clif_parse_TakeItem,2);
+	parseable_packet(0x07EC,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0802,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x087D,36,clif_parse_StoragePassword,0);
+	//parseable_packet(0x08A6,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x094F,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x095A,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
+// 2017-08-09cRagexeRE 
+//#elif PACKETVER == 20170809
+// 2017-08-16dRagexeRE
+#elif PACKETVER == 20170816
+	parseable_packet(0x022D,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x035F,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0361,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x0362,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0438,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x085A,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0862,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0864,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x087E,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0881,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0882,36,clif_parse_StoragePassword,0);
+	//parseable_packet(0x0884,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0888,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0889,6,clif_parse_TickSend,2);
+	parseable_packet(0x08A3,26,clif_parse_FriendsListAdd,2);
+	//parseable_packet(0x08A7,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x08A9,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x08AC,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x091C,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x0921,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0925,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x092C,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x093A,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x093D,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0940,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0941,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0950,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0959,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0960,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+// 2017-08-23aRagexeRE
+#elif PACKETVER == 20170823
+	parseable_packet(0x0281,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0361,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0362,6,clif_parse_DropItem,2,4);
+	//parseable_packet(0x0363,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0364,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0365,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x0366,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,7,clif_parse_ActionRequest,2,6);
+	//parseable_packet(0x0436,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x07E4,6,clif_parse_TakeItem,2);
+	parseable_packet(0x07EC,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0802,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x086C,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x086D,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x08AC,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x095B,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
+// 2017-08-30bRagexeRE
+#elif PACKETVER == 20170830
+	parseable_packet(0x0281,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x02C4,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0363,18,clif_parse_PartyBookingRegisterReq,2,4);
+	//parseable_packet(0x0364,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0860,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0865,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x086A,26,clif_parse_PartyInvite2,2);
+	//parseable_packet(0x0875,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0884,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0885,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0888,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0897,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0899,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x089A,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x089E,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x08A2,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x08A8,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x091E,6,clif_parse_TickSend,2);
+	parseable_packet(0x0921,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0925,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x092E,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x0939,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x093E,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0940,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0942,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x0943,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0947,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0951,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0959,10,clif_parse_UseSkillToPos,2,4,6,8);
+// 2017-09-06cRagexeRE
+#elif PACKETVER == 20170906
+	//parseable_packet(0x0202,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0281,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x02C4,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x035F,6,clif_parse_TickSend,2);
+	parseable_packet(0x0360,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0366,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0368,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0369,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0437,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0438,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x0802,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0811,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0815,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x0817,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0819,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x0835,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0838,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x083C,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0860,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0866,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	//parseable_packet(0x086C,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x087B,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x08A2,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x08A3,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x08A7,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x091A,6,clif_parse_TakeItem,2);
+	parseable_packet(0x091E,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0953,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x096A,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x0281,6,clif_parse_GetCharNameRequest,2);
+// 2017-09-13bRagexeRE
+#elif PACKETVER == 20170913
+	parseable_packet(0x035F,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x0437,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x07E4,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x0817,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0835,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x085A,2,clif_parse_ReqCloseBuyingStore,0);
+	parseable_packet(0x0860,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0865,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x0866,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x088C,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0890,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x0891,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x0892,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x08A6,6,clif_parse_ReqClickBuyingStore,2);
+	//parseable_packet(0x08A7,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x08AA,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x08AB,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x08AC,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x08AD,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x091B,6,clif_parse_TickSend,2);
+	parseable_packet(0x091D,6,clif_parse_DropItem,2,4);
+	//parseable_packet(0x091E,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0920,2,clif_parse_SearchStoreInfoNextPage,0);
+	parseable_packet(0x0923,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0925,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x0927,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x095A,10,clif_parse_UseSkillToPos,2,4,6,8);
+	parseable_packet(0x095C,6,clif_parse_SolveCharName,2);
+// 2017-09-20bRagexeRE
+#elif PACKETVER == 20170920
+	parseable_packet(0x0369,6,clif_parse_TakeItem,2);
+	parseable_packet(0x0436,-1,clif_parse_ItemListWindowSelected,2,4,8,12);
+	parseable_packet(0x07EC,8,clif_parse_MoveFromKafra,2,4);
+	parseable_packet(0x085A,5,clif_parse_WalkToXY,2);
+	parseable_packet(0x0861,26,clif_parse_FriendsListAdd,2);
+	parseable_packet(0x0862,10,clif_parse_UseSkillToId,2,4,6);
+	parseable_packet(0x0864,36,clif_parse_StoragePassword,0);
+	parseable_packet(0x0865,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
+	parseable_packet(0x086A,26,clif_parse_PartyInvite2,2);
+	parseable_packet(0x086C,6,clif_parse_DropItem,2,4);
+	parseable_packet(0x0874,2,clif_parse_ReqCloseBuyingStore,0);
+	//parseable_packet(0x0875,4,NULL,0); // CZ_GANGSI_RANK
+	parseable_packet(0x0889,6,clif_parse_GetCharNameRequest,2);
+	parseable_packet(0x088E,6,clif_parse_TickSend,2);
+	parseable_packet(0x089B,7,clif_parse_ActionRequest,2,6);
+	parseable_packet(0x0919,10,clif_parse_UseSkillToPos,2,4,6,8);
+	//parseable_packet(0x091E,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
+	parseable_packet(0x0921,6,clif_parse_SolveCharName,2);
+	parseable_packet(0x0923,19,clif_parse_WantToConnection,2,6,10,14,18);
+	parseable_packet(0x0926,8,clif_parse_MoveToKafra,2,4);
+	parseable_packet(0x092E,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
+	parseable_packet(0x0937,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
+	parseable_packet(0x0939,5,clif_parse_ChangeDir,2,4);
+	parseable_packet(0x0945,18,clif_parse_PartyBookingRegisterReq,2,4);
+	parseable_packet(0x094C,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
+	parseable_packet(0x095D,5,clif_parse_HomMenu,2,4);
+	parseable_packet(0x0961,6,clif_parse_ReqClickBuyingStore,2);
+	parseable_packet(0x0966,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
+	parseable_packet(0x096A,2,clif_parse_SearchStoreInfoNextPage,0);
 #endif
 #endif
 
 
 #endif /* _CLIF_SHUFFLE_H_ */
 #endif /* _CLIF_SHUFFLE_H_ */

+ 1 - 1
src/map/pc.c

@@ -6410,7 +6410,7 @@ int pc_follow_timer(int tid, unsigned int tick, int id, intptr_t data)
 	sd->followtimer = INVALID_TIMER;
 	sd->followtimer = INVALID_TIMER;
 	tbl = map_id2bl(sd->followtarget);
 	tbl = map_id2bl(sd->followtarget);
 
 
-	if (tbl == NULL || pc_isdead(sd) || status_isdead(tbl))
+	if (tbl == NULL || pc_isdead(sd))
 	{
 	{
 		pc_stop_following(sd);
 		pc_stop_following(sd);
 		return 0;
 		return 0;

+ 27 - 4
src/map/script.cpp

@@ -19718,7 +19718,7 @@ unsigned short script_instancegetid(struct script_state* st)
 		struct guild *gd = NULL;
 		struct guild *gd = NULL;
 		struct clan *cd = NULL;
 		struct clan *cd = NULL;
 
 
-		if (script_rid2sd(sd)) {
+		if ((sd = map_id2sd(st->rid))) {
 			if (sd->instance_id)
 			if (sd->instance_id)
 				instance_id = sd->instance_id;
 				instance_id = sd->instance_id;
 			if (instance_id == 0 && sd->status.party_id && (pd = party_search(sd->status.party_id)) != NULL && pd->instance_id)
 			if (instance_id == 0 && sd->status.party_id && (pd = party_search(sd->status.party_id)) != NULL && pd->instance_id)
@@ -22083,12 +22083,16 @@ BUILDIN_FUNC(getvar) {
 
 
 /**
 /**
  * Display script message
  * Display script message
- * showscript "<message>"{,<GID>};
+ * showscript "<message>"{,<GID>,<flag>};
+ * @param flag: Specify target
+ *   AREA - Message is sent to players in the vicinity of the source (default).
+ *   SELF - Message is sent only to player attached.
  **/
  **/
 BUILDIN_FUNC(showscript) {
 BUILDIN_FUNC(showscript) {
 	struct block_list *bl = NULL;
 	struct block_list *bl = NULL;
 	const char *msg = script_getstr(st,2);
 	const char *msg = script_getstr(st,2);
 	int id = 0;
 	int id = 0;
+	send_target target = AREA;
 
 
 	if (script_hasdata(st,3)) {
 	if (script_hasdata(st,3)) {
 		id = script_getnum(st,3);
 		id = script_getnum(st,3);
@@ -22104,7 +22108,15 @@ BUILDIN_FUNC(showscript) {
 		return SCRIPT_CMD_FAILURE;
 		return SCRIPT_CMD_FAILURE;
 	}
 	}
 
 
-	clif_showscript(bl, msg);
+	if (script_hasdata(st, 4)) {
+		target = static_cast<send_target>(script_getnum(st, 4));
+		if (target == SELF && map_id2sd(bl->id) == NULL) {
+			ShowWarning("script: showscript: self can't be used for non-players objects.\n");
+			return SCRIPT_CMD_FAILURE;
+		}
+	}
+
+	clif_showscript(bl, msg, target);
 
 
 	script_pushint(st,1);
 	script_pushint(st,1);
 	return SCRIPT_CMD_SUCCESS;
 	return SCRIPT_CMD_SUCCESS;
@@ -23565,6 +23577,7 @@ BUILDIN_FUNC(achievementupdate) {
 /**
 /**
  * Get an equipment's refine cost
  * Get an equipment's refine cost
  * getequiprefinecost(<equipment slot>,<type>,<information>{,<char id>})
  * getequiprefinecost(<equipment slot>,<type>,<information>{,<char id>})
+ * returns -1 on fail
  */
  */
 BUILDIN_FUNC(getequiprefinecost) {
 BUILDIN_FUNC(getequiprefinecost) {
 	int i = -1, slot, type, info;
 	int i = -1, slot, type, info;
@@ -23579,9 +23592,19 @@ BUILDIN_FUNC(getequiprefinecost) {
 		return SCRIPT_CMD_FAILURE;
 		return SCRIPT_CMD_FAILURE;
 	}
 	}
 
 
+	if (type < 0 || type >= REFINE_COST_MAX) {
+		script_pushint(st, -1);
+		return SCRIPT_CMD_SUCCESS;
+	}
+
 	if (equip_index_check(slot))
 	if (equip_index_check(slot))
 		i = pc_checkequip(sd, equip_bitmask[slot]);
 		i = pc_checkequip(sd, equip_bitmask[slot]);
 
 
+	if (i < 0) {
+		script_pushint(st, -1);
+		return SCRIPT_CMD_SUCCESS;
+	}
+
 	int weapon_lv = sd->inventory_data[i]->wlv;
 	int weapon_lv = sd->inventory_data[i]->wlv;
 	if (sd->inventory_data[i]->type == IT_SHADOWGEAR) {
 	if (sd->inventory_data[i]->type == IT_SHADOWGEAR) {
 		if (sd->inventory_data[i]->equip == EQP_SHADOW_WEAPON)
 		if (sd->inventory_data[i]->equip == EQP_SHADOW_WEAPON)
@@ -24178,7 +24201,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(npcshopupdate,"sii?"),
 	BUILDIN_DEF(npcshopupdate,"sii?"),
 	BUILDIN_DEF(getattachedrid,""),
 	BUILDIN_DEF(getattachedrid,""),
 	BUILDIN_DEF(getvar,"vi"),
 	BUILDIN_DEF(getvar,"vi"),
-	BUILDIN_DEF(showscript,"s?"),
+	BUILDIN_DEF(showscript,"s??"),
 	BUILDIN_DEF(ignoretimeout,"i?"),
 	BUILDIN_DEF(ignoretimeout,"i?"),
 	BUILDIN_DEF(geteleminfo,"i?"),
 	BUILDIN_DEF(geteleminfo,"i?"),
 	BUILDIN_DEF(setquestinfo_level,"iii"),
 	BUILDIN_DEF(setquestinfo_level,"iii"),

+ 5 - 1
src/map/skill.c

@@ -2712,7 +2712,11 @@ static int skill_magic_reflect(struct block_list* src, struct block_list* bl, in
 		return 0;
 		return 0;
 
 
 	// Kaite reflection - Does not bypass Boss check
 	// Kaite reflection - Does not bypass Boss check
-	if( sc->data[SC_KAITE] && (src->type == BL_PC || status_get_lv(src) <= 80) ) {
+	if( sc->data[SC_KAITE] && (src->type == BL_PC || status_get_lv(src) <= 80)
+#ifdef RENEWAL
+		&& type // Does not reflect AoE
+#endif
+		) {
 		// Kaite only works against non-players if they are low-level.
 		// Kaite only works against non-players if they are low-level.
 		// Kyomu doesn't disable Kaite, but the "skill fail chance" part of Kyomu applies to it.
 		// Kyomu doesn't disable Kaite, but the "skill fail chance" part of Kyomu applies to it.
 		clif_specialeffect(bl, 438, AREA);
 		clif_specialeffect(bl, 438, AREA);