Index: db/packet_db.txt =================================================================== --- db/packet_db.txt (revision 17321) +++ db/packet_db.txt (working copy) @@ -1845,6 +1845,12 @@ 0x978,6,reqworldinfo,2 0x979,50 //ackworldinfo 0x99a,9 // take_off_equipv5 +0x991,-1 //inv itemlist normal +0x992,-1 //inv itemlist equip +0x993,-1 //cart itemlist normal +0x994,-1 //cart itemlist equip +0x995,-1 //store itemlist normal +0x996,-1 //store itemlist equip 0x997,-1 //ZC_EQUIPWIN_MICROSCOPE_V5 0x998,8,equipitem,2:4 0x999,11 // cz_wear_equipv5 Index: src/common/mmo.h =================================================================== --- src/common/mmo.h (revision 17321) +++ src/common/mmo.h (working copy) @@ -47,8 +47,8 @@ // 20120307 - 2012-03-07aRagexeRE+ - 0x970 #ifndef PACKETVER - #define PACKETVER 20120410 - //#define PACKETVER 20130320 + //#define PACKETVER 20120410 + #define PACKETVER 20130320 //#define PACKETVER 20111116 #endif Index: src/map/clif.c =================================================================== --- src/map/clif.c (revision 17321) +++ src/map/clif.c (working copy) @@ -2242,31 +2242,74 @@ #endif } +void clif_item_sub_v5(unsigned char *buf, int n, int idx, struct item *i, struct item_data *id, int equip) { + char normal = (equip < 0); + WBUFW(buf,n)=idx; //index + WBUFW(buf,n+2)= i->nameid; + WBUFB(buf,n+4)=itemtype(id->type); + + if(!normal){ //equip 31B + WBUFL(buf,n+5)= i->equip; //location + WBUFL(buf,n+9)=equip; //wear state + WBUFB(buf,n+13)= i->refine; //refine lvl + clif_addcards(WBUFP(buf, n+14), i); //EQUIPSLOTINFO 8B + WBUFL(buf,n+22) = i->expire_time; + WBUFW(buf,n+26)= 0; //bindOnEquipType + WBUFW(buf,n+28)= (id->view_id > 0)?id->view_id:0; + //V5_ITEM_flag + WBUFB(buf,n+30)=i->identify; //0x1 IsIdentified + WBUFB(buf,n+30)|=(i->attribute)?0x2:0; //0x2 IsDamaged + WBUFB(buf,n+30)|= (id->equip&EQP_VISIBLE)?0:0x4; //0x4 PlaceETCTab + } + else { //normal 24B + WBUFW(buf,n+5)=i->amount; + WBUFL(buf,n+7)=equip; //wear state + clif_addcards(WBUFP(buf, n+11), i); //EQUIPSLOTINFO 8B + WBUFL(buf,n+19) = i->expire_time; + //V5_ITEM_flag + WBUFB(buf,n+23)=i->identify; //0x1 IsIdentified + WBUFB(buf,n+23)|= (id->equip&EQP_VISIBLE)?0:0x2; //0x4,0x2 PlaceETCTab + } +} + // Simplifies inventory/cart/storage packets by handling the packet section relevant to items. [Skotlex] // Equip is >= 0 for equippable items (holds the equip-point, is 0 for pet // armor/egg) -1 for stackable items, -2 for stackable items where arrows must send in the equip-point. -void clif_item_sub(unsigned char *buf, int n, struct item *i, struct item_data *id, int equip) { - if (id->view_id > 0) - WBUFW(buf,n)=id->view_id; - else - WBUFW(buf,n)=i->nameid; - WBUFB(buf,n+2)=itemtype(id->type); - WBUFB(buf,n+3)=i->identify; - if (equip >= 0) { //Equippable item - WBUFW(buf,n+4)=equip; - WBUFW(buf,n+6)=i->equip; - WBUFB(buf,n+8)=i->attribute; - WBUFB(buf,n+9)=i->refine; - } else { //Stackable item. - WBUFW(buf,n+4)=i->amount; - if (equip == -2 && id->equip == EQP_AMMO) - WBUFW(buf,n+6)=EQP_AMMO; - else - WBUFW(buf,n+6)=0; +void clif_item_sub(unsigned char *buf, int n, int idx, struct item *i, struct item_data *id, int equip) { +#if PACKETVER >= 20130000 + clif_item_sub_v5(buf, n, idx, i, id, equip); +#else + WBUFW(buf,n)=idx; //index + WBUFW(buf,n+2)=(id->view_id > 0)?id->view_id:i->nameid; //itid + WBUFB(buf,n+4)=itemtype(id->type); + WBUFB(buf,n+5)=i->identify; + if (equip >= 0) { //Equippable item 28.B + WBUFW(buf,n+6)=equip; + WBUFW(buf,n+8)=i->equip; + WBUFB(buf,n+10)=i->attribute; + WBUFB(buf,n+11)=i->refine; + clif_addcards(WBUFP(buf, n+12), i); //8B + #if PACKETVER >= 20071002 + WBUFL(buf,n+20)=i->expire_time; + WBUFW(buf,n+24)=0; //Unknown + #endif + #if PACKETVER >= 20100629 + WBUFW(buf,n+26)= (id->equip&EQP_VISIBLE)?id->look:0; + #endif + } else { //Stackable item. 22.B + WBUFW(buf,n+6)=i->amount; + WBUFW(buf,n+8)=(equip == -2 && id->equip == EQP_AMMO)?i->equip:0; + clif_addcards(WBUFP(buf, n+10), i); //8B + #if PACKETVER >= 20071002 + WBUFL(buf,n+18)=i->expire_time; + #endif } +#endif +} -} + + void clif_favorite_item(struct 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(struct map_session_data *sd) { @@ -2278,15 +2321,19 @@ const int s = 10; //Entry size. #elif PACKETVER < 20080102 const int s = 18; +#elif PACKETVER < 20130000 + const int s = 22; #else - const int s = 22; + const int s = 24; #endif #if PACKETVER < 20071002 const int se = 20; #elif PACKETVER < 20100629 const int se = 26; +#elif PACKETVER < 20130000 + const int se = 28; #else - const int se = 28; + const int se = 31; #endif buf = (unsigned char*)aMalloc(MAX_INVENTORY * s + 4); @@ -2299,33 +2346,13 @@ if( !itemdb_isstackable2(sd->inventory_data[i]) ) { //Non-stackable (Equippable) - WBUFW(bufe,ne*se+4)=i+2; - clif_item_sub(bufe, ne*se+6, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i)); - clif_addcards(WBUFP(bufe, ne*se+16), &sd->status.inventory[i]); -#if PACKETVER >= 20071002 - WBUFL(bufe,ne*se+24)=sd->status.inventory[i].expire_time; - WBUFW(bufe,ne*se+28)=0; //Unknown -#endif -#if PACKETVER >= 20100629 - if (sd->inventory_data[i]->equip&EQP_VISIBLE) - WBUFW(bufe,ne*se+30)= sd->inventory_data[i]->look; - else - WBUFW(bufe,ne*se+30)=0; -#endif + clif_item_sub(bufe, ne*se+4, i+2, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i)); ne++; } - else - { //Stackable. - WBUFW(buf,n*s+4)=i+2; - clif_item_sub(buf, n*s+6, &sd->status.inventory[i], sd->inventory_data[i], -2); + else { //Stackable. + clif_item_sub(buf, n*s+4,i+2, &sd->status.inventory[i], sd->inventory_data[i], -2); if( sd->inventory_data[i]->equip == EQP_AMMO && sd->status.inventory[i].equip ) arrow=i; -#if PACKETVER >= 5 - clif_addcards(WBUFP(buf, n*s+14), &sd->status.inventory[i]); -#endif -#if PACKETVER >= 20080102 - WBUFL(buf,n*s+22)=sd->status.inventory[i].expire_time; -#endif n++; } } @@ -2335,8 +2362,10 @@ WBUFW(buf,0)=0xa3; #elif PACKETVER < 20080102 WBUFW(buf,0)=0x1ee; +#elif PACKETVER < 20130000 + WBUFW(buf,0)=0x2e8; #else - WBUFW(buf,0)=0x2e8; + WBUFW(buf,0)=0x991; #endif WBUFW(buf,2)=4+n*s; clif_send(buf, WBUFW(buf,2), &sd->bl, SELF); @@ -2347,8 +2376,10 @@ if( ne ) { #if PACKETVER < 20071002 WBUFW(bufe,0)=0xa4; +#elif PACKETVER < 20130000 + WBUFW(bufe,0)=0x2d0; #else - WBUFW(bufe,0)=0x2d0; + WBUFW(bufe,0)=0x992; #endif WBUFW(bufe,2)=4+ne*se; clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF); @@ -2357,7 +2388,6 @@ for( i = 0; i < MAX_INVENTORY; i++ ) { if( sd->status.inventory[i].nameid <= 0 || sd->inventory_data[i] == NULL ) continue; - if ( sd->status.inventory[i].favorite ) clif_favorite_item(sd, i); } @@ -2376,8 +2406,10 @@ const int cmd = 20; #elif PACKETVER < 20100629 const int cmd = 26; +#elif PACKETVER < 20130000 + const int cmd = 28; #else - const int cmd = 28; + const int cmd = 31; #endif WFIFOHEAD(fd, MAX_INVENTORY * cmd + 4); @@ -2390,26 +2422,16 @@ if(itemdb_isstackable2(sd->inventory_data[i])) continue; //Equippable - WBUFW(buf,n*cmd+4)=i+2; - clif_item_sub(buf, n*cmd+6, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i)); - clif_addcards(WBUFP(buf, n*cmd+16), &sd->status.inventory[i]); -#if PACKETVER >= 20071002 - WBUFL(buf,n*cmd+24)=sd->status.inventory[i].expire_time; - WBUFW(buf,n*cmd+28)=0; //Unknown -#endif -#if PACKETVER >= 20100629 - if (sd->inventory_data[i]->equip&EQP_VISIBLE) - WBUFW(buf,n*cmd+30)= sd->inventory_data[i]->look; - else - WBUFW(buf,n*cmd+30)=0; -#endif + clif_item_sub(buf, n*cmd+4,i+2, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i)); n++; } if (n) { #if PACKETVER < 20071002 WBUFW(buf,0)=0xa4; +#elif PACKETVER < 20130000 + WBUFW(buf,0)=0x2d0; #else - WBUFW(buf,0)=0x2d0; + WBUFW(buf,0)=0x992; #endif WBUFW(buf,2)=4+n*cmd; WFIFOSET(fd,WFIFOW(fd,2)); @@ -2426,15 +2448,19 @@ const int s = 10; //Entry size. #elif PACKETVER < 20080102 const int s = 18; +#elif PACKETVER < 20130000 + const int s = 22; #else - const int s = 22; + const int s = 24; #endif #if PACKETVER < 20071002 const int cmd = 20; #elif PACKETVER < 20100629 const int cmd = 26; +#elif PACKETVER < 20130000 + const int cmd = 28; #else - const int cmd = 28; + const int cmd = 31; #endif buf = (unsigned char*)aMalloc(items_length * s + 4); @@ -2445,27 +2471,12 @@ if( items[i].nameid <= 0 ) continue; id = itemdb_search(items[i].nameid); - if( !itemdb_isstackable2(id) ) - { //Equippable - WBUFW(bufe,ne*cmd+4)=i+1; - clif_item_sub(bufe, ne*cmd+6, &items[i], id, id->equip); - clif_addcards(WBUFP(bufe, ne*cmd+16), &items[i]); -#if PACKETVER >= 20071002 - WBUFL(bufe,ne*cmd+24)=items[i].expire_time; - WBUFW(bufe,ne*cmd+28)=0; //Unknown -#endif + if( !itemdb_isstackable2(id) ) { //Equippable + clif_item_sub(bufe, ne*cmd+4,i+1, &items[i], id, id->equip); ne++; } - else - { //Stackable - WBUFW(buf,n*s+4)=i+1; - clif_item_sub(buf, n*s+6, &items[i], id,-1); -#if PACKETVER >= 5 - clif_addcards(WBUFP(buf,n*s+14), &items[i]); -#endif -#if PACKETVER >= 20080102 - WBUFL(buf,n*s+22)=items[i].expire_time; -#endif + else { //Stackable + clif_item_sub(buf, n*s+4,i+1, &items[i], id,-1); n++; } } @@ -2475,8 +2486,10 @@ WBUFW(buf,0)=0xa5; #elif PACKETVER < 20080102 WBUFW(buf,0)=0x1f0; +#elif PACKETVER < 20130000 + WBUFW(buf,0)=0x2ea; #else - WBUFW(buf,0)=0x2ea; + WBUFW(buf,0)=0x995; #endif WBUFW(buf,2)=4+n*s; clif_send(buf, WBUFW(buf,2), &sd->bl, SELF); @@ -2485,8 +2498,10 @@ { #if PACKETVER < 20071002 WBUFW(bufe,0)=0xa6; +#elif PACKETVER < 20130000 + WBUFW(bufe,0)=0x2d1; #else - WBUFW(bufe,0)=0x2d1; + WBUFW(buf,0)=0x996; #endif WBUFW(bufe,2)=4+ne*cmd; clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF); @@ -2506,15 +2521,19 @@ const int s = 10; //Entry size. #elif PACKETVER < 20080102 const int s = 18; +#elif PACKETVER < 20130000 + const int s = 22; #else - const int s = 22; + const int s = 24; #endif #if PACKETVER < 20071002 const int cmd = 20; #elif PACKETVER < 20100629 const int cmd = 26; +#elif PACKETVER < 20130000 + const int cmd = 28; #else - const int cmd = 28; + const int cmd = 31; #endif buf = (unsigned char*)aMalloc(MAX_CART * s + 4); @@ -2525,27 +2544,12 @@ if( sd->status.cart[i].nameid <= 0 ) continue; id = itemdb_search(sd->status.cart[i].nameid); - if( !itemdb_isstackable2(id) ) - { //Equippable - WBUFW(bufe,ne*cmd+4)=i+2; - clif_item_sub(bufe, ne*cmd+6, &sd->status.cart[i], id, id->equip); - clif_addcards(WBUFP(bufe, ne*cmd+16), &sd->status.cart[i]); -#if PACKETVER >= 20071002 - WBUFL(bufe,ne*cmd+24)=sd->status.cart[i].expire_time; - WBUFW(bufe,ne*cmd+28)=0; //Unknown -#endif + if( !itemdb_isstackable2(id) ) { //Equippable + clif_item_sub(bufe, ne*cmd+4,i+2, &sd->status.cart[i], id, id->equip); ne++; } - else - { //Stackable - WBUFW(buf,n*s+4)=i+2; - clif_item_sub(buf, n*s+6, &sd->status.cart[i], id,-1); -#if PACKETVER >= 5 - clif_addcards(WBUFP(buf,n*s+14), &sd->status.cart[i]); -#endif -#if PACKETVER >= 20080102 - WBUFL(buf,n*s+22)=sd->status.cart[i].expire_time; -#endif + else { //Stackable + clif_item_sub(buf, n*s+4,i+2, &sd->status.cart[i], id,-1); n++; } } @@ -2555,8 +2559,10 @@ WBUFW(buf,0)=0x123; #elif PACKETVER < 20080102 WBUFW(buf,0)=0x1ef; +#elif PACKETVER < 20130000 + WBUFW(buf,0)=0x2e9; #else - WBUFW(buf,0)=0x2e9; + WBUFW(buf,0)=0x993; #endif WBUFW(buf,2)=4+n*s; clif_send(buf, WBUFW(buf,2), &sd->bl, SELF); @@ -2565,8 +2571,10 @@ { #if PACKETVER < 20071002 WBUFW(bufe,0)=0x122; +#elif PACKETVER < 20130000 + WBUFW(buf,0)=0x2d2; #else - WBUFW(bufe,0)=0x2d2; + WBUFW(buf,0)=0x994; #endif WBUFW(bufe,2)=4+ne*cmd; clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF); @@ -8733,14 +8741,16 @@ int i, n, fd, offset = 0; #if PACKETVER < 20100629 const int s = 26; +#elif PACKETVER < 20130000 + const int s = 28; #else - const int s = 28; + const int s = 31; #endif nullpo_retv(sd); nullpo_retv(tsd); fd = sd->fd; - WFIFOHEAD(fd, MAX_INVENTORY * s + 43); + WFIFOHEAD(fd, MAX_INVENTORY * s + 43 + 2); buf = WFIFOP(fd,0); #if PACKETVER < 20101124 @@ -8771,22 +8781,8 @@ continue; if (!itemdb_isequip2(tsd->inventory_data[i])) // Is not equippable continue; - - // Inventory position - WBUFW(buf, n*s+43) = i + 2; - // Add refine, identify flag, element, etc. - clif_item_sub(WBUFP(buf,0), n*s+45, &tsd->status.inventory[i], tsd->inventory_data[i], pc_equippoint(tsd, i)); - // Add cards - clif_addcards(WBUFP(buf, n*s+55), &tsd->status.inventory[i]); - // Expiration date stuff, if all of those are set to 0 then the client doesn't show anything related (6 bytes) - WBUFL(buf, n*s+63) = tsd->status.inventory[i].expire_time; - WBUFW(buf, n*s+67) = 0; -#if PACKETVER >= 20100629 - if (tsd->inventory_data[i]->equip&EQP_VISIBLE) - WBUFW(buf, n*s+69) = tsd->inventory_data[i]->look; - else - WBUFW(buf, n*s+69) = 0; -#endif + // Add item info : refine, identify flag, element, etc. + clif_item_sub(WBUFP(buf,0), n*s+43,i + 2, &tsd->status.inventory[i], tsd->inventory_data[i], pc_equippoint(tsd, i)); n++; }