From 1b88213eca6e36c13fd1f37b3c09a0d5fe9c571e Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 19 Jul 2023 20:17:24 +0100 Subject: [PATCH] Make our registry wrapper implement IdMap This allows us to use some of the byte-buffer helper methods directly with our registries, rather than rolling our own helpers. --- .../command/arguments/ArgumentUtils.java | 4 ++-- .../shared/platform/RegistryWrappers.java | 16 ++------------ .../turtle/upgrades/TurtleToolSerialiser.java | 7 +++++-- .../shared/platform/PlatformHelperImpl.java | 21 ++++++++++--------- .../shared/platform/PlatformHelperImpl.java | 15 ++++++------- 5 files changed, 28 insertions(+), 35 deletions(-) diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentUtils.java b/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentUtils.java index dfe3f9dfa..2bd97ad28 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentUtils.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentUtils.java @@ -44,12 +44,12 @@ public static > void serializeToNetwork(FriendlyByteBu @SuppressWarnings("unchecked") private static , T extends ArgumentTypeInfo.Template> void serializeToNetwork(FriendlyByteBuf buffer, ArgumentTypeInfo type, ArgumentTypeInfo.Template template) { - RegistryWrappers.writeId(buffer, RegistryWrappers.COMMAND_ARGUMENT_TYPES, type); + buffer.writeId(RegistryWrappers.COMMAND_ARGUMENT_TYPES, type); type.serializeToNetwork((T) template, buffer); } public static ArgumentTypeInfo.Template deserialize(FriendlyByteBuf buffer) { - var type = RegistryWrappers.readId(buffer, RegistryWrappers.COMMAND_ARGUMENT_TYPES); + var type = buffer.readById(RegistryWrappers.COMMAND_ARGUMENT_TYPES); Objects.requireNonNull(type, "Unknown argument type"); return type.deserializeFromNetwork(buffer); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java b/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java index 741aa7206..59460572e 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/platform/RegistryWrappers.java @@ -5,6 +5,7 @@ package dan200.computercraft.shared.platform; import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.core.IdMap; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; @@ -36,9 +37,7 @@ public final class RegistryWrappers { public static final RegistryWrapper> RECIPE_SERIALIZERS = PlatformHelper.get().wrap(Registries.RECIPE_SERIALIZER); public static final RegistryWrapper> MENU = PlatformHelper.get().wrap(Registries.MENU); - public interface RegistryWrapper extends Iterable { - int getId(T object); - + public interface RegistryWrapper extends IdMap { ResourceLocation getKey(T object); T get(ResourceLocation location); @@ -46,8 +45,6 @@ public interface RegistryWrapper extends Iterable { @Nullable T tryGet(ResourceLocation location); - T get(int id); - default Stream stream() { return StreamSupport.stream(spliterator(), false); } @@ -56,15 +53,6 @@ default Stream stream() { private RegistryWrappers() { } - public static void writeId(FriendlyByteBuf buf, RegistryWrapper registry, K object) { - buf.writeVarInt(registry.getId(object)); - } - - public static K readId(FriendlyByteBuf buf, RegistryWrapper registry) { - var id = buf.readVarInt(); - return registry.get(id); - } - public static void writeKey(FriendlyByteBuf buf, RegistryWrapper registry, K object) { buf.writeResourceLocation(registry.getKey(object)); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleToolSerialiser.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleToolSerialiser.java index dc3443879..4d5f144db 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleToolSerialiser.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleToolSerialiser.java @@ -17,6 +17,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; +import java.util.Objects; + public final class TurtleToolSerialiser implements TurtleUpgradeSerialiser { public static final TurtleToolSerialiser INSTANCE = new TurtleToolSerialiser(); @@ -44,7 +46,8 @@ public TurtleTool fromJson(ResourceLocation id, JsonObject object) { @Override public TurtleTool fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { var adjective = buffer.readUtf(); - var craftingItem = RegistryWrappers.readId(buffer, RegistryWrappers.ITEMS); + var craftingItem = buffer.readById(RegistryWrappers.ITEMS); + Objects.requireNonNull(craftingItem, "Unknown crafting item"); var toolItem = buffer.readItem(); // damageMultiplier and breakable aren't used by the client, but we need to construct the upgrade exactly // as otherwise syncing on an SP world will overwrite the (shared) upgrade registry with an invalid upgrade! @@ -59,7 +62,7 @@ public TurtleTool fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { @Override public void toNetwork(FriendlyByteBuf buffer, TurtleTool upgrade) { buffer.writeUtf(upgrade.getUnlocalisedAdjective()); - RegistryWrappers.writeId(buffer, RegistryWrappers.ITEMS, upgrade.getCraftingItem().getItem()); + buffer.writeId(RegistryWrappers.ITEMS, upgrade.getCraftingItem().getItem()); buffer.writeItem(upgrade.item); buffer.writeFloat(upgrade.damageMulitiplier); buffer.writeBoolean(upgrade.allowEnchantments); diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java index 3c0ee5318..d3bf8a9c6 100644 --- a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java +++ b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java @@ -303,7 +303,7 @@ public ServerPlayer createFakePlayer(ServerLevel world, GameProfile name) { public boolean hasToolUsage(ItemStack stack) { var item = stack.getItem(); return item instanceof ShovelItem || stack.is(ItemTags.SHOVELS) || - item instanceof HoeItem || stack.is(ItemTags.HOES); + item instanceof HoeItem || stack.is(ItemTags.HOES); } @Override @@ -314,8 +314,8 @@ public InteractionResult canAttackEntity(ServerPlayer player, Entity entity) { @Override public boolean interactWithEntity(ServerPlayer player, Entity entity, Vec3 hitPos) { return UseEntityCallback.EVENT.invoker().interact(player, entity.level, InteractionHand.MAIN_HAND, entity, new EntityHitResult(entity, hitPos)).consumesAction() || - entity.interactAt(player, hitPos.subtract(entity.position()), InteractionHand.MAIN_HAND).consumesAction() || - player.interactOn(entity, InteractionHand.MAIN_HAND).consumesAction(); + entity.interactAt(player, hitPos.subtract(entity.position()), InteractionHand.MAIN_HAND).consumesAction() || + player.interactOn(entity, InteractionHand.MAIN_HAND).consumesAction(); } @Override @@ -337,9 +337,7 @@ private record RegistryWrapperImpl( ) implements RegistryWrappers.RegistryWrapper { @Override public int getId(T object) { - var id = registry.getId(object); - if (id == -1) throw new IllegalArgumentException(object + " was not registered in " + name); - return id; + return registry.getId(object); } @Override @@ -363,10 +361,13 @@ public T tryGet(ResourceLocation location) { } @Override - public T get(int id) { - var object = registry.byId(id); - if (object == null) throw new IllegalArgumentException(id + " was not registered in " + name); - return object; + public @Nullable T byId(int id) { + return registry.byId(id); + } + + @Override + public int size() { + return registry.size(); } @Override diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java index d7f3a74b3..361c11c1e 100644 --- a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java +++ b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java @@ -359,9 +359,7 @@ private record RegistryWrapperImpl( ) implements RegistryWrappers.RegistryWrapper { @Override public int getId(T object) { - var id = registry.getID(object); - if (id == -1) throw new IllegalStateException(object + " was not registered in " + name); - return id; + return registry.getID(object); } @Override @@ -385,10 +383,13 @@ public T tryGet(ResourceLocation location) { } @Override - public T get(int id) { - var object = registry.getValue(id); - if (object == null) throw new IllegalStateException(id + " was not registered in " + name); - return object; + public @Nullable T byId(int id) { + return registry.getValue(id); + } + + @Override + public int size() { + return registry.getKeys().size(); } @Override