Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import net.kyori.adventure.text.Component;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
Expand All @@ -45,6 +46,7 @@
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.WrittenBookContent;
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.EmptySlotDisplay;
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.ItemSlotDisplay;
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.ItemStackSlotDisplay;
Expand Down Expand Up @@ -115,6 +117,14 @@ public int getAmount() {
return isEmpty() ? 0 : amount;
}

public boolean is(Item item) {
return getJavaId() == item.javaId();
}

public boolean isSameItem(GeyserItemStack other) {
return getJavaId() == other.getJavaId();
}

/**
* Returns all components of this item - base and additional components sent over the network.
* These are NOT modifiable! To add components, use {@link #getOrCreateComponents()}.
Expand Down Expand Up @@ -173,6 +183,10 @@ public <T> T getComponentElseGet(@NonNull DataComponentType<T> type, Supplier<T>
return value == null ? supplier.get() : value;
}

public boolean hasComponent(@NonNull DataComponentType<?> type) {
return getComponent(type) != null;
}

public int getNetId() {
return isEmpty() ? 0 : netId;
}
Expand Down Expand Up @@ -248,6 +262,17 @@ public SlotDisplay asSlotDisplay() {
return new ItemStackSlotDisplay(this.getItemStack());
}

public Component getName() {
return getComponentElseGet(DataComponentTypes.CUSTOM_NAME, () -> {
WrittenBookContent book = getComponent(DataComponentTypes.WRITTEN_BOOK_CONTENT);
if (book != null) {
return Component.text(book.getTitle().getRaw());
}

return asItem().getName(this);
});
}

public int getMaxDamage() {
return getComponentElseGet(DataComponentTypes.MAX_DAMAGE, () -> 0);
}
Expand All @@ -263,7 +288,7 @@ public boolean nextDamageWillBreak() {
}

public boolean isDamageable() {
return getComponent(DataComponentTypes.MAX_DAMAGE) != null && getComponent(DataComponentTypes.UNBREAKABLE) == null && getComponent(DataComponentTypes.DAMAGE) != null;
return hasComponent(DataComponentTypes.MAX_DAMAGE) && !hasComponent(DataComponentTypes.UNBREAKABLE) && hasComponent(DataComponentTypes.DAMAGE);
}

public Item asItem() {
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

package org.geysermc.geyser.item.type;

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

public class CompassItem extends Item {
private static final Component LODESTONE_NAME = Component.translatable("item.minecraft.lodestone_compass");

public CompassItem(String javaIdentifier, Builder builder) {
super(javaIdentifier, builder);
}

@Override
public Component getName(GeyserItemStack stack) {
return stack.hasComponent(DataComponentTypes.LODESTONE_TRACKER) ? LODESTONE_NAME : super.getName(stack);
}

@Override
public ItemData.Builder translateToBedrock(GeyserSession session, int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
if (isLodestoneCompass(components)) {
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/org/geysermc/geyser/item/type/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ public <T> T getComponent(@NonNull DataComponentType<T> type) {
return baseComponents.get(type);
}

public Component getName(GeyserItemStack stack) {
return baseComponents.getOrDefault(DataComponentTypes.ITEM_NAME, Component.empty());
}

public String translationKey() {
return "item." + javaIdentifier.namespace() + "." + javaIdentifier.value();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@

package org.geysermc.geyser.item.type;

import net.kyori.adventure.text.Component;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.item.TooltipOptions;
import org.geysermc.geyser.item.components.Rarity;
import org.geysermc.geyser.level.block.type.Block;
Expand All @@ -42,6 +44,14 @@ public PlayerHeadItem(Builder builder, Block block, Block... otherBlocks) {
super(builder, block, otherBlocks);
}

@Override
public Component getName(GeyserItemStack stack) {
GameProfile profile = stack.getComponent(DataComponentTypes.PROFILE);
return profile != null && profile.getName() != null
? Component.translatable(translationKey() + ".named", profile.getName())
: super.getName(stack);
}

@Override
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull TooltipOptions tooltip, @NonNull BedrockItemBuilder builder) {
super.translateComponentsToBedrock(session, components, tooltip, builder);
Expand Down
23 changes: 23 additions & 0 deletions core/src/main/java/org/geysermc/geyser/item/type/PotionItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

package org.geysermc.geyser.item.type;

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

import java.util.Locale;
import java.util.Objects;
import java.util.function.Function;

public class PotionItem extends Item {
public PotionItem(String javaIdentifier, Builder builder) {
super(javaIdentifier, builder);
}

@Override
public Component getName(GeyserItemStack stack) {
return getName(stack, translationKey(), super::getName);
}

@Override
public ItemData.Builder translateToBedrock(GeyserSession session, int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
if (components == null) return super.translateToBedrock(session, count, components, mapping, mappings);
Expand Down Expand Up @@ -82,4 +92,17 @@ public ItemData.Builder translateToBedrock(GeyserSession session, int count, Dat
public boolean ignoreDamage() {
return true;
}

public static Component getName(GeyserItemStack stack, String translationKey, Function<GeyserItemStack, Component> fallback) {
PotionContents contents = stack.getComponent(DataComponentTypes.POTION_CONTENTS);
return contents != null ? potionName(contents, translationKey + ".effect.") : fallback.apply(stack);
}

private static Component potionName(PotionContents contents, String baseTranslation) {
String name = contents.getCustomName() != null
? contents.getCustomName()
: contents.getPotionId() == -1 ? "empty"
: Objects.requireNonNull(Potion.getByJavaId(contents.getPotionId())).getJavaIdentifier().toLowerCase(Locale.ROOT);
return Component.translatable(baseTranslation + name);
}
}
12 changes: 12 additions & 0 deletions core/src/main/java/org/geysermc/geyser/item/type/ShieldItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@

package org.geysermc.geyser.item.type;

import net.kyori.adventure.text.Component;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.inventory.item.DyeColor;
import org.geysermc.geyser.item.TooltipOptions;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
Expand All @@ -34,12 +37,21 @@
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;

import java.util.List;
import java.util.Objects;

public class ShieldItem extends Item {
public ShieldItem(String javaIdentifier, Builder builder) {
super(javaIdentifier, builder);
}

@Override
public Component getName(GeyserItemStack stack) {
Integer color = stack.getComponent(DataComponentTypes.BASE_COLOR);
return color != null
? Component.translatable(translationKey() + "." + Objects.requireNonNull(DyeColor.getById(color)).getJavaIdentifier())
: super.getName(stack);
}

@Override
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull TooltipOptions tooltip, @NonNull BedrockItemBuilder builder) {
super.translateComponentsToBedrock(session, components, tooltip, builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@

package org.geysermc.geyser.item.type;

import net.kyori.adventure.text.Component;
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.inventory.item.Potion;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings;
Expand All @@ -40,6 +42,11 @@ public TippedArrowItem(String javaIdentifier, Builder builder) {
super(javaIdentifier, builder);
}

@Override
public Component getName(GeyserItemStack stack) {
return PotionItem.getName(stack, translationKey(), super::getName);
}

@Override
public ItemData.Builder translateToBedrock(GeyserSession session, int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
if (components != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public <T> boolean is(@Nullable GeyserHolderSet<T> holderSet, @Nullable T object
* Accessible via the {@link #isItem(HolderSet, Item)} method.
* @return true if the specified network ID is in the given {@link HolderSet} set.
*/
private <T> boolean is(@Nullable HolderSet holderSet, @NonNull JavaRegistryKey<T> registry, int id) {
private <T> boolean is(@Nullable HolderSet holderSet, @NonNull JavaRegistryKey<T> registry, int id) {
if (holderSet == null) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ public int[] resolveRaw(TagCache tagCache) {
return tagCache.getRaw(Objects.requireNonNull(tag, "HolderSet must have a tag if it doesn't have a list of IDs"));
}

public boolean contains(GeyserSession session, T value) {
return contains(resolveRaw(session.getTagCache()), registry.toNetworkId(session, value));
}

/**
* Reads a HolderSet from a NBT object. Does not support reading HolderSets that can hold inline values.
*
Expand Down Expand Up @@ -195,4 +199,14 @@ public static <T> GeyserHolderSet<T> readHolderSet(JavaRegistryKey<T> registry,
GeyserImpl.getInstance().getLogger().warning("Failed parsing HolderSet for registry + " + registry + "! Expected " + expected + ", found " + holderSet);
return new GeyserHolderSet<>(registry);
}

// TODO
private static boolean contains(int[] array, int i) {
for (int item : array) {
if (item == i) {
return true;
}
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@ public static String getPotionEffectInfo(PotionContents contents, String languag
return finalText.toString();
}

// TODO
public static String getPotionName(PotionContents contents, ItemMapping mapping, String language) {
String customPotionName = contents.getCustomName();
Potion potion = Potion.getByJavaId(contents.getPotionId());
Expand Down
Loading