Better net ID handling

This commit is contained in:
Camotoy 2020-12-29 19:59:22 -05:00
parent f4b1d470c3
commit 3c1a40c56a
No known key found for this signature in database
GPG Key ID: 7EEFB66FE798081F
14 changed files with 68 additions and 67 deletions

View File

@ -286,11 +286,11 @@ public class Entity {
// Shield code // Shield code
if (session.getPlayerEntity().getEntityId() == entityId && metadata.getFlags().getFlag(EntityFlag.SNEAKING)) { if (session.getPlayerEntity().getEntityId() == entityId && metadata.getFlags().getFlag(EntityFlag.SNEAKING)) {
PlayerInventory playerInv = session.getPlayerInventory(); PlayerInventory playerInv = session.getPlayerInventory();
if ((playerInv.getItemInHand().getId() == ItemRegistry.SHIELD.getJavaId()) || if ((playerInv.getItemInHand().getJavaId() == ItemRegistry.SHIELD.getJavaId()) ||
(playerInv.getOffhand().getId() == ItemRegistry.SHIELD.getJavaId())) { (playerInv.getOffhand().getJavaId() == ItemRegistry.SHIELD.getJavaId())) {
ClientPlayerUseItemPacket useItemPacket; ClientPlayerUseItemPacket useItemPacket;
metadata.getFlags().setFlag(EntityFlag.BLOCKING, true); metadata.getFlags().setFlag(EntityFlag.BLOCKING, true);
if (playerInv.getItemInHand().getId() == ItemRegistry.SHIELD.getJavaId()) { if (playerInv.getItemInHand().getJavaId() == ItemRegistry.SHIELD.getJavaId()) {
useItemPacket = new ClientPlayerUseItemPacket(Hand.MAIN_HAND); useItemPacket = new ClientPlayerUseItemPacket(Hand.MAIN_HAND);
} }
// Else we just assume it's the offhand, to simplify logic and to assure the packet gets sent // Else we just assume it's the offhand, to simplify logic and to assure the packet gets sent

View File

@ -27,6 +27,7 @@ package org.geysermc.connector.inventory;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.inventory.InventoryTranslator; import org.geysermc.connector.network.translators.inventory.InventoryTranslator;
/** /**
@ -53,11 +54,11 @@ public class Container extends Inventory {
} }
@Override @Override
public void setItem(int slot, @NonNull GeyserItemStack item) { public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) {
if (slot < this.size) { if (slot < this.size) {
super.setItem(slot, item); super.setItem(slot, newItem, session);
} else { } else {
playerInventory.setItem(slot - this.size + InventoryTranslator.PLAYER_INVENTORY_OFFSET, item); playerInventory.setItem(slot - this.size + InventoryTranslator.PLAYER_INVENTORY_OFFSET, newItem, session);
} }
} }

View File

@ -39,32 +39,34 @@ import org.geysermc.connector.network.translators.item.ItemTranslator;
public class GeyserItemStack { public class GeyserItemStack {
public static final GeyserItemStack EMPTY = new GeyserItemStack(0, 0, null); public static final GeyserItemStack EMPTY = new GeyserItemStack(0, 0, null);
private final int id; private final int javaId;
private int amount; private int amount;
private CompoundTag nbt; private CompoundTag nbt;
private int netId; private int netId;
private boolean netIdWasUpdated;
public GeyserItemStack(int id) { public GeyserItemStack(int javaId) {
this(id, 1); this(javaId, 1);
} }
public GeyserItemStack(int id, int amount) { public GeyserItemStack(int javaId, int amount) {
this(id, amount, null); this(javaId, amount, null);
} }
public GeyserItemStack(int id, int amount, CompoundTag nbt) { public GeyserItemStack(int javaId, int amount, CompoundTag nbt) {
this(id, amount, nbt, 1); this(javaId, amount, nbt, 1);
} }
public GeyserItemStack(int id, int amount, CompoundTag nbt, int netId) { public GeyserItemStack(int javaId, int amount, CompoundTag nbt, int netId) {
this.id = id; this.javaId = javaId;
this.amount = amount; this.amount = amount;
this.nbt = nbt; this.nbt = nbt;
this.netId = netId; this.netId = netId;
this.netIdWasUpdated = !this.isEmpty();
} }
public int getId() { public int getJavaId() {
return isEmpty() ? 0 : id; return isEmpty() ? 0 : javaId;
} }
public int getAmount() { public int getAmount() {
@ -75,6 +77,11 @@ public class GeyserItemStack {
return isEmpty() ? null : nbt; return isEmpty() ? null : nbt;
} }
public void setNetId(int netId) {
this.netId = netId;
this.netIdWasUpdated = true;
}
public int getNetId() { public int getNetId() {
return isEmpty() ? 0 : netId; return isEmpty() ? 0 : netId;
} }
@ -96,7 +103,7 @@ public class GeyserItemStack {
} }
public ItemStack getItemStack() { public ItemStack getItemStack() {
return isEmpty() ? null : new ItemStack(id, amount, nbt); return isEmpty() ? null : new ItemStack(javaId, amount, nbt);
} }
public ItemData getItemData(GeyserSession session) { public ItemData getItemData(GeyserSession session) {
@ -106,11 +113,11 @@ public class GeyserItemStack {
} }
public ItemEntry getItemEntry() { public ItemEntry getItemEntry() {
return ItemRegistry.ITEM_ENTRIES.get(getId()); return ItemRegistry.ITEM_ENTRIES.get(getJavaId());
} }
public boolean isEmpty() { public boolean isEmpty() {
return amount <= 0 || id == 0; return amount <= 0 || javaId == 0;
} }
public GeyserItemStack copy() { public GeyserItemStack copy() {
@ -118,6 +125,6 @@ public class GeyserItemStack {
} }
public GeyserItemStack copy(int newAmount) { public GeyserItemStack copy(int newAmount) {
return isEmpty() ? EMPTY : new GeyserItemStack(id, newAmount, nbt == null ? null : nbt.clone(), netId); return isEmpty() ? EMPTY : new GeyserItemStack(javaId, newAmount, nbt == null ? null : nbt.clone(), netId);
} }
} }

View File

@ -29,6 +29,7 @@ import com.nukkitx.math.vector.Vector3i;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter; import lombok.Setter;
import org.geysermc.connector.network.session.GeyserSession;
import java.util.Arrays; import java.util.Arrays;
@ -76,8 +77,16 @@ public class Inventory {
return items[slot]; return items[slot];
} }
public void setItem(int slot, @NonNull GeyserItemStack item) { public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) {
items[slot] = item; GeyserItemStack oldItem = items[slot];
if (!newItem.isEmpty()) {
if (newItem.getItemData(session).equals(oldItem.getItemData(session), false, false, false)) {
newItem.setNetId(oldItem.getNetId());
} else {
newItem.setNetId(session.getNextItemNetId());
}
}
items[slot] = newItem;
} }
public short getNextTransactionId() { public short getNextTransactionId() {

View File

@ -186,7 +186,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
break; break;
case 1: case 1:
// Handled in Entity.java // Handled in Entity.java
if (session.getPlayerInventory().getItemInHand().getId() == ItemRegistry.SHIELD.getJavaId()) { if (session.getPlayerInventory().getItemInHand().getJavaId() == ItemRegistry.SHIELD.getJavaId()) {
break; break;
} }

View File

@ -61,7 +61,7 @@ public class BedrockEntityEventTranslator extends PacketTranslator<EntityEventPa
VillagerTrade[] trades = merchantInventory.getVillagerTrades(); VillagerTrade[] trades = merchantInventory.getVillagerTrades();
if (trades != null && packet.getData() >= 0 && packet.getData() < trades.length) { if (trades != null && packet.getData() >= 0 && packet.getData() < trades.length) {
VillagerTrade trade = merchantInventory.getVillagerTrades()[packet.getData()]; VillagerTrade trade = merchantInventory.getVillagerTrades()[packet.getData()];
openInventory.setItem(2, GeyserItemStack.from(trade.getOutput())); openInventory.setItem(2, GeyserItemStack.from(trade.getOutput()), session);
villager.getMetadata().put(EntityData.TRADE_XP, trade.getXp() + villager.getMetadata().getInt(EntityData.TRADE_XP)); villager.getMetadata().put(EntityData.TRADE_XP, trade.getXp() + villager.getMetadata().getInt(EntityData.TRADE_XP));
villager.updateBedrockMetadata(session); villager.updateBedrockMetadata(session);
} }

View File

@ -100,7 +100,7 @@ public class BedrockInteractTranslator extends PacketTranslator<InteractPacket>
switch (packet.getAction()) { switch (packet.getAction()) {
case INTERACT: case INTERACT:
if (session.getPlayerInventory().getItemInHand().getId() == ItemRegistry.SHIELD.getJavaId()) { if (session.getPlayerInventory().getItemInHand().getJavaId() == ItemRegistry.SHIELD.getJavaId()) {
break; break;
} }
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(), ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),

View File

@ -213,7 +213,7 @@ public abstract class InventoryTranslator {
GeyserItemStack newItem = sourceItem.copy(); GeyserItemStack newItem = sourceItem.copy();
if (sourceIsCursor) { if (sourceIsCursor) {
GeyserItemStack destItem = inventory.getItem(destSlot); GeyserItemStack destItem = inventory.getItem(destSlot);
if (destItem.getId() == sourceItem.getId()) { if (destItem.getJavaId() == sourceItem.getJavaId()) {
// Combining items // Combining items
int itemsLeftOver = destItem.getAmount() + transferAction.getCount(); int itemsLeftOver = destItem.getAmount() + transferAction.getCount();
if (itemsLeftOver > MAX_ITEM_STACK_SIZE) { if (itemsLeftOver > MAX_ITEM_STACK_SIZE) {
@ -235,7 +235,7 @@ public abstract class InventoryTranslator {
} }
} else { } else {
// Delete the source since we're moving it // Delete the source since we're moving it
inventory.setItem(sourceSlot, GeyserItemStack.EMPTY); inventory.setItem(sourceSlot, GeyserItemStack.EMPTY, session);
ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket( ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket(
sourceSlot, sourceSlot,
new ItemStack(0) new ItemStack(0)
@ -252,13 +252,13 @@ public abstract class InventoryTranslator {
if (sourceIsCursor) { if (sourceIsCursor) {
session.getPlayerInventory().setCursor(GeyserItemStack.EMPTY); session.getPlayerInventory().setCursor(GeyserItemStack.EMPTY);
} else { } else {
inventory.setItem(sourceSlot, GeyserItemStack.EMPTY); inventory.setItem(sourceSlot, GeyserItemStack.EMPTY, session);
} }
} }
if (destIsCursor) { if (destIsCursor) {
session.getPlayerInventory().setCursor(newItem); session.getPlayerInventory().setCursor(newItem);
} else { } else {
inventory.setItem(destSlot, newItem); inventory.setItem(destSlot, newItem, session);
} }
GeyserItemStack itemToUpdate = destIsCursor ? sourceItem : newItem; GeyserItemStack itemToUpdate = destIsCursor ? sourceItem : newItem;
// The Java server doesn't care about what's in the mouse in creative mode, so we just need to track // The Java server doesn't care about what's in the mouse in creative mode, so we just need to track
@ -386,7 +386,7 @@ public abstract class InventoryTranslator {
); );
System.out.println(creativeActionPacket); System.out.println(creativeActionPacket);
session.sendDownstreamPacket(creativeActionPacket); session.sendDownstreamPacket(creativeActionPacket);
inventory.setItem(sourceSlot, oldDestinationItem); inventory.setItem(sourceSlot, oldDestinationItem, session);
} }
if (isCursor(swapAction.getDestination())) { if (isCursor(swapAction.getDestination())) {
session.getPlayerInventory().setCursor(oldSourceItem); session.getPlayerInventory().setCursor(oldSourceItem);
@ -397,7 +397,7 @@ public abstract class InventoryTranslator {
); );
System.out.println(creativeActionPacket); System.out.println(creativeActionPacket);
session.sendDownstreamPacket(creativeActionPacket); session.sendDownstreamPacket(creativeActionPacket);
inventory.setItem(destSlot, oldSourceItem); inventory.setItem(destSlot, oldSourceItem, session);
} }
} else if (isCursor(swapAction.getSource()) && isCursor(swapAction.getDestination())) { //??? } else if (isCursor(swapAction.getSource()) && isCursor(swapAction.getDestination())) { //???
@ -499,7 +499,7 @@ public abstract class InventoryTranslator {
); );
session.sendDownstreamPacket(destroyItemPacket); session.sendDownstreamPacket(destroyItemPacket);
System.out.println(destroyItemPacket); System.out.println(destroyItemPacket);
inventory.setItem(javaSlot, GeyserItemStack.EMPTY); inventory.setItem(javaSlot, GeyserItemStack.EMPTY, session);
affectedSlots.add(javaSlot); affectedSlots.add(javaSlot);
} else { } else {
// Just sync up the item on our end, since the server doesn't care what's in our cursor // Just sync up the item on our end, since the server doesn't care what's in our cursor
@ -522,7 +522,7 @@ public abstract class InventoryTranslator {
GeyserItemStack item = inventory.getItem(sourceSlot); GeyserItemStack item = inventory.getItem(sourceSlot);
item.setAmount(item.getAmount() - consumeData.getCount()); item.setAmount(item.getAmount() - consumeData.getCount());
if (item.isEmpty()) { if (item.isEmpty()) {
inventory.setItem(sourceSlot, GeyserItemStack.EMPTY); inventory.setItem(sourceSlot, GeyserItemStack.EMPTY, session);
} }
affectedSlots.add(sourceSlot); affectedSlots.add(sourceSlot);
} }
@ -718,16 +718,16 @@ public abstract class InventoryTranslator {
session.getPlayerInventory().setCursor(GeyserItemStack.from(javaCreativeItem, session.getNextItemNetId())); session.getPlayerInventory().setCursor(GeyserItemStack.from(javaCreativeItem, session.getNextItemNetId()));
return acceptRequest(request, Collections.singletonList( return acceptRequest(request, Collections.singletonList(
new ItemStackResponsePacket.ContainerEntry(ContainerSlotType.CURSOR, new ItemStackResponsePacket.ContainerEntry(ContainerSlotType.CURSOR,
Collections.singletonList(makeItemEntry(session, 0, session.getPlayerInventory().getCursor()))))); Collections.singletonList(makeItemEntry(0, session.getPlayerInventory().getCursor())))));
} else { } else {
int javaSlot = bedrockSlotToJava(transferAction.getDestination()); int javaSlot = bedrockSlotToJava(transferAction.getDestination());
GeyserItemStack existingItem = inventory.getItem(javaSlot); GeyserItemStack existingItem = inventory.getItem(javaSlot);
if (existingItem.getId() == javaCreativeItem.getId()) { if (existingItem.getJavaId() == javaCreativeItem.getId()) {
// Adding more to an existing item // Adding more to an existing item
existingItem.setAmount(existingItem.getAmount() + transferAction.getCount()); existingItem.setAmount(existingItem.getAmount() + transferAction.getCount());
javaCreativeItem = existingItem.getItemStack(); javaCreativeItem = existingItem.getItemStack();
} else { } else {
inventory.setItem(javaSlot, GeyserItemStack.from(javaCreativeItem, session.getNextItemNetId())); inventory.setItem(javaSlot, GeyserItemStack.from(javaCreativeItem, session.getNextItemNetId()), session);
} }
ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket( ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket(
javaSlot, javaSlot,
@ -765,8 +765,8 @@ public abstract class InventoryTranslator {
public boolean checkNetId(GeyserSession session, Inventory inventory, StackRequestSlotInfoData slotInfoData) { public boolean checkNetId(GeyserSession session, Inventory inventory, StackRequestSlotInfoData slotInfoData) {
if (slotInfoData.getStackNetworkId() < 0) if (slotInfoData.getStackNetworkId() < 0)
return true; return true;
if (slotInfoData.getContainer() == ContainerSlotType.CURSOR) //TODO: temporary // if (slotInfoData.getContainer() == ContainerSlotType.CURSOR) //TODO: temporary
return true; // return true;
GeyserItemStack currentItem = isCursor(slotInfoData) ? session.getPlayerInventory().getCursor() : inventory.getItem(bedrockSlotToJava(slotInfoData)); GeyserItemStack currentItem = isCursor(slotInfoData) ? session.getPlayerInventory().getCursor() : inventory.getItem(bedrockSlotToJava(slotInfoData));
return currentItem.getNetId() == slotInfoData.getStackNetworkId(); return currentItem.getNetId() == slotInfoData.getStackNetworkId();
@ -826,7 +826,7 @@ public abstract class InventoryTranslator {
for (int slot : affectedSlots) { for (int slot : affectedSlots) {
BedrockContainerSlot bedrockSlot = javaSlotToBedrockContainer(slot); BedrockContainerSlot bedrockSlot = javaSlotToBedrockContainer(slot);
List<ItemStackResponsePacket.ItemEntry> list = containerMap.computeIfAbsent(bedrockSlot.getContainer(), k -> new ArrayList<>()); List<ItemStackResponsePacket.ItemEntry> list = containerMap.computeIfAbsent(bedrockSlot.getContainer(), k -> new ArrayList<>());
list.add(makeItemEntry(session, bedrockSlot.getSlot(), inventory.getItem(slot))); list.add(makeItemEntry(bedrockSlot.getSlot(), inventory.getItem(slot)));
} }
List<ItemStackResponsePacket.ContainerEntry> containerEntries = new ArrayList<>(); List<ItemStackResponsePacket.ContainerEntry> containerEntries = new ArrayList<>();
@ -834,18 +834,16 @@ public abstract class InventoryTranslator {
containerEntries.add(new ItemStackResponsePacket.ContainerEntry(entry.getKey(), entry.getValue())); containerEntries.add(new ItemStackResponsePacket.ContainerEntry(entry.getKey(), entry.getValue()));
} }
ItemStackResponsePacket.ItemEntry cursorEntry = makeItemEntry(session, 0, session.getPlayerInventory().getCursor()); ItemStackResponsePacket.ItemEntry cursorEntry = makeItemEntry(0, session.getPlayerInventory().getCursor());
containerEntries.add(new ItemStackResponsePacket.ContainerEntry(ContainerSlotType.CURSOR, Collections.singletonList(cursorEntry))); containerEntries.add(new ItemStackResponsePacket.ContainerEntry(ContainerSlotType.CURSOR, Collections.singletonList(cursorEntry)));
return containerEntries; return containerEntries;
} }
public static ItemStackResponsePacket.ItemEntry makeItemEntry(GeyserSession session, int bedrockSlot, GeyserItemStack itemStack) { public static ItemStackResponsePacket.ItemEntry makeItemEntry(int bedrockSlot, GeyserItemStack itemStack) {
ItemStackResponsePacket.ItemEntry itemEntry; ItemStackResponsePacket.ItemEntry itemEntry;
if (!itemStack.isEmpty()) { if (!itemStack.isEmpty()) {
int newNetId = session.getNextItemNetId(); itemEntry = new ItemStackResponsePacket.ItemEntry((byte) bedrockSlot, (byte) bedrockSlot, (byte) itemStack.getAmount(), itemStack.getNetId(), "");
itemStack.setNetId(newNetId);
itemEntry = new ItemStackResponsePacket.ItemEntry((byte) bedrockSlot, (byte) bedrockSlot, (byte) itemStack.getAmount(), newNetId, "");
} else { } else {
itemEntry = new ItemStackResponsePacket.ItemEntry((byte) bedrockSlot, (byte) bedrockSlot, (byte) 0, 0, ""); itemEntry = new ItemStackResponsePacket.ItemEntry((byte) bedrockSlot, (byte) bedrockSlot, (byte) 0, 0, "");
} }

View File

@ -127,7 +127,7 @@ public class ClickPlan {
if (simulating) { if (simulating) {
simulatedItems.put(slot, item); simulatedItems.put(slot, item);
} else { } else {
inventory.setItem(slot, item); inventory.setItem(slot, item, session);
} }
} }

View File

@ -166,7 +166,7 @@ public class LoomInventoryTranslator extends AbstractBlockInventoryTranslator {
inputCopy.getNbt().put(blockEntityTag); inputCopy.getNbt().put(blockEntityTag);
} }
// Set the new item as the output // Set the new item as the output
inventory.setItem(3, inputCopy); inventory.setItem(3, inputCopy, session);
return translateRequest(session, inventory, request); return translateRequest(session, inventory, request);
} }

View File

@ -64,7 +64,7 @@ public class StonecutterInventoryTranslator extends AbstractBlockInventoryTransl
} }
CraftResultsDeprecatedStackRequestActionData craftData = (CraftResultsDeprecatedStackRequestActionData) data; CraftResultsDeprecatedStackRequestActionData craftData = (CraftResultsDeprecatedStackRequestActionData) data;
// Get the ID of the item we are cutting // Get the ID of the item we are cutting
int id = inventory.getItem(0).getId(); int id = inventory.getItem(0).getJavaId();
// Look up all possible options of cutting from this ID // Look up all possible options of cutting from this ID
IntList results = session.getStonecutterRecipes().get(id); IntList results = session.getStonecutterRecipes().get(id);
if (results == null) { if (results == null) {
@ -77,9 +77,9 @@ public class StonecutterInventoryTranslator extends AbstractBlockInventoryTransl
ClientClickWindowButtonPacket packet = new ClientClickWindowButtonPacket(inventory.getId(), results.indexOf(javaOutput.getId())); ClientClickWindowButtonPacket packet = new ClientClickWindowButtonPacket(inventory.getId(), results.indexOf(javaOutput.getId()));
System.out.println(packet.toString()); System.out.println(packet.toString());
session.sendDownstreamPacket(packet); session.sendDownstreamPacket(packet);
if (inventory.getItem(1).getId() != javaOutput.getId()) { if (inventory.getItem(1).getJavaId() != javaOutput.getId()) {
// We don't know there is an output here, so we tell ourselves that there is // We don't know there is an output here, so we tell ourselves that there is
inventory.setItem(1, GeyserItemStack.from(javaOutput, session.getNextItemNetId())); inventory.setItem(1, GeyserItemStack.from(javaOutput, session.getNextItemNetId()), session);
} }
return translateRequest(session, inventory, request); return translateRequest(session, inventory, request);
} }

View File

@ -62,15 +62,7 @@ public class JavaSetSlotTranslator extends PacketTranslator<ServerSetSlotPacket>
InventoryTranslator translator = session.getInventoryTranslator(); InventoryTranslator translator = session.getInventoryTranslator();
if (translator != null) { if (translator != null) {
GeyserItemStack newItem = GeyserItemStack.from(packet.getItem()); GeyserItemStack newItem = GeyserItemStack.from(packet.getItem());
GeyserItemStack oldItem = inventory.getItem(packet.getSlot()); inventory.setItem(packet.getSlot(), newItem, session);
if (newItem.getItemData(session).equals(oldItem.getItemData(session), false, false, false)) {
newItem.setNetId(oldItem.getNetId());
System.out.println("OLD: " + newItem.getNetId());
} else {
newItem.setNetId(session.getNextItemNetId());
System.out.println("NEW: " + newItem.getNetId());
}
inventory.setItem(packet.getSlot(), newItem);
translator.updateSlot(session, inventory, packet.getSlot()); translator.updateSlot(session, inventory, packet.getSlot());
} }
}); });

View File

@ -46,13 +46,7 @@ public class JavaWindowItemsTranslator extends PacketTranslator<ServerWindowItem
for (int i = 0; i < packet.getItems().length; i++) { for (int i = 0; i < packet.getItems().length; i++) {
GeyserItemStack newItem = GeyserItemStack.from(packet.getItems()[i]); GeyserItemStack newItem = GeyserItemStack.from(packet.getItems()[i]);
GeyserItemStack oldItem = inventory.getItem(i); inventory.setItem(i, newItem, session);
if (newItem.getItemData(session).equals(oldItem.getItemData(session), false, false, false)) {
newItem.setNetId(oldItem.getNetId());
} else {
newItem.setNetId(session.getNextItemNetId());
}
inventory.setItem(i, newItem);
} }
InventoryTranslator translator = session.getInventoryTranslator(); InventoryTranslator translator = session.getInventoryTranslator();

View File

@ -115,7 +115,7 @@ public class InventoryUtils {
public static boolean canStack(GeyserItemStack item1, GeyserItemStack item2) { public static boolean canStack(GeyserItemStack item1, GeyserItemStack item2) {
if (item1.isEmpty() || item2.isEmpty()) if (item1.isEmpty() || item2.isEmpty())
return false; return false;
return item1.getId() == item2.getId() && Objects.equals(item1.getNbt(), item2.getNbt()); return item1.getJavaId() == item2.getJavaId() && Objects.equals(item1.getNbt(), item2.getNbt());
} }
public static boolean canStack(ItemStack item1, ItemStack item2) { public static boolean canStack(ItemStack item1, ItemStack item2) {