- int bits = 0;
- FOREACH(ITEMS, true, LAMBDA(
- .int fld = inv_items[i];
- bits = BITSET(bits, BIT(i), data.inventory.(fld) != (data.inventory.(fld) = data.(fld)));
- ));
- WriteInt24_t(MSG_ENTITY, bits);
- FOREACH(ITEMS, bits & BIT(i), LAMBDA(
- WriteByte(MSG_ENTITY, data.inv_items[i]);
- ));
+ if (!data) {
+ WriteShort(MSG_ENTITY, 0);
+ return;
+ }
+ TC(Inventory, data);
+
+ int majorBits = 0;
+ FOREACH(Items, true, {
+ .int fld = inv_items[it.m_id];
+ const bool changed = data.inventory.(fld) != data.(fld);
+ if (changed) {
+ majorBits = BITSET(majorBits, BIT(G_MAJOR(it.m_id)), true);
+ }
+ });
+ WriteShort(MSG_ENTITY, majorBits);
+
+ int minorBits = 0;
+ int lastMaj = 0;
+ int maj = 0;
+ FOREACH(Items, majorBits & BIT(maj = G_MAJOR(it.m_id)), {
+ .int fld = inv_items[it.m_id];
+ const bool changed = data.inventory.(fld) != (data.inventory.(fld) = data.(fld));
+ if (changed) {
+ if (maj != lastMaj) {
+ lastMaj = maj;
+#define X() MACRO_BEGIN \
+ if (minorBits) { \
+ WriteByte(MSG_ENTITY, minorBits); \
+ for (int j = 0; j < Inventory_groups_minor; ++j) { \
+ if (!(minorBits & BIT(j))) { \
+ continue; \
+ } \
+ const entity it = Items_from(Inventory_groups_minor * maj + j); \
+ WriteByte(MSG_ENTITY, data.inv_items[it.m_id]); \
+ } \
+ } \
+MACRO_END
+ X();
+ minorBits = 0;
+ }
+ minorBits = BITSET(minorBits, BIT(G_MINOR(it.m_id)), true);
+ }
+ });
+ X();
+#undef X