mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-08-20 09:57:09 +00:00
optimize item data communication, options for future item flags
This commit is contained in:
parent
f364a5bb07
commit
0ea9dfb0ce
|
|
@ -48,9 +48,15 @@ public class Inventory : IEnumerable<ItemStack>
|
||||||
|
|
||||||
for (int i = 0; i < _items.Length; i++)
|
for (int i = 0; i < _items.Length; i++)
|
||||||
{
|
{
|
||||||
int id = buf[i * 3];
|
int id = buf[i * 3 + 0];
|
||||||
int count = buf[i * 3 + 1];
|
int aux = buf[i * 3 + 1];
|
||||||
int aux = buf[i * 3 + 2];
|
int packed = buf[i * 3 + 2];
|
||||||
|
|
||||||
|
ushort count = (ushort)((packed >> 8) & 0xFFFF);
|
||||||
|
|
||||||
|
//byte flags = (byte)((packed >> 24) & 0xFF);
|
||||||
|
//bool hasMetadata = (flags & 0x1) != 0; //unused here
|
||||||
|
|
||||||
_items[i]?.UnbindFromInventory();
|
_items[i]?.UnbindFromInventory();
|
||||||
if (id > 0 && count > 0)
|
if (id > 0 && count > 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,16 +43,25 @@ public class PlayerInventory : Inventory
|
||||||
|
|
||||||
for (int i = 0; i < INVENTORY_SIZE; i++)
|
for (int i = 0; i < INVENTORY_SIZE; i++)
|
||||||
{
|
{
|
||||||
int id = buf[i * 3];
|
int id = buf[i * 3 + 0];
|
||||||
int count = buf[i * 3 + 1];
|
int aux = buf[i * 3 + 1];
|
||||||
int aux = buf[i * 3 + 2];
|
int packed = buf[i * 3 + 2];
|
||||||
|
|
||||||
|
ushort count = (ushort)((packed >> 8) & 0xFFFF);
|
||||||
|
|
||||||
|
byte flags = (byte)((packed >> 24) & 0xFF);
|
||||||
|
bool hasMetadata = (flags & 0x1) != 0;
|
||||||
|
|
||||||
_items[i]?.UnbindFromInventory();
|
_items[i]?.UnbindFromInventory();
|
||||||
if (id > 0 && count > 0)
|
if (id > 0 && count > 0)
|
||||||
{
|
{
|
||||||
var stack = new ItemStack(id, count, (short)aux);
|
var stack = new ItemStack(id, count, (short)aux);
|
||||||
var meta = ReadMetaFromNative(entityId, i);
|
if (hasMetadata)
|
||||||
if (meta != null)
|
{
|
||||||
stack.setItemMetaInternal(meta);
|
var meta = ReadMetaFromNative(entityId, i);
|
||||||
|
if (meta != null)
|
||||||
|
stack.setItemMetaInternal(meta);
|
||||||
|
}
|
||||||
_items[i] = stack;
|
_items[i] = stack;
|
||||||
stack.BindToInventory(this, i);
|
stack.BindToInventory(this, i);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -612,9 +612,41 @@ int __cdecl NativeGetPlayerAddress(int entityId, char *outIpBuf, int outIpBufSiz
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WriteInventoryItemData(std::shared_ptr<ItemInstance> item, int index, int* outBuffer) {
|
||||||
|
if (item) {
|
||||||
|
//ItemFlags Key:
|
||||||
|
// 0x1 = hasMetadata (has data that needs to be gotten from "ReadMetaFromNative")
|
||||||
|
|
||||||
|
uint8_t itemFlags = 0;
|
||||||
|
if (item->getTag() == nullptr) goto doneWithMetadataFlag;
|
||||||
|
CompoundTag* itemTag = item->getTag();
|
||||||
|
|
||||||
|
if (itemTag->contains(L"ench")) {
|
||||||
|
itemFlags |= 0x1;
|
||||||
|
goto doneWithMetadataFlag;
|
||||||
|
}
|
||||||
|
else { //we just want to check one tag for metadata and return for this flag, not all of them
|
||||||
|
CompoundTag* displayTag = itemTag->getCompound(L"display");
|
||||||
|
if (displayTag->contains(L"Name") || displayTag->contains(L"Lore")) {
|
||||||
|
itemFlags |= 0x1;
|
||||||
|
goto doneWithMetadataFlag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
doneWithMetadataFlag:
|
||||||
|
|
||||||
|
outBuffer[(index * 3) + 0] = item->id;
|
||||||
|
outBuffer[(index * 3) + 1] = item->getAuxValue();
|
||||||
|
outBuffer[(index * 3) + 2] = (((int)itemFlags << 24) | ((int)item->count << 8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void __cdecl NativeGetPlayerInventory(int entityId, int *outData)
|
void __cdecl NativeGetPlayerInventory(int entityId, int *outData)
|
||||||
{
|
{
|
||||||
|
// 9 slots per row, 3 slots in the inventory and the hotbar, 4 armor slots, 1 hand slot
|
||||||
|
// (((slotsPerRow * Rows) + ArmorSlots) * AmountOfIntsPerSlot) + hand slot
|
||||||
|
// (((9 * 4) + 4) * 3) + 1 = 121
|
||||||
memset(outData, 0, 121 * sizeof(int));
|
memset(outData, 0, 121 * sizeof(int));
|
||||||
|
|
||||||
auto player = FindPlayer(entityId);
|
auto player = FindPlayer(entityId);
|
||||||
|
|
@ -627,13 +659,7 @@ void __cdecl NativeGetPlayerInventory(int entityId, int *outData)
|
||||||
|
|
||||||
for (unsigned int i = 0; i < size; i++)
|
for (unsigned int i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
auto item = player->inventory->getItem(i);
|
WriteInventoryItemData(player->inventory->getItem(i), i, outData);
|
||||||
if (item)
|
|
||||||
{
|
|
||||||
outData[i * 3] = item->id;
|
|
||||||
outData[i * 3 + 1] = item->count;
|
|
||||||
outData[i * 3 + 2] = item->getAuxValue();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
outData[120] = player->inventory->selected;
|
outData[120] = player->inventory->selected;
|
||||||
|
|
@ -667,13 +693,7 @@ void __cdecl NativeGetContainerContents(int entityId, int *outData, int maxSlots
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
auto &item = (*items)[i];
|
WriteInventoryItemData((*items)[i], i, outData);
|
||||||
if (item)
|
|
||||||
{
|
|
||||||
outData[i * 3] = item->id;
|
|
||||||
outData[i * 3 + 1] = item->count;
|
|
||||||
outData[i * 3 + 2] = item->getAuxValue();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
delete items;
|
delete items;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue