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++;
}