3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-10-08 10:50:11 +02:00

Fix custom items with ItemTranslator#getBedrockItemMapping

Dieser Commit ist enthalten in:
Camotoy 2022-07-20 18:35:40 -04:00
Ursprung 240af3cf2e
Commit 616c088b66
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 7EEFB66FE798081F
3 geänderte Dateien mit 16 neuen und 10 gelöschten Zeilen

Datei anzeigen

@ -34,7 +34,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.geysermc.geyser.translator.inventory.item.ItemTranslator;
import org.jetbrains.annotations.Range; import org.jetbrains.annotations.Range;
@ -136,9 +135,9 @@ public abstract class Inventory {
protected void updateItemNetId(GeyserItemStack oldItem, GeyserItemStack newItem, GeyserSession session) { protected void updateItemNetId(GeyserItemStack oldItem, GeyserItemStack newItem, GeyserSession session) {
if (!newItem.isEmpty()) { if (!newItem.isEmpty()) {
ItemMapping oldMapping = ItemTranslator.getBedrockItemMapping(session, oldItem); int oldMapping = ItemTranslator.getBedrockItemId(session, oldItem);
ItemMapping newMapping = ItemTranslator.getBedrockItemMapping(session, newItem); int newMapping = ItemTranslator.getBedrockItemId(session, newItem);
if (oldMapping.getBedrockId() == newMapping.getBedrockId()) { if (oldMapping == newMapping) {
newItem.setNetId(oldItem.getNetId()); newItem.setNetId(oldItem.getNetId());
} else { } else {
newItem.setNetId(session.getNextItemNetId()); newItem.setNetId(session.getNextItemNetId());

Datei anzeigen

@ -266,16 +266,23 @@ public abstract class ItemTranslator {
} }
/** /**
* Given an item stack, determine the item mapping that should be applied to Bedrock players. * Given an item stack, determine the Bedrock item ID that should be applied to Bedrock players.
*/ */
@Nonnull public static int getBedrockItemId(GeyserSession session, @Nonnull GeyserItemStack itemStack) {
public static ItemMapping getBedrockItemMapping(GeyserSession session, @Nonnull GeyserItemStack itemStack) {
if (itemStack.isEmpty()) { if (itemStack.isEmpty()) {
return ItemMapping.AIR; return ItemMapping.AIR.getJavaId();
} }
int javaId = itemStack.getJavaId(); int javaId = itemStack.getJavaId();
return ITEM_STACK_TRANSLATORS.getOrDefault(javaId, DEFAULT_TRANSLATOR) ItemMapping mapping = ITEM_STACK_TRANSLATORS.getOrDefault(javaId, DEFAULT_TRANSLATOR)
.getItemMapping(javaId, itemStack.getNbt(), session.getItemMappings()); .getItemMapping(javaId, itemStack.getNbt(), session.getItemMappings());
int customItemId = getCustomItem(itemStack.getNbt(), mapping);
if (customItemId == -1) {
// No custom item
return mapping.getBedrockId();
} else {
return customItemId;
}
} }
private static final ItemTranslator DEFAULT_TRANSLATOR = new ItemTranslator() { private static final ItemTranslator DEFAULT_TRANSLATOR = new ItemTranslator() {

Datei anzeigen

@ -542,7 +542,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
private boolean isIncorrectHeldItem(GeyserSession session, InventoryTransactionPacket packet) { private boolean isIncorrectHeldItem(GeyserSession session, InventoryTransactionPacket packet) {
int javaSlot = session.getPlayerInventory().getOffsetForHotbar(packet.getHotbarSlot()); int javaSlot = session.getPlayerInventory().getOffsetForHotbar(packet.getHotbarSlot());
int expectedItemId = ItemTranslator.getBedrockItemMapping(session, session.getPlayerInventory().getItem(javaSlot)).getBedrockId(); int expectedItemId = ItemTranslator.getBedrockItemId(session, session.getPlayerInventory().getItem(javaSlot));
int heldItemId = packet.getItemInHand() == null ? ItemData.AIR.getId() : packet.getItemInHand().getId(); int heldItemId = packet.getItemInHand() == null ? ItemData.AIR.getId() : packet.getItemInHand().getId();
if (expectedItemId != heldItemId) { if (expectedItemId != heldItemId) {