From 8745391ad46a128cfd01ae07f85240bd2b40e2bd Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 4 Apr 2024 08:42:19 +0200 Subject: [PATCH] Cleaned up ZC_INVENTORY_TAB (#8217) Co-authored-by: Atemo --- src/map/clif.cpp | 55 +++++++++++++++++++++------------------ src/map/clif_packetdb.hpp | 5 +--- src/map/packets.hpp | 14 ++++++++++ 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index eb56c4af71..e1c06e28be 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -86,6 +86,7 @@ unsigned long color_table[COLOR_MAX]; #include "clif_obfuscation.hpp" static bool clif_session_isValid(map_session_data *sd); static void clif_loadConfirm( map_session_data *sd ); +static void clif_favorite_item( map_session_data& sd, uint16 index ); #if PACKETVER >= 20150513 enum mail_type { @@ -3007,7 +3008,6 @@ static void clif_inventoryEnd( map_session_data *sd, e_inventory_type type ){ #endif } -void clif_favorite_item(map_session_data* sd, unsigned short index); //Unified inventory function which sends all of the inventory (requires two packets, one for equipable items and one for stackable ones. [Skotlex] void clif_inventorylist( map_session_data *sd ){ nullpo_retv( sd ); @@ -3093,7 +3093,7 @@ void clif_inventorylist( map_session_data *sd ){ continue; if ( sd->inventory.u.items_inventory[i].favorite ) - clif_favorite_item(sd, i); + clif_favorite_item( *sd, i ); } #endif } @@ -19730,49 +19730,52 @@ void clif_spiritcharm(map_session_data *sd) { } -/// Move Item from or to Personal Tab (CZ_WHATSOEVER) [FE] -/// 0907 .W -/// -/// R 0908 .w .b +/// Move Item from or to Personal Tab +/// 0907 .W .B (CZ_INVENTORY_TAB) /// type: /// 0 = move item to personal tab /// 1 = move item to normal tab -void clif_parse_MoveItem(int fd, map_session_data *sd) { -#if PACKETVER >= 20111122 - struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; - int index = RFIFOW(fd,info->pos[0]) - 2; - int type = RFIFOB(fd, info->pos[1]); - +void clif_parse_MoveItem( int fd, map_session_data* sd ){ +// TODO: Check for correct packet version +#if PACKETVER >= 20120410 /* can't move while dead. */ if(pc_isdead(sd)) { return; } - if (index < 0 || index >= MAX_INVENTORY) - return; + PACKET_CZ_INVENTORY_TAB* p = (PACKET_CZ_INVENTORY_TAB*)RFIFOP( fd, 0 ); - if ( sd->inventory.u.items_inventory[index].favorite && type == 1 ) + uint16 index = server_index( p->index ); + + if( index >= MAX_INVENTORY ){ + return; + } + + if ( sd->inventory.u.items_inventory[index].favorite && p->favorite == true ) sd->inventory.u.items_inventory[index].favorite = 0; - else if( type == 0 ) + else if( p->favorite == false ) sd->inventory.u.items_inventory[index].favorite = 1; else return;/* nothing to do. */ - clif_favorite_item(sd, index); + clif_favorite_item( *sd, index ); #endif } -/// Items that are in favorite tab of inventory (ZC_ITEM_FAVORITE). -/// 0900 .W .B -void clif_favorite_item(map_session_data* sd, unsigned short index) { - int fd = sd->fd; +/// Items that are in favorite tab of inventory. +/// 0908 .W .B (ZC_INVENTORY_TAB) +static void clif_favorite_item( map_session_data& sd, uint16 index ){ +// TODO: Check for correct packet version +#if PACKETVER >= 20111122 + PACKET_ZC_INVENTORY_TAB p = {}; - WFIFOHEAD(fd,packet_len(0x908)); - WFIFOW(fd,0) = 0x908; - WFIFOW(fd,2) = index+2; - WFIFOL(fd,4) = (sd->inventory.u.items_inventory[index].favorite == 1) ? 0 : 1; - WFIFOSET(fd,packet_len(0x908)); + p.packetType = HEADER_ZC_INVENTORY_TAB; + p.index = client_index( index ); + p.favorite = ( sd.inventory.u.items_inventory[index].favorite == true ) ? false : true; + + clif_send( &p, sizeof( p ), &sd.bl, SELF ); +#endif } diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 4da03ea68b..8249c7b300 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -1896,8 +1896,7 @@ packet(0x08f9,6); packet(0x08fa,6); parseable_packet(0x08fb,6,NULL,2); - parseable_packet(0x0907,5,clif_parse_MoveItem,2,4); - packet(0x0908,5); + parseable_packet( HEADER_CZ_INVENTORY_TAB, sizeof( PACKET_CZ_INVENTORY_TAB ), clif_parse_MoveItem, 0 ); parseable_packet(0x08D7,28,clif_parse_bg_queue_apply_request,2,4); packet(0x08D8,27); packet(0x08D9,30); @@ -2005,8 +2004,6 @@ parseable_packet(0x08c9,2,clif_parse_cashshop_list_request,0); packet(0x08cf,10); //Amulet spirits packet(0x08d2,10); - parseable_packet(0x0907,5,clif_parse_MoveItem,2,4); - packet(0x0908,5); parseable_packet(0x0922,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12); //parseable_packet(0x092e,2,clif_parse_SearchStoreInfoNextPage,0); parseable_packet(0x0933,6,clif_parse_TakeItem,2); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 57b5274ec5..76f8b6749c 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -415,6 +415,18 @@ struct PACKET_ZC_BOSS_INFO{ char name[51]; } __attribute__((packed)); +struct PACKET_CZ_INVENTORY_TAB{ + int16 packetType; + int16 index; + bool favorite; +} __attribute__((packed)); + +struct PACKET_ZC_INVENTORY_TAB{ + int16 packetType; + int16 index; + bool favorite; +} __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 ) @@ -452,6 +464,8 @@ DEFINE_PACKET_HEADER(CZ_REQ_SE_CASH_TAB_CODE, 0x846) DEFINE_PACKET_HEADER(ZC_ACK_SE_CASH_ITEM_LIST2, 0x8c0) DEFINE_PACKET_HEADER(ZC_ACK_SCHEDULER_CASHITEM, 0x8ca) DEFINE_PACKET_HEADER(ZC_CLEAR_DIALOG, 0x8d6) +DEFINE_PACKET_HEADER(CZ_INVENTORY_TAB, 0x907) +DEFINE_PACKET_HEADER(ZC_INVENTORY_TAB, 0x908) DEFINE_PACKET_HEADER(ZC_ENTRY_QUEUE_INIT, 0x90e) DEFINE_PACKET_HEADER(CZ_REQ_MERGE_ITEM, 0x96e) DEFINE_PACKET_HEADER(ZC_BANKING_CHECK, 0x9a6)