From 2b4b33b06a964e83bf5df9f7f0b795ddf76f9dd0 Mon Sep 17 00:00:00 2001 From: Dastgir Date: Thu, 27 Aug 2015 20:47:23 +0530 Subject: Hotkey Rotate Packet Implemented --- src/map/clif.c | 33 ++++++++++++++++----------------- src/map/clif.h | 1 + src/map/packets.h | 1 + src/map/packets_struct.h | 19 +++++++++++++++++++ 4 files changed, 37 insertions(+), 17 deletions(-) (limited to 'src/map') diff --git a/src/map/clif.c b/src/map/clif.c index 26cf4faac..12565de3c 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -9430,31 +9430,29 @@ void clif_parse_TickSend(int fd, struct map_session_data *sd) /// 02b9 { .B .L .W }*27 (ZC_SHORTCUT_KEY_LIST) /// 07d9 { .B .L .W }*36 (ZC_SHORTCUT_KEY_LIST_V2, PACKETVER >= 20090603) /// 07d9 { .B .L .W }*38 (ZC_SHORTCUT_KEY_LIST_V2, PACKETVER >= 20090617) +/// 0a00 .B { .B .L .W }*38 (ZC_SHORTCUT_KEY_LIST_V3, PACKETVER >= 20141022) void clif_hotkeys_send(struct map_session_data *sd) { #ifdef HOTKEY_SAVING - const int fd = sd->fd; + struct packet_hotkey p; int i; - int offset = 2; -#if PACKETVER < 20090603 - const int cmd = 0x2b9; -#elif PACKETVER < 20141022 - const int cmd = 0x7d9; -#else - const int cmd = 0xa00; - offset = 3; + p.PacketType = hotkeyType; +#if PACKETVER >= 20141022 + p.Rotate = sd->status.hotkey_rowshift; #endif - if (!fd) return; - WFIFOHEAD(fd, offset+MAX_HOTKEYS*7); - WFIFOW(fd, 0) = cmd; - for(i = 0; i < MAX_HOTKEYS; i++) { - WFIFOB(fd, offset + 0 + i * 7) = sd->status.hotkeys[i].type; // type: 0: item, 1: skill - WFIFOL(fd, offset + 1 + i * 7) = sd->status.hotkeys[i].id; // item or skill ID - WFIFOW(fd, offset + 5 + i * 7) = sd->status.hotkeys[i].lv; // item qty or skill level + for(i = 0; i < ARRAYLENGTH(p.hotkey); i++) { + p.hotkey[i].isSkill = sd->status.hotkeys[i].type; + p.hotkey[i].ID = sd->status.hotkeys[i].id; + p.hotkey[i].count = sd->status.hotkeys[i].lv; } - WFIFOSET(fd, packet_len(cmd)); + clif->send(&p, sizeof(p), &sd->bl, SELF); #endif } +void clif_parse_HotkeyRowShift(int fd, struct map_session_data *sd) +{ + int cmd = RFIFOW(fd, 0); + sd->status.hotkey_rowshift = RFIFOB(fd, packet_db[cmd].pos[0]); +} /// Request to update a position on the hotkey bar (CZ_SHORTCUT_KEY_CHANGE). /// 02ba .W .B .L .W @@ -19333,4 +19331,5 @@ void clif_defaults(void) { clif->pNPCMarketPurchase = clif_parse_NPCMarketPurchase; /* */ clif->add_random_options = clif_add_random_options; + clif->pHotkeyRowShift = clif_parse_HotkeyRowShift; } diff --git a/src/map/clif.h b/src/map/clif.h index 3f0d043f7..fdcc929e3 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -1317,6 +1317,7 @@ struct clif_interface { void (*pNPCMarketPurchase) (int fd, struct map_session_data *sd); /* */ void (*add_random_options) (unsigned char* buf, struct item* item); + void (*pHotkeyRowShift) (int fd, struct map_session_data *sd); }; #ifdef HERCULES_CORE diff --git a/src/map/packets.h b/src/map/packets.h index e84607aaf..1f465b833 100644 --- a/src/map/packets.h +++ b/src/map/packets.h @@ -2850,6 +2850,7 @@ packet(0x96e,-1,clif->ackmergeitems); packet(0x091A,26,clif->pFriendsListAdd,2); packet(0x0899,5,clif->pHomMenu,2,4); packet(0x0438,36,clif->pStoragePassword,0); + packet(0x0A01,3,clif->pHotkeyRowShift,2); #endif #if PACKETVER >= 20150226 diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h index daf77c134..8f9747747 100644 --- a/src/map/packets_struct.h +++ b/src/map/packets_struct.h @@ -18,6 +18,13 @@ enum packet_headers { banking_checkType = 0x9a6, cart_additem_ackType = 0x12c, sc_notickType = 0x196, +#if PACKETVER >= 20141022 + hotkeyType = 0xa00, +#elif PACKETVER >= 20090603 + hotkeyType = 0x7d9, +#else + hotkeyType = 0x2b9, +#endif #if PACKETVER >= 20150226 cartaddType = 0xa0b, #elif PACKETVER >= 5 @@ -1082,6 +1089,18 @@ struct packet_party_leader_changed { unsigned int new_leader_aid; } __attribute__((packed)); +struct packet_hotkey { + short PacketType; +#if PACKETVER >= 20141022 + char Rotate; +#endif + struct { + char isSkill; // 0: Item, 1:Skill + unsigned int ID; // Item/Skill ID + short count; // Item Quantity/Skill Level + } hotkey[MAX_HOTKEYS]; +} __attribute__((packed)); + #if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #pragma pack(pop) #endif // not NetBSD < 6 / Solaris -- cgit v1.2.3-70-g09d2