diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/clif.c | 43 | ||||
-rw-r--r-- | src/map/packets_struct.h | 16 |
2 files changed, 40 insertions, 19 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index cb3ba70f0..793aa9e71 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -5593,35 +5593,40 @@ static void clif_skill_estimation(struct map_session_data *sd, struct block_list /// unused by the client static void clif_skill_produce_mix_list(struct map_session_data *sd, int skill_id, int trigger) { - int i,c,view,fd; + int i, c, view, fd; + int len; + struct PACKET_ZC_MAKABLEITEMLIST *p; + nullpo_retv(sd); - if(sd->menuskill_id == skill_id) + if (sd->menuskill_id == skill_id) return; //Avoid resending the menu twice or more times... - if( skill_id == GC_CREATENEWPOISON ) + if (skill_id == GC_CREATENEWPOISON) skill_id = GC_RESEARCHNEWPOISON; - fd=sd->fd; - WFIFOHEAD(fd, MAX_SKILL_PRODUCE_DB * 8 + 8); - WFIFOW(fd, 0)=0x18d; + fd = sd->fd; + len = MAX_SKILL_PRODUCE_DB * sizeof(struct PACKET_ZC_MAKABLEITEMLIST_sub) + sizeof(struct PACKET_ZC_MAKABLEITEMLIST); + WFIFOHEAD(fd, len); + p = WFIFOP(fd, 0); + p->packetType = 0x18d; - for(i=0,c=0;i<MAX_SKILL_PRODUCE_DB;i++){ - if( skill->can_produce_mix(sd,skill->dbs->produce_db[i].nameid, trigger, 1) && - ( ( skill_id > 0 && skill->dbs->produce_db[i].req_skill == skill_id ) || skill_id < 0 ) - ){ - if((view = itemdb_viewid(skill->dbs->produce_db[i].nameid)) > 0) - WFIFOW(fd,c*8+ 4)= view; + for (i = 0, c = 0; i < MAX_SKILL_PRODUCE_DB; i++) { + if (skill->can_produce_mix(sd, skill->dbs->produce_db[i].nameid, trigger, 1) && + ((skill_id > 0 && skill->dbs->produce_db[i].req_skill == skill_id) || skill_id < 0)) { + if ((view = itemdb_viewid(skill->dbs->produce_db[i].nameid)) > 0) + p->items[c].itemId = view; else - WFIFOW(fd,c*8+ 4)= skill->dbs->produce_db[i].nameid; - WFIFOW(fd,c*8+ 6)= 0; - WFIFOW(fd,c*8+ 8)= 0; - WFIFOW(fd,c*8+10)= 0; + p->items[c].itemId = skill->dbs->produce_db[i].nameid; + p->items[c].material[0] = 0; + p->items[c].material[1] = 0; + p->items[c].material[2] = 0; c++; } } - WFIFOW(fd, 2)=c*8+8; - WFIFOSET(fd,WFIFOW(fd,2)); - if(c > 0) { + len = c * sizeof(struct PACKET_ZC_MAKABLEITEMLIST_sub) + sizeof(struct PACKET_ZC_MAKABLEITEMLIST); + p->packetLength = len; + WFIFOSET(fd, len); + if (c > 0) { sd->menuskill_id = skill_id; sd->menuskill_val = trigger; return; diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h index 211ae654b..05c85a55a 100644 --- a/src/map/packets_struct.h +++ b/src/map/packets_struct.h @@ -2390,6 +2390,22 @@ struct PACKET_CZ_REQ_TRADE_BUYING_STORE { struct PACKET_CZ_REQ_TRADE_BUYING_STORE_sub items[]; } __attribute__((packed)); +struct PACKET_ZC_MAKABLEITEMLIST_sub { +#if PACKETVER_RE_NUM >= 20180704 + uint32 itemId; + uint32 material[3]; +#else + uint16 itemId; + uint16 material[3]; +#endif +} __attribute__((packed)); + +struct PACKET_ZC_MAKABLEITEMLIST { + int16 packetType; + int16 packetLength; + struct PACKET_ZC_MAKABLEITEMLIST_sub items[]; +} __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 |