Skip to content

Commit b6f5c39

Browse files
Anvil updater refactor and other small refactors, there are still bugs
1 parent 6eeb886 commit b6f5c39

File tree

11 files changed

+287
-94
lines changed

11 files changed

+287
-94
lines changed

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

Lines changed: 26 additions & 1 deletion
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;
@@ -115,6 +117,14 @@ public int getAmount() {
115117
return isEmpty() ? 0 : amount;
116118
}
117119

120+
public boolean is(Item item) {
121+
return getJavaId() == item.javaId();
122+
}
123+
124+
public boolean isSameItem(GeyserItemStack other) {
125+
return getJavaId() == other.getJavaId();
126+
}
127+
118128
/**
119129
* Returns all components of this item - base and additional components sent over the network.
120130
* These are NOT modifiable! To add components, use {@link #getOrCreateComponents()}.
@@ -173,6 +183,10 @@ public <T> T getComponentElseGet(@NonNull DataComponentType<T> type, Supplier<T>
173183
return value == null ? supplier.get() : value;
174184
}
175185

186+
public boolean hasComponent(@NonNull DataComponentType<?> type) {
187+
return getComponent(type) != null;
188+
}
189+
176190
public int getNetId() {
177191
return isEmpty() ? 0 : netId;
178192
}
@@ -248,6 +262,17 @@ public SlotDisplay asSlotDisplay() {
248262
return new ItemStackSlotDisplay(this.getItemStack());
249263
}
250264

265+
public Component getName() {
266+
return getComponentElseGet(DataComponentTypes.CUSTOM_NAME, () -> {
267+
WrittenBookContent book = getComponent(DataComponentTypes.WRITTEN_BOOK_CONTENT);
268+
if (book != null) {
269+
return Component.text(book.getTitle().getRaw());
270+
}
271+
272+
return asItem().getName(this);
273+
});
274+
}
275+
251276
public int getMaxDamage() {
252277
return getComponentElseGet(DataComponentTypes.MAX_DAMAGE, () -> 0);
253278
}
@@ -263,7 +288,7 @@ public boolean nextDamageWillBreak() {
263288
}
264289

265290
public boolean isDamageable() {
266-
return getComponent(DataComponentTypes.MAX_DAMAGE) != null && getComponent(DataComponentTypes.UNBREAKABLE) == null && getComponent(DataComponentTypes.DAMAGE) != null;
291+
return hasComponent(DataComponentTypes.MAX_DAMAGE) && !hasComponent(DataComponentTypes.UNBREAKABLE) && hasComponent(DataComponentTypes.DAMAGE);
267292
}
268293

269294
public Item asItem() {

core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java

Lines changed: 181 additions & 92 deletions
Large diffs are not rendered by default.

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: 10 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,6 +44,14 @@ 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);

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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
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;
31+
import org.geysermc.geyser.inventory.item.DyeColor;
2932
import org.geysermc.geyser.item.TooltipOptions;
3033
import org.geysermc.geyser.session.GeyserSession;
3134
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
@@ -34,12 +37,21 @@
3437
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
3538

3639
import java.util.List;
40+
import java.util.Objects;
3741

3842
public class ShieldItem extends Item {
3943
public ShieldItem(String javaIdentifier, Builder builder) {
4044
super(javaIdentifier, builder);
4145
}
4246

47+
@Override
48+
public Component getName(GeyserItemStack stack) {
49+
Integer color = stack.getComponent(DataComponentTypes.BASE_COLOR);
50+
return color != null
51+
? Component.translatable(translationKey() + "." + Objects.requireNonNull(DyeColor.getById(color)).getJavaIdentifier())
52+
: super.getName(stack);
53+
}
54+
4355
@Override
4456
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull TooltipOptions tooltip, @NonNull BedrockItemBuilder builder) {
4557
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) {

core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public <T> boolean is(@Nullable GeyserHolderSet<T> holderSet, @Nullable T object
134134
* Accessible via the {@link #isItem(HolderSet, Item)} method.
135135
* @return true if the specified network ID is in the given {@link HolderSet} set.
136136
*/
137-
private <T> boolean is(@Nullable HolderSet holderSet, @NonNull JavaRegistryKey<T> registry, int id) {
137+
private <T> boolean is(@Nullable HolderSet holderSet, @NonNull JavaRegistryKey<T> registry, int id) {
138138
if (holderSet == null) {
139139
return false;
140140
}

core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ public int[] resolveRaw(TagCache tagCache) {
126126
return tagCache.getRaw(Objects.requireNonNull(tag, "HolderSet must have a tag if it doesn't have a list of IDs"));
127127
}
128128

129+
public boolean contains(GeyserSession session, T value) {
130+
return contains(resolveRaw(session.getTagCache()), registry.toNetworkId(session, value));
131+
}
132+
129133
/**
130134
* Reads a HolderSet from a NBT object. Does not support reading HolderSets that can hold inline values.
131135
*
@@ -195,4 +199,14 @@ public static <T> GeyserHolderSet<T> readHolderSet(JavaRegistryKey<T> registry,
195199
GeyserImpl.getInstance().getLogger().warning("Failed parsing HolderSet for registry + " + registry + "! Expected " + expected + ", found " + holderSet);
196200
return new GeyserHolderSet<>(registry);
197201
}
202+
203+
// TODO
204+
private static boolean contains(int[] array, int i) {
205+
for (int item : array) {
206+
if (item == i) {
207+
return true;
208+
}
209+
}
210+
return false;
211+
}
198212
}

0 commit comments

Comments
 (0)