Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Shanwer committed Dec 24, 2024
2 parents 25fb352 + 6bd60d4 commit dc49876
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,13 @@ public void setItemInFrame(EntityMetadata<ItemStack, ?> entityMetadata) {
if (entityMetadata.getValue() != null) {
this.heldItem = entityMetadata.getValue();
ItemData itemData = ItemTranslator.translateToBedrock(session, heldItem);

String customIdentifier = session.getItemMappings().getCustomIdMappings().get(itemData.getDefinition().getRuntimeId());

NbtMapBuilder builder = NbtMap.builder();

builder.putByte("Count", (byte) itemData.getCount());
NbtMap itemDataTag = itemData.getTag();
if (itemData.getTag() != null) {
builder.put("tag", itemData.getTag());
builder.put("tag", itemDataTag);
}
builder.putShort("Damage", (short) itemData.getDamage());
builder.putString("Name", customIdentifier != null ? customIdentifier : session.getItemMappings().getMapping(entityMetadata.getValue()).getBedrockIdentifier());
Expand Down
11 changes: 9 additions & 2 deletions core/src/main/java/org/geysermc/geyser/item/type/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,9 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul
}

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);
}

Expand All @@ -202,7 +204,12 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul

// Prevents the client from trying to stack items with untranslated components
// 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
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul

// Only the display name is what we have interest in, so just translate that if relevant
if (boxComponents != null) {
String customName = ItemTranslator.getCustomName(session, boxComponents, boxMapping, '7');
String customName = ItemTranslator.getCustomName(session, boxComponents, boxMapping, '7', true);
if (customName != null) {
boxItemNbt.putCompound("tag", NbtMap.builder()
.putCompound("display", NbtMap.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ public ItemStackResponse translateRequest(GeyserSession session, Inventory inven
boolean isSourceCursor = isCursor(transferAction.getSource());
boolean isDestCursor = isCursor(transferAction.getDestination());

if ((this) instanceof PlayerInventoryTranslator) {
if (this instanceof PlayerInventoryTranslator) {
if (destSlot == 5) {
//only set the head if the destination is the head slot
GeyserItemStack javaItem = inventory.getItem(sourceSlot);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,13 @@ public NbtMapBuilder putCompound(String name, NbtMap value) {
*/
@Nullable
public NbtMap build() {
if (customName != null || lore != null) {
boolean validLore = lore != null && !lore.isEmpty();
if (customName != null || validLore) {
NbtMapBuilder display = NbtMap.builder();
if (customName != null) {
display.putString("Name", customName);
}
if (lore != null) {
if (validLore) {
display.putList("Lore", NbtType.STRING, lore);
}
getOrCreateNbt().put("display", display.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public static ItemData translateToBedrock(GeyserSession session, ItemStack stack
javaItem.translateComponentsToBedrock(session, components, nbtBuilder);

Rarity rarity = Rarity.fromId(components.getOrDefault(DataComponentType.RARITY, 0));
String customName = getCustomName(session, components, bedrockItem, rarity.getColor());
String customName = getCustomName(session, components, bedrockItem, rarity.getColor(), false);
if (customName != null) {
nbtBuilder.setCustomName(customName);
}
Expand Down Expand Up @@ -493,7 +493,7 @@ public static ItemDefinition getBedrockItemDefinition(GeyserSession session, @No
* @param translationColor if this item is not available on Java, the color that the new name should be.
* Normally, this should just be white, but for shulker boxes this should be gray.
*/
public static String getCustomName(GeyserSession session, DataComponents components, ItemMapping mapping, char translationColor) {
public static String getCustomName(GeyserSession session, DataComponents components, ItemMapping mapping, char translationColor, boolean includeDefault) {
if (components != null) {
// ItemStack#getHoverName as of 1.20.5
Component customName = components.get(DataComponentType.CUSTOM_NAME);
Expand All @@ -514,7 +514,7 @@ public static String getCustomName(GeyserSession session, DataComponents compone
}
}
customName = components.get(DataComponentType.ITEM_NAME);
if (customName != null) {
if (customName != null && includeDefault) {
// Get the translated name and prefix it with a reset char to prevent italics - matches Java Edition
// behavior as of 1.21
return ChatColor.RESET + ChatColor.ESCAPE + translationColor + MessageTranslator.convertMessage(customName, session.locale());
Expand Down

0 comments on commit dc49876

Please sign in to comment.