Skip to content

Commit 0bb88d9

Browse files
Move over item name computing from GeyserMC#5595
1 parent d330b47 commit 0bb88d9

File tree

7 files changed

+78
-0
lines changed

7 files changed

+78
-0
lines changed

core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import lombok.EqualsAndHashCode;
3131
import lombok.Getter;
3232
import lombok.Setter;
33+
import net.kyori.adventure.text.Component;
3334
import org.checkerframework.checker.nullness.qual.NonNull;
3435
import org.checkerframework.checker.nullness.qual.Nullable;
3536
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
@@ -45,6 +46,7 @@
4546
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
4647
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes;
4748
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
49+
import org.geysermc.mcprotocollib.protocol.data.game.item.component.WrittenBookContent;
4850
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.EmptySlotDisplay;
4951
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.ItemSlotDisplay;
5052
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.ItemStackSlotDisplay;
@@ -173,6 +175,10 @@ public <T> T getComponentElseGet(@NonNull DataComponentType<T> type, Supplier<T>
173175
return value == null ? supplier.get() : value;
174176
}
175177

178+
public boolean hasComponent(@NonNull DataComponentType<?> type) {
179+
return getComponent(type) != null;
180+
}
181+
176182
public int getNetId() {
177183
return isEmpty() ? 0 : netId;
178184
}
@@ -248,6 +254,17 @@ public SlotDisplay asSlotDisplay() {
248254
return new ItemStackSlotDisplay(this.getItemStack());
249255
}
250256

257+
public Component getName() {
258+
return getComponentElseGet(DataComponentTypes.CUSTOM_NAME, () -> {
259+
WrittenBookContent book = getComponent(DataComponentTypes.WRITTEN_BOOK_CONTENT);
260+
if (book != null) {
261+
return Component.text(book.getTitle().getRaw());
262+
}
263+
264+
return asItem().getName(this);
265+
});
266+
}
267+
251268
public int getMaxDamage() {
252269
return getComponentElseGet(DataComponentTypes.MAX_DAMAGE, () -> 0);
253270
}

core/src/main/java/org/geysermc/geyser/item/type/CompassItem.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
package org.geysermc.geyser.item.type;
2727

28+
import net.kyori.adventure.text.Component;
2829
import org.checkerframework.checker.nullness.qual.NonNull;
2930
import org.checkerframework.checker.nullness.qual.Nullable;
3031
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
@@ -39,10 +40,17 @@
3940
import org.geysermc.mcprotocollib.protocol.data.game.item.component.LodestoneTracker;
4041

