diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/DefaultBlockMinecartEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/DefaultBlockMinecartEntity.java index ab43bf7b3..c562df476 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/DefaultBlockMinecartEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/DefaultBlockMinecartEntity.java @@ -57,7 +57,7 @@ public class DefaultBlockMinecartEntity extends MinecartEntity { @Override public void setCustomBlock(IntEntityMetadata entityMetadata) { - customBlock = ((IntEntityMetadata) entityMetadata).getPrimitiveValue(); + customBlock = entityMetadata.getPrimitiveValue(); if (showCustomBlock) { dirtyMetadata.put(EntityData.DISPLAY_ITEM, session.getBlockMappings().getBedrockBlockId(customBlock)); diff --git a/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java b/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java index d2f3e7c9e..d95767b97 100644 --- a/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java +++ b/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java @@ -96,7 +96,7 @@ public enum BitArrayVersion { // Padded palettes aren't able to use bitwise operations due to their padding. return new PaddedBitArray(this, size, words); } else if (this == V0) { - return new SingletonBitArray(); + return SingletonBitArray.INSTANCE; } else { return new Pow2BitArray(this, size, words); } diff --git a/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/SingletonBitArray.java b/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/SingletonBitArray.java index 6e37749df..ce25ead95 100644 --- a/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/SingletonBitArray.java +++ b/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/SingletonBitArray.java @@ -26,13 +26,12 @@ package org.geysermc.geyser.level.chunk.bitarray; import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.ints.IntArrays; public class SingletonBitArray implements BitArray { public static final SingletonBitArray INSTANCE = new SingletonBitArray(); - private static final int[] EMPTY_ARRAY = new int[0]; - - public SingletonBitArray() { + private SingletonBitArray() { } @Override @@ -56,7 +55,7 @@ public class SingletonBitArray implements BitArray { @Override public int[] getWords() { - return EMPTY_ARRAY; + return IntArrays.EMPTY_ARRAY; } @Override diff --git a/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java index fc4e3d022..70a3da88e 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java @@ -29,8 +29,8 @@ import org.geysermc.geyser.registry.loader.RegistryLoader; import javax.annotation.Nullable; import java.util.Map; -import java.util.Optional; -import java.util.function.Function; +import java.util.OptionalInt; +import java.util.function.ToIntFunction; /** * An abstract registry holding a map of various registrations as defined by {@link M}. @@ -62,15 +62,14 @@ public abstract class AbstractMappedRegistry> extends * * @param key the key * @param mapper the mapper - * @param the type * @return the mapped value from the given key if present */ - public Optional map(K key, Function mapper) { + public OptionalInt map(K key, ToIntFunction mapper) { V value = this.get(key); if (value == null) { - return Optional.empty(); + return OptionalInt.empty(); } else { - return Optional.ofNullable(mapper.apply(value)); + return OptionalInt.of(mapper.applyAsInt(value)); } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java index 017ede61e..1daa6d28d 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java @@ -34,6 +34,7 @@ import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.item.custom.CustomItemData; import org.geysermc.geyser.api.item.custom.CustomRenderOffsets; import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData; +import org.geysermc.geyser.api.util.TriState; import org.geysermc.geyser.item.GeyserCustomMappingData; import org.geysermc.geyser.item.components.ToolBreakSpeedsUtils; import org.geysermc.geyser.item.components.WearableSlot; @@ -171,7 +172,8 @@ public class CustomItemRegistryPopulator { itemProperties.putBoolean("allow_off_hand", customItemData.allowOffhand()); itemProperties.putBoolean("hand_equipped", isTool); itemProperties.putInt("max_stack_size", stackSize); - if (maxDamage > 0) { + // Ignore durability if the item's predicate requires that it be unbreakable + if (maxDamage > 0 && customItemData.customItemOptions().unbreakable() != TriState.TRUE) { componentBuilder.putCompound("minecraft:durability", NbtMap.builder() .putCompound("damage_chance", NbtMap.builder() .putInt("max", 1) diff --git a/core/src/main/java/org/geysermc/geyser/session/SessionManager.java b/core/src/main/java/org/geysermc/geyser/session/SessionManager.java index 02940e00c..7e5982ab5 100644 --- a/core/src/main/java/org/geysermc/geyser/session/SessionManager.java +++ b/core/src/main/java/org/geysermc/geyser/session/SessionManager.java @@ -28,9 +28,9 @@ package org.geysermc.geyser.session; import com.google.common.collect.ImmutableList; import lombok.AccessLevel; import lombok.Getter; -import lombok.NonNull; import org.geysermc.geyser.text.GeyserLocale; +import javax.annotation.Nonnull; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -69,7 +69,7 @@ public final class SessionManager { } } - public GeyserSession sessionByXuid(@NonNull String xuid) { + public GeyserSession sessionByXuid(@Nonnull String xuid) { Objects.requireNonNull(xuid); for (GeyserSession session : sessions.values()) { if (session.xuid().equals(xuid)) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java index 0a4ca0686..642a43123 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/CrossbowTranslator.java @@ -39,8 +39,8 @@ public class CrossbowTranslator extends NbtItemStackTranslator { @Override public void translateToBedrock(GeyserSession session, CompoundTag itemTag, ItemMapping mapping) { - if (itemTag.get("ChargedProjectiles") != null) { - ListTag chargedProjectiles = itemTag.get("ChargedProjectiles"); + ListTag chargedProjectiles = itemTag.get("ChargedProjectiles"); + if (chargedProjectiles != null) { if (!chargedProjectiles.getValue().isEmpty()) { CompoundTag projectile = (CompoundTag) chargedProjectiles.getValue().get(0); diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java index 2fb5ec6cb..5e5920b4a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/nbt/LeatherArmorTranslator.java @@ -32,13 +32,12 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemRemapper; import org.geysermc.geyser.translator.inventory.item.NbtItemStackTranslator; -import java.util.Arrays; import java.util.List; @ItemRemapper public class LeatherArmorTranslator extends NbtItemStackTranslator { - private static final List ITEMS = Arrays.asList("minecraft:leather_helmet", "minecraft:leather_chestplate", + private static final List ITEMS = List.of("minecraft:leather_helmet", "minecraft:leather_chestplate", "minecraft:leather_leggings", "minecraft:leather_boots", "minecraft:leather_horse_armor"); @Override @@ -47,10 +46,9 @@ public class LeatherArmorTranslator extends NbtItemStackTranslator { if (displayTag == null) { return; } - IntTag color = displayTag.get("color"); + IntTag color = displayTag.remove("color"); if (color != null) { itemTag.put(new IntTag("customColor", color.getValue())); - displayTag.remove("color"); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/CampfireBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/CampfireBlockEntityTranslator.java index 6ec0effca..e36ad2d22 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/CampfireBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/CampfireBlockEntityTranslator.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.level.block.entity; import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.nukkitx.nbt.NbtMap; import com.nukkitx.nbt.NbtMapBuilder; import org.geysermc.geyser.network.GameProtocol; @@ -40,7 +41,7 @@ public class CampfireBlockEntityTranslator extends BlockEntityTranslator { public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) { ListTag items = tag.get("Items"); int i = 1; - for (com.github.steveice10.opennbt.tag.builtin.Tag itemTag : items.getValue()) { + for (Tag itemTag : items.getValue()) { builder.put("Item" + i, getItem((CompoundTag) itemTag)); i++; } diff --git a/core/src/test/java/org/geysermc/geyser/translator/inventory/item/CustomItemsTest.java b/core/src/test/java/org/geysermc/geyser/translator/inventory/item/CustomItemsTest.java index 6870558d0..145f46369 100644 --- a/core/src/test/java/org/geysermc/geyser/translator/inventory/item/CustomItemsTest.java +++ b/core/src/test/java/org/geysermc/geyser/translator/inventory/item/CustomItemsTest.java @@ -72,7 +72,7 @@ public class CustomItemsTest { tagToCustomItemWithDamage = new Object2IntOpenHashMap<>(); CompoundTag tag = new CompoundTag(""); - tag.put(new IntTag("CustomModelData", 6)); + addCustomModelData(6, tag); // Test item with no damage should be treated as unbreakable tagToCustomItemWithDamage.put(tag, optionsToId.getInt(a)); @@ -121,7 +121,7 @@ public class CustomItemsTest { tagToCustomItemWithNoDamage = new Object2IntOpenHashMap<>(); tag = new CompoundTag(""); - tag.put(new IntTag("CustomModelData", 2)); + addCustomModelData(2, tag); // Damage predicates existing mean an item will never match if the item mapping has no max damage tagToCustomItemWithNoDamage.put(tag, -1);