diff options
author | Smokexyz <sagunkho@hotmail.com> | 2017-03-02 19:24:48 +0800 |
---|---|---|
committer | Smokexyz <sagunkho@hotmail.com> | 2017-04-04 13:38:16 +0800 |
commit | 974222a8d3f189083205bf5d330de04a43226ad3 (patch) | |
tree | b78280b9dad90616196ee37c3992c3e46962b906 /src/map/clif.c | |
parent | 20145c61053479b9acd8ed50c75a80c2a861e349 (diff) | |
download | hercules-974222a8d3f189083205bf5d330de04a43226ad3.tar.gz hercules-974222a8d3f189083205bf5d330de04a43226ad3.tar.bz2 hercules-974222a8d3f189083205bf5d330de04a43226ad3.tar.xz hercules-974222a8d3f189083205bf5d330de04a43226ad3.zip |
Implementation of Item Options System.
Allows the infusing of equipments with bonus item options.
This feature is constrained to clients of packet versions greater than or equal to `20150226`.
Item Options and their effects are defined server-side in `db/item_options.conf` and client side in `data/luafiles514/lua files/datainfo/addrandomoptionnametable.lub`
The ID of the option must tally with the correct index of the description provided in the client side lua file to avoid bugs.
IT_OPT_* keys and MAX_ITEM_OPTIONS macro are also exported from the source as constants.
An additional flag `disable_options` has been added to sql, and as `DisableOptions: true/false (boolean, defaults to false !!for equipments only!!)` to item_db.conf files.
Script commands documentation is also included.
SQL file updates are included.
Credits: [Smokexyz](https://github.com/Smokexyz)
Style and Script Fixes by [Asheraf](https://github.com/Asheraf)
Initial design Idea by [secretdataz](https://github.com/secretdataz)
Diffstat (limited to 'src/map/clif.c')
-rw-r--r-- | src/map/clif.c | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index c48241898..8de18da30 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -2378,23 +2378,37 @@ void clif_addcards2(unsigned short *cards, struct item* item) { } /** - * Fills in RandomOptions(Bonuses) of items into the buffer + * Fills in ItemOptions(Bonuses) of items into the buffer * - * Dummy datais used since this feature isn't supported yet (ITEM_RDM_OPT). - * A maximum of 5 random options can be supported. + * A maximum of 5 item options can be supported. * * @param buf[in,out] The buffer to write to. The pointer must be valid and initialized. * @param item[in] The source item. */ -void clif_add_random_options(unsigned char* buf, struct item* item) -{ - int i; - nullpo_retv(buf); - for (i = 0; i < 5; i++){ - WBUFW(buf,i*5+0) = 0; // OptIndex - WBUFW(buf,i*5+2) = 0; // Value - WBUFB(buf,i*5+4) = 0; // Param1 + int clif_add_item_options(struct ItemOptions *buf, const struct item *it) +{ + int i = 0, j = 0, total_options = 0; + + nullpo_ret(buf); + + // Append the buffer with existing options first. + for (i = 0; i < MAX_ITEM_OPTIONS; i++) { + if (it->option[i].index) { + WBUFW(buf, j * 5 + 0) = it->option[i].index; // OptIndex + WBUFW(buf, j * 5 + 2) = it->option[i].value; // Value + WBUFB(buf, j * 5 + 4) = it->option[i].param; // Param1 + total_options++; + j++; + } + } + // Append the remaining buffer with no values; + for (; j < MAX_ITEM_OPTIONS || j < 5; j++) { + WBUFW(buf, j * 5 + 0) = 0; + WBUFW(buf, j * 5 + 2) = 0; + WBUFB(buf, j * 5 + 4) = 0; } + + return total_options; } /// Notifies the client, about a received inventory item or the result of a pick-up request. @@ -2418,9 +2432,6 @@ void clif_additem(struct map_session_data *sd, int n, int amount, int fail) { p.count = amount; if( !fail ) { -#if PACKETVER >= 20150226 - int i; -#endif if( n < 0 || n >= MAX_INVENTORY || sd->status.inventory[n].nameid <=0 || sd->inventory_data[n] == NULL ) return; @@ -2445,11 +2456,7 @@ void clif_additem(struct map_session_data *sd, int n, int amount, int fail) { p.bindOnEquipType = sd->status.inventory[n].bound && !itemdb->isstackable2(sd->inventory_data[n]) ? 2 : sd->inventory_data[n]->flag.bindonequip ? 1 : 0; #endif #if PACKETVER >= 20150226 - for (i=0; i<5; i++){ - p.option_data[i].index = 0; - p.option_data[i].value = 0; - p.option_data[i].param = 0; - } + clif->add_item_options(&p.option_data[0], &sd->status.inventory[n]); #endif } p.result = (unsigned char)fail; @@ -2522,19 +2529,17 @@ void clif_item_sub(unsigned char *buf, int n, struct item *i, struct item_data * } -void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct item_data *id, int eqp_pos) { -#if PACKETVER >= 20150226 - int j; -#endif +void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *it, struct item_data *id, int eqp_pos) +{ nullpo_retv(p); - nullpo_retv(i); + nullpo_retv(it); nullpo_retv(id); p->index = idx; if (id->view_id > 0) p->ITID = id->view_id; else - p->ITID = i->nameid; + p->ITID = it->nameid; p->type = itemtype(id->type); @@ -2543,20 +2548,20 @@ void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct #endif p->location = eqp_pos; - p->WearState = i->equip; + p->WearState = it->equip; #if PACKETVER < 20120925 p->IsDamaged = (i->attribute & ATTR_BROKEN) != 0 ? 1 : 0; #endif - p->RefiningLevel = i->refine; + p->RefiningLevel = it->refine; - clif->addcards2(&p->slot.card[0], i); + clif->addcards2(&p->slot.card[0], it); #if PACKETVER >= 20071002 - p->HireExpireDate = i->expire_time; + p->HireExpireDate = it->expire_time; #endif #if PACKETVER >= 20080102 - p->bindOnEquipType = i->bound ? 2 : id->flag.bindonequip ? 1 : 0; + p->bindOnEquipType = it->bound ? 2 : id->flag.bindonequip ? 1 : 0; #endif #if PACKETVER >= 20100629 @@ -2564,19 +2569,14 @@ void clif_item_equip(short idx, struct EQUIPITEM_INFO *p, struct item *i, struct #endif #if PACKETVER >= 20120925 - p->Flag.IsIdentified = i->identify ? 1 : 0; - p->Flag.IsDamaged = (i->attribute & ATTR_BROKEN) != 0 ? 1 : 0; - p->Flag.PlaceETCTab = i->favorite ? 1 : 0; + p->Flag.IsIdentified = it->identify ? 1 : 0; + p->Flag.IsDamaged = (it->attribute & ATTR_BROKEN) != 0 ? 1 : 0; + p->Flag.PlaceETCTab = it->favorite ? 1 : 0; p->Flag.SpareBits = 0; #endif #if PACKETVER >= 20150226 - p->option_count = 0; - for (j=0; j<5; j++){ - p->option_data[j].index = 0; - p->option_data[j].value = 0; - p->option_data[j].param = 0; - } + p->option_count = clif->add_item_options(p->option_data, it); #endif } @@ -3992,7 +3992,7 @@ void clif_tradeadditem(struct map_session_data* sd, struct map_session_data* tsd WBUFW(buf,15)= 0; //card (4w) WBUFW(buf,17)= 0; //card (4w) #if PACKETVER >= 20150226 - clif->add_random_options(WBUFP(buf, 19), &sd->status.inventory[index]); + clif->add_item_options(WBUFP(buf, 19), &sd->status.inventory[index]); #endif } else @@ -4018,7 +4018,7 @@ void clif_tradeadditem(struct map_session_data* sd, struct map_session_data* tsd WBUFB(buf,10)= sd->status.inventory[index].refine; //refine clif->addcards(WBUFP(buf, 11), &sd->status.inventory[index]); #if PACKETVER >= 20150226 - clif->add_random_options(WBUFP(buf, 19), &sd->status.inventory[index]); + clif->add_item_options(WBUFP(buf, 19), &sd->status.inventory[index]); #endif } WFIFOSET(fd,packet_len(tradeaddType)); @@ -4149,7 +4149,7 @@ void clif_storageitemadded(struct map_session_data* sd, struct item* i, int inde WFIFOB(fd,12+offset) = i->refine; //refine clif->addcards(WFIFOP(fd,13+offset), i); #if PACKETVER >= 20150226 - clif->add_random_options(WFIFOP(fd,21+offset), i); + clif->add_item_options(WFIFOP(fd,21+offset), i); #endif WFIFOSET(fd,packet_len(storageaddType)); } @@ -6223,7 +6223,7 @@ void clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail) WBUFB(buf,12+offset)=sd->status.cart[n].refine; clif->addcards(WBUFP(buf,13+offset), &sd->status.cart[n]); #if PACKETVER >= 20150226 - clif->add_random_options(WBUFP(buf,21+offset), &sd->status.cart[n]); + clif->add_item_options(WBUFP(buf,21+offset), &sd->status.cart[n]); #endif WFIFOSET(fd,packet_len(cartaddType)); } @@ -6351,7 +6351,7 @@ void clif_vendinglist(struct map_session_data* sd, unsigned int id, struct s_ven WFIFOB(fd,offset+13+i*item_length) = vsd->status.cart[index].refine; clif->addcards(WFIFOP(fd,offset+14+i*item_length), &vsd->status.cart[index]); #if PACKETVER >= 20150226 - clif->add_random_options(WFIFOP(fd,offset+22+i*item_length), &vsd->status.cart[index]); + clif->add_item_options(WFIFOP(fd,offset+22+i*item_length), &vsd->status.cart[index]); #endif } WFIFOSET(fd,WFIFOW(fd,2)); @@ -6417,7 +6417,7 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven WFIFOB(fd,21+i*item_length) = sd->status.cart[index].refine; clif->addcards(WFIFOP(fd,22+i*item_length), &sd->status.cart[index]); #if PACKETVER >= 20150226 - clif->add_random_options(WFIFOP(fd,30+22+i*item_length), &sd->status.cart[index]); + clif->add_item_options(WFIFOP(fd,30+22+i*item_length), &sd->status.cart[index]); #endif } WFIFOSET(fd,WFIFOW(fd,2)); @@ -20092,7 +20092,7 @@ void clif_defaults(void) { clif->pNPCMarketClosed = clif_parse_NPCMarketClosed; clif->pNPCMarketPurchase = clif_parse_NPCMarketPurchase; /* */ - clif->add_random_options = clif_add_random_options; + clif->add_item_options = clif_add_item_options; clif->pHotkeyRowShift = clif_parse_HotkeyRowShift; clif->dressroom_open = clif_dressroom_open; clif->pOneClick_ItemIdentify = clif_parse_OneClick_ItemIdentify; |