浏览代码

Removed the strange ACK function concept (#7404)

Cleans up packet database a little more.
Turned some more packets into structs.

Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
Lemongrass3110 2 年之前
父节点
当前提交
eb8587f5b5
共有 11 个文件被更改,包括 259 次插入338 次删除
  1. 1 2
      src/map/chrif.cpp
  2. 162 266
      src/map/clif.cpp
  3. 14 30
      src/map/clif.hpp
  4. 0 23
      src/map/clif_packetdb.hpp
  5. 47 0
      src/map/packets.hpp
  6. 17 1
      src/map/packets_struct.hpp
  7. 9 8
      src/map/pc.cpp
  8. 1 1
      src/map/pc.hpp
  9. 1 1
      src/map/pet.cpp
  10. 2 2
      src/map/script.cpp
  11. 5 4
      src/map/status.cpp

+ 1 - 2
src/map/chrif.cpp

@@ -1614,8 +1614,7 @@ void chrif_parse_ack_vipActive(int fd) {
 	}
 	// Show info if status changed
 	if (((flag&0x4) || changed) && !sd->vip.disableshowrate) {
-		clif_display_pinfo(sd,ZC_PERSONAL_INFOMATION);
-		//clif_vip_display_info(sd,ZC_PERSONAL_INFOMATION_CHN);
+		clif_display_pinfo( *sd );
 	}
 #endif
 }

+ 162 - 266
src/map/clif.cpp

