3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-12-25 07:40:10 +01:00

Fix: Default components breaking item stacking while crafting.

Dieser Commit ist enthalten in:
onebeastchris 2024-12-24 01:43:04 +08:00
Ursprung 030b935d8a
Commit 6bd60d4233
5 geänderte Dateien mit 15 neuen und 17 gelöschten Zeilen

Datei anzeigen

@ -118,17 +118,7 @@ public class ItemFrameEntity extends Entity {
NbtMapBuilder builder = NbtMap.builder(); NbtMapBuilder builder = NbtMap.builder();
builder.putByte("Count", (byte) itemData.getCount()); builder.putByte("Count", (byte) itemData.getCount());
NbtMap itemDataTag = itemData.getTag(); NbtMap itemDataTag = itemData.getTag();
if (itemDataTag != null) { if (itemData.getTag() != null) {
// Remove custom name that Geyser sets for items due to translating default components
String customName = ItemTranslator.getCustomName(session, heldItem.getDataComponents(),
session.getItemMappings().getMapping(heldItem), 'f', false);
if (customName == null) {
// No custom name found, must modify tag if custom name exists
NbtMapBuilder copy = itemDataTag.toBuilder();
copy.remove("display"); // Also removes lore, but, should not matter
itemDataTag = copy.build();
}
builder.put("tag", itemDataTag); builder.put("tag", itemDataTag);
} }
builder.putShort("Damage", (short) itemData.getDamage()); builder.putShort("Damage", (short) itemData.getDamage());

Datei anzeigen

@ -191,7 +191,9 @@ public class Item {
} }
Integer repairCost = components.get(DataComponentType.REPAIR_COST); Integer repairCost = components.get(DataComponentType.REPAIR_COST);
if (repairCost != null) { // Java sets repair cost to 0 on all items via default components, that trips up Bedrock crafting.
// See https://github.com/GeyserMC/Geyser/issues/5220 for more details
if (repairCost != null && repairCost != 0) {
builder.putInt("RepairCost", repairCost); builder.putInt("RepairCost", repairCost);
} }
@ -202,7 +204,12 @@ public class Item {
// Prevents the client from trying to stack items with untranslated components // Prevents the client from trying to stack items with untranslated components
// Relies on correct hash code implementation, and some luck // Relies on correct hash code implementation, and some luck
builder.putInt("GeyserHash", components.hashCode()); // TODO: don't rely on this // However, we should only set a hash when the components differ from the default ones,
// otherwise Bedrock can't stack these when crafting items since it's predicted recipe output
// does not contain the GeyserHash. See https://github.com/GeyserMC/Geyser/issues/5220 for more details
if (!baseComponents.equals(components)) {
builder.putInt("GeyserHash", components.hashCode()); // TODO: don't rely on this
}
} }
/** /**

Datei anzeigen

@ -246,7 +246,7 @@ public abstract class InventoryTranslator {
boolean isSourceCursor = isCursor(transferAction.getSource()); boolean isSourceCursor = isCursor(transferAction.getSource());
boolean isDestCursor = isCursor(transferAction.getDestination()); boolean isDestCursor = isCursor(transferAction.getDestination());
if ((this) instanceof PlayerInventoryTranslator) { if (this instanceof PlayerInventoryTranslator) {
if (destSlot == 5) { if (destSlot == 5) {
//only set the head if the destination is the head slot //only set the head if the destination is the head slot
GeyserItemStack javaItem = inventory.getItem(sourceSlot); GeyserItemStack javaItem = inventory.getItem(sourceSlot);

Datei anzeigen

@ -122,12 +122,13 @@ public final class BedrockItemBuilder {
*/ */
@Nullable @Nullable
public NbtMap build() { public NbtMap build() {
if (customName != null || lore != null) { boolean validLore = lore != null && !lore.isEmpty();
if (customName != null || validLore) {
NbtMapBuilder display = NbtMap.builder(); NbtMapBuilder display = NbtMap.builder();
if (customName != null) { if (customName != null) {
display.putString("Name", customName); display.putString("Name", customName);
} }
if (lore != null) { if (validLore) {
display.putList("Lore", NbtType.STRING, lore); display.putList("Lore", NbtType.STRING, lore);
} }
getOrCreateNbt().put("display", display.build()); getOrCreateNbt().put("display", display.build());

Datei anzeigen

@ -173,7 +173,7 @@ public final class ItemTranslator {
javaItem.translateComponentsToBedrock(session, components, nbtBuilder); javaItem.translateComponentsToBedrock(session, components, nbtBuilder);
Rarity rarity = Rarity.fromId(components.getOrDefault(DataComponentType.RARITY, 0)); Rarity rarity = Rarity.fromId(components.getOrDefault(DataComponentType.RARITY, 0));
String customName = getCustomName(session, components, bedrockItem, rarity.getColor(), true); String customName = getCustomName(session, components, bedrockItem, rarity.getColor(), false);
if (customName != null) { if (customName != null) {
nbtBuilder.setCustomName(customName); nbtBuilder.setCustomName(customName);
} }