4142
public class CompassItem extends Item {
43+
private static final Component LODESTONE_NAME = Component.translatable("item.minecraft.lodestone_compass");
44+
4245
public CompassItem(String javaIdentifier, Builder builder) {
4346
super(javaIdentifier, builder);
4447
}
4548

49+
@Override
50+
public Component getName(GeyserItemStack stack) {
51+
return stack.hasComponent(DataComponentTypes.LODESTONE_TRACKER) ? LODESTONE_NAME : super.getName(stack);
52+
}
53+
4654
@Override
4755
public ItemData.Builder translateToBedrock(GeyserSession session, int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
4856
if (isLodestoneCompass(components)) {

core/src/main/java/org/geysermc/geyser/item/type/Item.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ public <T> T getComponent(@NonNull DataComponentType<T> type) {
134134
return baseComponents.get(type);
135135
}
136136

137+
public Component getName(GeyserItemStack stack) {
138+
return baseComponents.getOrDefault(DataComponentTypes.ITEM_NAME, Component.empty());
139+
}
140+
137141
public String translationKey() {
138142
return "item." + javaIdentifier.namespace() + "." + javaIdentifier.value();
139143
}

core/src/main/java/org/geysermc/geyser/item/type/PlayerHeadItem.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525

2626
package org.geysermc.geyser.item.type;
2727

28+
import net.kyori.adventure.text.Component;
2829
import org.checkerframework.checker.nullness.qual.NonNull;
30+
import org.geysermc.geyser.inventory.GeyserItemStack;
2931
import org.geysermc.geyser.item.TooltipOptions;
3032
import org.geysermc.geyser.item.components.Rarity;
3133
import org.geysermc.geyser.level.block.type.Block;
@@ -42,13 +44,22 @@ public PlayerHeadItem(Builder builder, Block block, Block... otherBlocks) {
4244
super(builder, block, otherBlocks);
4345
}
4446

47+
@Override
48+
public Component getName(GeyserItemStack stack) {
49+
GameProfile profile = stack.getComponent(DataComponentTypes.PROFILE);
50+
return profile != null && profile.getName() != null
51+
? Component.translatable(translationKey() + ".named", profile.getName())
52+
: super.getName(stack);
53+
}
54+
4555
@Override
4656
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull TooltipOptions tooltip, @NonNull BedrockItemBuilder builder) {
4757
super.translateComponentsToBedrock(session, components, tooltip, builder);
4858

4959
// Use the correct color, determined by the rarity of the item
5060
char rarity = Rarity.fromId(components.getOrDefault(DataComponentTypes.RARITY, Rarity.COMMON.ordinal())).getColor();
5161

62+
// TODO name translation where?
5263
GameProfile profile = components.get(DataComponentTypes.PROFILE);
5364
if (profile != null) {
5465
String name = profile.getName();

core/src/main/java/org/geysermc/geyser/item/type/PotionItem.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
package org.geysermc.geyser.item.type;
2727

28+
import net.kyori.adventure.text.Component;
2829
import org.checkerframework.checker.nullness.qual.NonNull;
2930
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
3031
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
@@ -39,11 +40,20 @@
3940
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
4041
import org.geysermc.mcprotocollib.protocol.data.game.item.component.PotionContents;
4142

43+
import java.util.Locale;
44+
import java.util.Objects;
45+
import java.util.function.Function;
46+
4247
public class PotionItem extends Item {
4348
public PotionItem(String javaIdentifier, Builder builder) {
4449
super(javaIdentifier, builder);
4550
}
4651

52+
@Override
53+
public Component getName(GeyserItemStack stack) {
54+
return getName(stack, translationKey(), super::getName);
55+
}
56+
4757
@Override
4858
public ItemData.Builder translateToBedrock(GeyserSession session, int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
4959
if (components == null) return super.translateToBedrock(session, count, components, mapping, mappings);
@@ -82,4 +92,17 @@ public ItemData.Builder translateToBedrock(GeyserSession session, int count, Dat
8292
public boolean ignoreDamage() {
8393
return true;
8494
}
95+
96+
public static Component getName(GeyserItemStack stack, String translationKey, Function<GeyserItemStack, Component> fallback) {
97+
PotionContents contents = stack.getComponent(DataComponentTypes.POTION_CONTENTS);
98+
return contents != null ? potionName(contents, translationKey + ".effect.") : fallback.apply(stack);
99+
}
100+
101+
private static Component potionName(PotionContents contents, String baseTranslation) {
102+
String name = contents.getCustomName() != null
103+
? contents.getCustomName()
104+
: contents.getPotionId() == -1 ? "empty"
105+
: Objects.requireNonNull(Potion.getByJavaId(contents.getPotionId())).getJavaIdentifier().toLowerCase(Locale.ROOT);
106+
return Component.translatable(baseTranslation + name);
107+
}
85108
}

core/src/main/java/org/geysermc/geyser/item/type/ShieldItem.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ public ShieldItem(String javaIdentifier, Builder builder) {
4040
super(javaIdentifier, builder);
4141
}
4242

43+
@Override
44+
public Component getName(GeyserItemStack stack) {
45+
Integer color = stack.getComponent(DataComponentTypes.BASE_COLOR);
46+
return color != null
47+
? Component.translatable(translationKey() + "." + Objects.requireNonNull(DyeColor.getById(color)).getJavaIdentifier())
48+
: super.getName(stack);
49+
}
50+
4351
@Override
4452
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull TooltipOptions tooltip, @NonNull BedrockItemBuilder builder) {
4553
super.translateComponentsToBedrock(session, components, tooltip, builder);

core/src/main/java/org/geysermc/geyser/item/type/TippedArrowItem.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525

2626
package org.geysermc.geyser.item.type;
2727

28+
import net.kyori.adventure.text.Component;
2829
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
2930
import org.geysermc.geyser.GeyserImpl;
31+
import org.geysermc.geyser.inventory.GeyserItemStack;
3032
import org.geysermc.geyser.inventory.item.Potion;
3133
import org.geysermc.geyser.registry.type.ItemMapping;
3234
import org.geysermc.geyser.registry.type.ItemMappings;
@@ -40,6 +42,11 @@ public TippedArrowItem(String javaIdentifier, Builder builder) {
4042
super(javaIdentifier, builder);
4143
}
4244

45+
@Override
46+
public Component getName(GeyserItemStack stack) {
47+
return PotionItem.getName(stack, translationKey(), super::getName);
48+
}
49+
4350
@Override
4451
public ItemData.Builder translateToBedrock(GeyserSession session, int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
4552
if (components != null) {

0 commit comments

Comments
 (0)