@@ -79,7 +79,6 @@ static inline int32 client_exp(t_exp exp) {
 static struct eri *delay_clearunit_ers;
 
 struct s_packet_db packet_db[MAX_PACKET_DB + 1];
-int packet_db_ack[MAX_ACK_FUNC + 1];
 // Reuseable global packet buffer to prevent too many allocations
 // Take socket.cpp::socket_max_client_packet into consideration
 static int8 packet_buffer[UINT16_MAX];
@@ -2491,25 +2490,13 @@ void clif_scriptclose(struct map_session_data *sd, int npcid)
  * @param sd : player pointer
  * @param npcid : npc gid to close
  */
-void clif_scriptclear(struct map_session_data *sd, int npcid)
-{
-	struct s_packet_db* info;
-	int16 len;
-	int cmd = 0;
-	int fd;
+void clif_scriptclear( struct map_session_data& sd, int npcid ){
+	struct PACKET_ZC_CLEAR_DIALOG p = {};
 
-	nullpo_retv(sd);
+	p.packetType = HEADER_ZC_CLEAR_DIALOG;
+	p.GID = npcid;
 
-	cmd = packet_db_ack[ZC_CLEAR_DIALOG];
-	if(!cmd) cmd = 0x8d6; //default
-	info = &packet_db[cmd];
-	len = info->len;
-	fd = sd->fd;
-
-	WFIFOHEAD(fd, len);
-	WFIFOW(fd,0)=0x8d6;
-	WFIFOL(fd,info->pos[0])=npcid;
-	WFIFOSET(fd,len);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
  }
 
 /*==========================================
@@ -4134,48 +4121,22 @@ void clif_statusupack(struct map_session_data *sd,int type,int ok,int val) {
 ///     0 = failure
 ///     1 = success
 ///     2 = failure due to low level
-void clif_equipitemack(struct map_session_data *sd,int n,int pos,uint8 flag)
-{
-	int fd = 0, cmd = 0, look = 0;
-	struct s_packet_db *info = NULL;
-
-	nullpo_retv(sd);
-
-	cmd = packet_db_ack[ZC_WEAR_EQUIP_ACK];
-	if (!cmd || !(info = &packet_db[cmd]) || !info->len)
-		return;
-
-	fd = sd->fd;
+void clif_equipitemack( struct map_session_data& sd, uint8 flag, int index, int pos ){
+	struct PACKET_ZC_REQ_WEAR_EQUIP_ACK p = {};
 
-	if (flag == ITEM_EQUIP_ACK_OK && sd->inventory_data[n]->equip&EQP_VISIBLE)
-		look = sd->inventory_data[n]->look;
-
-	WFIFOHEAD(fd, info->len);
-	WFIFOW(fd, 0) = cmd;
-	WFIFOW(fd, info->pos[0]) = n+2;
-	switch (cmd) {
-		case 0xaa:
-			WFIFOW(fd, info->pos[1]) = pos;
-#if PACKETVER < 20100629
-			WFIFOW(fd, info->pos[2]) = (flag == ITEM_EQUIP_ACK_OK ? 1 : 0);
-#else
-			WFIFOL(fd, info->pos[2]) = look;
-			WFIFOW(fd, info->pos[3]) = (flag == ITEM_EQUIP_ACK_OK ? 1 : 0);
-#endif
-			break;
-		case 0x8d0:
-			if (flag == ITEM_EQUIP_ACK_FAILLEVEL)
-				flag = 1;
-		case 0x999:
-			if (cmd == 0x999)
-				WFIFOL(fd, info->pos[1]) = pos;
-			else
-				WFIFOW(fd, info->pos[1]) = pos;
-			WFIFOL(fd, info->pos[2]) = look;
-			WFIFOW(fd, info->pos[3]) = flag;
-			break;
+	p.PacketType = HEADER_ZC_REQ_WEAR_EQUIP_ACK;
+	p.index = client_index( index );
+	p.wearLocation = pos;
+#if PACKETVER_MAIN_NUM >= 20101123 || PACKETVER_RE_NUM >= 20100629
+	if( flag == ITEM_EQUIP_ACK_OK && sd.inventory_data[index]->equip&EQP_VISIBLE ){
+		p.wItemSpriteNumber = sd.inventory_data[index]->look;
+	}else{
+		p.wItemSpriteNumber = 0;
 	}
-	WFIFOSET(fd, info->len);
+#endif
+	p.result = flag;
+
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
 }
 
 
@@ -7346,16 +7307,15 @@ void clif_cart_additem_ack(struct map_session_data *sd, uint8 flag)
 }
 
 // 09B7 <unknow data> (ZC_ACK_OPEN_BANKING)
-void clif_bank_open(struct map_session_data *sd){
-	int fd;
+void clif_bank_open( struct map_session_data& sd ){
+#if PACKETVER >= 20130717
+	struct PACKET_ZC_ACK_OPEN_BANKING p = {};
 
-	nullpo_retv(sd);
-	fd = sd->fd;
+	p.packetType = HEADER_ZC_ACK_OPEN_BANKING;
+	p.unknown = 0;
 
-	WFIFOHEAD(fd,4);
-	WFIFOW(fd,0) = 0x09b7;
-	WFIFOW(fd,2) = 0;
-	WFIFOSET(fd,4);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /*
@@ -7378,23 +7338,21 @@ void clif_parse_BankOpen(int fd, struct map_session_data* sd) {
 			//request save ?
 			//chrif_bankdata_request(sd->status.account_id, sd->status.char_id);
 			//on succes open bank ?
-			clif_bank_open(sd);
+			clif_bank_open( *sd );
 		}
 	}
 }
 
 // 09B9 <unknow data> (ZC_ACK_CLOSE_BANKING)
+void clif_bank_close( struct map_session_data& sd ){
+#if PACKETVER >= 20130717
+	struct PACKET_ZC_ACK_CLOSE_BANKING p = {};
 
-void clif_bank_close(struct map_session_data *sd){
-	int fd;
-
-	nullpo_retv(sd);
-	fd = sd->fd;
+	p.packetType = HEADER_ZC_ACK_CLOSE_BANKING;
+	p.unknown = 0;
 
-	WFIFOHEAD(fd,4);
-	WFIFOW(fd,0) = 0x09B9;
-	WFIFOW(fd,2) = 0;
-	WFIFOSET(fd,4);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /*
@@ -7412,33 +7370,24 @@ void clif_parse_BankClose(int fd, struct map_session_data* sd) {
 	}
 	if(sd->status.account_id == aid){
 		sd->state.banking = 0;
-		clif_bank_close(sd);
+		clif_bank_close( *sd );
 	}
 }
 
 /*
  * Display how much we got in bank (I suppose)
-  09A6 <Bank_Vault>Q <Reason>W (PACKET_ZC_BANKING_CHECK)
+ * 09A6 <Bank_Vault>Q <Reason>W (ZC_BANKING_CHECK)
  */
-void clif_Bank_Check(struct map_session_data* sd) {
-	unsigned char buf[13];
-	struct s_packet_db* info;
-	int16 len;
-	int cmd = 0;
-
-	nullpo_retv(sd);
+void clif_Bank_Check( struct map_session_data& sd ){
+#if PACKETVER >= 20130717
+	struct PACKET_ZC_BANKING_CHECK p = {};
 
-	cmd = packet_db_ack[ZC_BANKING_CHECK];
-	if(!cmd) cmd = 0x09A6; //default
-	info = &packet_db[cmd];
-	len = info->len;
-	if(!len) return; //version as packet disable
-	// sd->state.banking = 1; //mark opening and closing
+	p.packetType = HEADER_ZC_BANKING_CHECK;
+	p.money = sd.bank_vault;
+	p.reason = 0;
 
-	WBUFW(buf,0) = cmd;
-	WBUFQ(buf,info->pos[0]) = sd->bank_vault; //value
-	WBUFW(buf,info->pos[1]) = 0; //reason
-	clif_send(buf,len,&sd->bl,SELF);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /*
@@ -7456,7 +7405,7 @@ void clif_parse_BankCheck(int fd, struct map_session_data* sd) {
 		struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
 		int aid = RFIFOL(fd,info->pos[0]); //unused should we check vs fd ?
 		if(sd->status.account_id == aid) //since we have it let check it for extra security
-			clif_Bank_Check(sd);
+			clif_Bank_Check( *sd );
 	}
 }
 
@@ -7464,25 +7413,17 @@ void clif_parse_BankCheck(int fd, struct map_session_data* sd) {
  * Acknowledge of deposit some money in bank
   09A8 <Reason>W <Money>Q <balance>L (PACKET_ZC_ACK_BANKING_DEPOSIT)
  */
-void clif_bank_deposit(struct map_session_data *sd, enum e_BANKING_DEPOSIT_ACK reason) {
-	unsigned char buf[17];
-	struct s_packet_db* info;
-	int16 len;
-	int cmd =0;
-
-	nullpo_retv(sd);
+void clif_bank_deposit( struct map_session_data& sd, enum e_BANKING_DEPOSIT_ACK reason ){
+#if PACKETVER >= 20130717
+	struct PACKET_ZC_ACK_BANKING_DEPOSIT p = {};
 
-	cmd = packet_db_ack[ZC_ACK_BANKING_DEPOSIT];
-	if(!cmd) cmd = 0x09A8;
-	info = &packet_db[cmd];
-	len = info->len;
-	if(!len) return; //version as packet disable
+	p.packetType = HEADER_ZC_ACK_BANKING_DEPOSIT;
+	p.money = sd.bank_vault;
+	p.zeny = sd.status.zeny;
+	p.reason = reason;
 
-	WBUFW(buf,0) = cmd;
-	WBUFW(buf,info->pos[0]) = (short)reason;
-	WBUFQ(buf,info->pos[1]) = sd->bank_vault;/* money in the bank */
-	WBUFL(buf,info->pos[2]) = sd->status.zeny;/* how much zeny char has after operation */
-	clif_send(buf,len,&sd->bl,SELF);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /*
@@ -7503,7 +7444,7 @@ void clif_parse_BankDeposit(int fd, struct map_session_data* sd) {
 
 		if(sd->status.account_id == aid){
 			enum e_BANKING_DEPOSIT_ACK reason = pc_bank_deposit(sd,max(0,money));
-			clif_bank_deposit(sd,reason);
+			clif_bank_deposit( *sd, reason );
 		}
 	}
 }
@@ -7512,26 +7453,17 @@ void clif_parse_BankDeposit(int fd, struct map_session_data* sd) {
  * Acknowledge of withdrawing some money from bank
   09AA <Reason>W <Money>Q <balance>L (PACKET_ZC_ACK_BANKING_WITHDRAW)
  */
-void clif_bank_withdraw(struct map_session_data *sd,enum e_BANKING_WITHDRAW_ACK reason) {
-	unsigned char buf[17];
-	struct s_packet_db* info;
-	int16 len;
-	int cmd;
-
-	nullpo_retv(sd);
+void clif_bank_withdraw( struct map_session_data& sd, enum e_BANKING_WITHDRAW_ACK reason ){
+#if PACKETVER >= 20130717
+	struct PACKET_ZC_ACK_BANKING_WITHDRAW p = {};
 
-	cmd = packet_db_ack[ZC_ACK_BANKING_WITHDRAW];
-	if(!cmd) cmd = 0x09AA;
-	info = &packet_db[cmd];
-	len = info->len;
-	if(!len) return; //version as packet disable
+	p.packetType = HEADER_ZC_ACK_BANKING_WITHDRAW;
+	p.reason = reason;
+	p.money = sd.bank_vault;
+	p.zeny = sd.status.zeny;
 
-	WBUFW(buf,0) = cmd;
-	WBUFW(buf,info->pos[0]) = (short)reason;
-	WBUFQ(buf,info->pos[1]) = sd->bank_vault;/* money in the bank */
-	WBUFL(buf,info->pos[2]) = sd->status.zeny;/* how much zeny char has after operation */
-
-	clif_send(buf,len,&sd->bl,SELF);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /*
@@ -7550,7 +7482,7 @@ void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) {
 		int money = RFIFOL(fd,info->pos[1]);
 		if(sd->status.account_id == aid){
 			enum e_BANKING_WITHDRAW_ACK reason = pc_bank_withdraw(sd,max(0,money));
-			clif_bank_withdraw(sd,reason);
+			clif_bank_withdraw( *sd, reason );
 		}
 	}
 }
@@ -11088,8 +11020,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 			map_getmapflag(sd->state.pmap, MF_BEXP) != mapdata->flag[MF_BEXP]
 			)
 		{
-			clif_display_pinfo(sd,ZC_PERSONAL_INFOMATION);
-			//clif_vip_display_info(sd,ZC_PERSONAL_INFOMATION_CHN);
+			clif_display_pinfo( *sd );
 		}
 #endif
 
@@ -12094,7 +12025,7 @@ void clif_parse_EquipItem(int fd,struct map_session_data *sd)
 		return;
 
 	if(!sd->inventory.u.items_inventory[index].identify) {
-		clif_equipitemack(sd,index,0,ITEM_EQUIP_ACK_FAIL);	// fail
+		clif_equipitemack( *sd, ITEM_EQUIP_ACK_FAIL, index ); // fail
 		return;
 	}
 
@@ -19957,19 +19888,16 @@ void clif_update_rankingpoint(map_session_data &sd, int rankingtype, int point)
  *   0 - map adjustment (bexp mapflag), 1 - Premium/VIP adjustment, 2 - Server rate adjustment, 3 - None
 */
 #ifdef VIP_ENABLE
-void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
-	if (sd) {
-		struct s_packet_db* info;
-		int16 len, szdetails = 13, maxinfotype = PINFO_MAX;
-		int cmd = 0, fd, i = 0;
-		int tot_baseexp = 100, tot_penalty = 100, tot_drop = 100, factor = 1000;
+void clif_display_pinfo( struct map_session_data& sd ){
+#if PACKETVER_MAIN_NUM >= 20110627 || PACKETVER_RE_NUM >= 20110628 || defined(PACKETVER_ZERO)
+	// TODO: Whoever wants to take the blame, fix this crappy logic below - and yes I know indentation is wrong, but CANT TOUCH THIS! *sings* [Lemongrass]
 		int details_bexp[PINFO_MAX], details_drop[PINFO_MAX], details_penalty[PINFO_MAX];
 
 		/**
 		 * EXP
 		 */
 		//0:PCRoom
-		details_bexp[PINFO_BASIC] = map_getmapflag(sd->bl.m, MF_BEXP);
+		details_bexp[PINFO_BASIC] = map_getmapflag( sd.bl.m, MF_BEXP );
 		if (details_bexp[PINFO_BASIC] == 100 || !details_bexp[PINFO_BASIC])
 			details_bexp[PINFO_BASIC] = 0;
 		else {
@@ -19981,7 +19909,7 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
 		}
 
 		//1:Premium
-		if (pc_isvip(sd)) {
+		if( pc_isvip( &sd ) ){
 			details_bexp[PINFO_PREMIUM] = battle_config.vip_base_exp_increase * battle_config.base_exp_rate / 100;
 			if (details_bexp[PINFO_PREMIUM] < 0)
 				details_bexp[PINFO_PREMIUM] = 0 - details_bexp[PINFO_PREMIUM];
@@ -20010,7 +19938,7 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
 		details_drop[PINFO_BASIC] = 0;
 
 		//1:Premium
-		if (pc_isvip(sd)) {
+		if( pc_isvip( &sd ) ){
 			details_drop[PINFO_PREMIUM] = (battle_config.vip_drop_increase * battle_config.item_rate_common) / 100;
 			if (details_drop[PINFO_PREMIUM] < 0)
 				details_drop[PINFO_PREMIUM] = 0 - details_drop[PINFO_PREMIUM];
@@ -20040,7 +19968,7 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
 		details_penalty[PINFO_BASIC] = 0;
 
 		//1:Premium
-		if (pc_isvip(sd)) {
+		if( pc_isvip( &sd ) ){
 			details_penalty[PINFO_PREMIUM] = battle_config.vip_exp_penalty_base;
 			if (details_penalty[PINFO_PREMIUM] == 100)
 				details_penalty[PINFO_PREMIUM] = 0;
@@ -20071,53 +19999,40 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
 		//3:TPLUS
 		details_penalty[PINFO_CAFE] = 0;
 
-		cmd = packet_db_ack[cmdtype];
-		info = &packet_db[cmd];
-		len = info->len; //this is the base len without details
-		if(!len) return; //version as packet disable
-
-		if (cmdtype == ZC_PERSONAL_INFOMATION && cmd == 0x08cb) { //0x08cb version
-			szdetails = 7;
-			factor = 1;
-		}
-		else if (cmd == 0x097b) {
-			tot_baseexp *= factor;
-			tot_drop *= factor;
-			tot_penalty *= factor;
-		}
-
-		fd = sd->fd;
-		WFIFOHEAD(fd,len+maxinfotype*szdetails);
-		WFIFOW(fd,0) = cmd;
+	struct PACKET_ZC_PERSONAL_INFOMATION* p = (struct PACKET_ZC_PERSONAL_INFOMATION*)packet_buffer;
 
-		for (i = 0; i < maxinfotype; i++) {
-			WFIFOB(fd,info->pos[4]+(i*szdetails)) = i; //infotype //0 PCRoom, 1 Premium, 2 Server, 3 TPlus
+	p->packetType = HEADER_ZC_PERSONAL_INFOMATION;
+	p->length = sizeof( *p ) + PINFO_MAX * sizeof( p->details[0] );
+#if PACKETVER_MAIN_NUM >= 20120503 || PACKETVER_RE_NUM >= 20120502 || defined(PACKETVER_ZERO)
+	p->total_exp = 100 * 1000;
+	p->total_death = 100 * 1000;
+	p->total_drop = 100 * 1000;
+#else
+	p->total_exp = 100;
+	p->total_death = 100;
+	p->total_drop = 100;
+#endif
 
-			WFIFOL(fd,info->pos[5]+(i*szdetails)) = details_bexp[i]*factor;
-			WFIFOL(fd,info->pos[6]+(i*szdetails)) = details_penalty[i]*factor;
-			WFIFOL(fd,info->pos[7]+(i*szdetails)) = details_drop[i]*factor;
+	for( int i = PINFO_BASIC; i < PINFO_MAX; i++ ){
+		p->details[i].type = i; // infotype 0 PCRoom, 1 Premium, 2 Server, 3 TPlus
 
-			tot_baseexp += details_bexp[i]*factor;
-			tot_drop += details_drop[i]*factor;
-			tot_penalty += details_penalty[i]*factor;
+#if PACKETVER_MAIN_NUM >= 20120503 || PACKETVER_RE_NUM >= 20120502 || defined(PACKETVER_ZERO)
+		p->details[i].exp = details_bexp[i] * 1000;
+		p->details[i].death = details_penalty[i] * 1000;
+		p->details[i].drop = details_drop[i] * 1000;
+#else
+		p->details[i].exp = details_bexp[i];
+		p->details[i].death = details_penalty[i];
+		p->details[i].drop = details_drop[i];
+#endif
 
-			len += szdetails;
-		}
-		WFIFOW(fd,info->pos[0])  = len; //packetlen
-		if (cmd == 0x08cb) { //0x08cb version
-			WFIFOW(fd,info->pos[1])  = tot_baseexp;
-			WFIFOW(fd,info->pos[2])  = tot_penalty;
-			WFIFOW(fd,info->pos[3])  = tot_drop;
-		}
-		else { //2013-08-07aRagexe uses 0x097b
-			WFIFOL(fd,info->pos[1])  = tot_baseexp;
-			WFIFOL(fd,info->pos[2])  = tot_penalty;
-			WFIFOL(fd,info->pos[3])  = tot_drop;
-		}
-		if (cmdtype == ZC_PERSONAL_INFOMATION_CHN)
-			WFIFOW(fd,info->pos[8])  = 0; //activity rate case of event ??
-		WFIFOSET(fd,len);
+		p->total_exp += p->details[i].exp;
+		p->total_death += p->details[i].death;
+		p->total_drop += p->details[i].drop;
 	}
+
+	clif_send( p, p->length, &sd.bl, SELF );
+#endif
 }
 #endif
 
@@ -20134,46 +20049,36 @@ void clif_parse_GMFullStrip(int fd, struct map_session_data *sd) {
 * @param fd
 * @param bl Crimson Marker target
 **/
-void clif_crimson_marker(struct map_session_data *sd, struct block_list *bl, bool remove) {
-	struct s_packet_db* info;
-	int cmd = 0;
-	int16 len;
-	unsigned char buf[11];
-
-	nullpo_retv(sd);
+void clif_crimson_marker( struct map_session_data& sd, struct block_list& bl, bool remove ){
+#if PACKETVER_MAIN_NUM >= 20130731 || PACKETVER_RE_NUM >= 20130707 || defined(PACKETVER_ZERO)
+	struct PACKET_ZC_C_MARKERINFO p = {};
 
-	cmd = packet_db_ack[ZC_C_MARKERINFO];
-	if (!cmd)
-		cmd = 0x09C1; //default
-	info = &packet_db[cmd];
-	if (!(len = info->len))
-		return;
+	p.PacketType = HEADER_ZC_C_MARKERINFO;
+	p.AID = bl.id;
+	if( remove ){
+		p.xPos = -1;
+		p.yPos = -1;
+	}else{
+		p.xPos = bl.x;
+		p.yPos = bl.y;
+	}
 
-	WBUFW(buf, 0) = cmd;
-	WBUFL(buf, info->pos[0]) = bl->id;
-	WBUFW(buf, info->pos[1]) = (remove ? -1 : bl->x);
-	WBUFW(buf, info->pos[2]) = (remove ? -1 : bl->y);
-	clif_send(buf, len, &sd->bl, SELF);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /**
  * 02d3 <index>.W (ZC_NOTIFY_BIND_ON_EQUIP)
  **/
-void clif_notify_bindOnEquip(struct map_session_data *sd, int n) {
-	struct s_packet_db *info = NULL;
-	int cmd = 0;
+void clif_notify_bindOnEquip( struct map_session_data& sd, int16 index ){
+#if PACKETVER >= 20070227
+	struct PACKET_ZC_NOTIFY_BIND_ON_EQUIP p = {};
 
-	nullpo_retv(sd);
-
-	cmd = packet_db_ack[ZC_NOTIFY_BIND_ON_EQUIP];
-	info = &packet_db[cmd];
-	if (!cmd || !info->len)
-		return;
+	p.packetType = HEADER_ZC_NOTIFY_BIND_ON_EQUIP;
+	p.index = client_index( index );
 
-	WFIFOHEAD(sd->fd, info->len);
-	WFIFOW(sd->fd, 0) = cmd;
-	WFIFOW(sd->fd, info->pos[0]) = n+2;
-	WFIFOSET(sd->fd, info->len);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /**
@@ -20707,25 +20612,21 @@ void clif_parse_roulette_item( int fd, struct map_session_data* sd ){
  * @param fd
  * @param sd
  **/
-void clif_merge_item_ack(struct map_session_data *sd, unsigned short index, unsigned short count, enum MERGE_ITEM_ACK type) {
-	unsigned char buf[9];
-	struct s_packet_db *info = NULL;
-	short cmd = 0;
-
-	nullpo_retv(sd);
+void clif_merge_item_ack( struct map_session_data &sd, enum MERGE_ITEM_ACK type, uint16 index = 0, uint16 count = 0 ){
+#if PACKETVER_MAIN_NUM >= 20120314 || PACKETVER_RE_NUM >= 20120221 || defined(PACKETVER_ZERO)
+	struct PACKET_ZC_ACK_MERGE_ITEM p = {};
 
-	if (!clif_session_isValid(sd))
-		return;
-	if (!(cmd = packet_db_ack[ZC_ACK_MERGE_ITEM]))
-		return;
-	if (!(info = &packet_db[cmd]) || info->len == 0)
-		return;
+	p.packetType = HEADER_ZC_ACK_MERGE_ITEM;
+	if( type == MERGE_ITEM_SUCCESS ){
+		p.index = client_index( index );
+	}else{
+		p.index = index;
+	}
+	p.amount = count;
+	p.reason = type;
 
-	WBUFW(buf, 0) = cmd;
-	WBUFW(buf, info->pos[0]) = index;
-	WBUFW(buf, info->pos[1]) = count;
-	WBUFB(buf, info->pos[2]) = type;
-	clif_send(buf, info->len, &sd->bl, SELF);
+	clif_send( &p, sizeof( p ), &sd.bl, SELF );
+#endif
 }
 
 /**
@@ -20773,41 +20674,37 @@ static bool clif_merge_item_check(struct item_data *id, struct item *it) {
  * ZC 096D <size>.W { <index>.W }* (ZC_MERGE_ITEM_OPEN)
  * @param sd
  **/
-void clif_merge_item_open(struct map_session_data *sd) {
-	unsigned char buf[4 + MAX_INVENTORY*2] = { 0 };
-	unsigned short cmd = 0, n = 0, i = 0, indexes[MAX_INVENTORY] = { 0 };
-	int len = 0;
-	struct s_packet_db *info = NULL;
-	struct item *it;
+void clif_merge_item_open( struct map_session_data& sd ){
+#if PACKETVER_MAIN_NUM >= 20120314 || PACKETVER_RE_NUM >= 20120221 || defined(PACKETVER_ZERO)
+	struct PACKET_ZC_MERGE_ITEM_OPEN* p = (struct PACKET_ZC_MERGE_ITEM_OPEN*)packet_buffer;
 
-	nullpo_retv(sd);
-	if (!clif_session_isValid(sd))
-		return;
-	if (!(cmd = packet_db_ack[ZC_MERGE_ITEM_OPEN]))
-		return;
-	if (!(info = &packet_db[cmd]) || info->len == 0)
-		return;
+	p->packetType = HEADER_ZC_MERGE_ITEM_OPEN;
+	p->packetLen = sizeof( *p );
+
+	int n = 0;
 
 	// Get entries
-	for (i = 0; i < MAX_INVENTORY; i++) {
-		if (!clif_merge_item_check(sd->inventory_data[i], (it = &sd->inventory.u.items_inventory[i])))
+	for( int i = 0; i < MAX_INVENTORY; i++ ){
+		struct item* it = &sd.inventory.u.items_inventory[i];
+
+		if( !clif_merge_item_check( sd.inventory_data[i], it ) ){
 			continue;
-		if (clif_merge_item_has_pair(sd, it))
-			indexes[n++] = i;
-	}
+		}
 
-	if (n < 2) { // No item need to be merged
-		clif_msg(sd, MERGE_ITEM_NOT_AVAILABLE);
-		return;
+		if( clif_merge_item_has_pair( &sd, it ) ){
+			p->items[n++].index = client_index( i );
+			p->packetLen += sizeof( p->items[0] );
+		}
 	}
 
-	WBUFW(buf, 0) = cmd;
-	WBUFW(buf, info->pos[0]) = (len = 4 + n*2);
-	for (i = 0; i < n; i++) {
-		WBUFW(buf, info->pos[1] + i*2) = indexes[i]+2;
+	// No item need to be merged
+	if( n < 2 ){
+		clif_msg( &sd, MERGE_ITEM_NOT_AVAILABLE );
+		return;
 	}
 
-	clif_send(buf, len, &sd->bl, SELF);
+	clif_send( p, p->packetLen, &sd.bl, SELF );
+#endif
 }
 
 /**
@@ -20846,7 +20743,7 @@ void clif_parse_merge_item_req(int fd, struct map_session_data* sd) {
 			continue;
 		indexes[j] = idx;
 		if (j && id->nameid != sd->inventory_data[indexes[0]]->nameid) { // Only can merge 1 kind at once
-			clif_merge_item_ack(sd, 0, 0, MERGE_ITEM_FAILED_NOT_MERGE);
+			clif_merge_item_ack( *sd, MERGE_ITEM_FAILED_NOT_MERGE );
 			return;
 		}
 		count += sd->inventory.u.items_inventory[idx].amount;
@@ -20859,7 +20756,7 @@ void clif_parse_merge_item_req(int fd, struct map_session_data* sd) {
 	}
 
 	if (count >= (id->stack.amount ? id->stack.amount : MAX_AMOUNT)) {
-		clif_merge_item_ack(sd, 0, 0, MERGE_ITEM_FAILED_MAX_COUNT);
+		clif_merge_item_ack( *sd, MERGE_ITEM_FAILED_MAX_COUNT );
 		return;
 	}
 
@@ -20873,7 +20770,7 @@ void clif_parse_merge_item_req(int fd, struct map_session_data* sd) {
 	}
 	sd->inventory.u.items_inventory[indexes[0]].amount = count;
 
-	clif_merge_item_ack(sd, indexes[0]+2, count, MERGE_ITEM_SUCCESS);
+	clif_merge_item_ack( *sd, MERGE_ITEM_SUCCESS, indexes[0], count );
 }
 
 /**
@@ -25079,7 +24976,6 @@ void packetdb_addpacket( uint16 cmd, uint16 length, void (*func)(int, struct map
  *------------------------------------------*/
 void packetdb_readdb(){
 	memset(packet_db,0,sizeof(packet_db));
-	memset(packet_db_ack,0,sizeof(packet_db_ack));
 
 #include "clif_packetdb.hpp"
 #include "clif_shuffle.hpp"

+ 14 - 30
src/map/clif.hpp

@@ -59,25 +59,6 @@ enum e_PacketDBVersion { // packet DB
 #endif
 };
 
-enum e_packet_ack : uint8_t{
-	ZC_ACK_OPEN_BANKING = 0,
-	ZC_ACK_CLOSE_BANKING,
-	ZC_ACK_BANKING_DEPOSIT,
-	ZC_ACK_BANKING_WITHDRAW,
-	ZC_BANKING_CHECK,
-	ZC_PERSONAL_INFOMATION,
-	ZC_PERSONAL_INFOMATION_CHN,
-	ZC_CLEAR_DIALOG,
-	ZC_C_MARKERINFO,
-	ZC_NOTIFY_BIND_ON_EQUIP,
-	ZC_WEAR_EQUIP_ACK,
-	ZC_MERGE_ITEM_OPEN,
-	ZC_ACK_MERGE_ITEM,
-	ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN,
-	//add other here
-	MAX_ACK_FUNC //auto upd len
-};
-
 struct s_packet_db {
 	short len;
 	void (*func)(int, struct map_session_data *);
@@ -214,7 +195,6 @@ enum class e_purchase_result : uint8{
 
 #define packet_len(cmd) packet_db[cmd].len
 extern struct s_packet_db packet_db[MAX_PACKET_DB+1];
-extern int packet_db_ack[MAX_ACK_FUNC + 1];
 
 // local define
 enum send_target : uint8_t {
@@ -516,9 +496,15 @@ enum clif_messages : uint16_t {
 	ADDITEM_TO_CART_FAIL_COUNT = 0x1,
 
 	// clif_equipitemack flags
+#if PACKETVER_MAIN_NUM >= 20121205 || PACKETVER_RE_NUM >= 20121107 || defined(PACKETVER_ZERO)
 	ITEM_EQUIP_ACK_OK = 0,
-	ITEM_EQUIP_ACK_FAIL = 1,
-	ITEM_EQUIP_ACK_FAILLEVEL = 2,
+	ITEM_EQUIP_ACK_FAIL = 2,
+	ITEM_EQUIP_ACK_FAILLEVEL = 1,
+#else
+	ITEM_EQUIP_ACK_OK = 1,
+	ITEM_EQUIP_ACK_FAIL = 0,
+	ITEM_EQUIP_ACK_FAILLEVEL = 0,
+#endif
 	/* -end- */
 
 	//! NOTE: These values below need client version validation
@@ -645,7 +631,7 @@ void clif_parse_NPCMarketPurchase(int fd, struct map_session_data *sd);
 void clif_scriptmes( struct map_session_data& sd, uint32 npcid, const char *mes );
 void clif_scriptnext( struct map_session_data& sd, uint32 npcid );
 void clif_scriptclose(struct map_session_data *sd, int npcid);	//self
-void clif_scriptclear(struct map_session_data *sd, int npcid);	//self
+void clif_scriptclear( struct map_session_data& sd, int npcid ); //self
 void clif_scriptmenu(struct map_session_data* sd, int npcid, const char* mes);	//self
 void clif_scriptinput(struct map_session_data *sd, int npcid);	//self
 void clif_scriptinputstr(struct map_session_data *sd, int npcid);	// self
@@ -669,7 +655,7 @@ void clif_arrowequip(struct map_session_data *sd,int val); //self
 void clif_arrow_fail(struct map_session_data *sd,int type); //self
 void clif_arrow_create_list(struct map_session_data *sd);	//self
 void clif_statusupack(struct map_session_data *sd,int type,int ok,int val);	// self
-void clif_equipitemack(struct map_session_data *sd,int n,int pos,uint8 flag);	// self
+void clif_equipitemack( struct map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self
 void clif_unequipitemack(struct map_session_data *sd,int n,int pos,int ok);	// self
 void clif_misceffect(struct block_list* bl,int type);	// area
 void clif_changeoption_target(struct block_list* bl, struct block_list* target);
@@ -1042,8 +1028,6 @@ void clif_PartyBookingDeleteNotify(struct map_session_data* sd, int index);
 void clif_PartyBookingInsertNotify(struct map_session_data* sd, struct party_booking_ad_info* pb_ad);
 
 /* Bank System [Yommy/Hercules] */
-void clif_bank_deposit (struct map_session_data *sd, enum e_BANKING_DEPOSIT_ACK reason);
-void clif_bank_withdraw (struct map_session_data *sd,enum e_BANKING_WITHDRAW_ACK reason);
 void clif_parse_BankDeposit (int fd, struct map_session_data *sd);
 void clif_parse_BankWithdraw (int fd, struct map_session_data *sd);
 void clif_parse_BankCheck (int fd, struct map_session_data *sd);
@@ -1074,7 +1058,7 @@ void clif_search_store_info_click_ack(struct map_session_data* sd, short x, shor
 void clif_cashshop_result( struct map_session_data* sd, t_itemid item_id, uint16 result );
 void clif_cashshop_open( struct map_session_data* sd, int tab );
 
-void clif_display_pinfo(struct map_session_data *sd, int type);
+void clif_display_pinfo( struct map_session_data& sd );
 
 /// Roulette
 void clif_roulette_open(struct map_session_data* sd);
@@ -1140,15 +1124,15 @@ void clif_channel_msg(struct Channel *channel, const char *msg, unsigned long co
 void clif_ranklist(struct map_session_data *sd, int16 rankingType);
 void clif_update_rankingpoint(map_session_data &sd, int rankingtype, int point);
 
-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, enum send_target flag);
 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_notify_bindOnEquip(struct map_session_data *sd, int n);
+void clif_notify_bindOnEquip( struct map_session_data& sd, int16 index );
 
-void clif_merge_item_open(struct map_session_data *sd);
+void clif_merge_item_open( struct map_session_data& sd );
 
 void clif_broadcast_obtain_special_item(const char *char_name, t_itemid nameid, t_itemid container, enum BROADCASTING_SPECIAL_ITEM_OBTAIN type);
 

+ 0 - 23
src/map/clif_packetdb.hpp

@@ -6,9 +6,6 @@
 
 	#define packet(cmd,length) packetdb_addpacket(cmd,length,NULL,0)
 	#define parseable_packet(cmd,length,func,...) packetdb_addpacket(cmd,length,func,__VA_ARGS__,0)
-	#define ack_packet(type,cmd,length,...) \
-		packetdb_addpacket(cmd,length,NULL,__VA_ARGS__,0); \
-		packet_db_ack[type] = cmd
 
 	packet(0x0064,55);
 	packet(0x0065,17);
@@ -78,7 +75,6 @@
 	parseable_packet(0x00a7,8,clif_parse_UseItem,2,4);
 	packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) );
 	parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4);
-	ack_packet(ZC_WEAR_EQUIP_ACK,0x00aa,7,2,4,6);
 	parseable_packet(0x00ab,4,clif_parse_UnequipItem,2);
 	packet(0x00ac,7);
 	//packet(0x00ad,-1);
@@ -415,7 +411,6 @@
 	//packet(0x020c,-1);
 	packet(0x020d,-1);
 	packet(0x8b3,-1);
-	ack_packet(ZC_CLEAR_DIALOG,0x8d6,6,2);
 
 // 2004-07-05aSakexe
 #if PACKETVER >= 20040705
@@ -1082,7 +1077,6 @@
 	packet(0x02cd,26);
 	packet(0x02ce,10);
 	parseable_packet(0x02cf,6,clif_parse_MemorialDungeonCommand,2);
-	ack_packet(ZC_NOTIFY_BIND_ON_EQUIP,0x02d3,4,2);
 	packet(0x02d5,2);
 	parseable_packet(0x02d6,6,clif_parse_ViewPlayerEquip,2);
 	parseable_packet(0x02d8,10,clif_parse_configuration,2,6);
@@ -1582,7 +1576,6 @@
 // 2009-12-01aRagexeRE
 #if PACKETVER >= 20091201
 	packet(0x07fc,10);
-	ack_packet(ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN,0x07fd,-1,0);
 	//packet(0x07ff,-1);
 #endif
 
@@ -1720,7 +1713,6 @@
 
 // 2010-06-29aRagexeRE
 #if PACKETVER >= 20100629
-	ack_packet(ZC_WEAR_EQUIP_ACK,0x00AA,9,2,4,6,8);
 	//packet(0x07F1,18);
 	//packet(0x07F2,8);
 	//packet(0x07F3,6);
@@ -1773,7 +1765,6 @@
 	packet(0x0856,-1);
 	packet(0x0857,-1);
 	packet(0x0858,-1);
-	ack_packet(ZC_WEAR_EQUIP_ACK,0x08d0,9,2,4,6,8);
 #endif
 
 // 2011-10-05aRagexeRE
@@ -1924,11 +1915,8 @@
 	packet(0x0977,14); //Monster HP Bar
 	parseable_packet(0x0916,26,clif_parse_GuildInvite2,2);
 	parseable_packet(0x091d,41,clif_parse_PartyBookingRegisterReq,2,4,6);
-	ack_packet(ZC_PERSONAL_INFOMATION,0x08cb,10,2,4,6,8,10,11,13,15); //Still need further information
 	// Merge Item
-	ack_packet(ZC_MERGE_ITEM_OPEN,0x096D,-1,2,4); // ZC_MERGE_ITEM_OPEN
 	parseable_packet(0x096E,-1,clif_parse_merge_item_req,2,4); // CZ_REQ_MERGE_ITEM
-	ack_packet(ZC_ACK_MERGE_ITEM,0x096F,7,2,4,6); // ZC_ACK_MERGE_ITEM
 	parseable_packet(0x0974,2,clif_parse_merge_item_cancel,0); // CZ_CANCEL_MERGE_ITEM
 	parseable_packet(0x0844,2,clif_parse_cashshop_open_request,0);
 	packet(0x0849,16); //clif_cashshop_result
@@ -2033,10 +2021,7 @@
 	packet(0x0977,14); //Monster HP Bar
 	parseable_packet(0x0978,6,clif_parse_reqworldinfo,2);
 	packet(0x0979,50); //ackworldinfo
-	ack_packet(ZC_PERSONAL_INFOMATION,0x097b,16,2,4,8,12,16,17,21,25); //Still need further information
-	//ack_packet(ZC_PERSONAL_INFOMATION_CHN,0x0981,12,2,4,6,8,12,13,15,17,10); // Disabled until further information is found.
 	parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5
-	ack_packet(ZC_WEAR_EQUIP_ACK,0x0999,11,2,4,8,10); // cz_wear_equipv5
 	packet(0x099a,9); // take_off_equipv5
 	packet(0x099b,8); //maptypeproperty2
 	// New Packets
@@ -2060,16 +2045,11 @@
 
 // 2013-07-17Ragexe
 #if PACKETVER >= 20130717
-	ack_packet(ZC_BANKING_CHECK,0x09A6,12,2,10);
 	parseable_packet(0x09A7,10,clif_parse_BankDeposit,2,6);
-	ack_packet(ZC_ACK_BANKING_DEPOSIT,0x09A8,16,2,4,12);
 	parseable_packet(0x09A9,10,clif_parse_BankWithdraw,2,6);
-	ack_packet(ZC_ACK_BANKING_WITHDRAW,0x09AA,16,2,4,12);
 	parseable_packet(0x09AB,6,clif_parse_BankCheck,2);
 	parseable_packet(0x09B6,6,clif_parse_BankOpen,2);
-	ack_packet(ZC_ACK_OPEN_BANKING,0x09B7,4,2);
 	parseable_packet(0x09B8,6,clif_parse_BankClose,2);
-	ack_packet(ZC_ACK_CLOSE_BANKING,0x09B9,4,2);
 #endif
 
 // 2013-07-31cRagexe
@@ -2080,11 +2060,8 @@
 
 // 2013-08-07Ragexe
 #if PACKETVER >= 20130807
-	ack_packet(ZC_C_MARKERINFO,0x09C1,10,2,6,8);
 	// Merge Item
-	ack_packet(ZC_MERGE_ITEM_OPEN,0x096D,-1,2,4); // ZC_MERGE_ITEM_OPEN
 	parseable_packet(0x096E,-1,clif_parse_merge_item_req,2,4); // CZ_REQ_MERGE_ITEM
-	ack_packet(ZC_ACK_MERGE_ITEM,0x096F,7,2,4,6,7); // ZC_ACK_MERGE_ITEM
 	parseable_packet(0x0974,2,clif_parse_merge_item_cancel,0); // CZ_CANCEL_MERGE_ITEM
 	packet(0x9CD,8); // ZC_MSG_COLOR
 #endif

+ 47 - 0
src/map/packets.hpp

@@ -367,6 +367,46 @@ struct PACKET_CZ_REQ_CHANGE_MEMBERPOS{
 	struct PACKET_CZ_REQ_CHANGE_MEMBERPOS_sub list[];
 } __attribute__((packed));
 
+struct PACKET_ZC_CLEAR_DIALOG{
+	int16 packetType;
+	uint32 GID;
+} __attribute__((packed));
+
+struct PACKET_ZC_NOTIFY_BIND_ON_EQUIP{
+	int16 packetType;
+	int16 index;
+} __attribute__((packed));
+
+struct PACKET_ZC_BANKING_CHECK{
+	int16 packetType;
+	int64 money;
+	int16 reason;
+} __attribute__((packed));
+
+struct PACKET_ZC_ACK_BANKING_WITHDRAW{
+	int16 packetType;
+	int16 reason;
+	int64 money;
+	int32 zeny;
+} __attribute__((packed));
+
+struct PACKET_ZC_ACK_BANKING_DEPOSIT{
+	int16 packetType;
+	int16 reason;
+	int64 money;
+	int32 zeny;
+} __attribute__((packed));
+
+struct PACKET_ZC_ACK_CLOSE_BANKING{
+	int16 packetType;
+	int16 unknown;
+} __attribute__((packed));
+
+struct PACKET_ZC_ACK_OPEN_BANKING{
+	int16 packetType;
+	int16 unknown;
+} __attribute__((packed));
+
 // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
 #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
 	#pragma pack( pop )
@@ -398,15 +438,22 @@ DEFINE_PACKET_HEADER(ZC_ACK_WEAPONREFINE, 0x223)
 DEFINE_PACKET_HEADER(CZ_REQ_MAKINGITEM, 0x25b)
 DEFINE_PACKET_HEADER(ZC_CASH_TIME_COUNTER, 0x298)
 DEFINE_PACKET_HEADER(ZC_CASH_ITEM_DELETE, 0x299)
+DEFINE_PACKET_HEADER(ZC_NOTIFY_BIND_ON_EQUIP, 0x2d3)
 DEFINE_PACKET_HEADER(ZC_FAILED_TRADE_BUYING_STORE_TO_SELLER, 0x824)
 DEFINE_PACKET_HEADER(CZ_SSILIST_ITEM_CLICK, 0x83c)
+DEFINE_PACKET_HEADER(ZC_CLEAR_DIALOG, 0x8d6)
 DEFINE_PACKET_HEADER(ZC_ENTRY_QUEUE_INIT, 0x90e);
+DEFINE_PACKET_HEADER(ZC_BANKING_CHECK, 0x9a6)
+DEFINE_PACKET_HEADER(ZC_ACK_BANKING_DEPOSIT, 0x9a8)
+DEFINE_PACKET_HEADER(ZC_ACK_BANKING_WITHDRAW, 0x9aa)
 DEFINE_PACKET_HEADER(CZ_REQ_CASH_BARGAIN_SALE_ITEM_INFO, 0x9ac)
 DEFINE_PACKET_HEADER(ZC_ACK_CASH_BARGAIN_SALE_ITEM_INFO, 0x9ad)
 DEFINE_PACKET_HEADER(CZ_REQ_APPLY_BARGAIN_SALE_ITEM, 0x9ae)
 DEFINE_PACKET_HEADER(CZ_REQ_REMOVE_BARGAIN_SALE_ITEM, 0x9b0)
 DEFINE_PACKET_HEADER(ZC_NOTIFY_BARGAIN_SALE_SELLING, 0x9b2)
 DEFINE_PACKET_HEADER(ZC_NOTIFY_BARGAIN_SALE_CLOSE, 0x9b3)
+DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7)
+DEFINE_PACKET_HEADER(ZC_ACK_CLOSE_BANKING, 0x9b9)
 DEFINE_PACKET_HEADER(ZC_ACK_COUNT_BARGAIN_SALE_ITEM, 0x9c4)
 DEFINE_PACKET_HEADER(ZC_ACK_GUILDSTORAGE_LOG, 0x9da)
 DEFINE_PACKET_HEADER(CZ_REQ_APPLY_BARGAIN_SALE_ITEM2, 0xa3d)

+ 17 - 1
src/map/packets_struct.hpp

@@ -4704,7 +4704,23 @@ struct PACKET_ZC_PERSONAL_INFOMATION {
 	struct PACKET_ZC_PERSONAL_INFOMATION_SUB details[];
 } __attribute__((packed));
 DEFINE_PACKET_HEADER(ZC_PERSONAL_INFOMATION, 0x097b);
-#endif  // PACKETVER_MAIN_NUM >= 20120503 || PACKETVER_RE_NUM >= 20120502 || defined(PACKETVER_ZERO)
+#elif PACKETVER_MAIN_NUM >= 20110627 || PACKETVER_RE_NUM >= 20110628
+struct PACKET_ZC_PERSONAL_INFOMATION_SUB {
+	int8 type;
+	int16 exp;
+	int16 death;
+	int16 drop;
+} __attribute__((packed));
+struct PACKET_ZC_PERSONAL_INFOMATION {
+	int16 packetType;
+	int16 length;
+	int16 total_exp;
+	int16 total_death;
+	int16 total_drop;
+	struct PACKET_ZC_PERSONAL_INFOMATION_SUB details[];
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_PERSONAL_INFOMATION, 0x08cb);
+#endif // PACKETVER_MAIN_NUM >= 20110627 || PACKETVER_RE_NUM >= 20110628
 
 struct PACKET_CZ_REQUEST_ACTNPC {
 	int16 packetType;

+ 9 - 8
src/map/pc.cpp

@@ -9258,7 +9258,7 @@ void pc_close_npc(struct map_session_data *sd,int flag)
 		if (sd->st) {
 			if (sd->st->state == CLOSE) {
 				clif_scriptclose(sd, sd->npc_id);
-				clif_scriptclear(sd, sd->npc_id); // [Ind/Hercules]
+				clif_scriptclear( *sd, sd->npc_id ); // [Ind/Hercules]
 				sd->st->state = END; // Force to end now
 			}
 			if (sd->st->state == END) { // free attached scripts that are waiting
@@ -11512,7 +11512,8 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 		if( equipswitch ){
 			clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
 		}else{
-			clif_equipitemack(sd,0,0,ITEM_EQUIP_ACK_FAIL);
+			// Does not deserve an answer... [Lemongrass]
+			//clif_equipitemack( sd, ITEM_EQUIP_ACK_FAIL, n );
 		}
 		return false;
 	}
@@ -11520,7 +11521,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 		if( equipswitch ){
 			clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
 		}else{
-			clif_equipitemack(sd,n,0,ITEM_EQUIP_ACK_FAIL);
+			clif_equipitemack( *sd, ITEM_EQUIP_ACK_FAIL, n );
 		}
 		return false;
 	}
@@ -11536,7 +11537,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 		if( equipswitch ){
 			clif_equipswitch_add( sd, n, req_pos, res );
 		}else{
-			clif_equipitemack(sd,n,0,res);	// fail
+			clif_equipitemack( *sd, res, n );	// fail
 		}
 		return false;
 	}
@@ -11550,7 +11551,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 		if( equipswitch ){
 			clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
 		}else{
-			clif_equipitemack(sd,n,0,ITEM_EQUIP_ACK_FAIL);	// fail
+			clif_equipitemack( *sd, ITEM_EQUIP_ACK_FAIL, n );	// fail
 		}
 		return false;
 	}
@@ -11558,7 +11559,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 		if( equipswitch ){
 			clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL );
 		}else{
-			clif_equipitemack(sd,n,0,ITEM_EQUIP_ACK_FAIL); //Fail
+			clif_equipitemack( *sd, ITEM_EQUIP_ACK_FAIL, n ); //Fail
 		}
 		return false;
 	}
@@ -11567,7 +11568,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 
 	if ( !equipswitch && id->flag.bindOnEquip && !sd->inventory.u.items_inventory[n].bound) {
 		sd->inventory.u.items_inventory[n].bound = (char)battle_config.default_bind_on_equip;
-		clif_notify_bindOnEquip(sd,n);
+		clif_notify_bindOnEquip( *sd, n );
 	}
 
 	if(pos == EQP_ACC) { //Accessories should only go in one of the two.
@@ -11650,7 +11651,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit
 			clif_arrow_fail(sd,3);
 		}
 		else
-			clif_equipitemack(sd,n,pos,ITEM_EQUIP_ACK_OK);
+			clif_equipitemack( *sd, ITEM_EQUIP_ACK_OK, n, pos );
 
 		sd->inventory.u.items_inventory[n].equip = pos;
 	}

+ 1 - 1
src/map/pc.hpp

@@ -1146,7 +1146,7 @@ static bool pc_cant_act( struct map_session_data* sd ){
 #define pc_iscloaking(sd)     ( !((sd)->sc.option&OPTION_CHASEWALK) && ((sd)->sc.option&OPTION_CLOAK) )
 #define pc_ischasewalk(sd)    ( (sd)->sc.option&OPTION_CHASEWALK )
 #ifdef VIP_ENABLE
-	#define pc_isvip(sd)      ( sd->vip.enabled ? true : false )
+	#define pc_isvip(sd)      ( (sd)->vip.enabled ? true : false )
 #else
 	#define pc_isvip(sd)      ( false )
 #endif

+ 1 - 1
src/map/pet.cpp

@@ -1514,7 +1514,7 @@ int pet_equipitem(struct map_session_data *sd,int index)
 	t_itemid nameid = sd->inventory.u.items_inventory[index].nameid;
 
 	if(pet_db_ptr->AcceID == 0 || nameid != pet_db_ptr->AcceID || pd->pet.equip != 0) {
-		clif_equipitemack(sd,0,0,ITEM_EQUIP_ACK_FAIL);
+		clif_equipitemack( *sd, ITEM_EQUIP_ACK_FAIL, index );
 		return 1;
 	}
 

+ 2 - 2
src/map/script.cpp

@@ -4967,7 +4967,7 @@ BUILDIN_FUNC(clear)
 	if (!script_rid2sd(sd))
 		return SCRIPT_CMD_FAILURE;
 
-	clif_scriptclear(sd, st->oid);
+	clif_scriptclear( *sd, st->oid );
 	return SCRIPT_CMD_SUCCESS;
 }
 
@@ -23610,7 +23610,7 @@ BUILDIN_FUNC(mergeitem) {
 	if (!script_charid2sd(2, sd))
 		return SCRIPT_CMD_FAILURE;
 
-	clif_merge_item_open(sd);
+	clif_merge_item_open( *sd );
 	return SCRIPT_CMD_SUCCESS;
 }
 

+ 5 - 4
src/map/status.cpp

@@ -12815,8 +12815,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			break;
 		case SC_C_MARKER:
 			//Send mini-map, don't wait for first timer triggered
-			if (src->type == BL_PC && (sd = map_id2sd(src->id)))
-				clif_crimson_marker(sd, bl, false);
+			if (src->type == BL_PC) {
+				clif_crimson_marker(*(struct map_session_data *)(src), *bl, false);
+			}
 			break;
 		case SC_ITEMSCRIPT: // Shows Buff Icons
 			if (sd)
@@ -13419,7 +13420,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
 				ARR_FIND(0,MAX_SKILL_CRIMSON_MARKER,i,caster->c_marker[i] == bl->id);
 				if (i < MAX_SKILL_CRIMSON_MARKER) {
 					caster->c_marker[i] = 0;
-					clif_crimson_marker(caster, bl, true);
+					clif_crimson_marker( *caster, *bl, true );
 				}
 			}
 			break;
@@ -14417,7 +14418,7 @@ TIMER_FUNC(status_change_timer){
 			if (!caster || caster->bl.m != bl->m) //End the SC if caster isn't in same map
 				break;
 			sc_timer_next(1000 + tick);
-			clif_crimson_marker(caster, bl, false);
+			clif_crimson_marker( *caster, *bl, false );
 			return 0;
 		}
 		break;