From 87f1a534974ec938308089a748f37e15606bb063 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 11 Jul 2025 02:48:34 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E6=96=B9=E6=98=A0=E5=B0=84=E5=AE=8C?= =?UTF-8?q?=E6=88=9080%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/BukkitBlockManager.java | 2 +- .../bukkit/block/BukkitCustomBlock.java | 5 +- .../bukkit/item/BukkitItemManager.java | 2 +- .../factory/ComponentItemFactory1_20_5.java | 1 - .../plugin/network/PacketConsumers.java | 12 ++- .../plugin/network/id/PacketIds1_20.java | 6 +- .../minecraft/NetworkReflections.java | 2 +- .../craftengine/bukkit/util/ItemTags.java | 1 - .../core/block/behavior/BlockBehaviors.java | 6 +- .../core/block/properties/Properties.java | 4 +- .../core/entity/furniture/HitBoxTypes.java | 6 +- .../core/entity/player/Player.java | 1 - .../core/item/AbstractItemManager.java | 2 +- .../core/item/behavior/ItemBehaviors.java | 6 +- .../core/item/context/UseOnContext.java | 1 - .../core/item/equipment/Equipments.java | 6 +- .../item/recipe/CookingRecipeCategory.java | 8 +- .../recipe/CustomSmithingTransformRecipe.java | 5 +- .../core/item/recipe/RecipeTypes.java | 6 +- .../network/legacy/LegacyCookingRecipe.java | 58 ++++++++++++++ .../network/legacy/LegacyCustomRecipe.java | 24 ++++++ .../network/legacy/LegacyIngredient.java | 12 ++- .../recipe/network/legacy/LegacyRecipe.java | 20 +---- .../network/legacy/LegacyRecipeHolder.java | 53 ++++++++++++ .../network/legacy/LegacyRecipeTypes.java | 34 ++++++++ .../network/legacy/LegacyShapedRecipe.java | 72 ++++++++++++----- .../network/legacy/LegacyShapelessRecipe.java | 53 ++++++++++++ .../legacy/LegacySmithingTransformRecipe.java | 46 +++++++++++ .../legacy/LegacySmithingTrimRecipe.java | 39 +++++++++ .../legacy/LegacyStoneCuttingRecipe.java | 42 ++++++++++ ...eDisplays.java => RecipeDisplayTypes.java} | 9 +-- ...lotDisplays.java => SlotDisplayTypes.java} | 10 +-- .../craftengine/core/loot/LootConditions.java | 6 +- .../core/loot/entry/LootEntryContainers.java | 6 +- .../function/ApplyBonusCountFunction.java | 6 +- .../core/loot/function/LootFunctions.java | 6 +- .../pack/conflict/matcher/PathMatchers.java | 6 +- .../pack/conflict/resolution/Resolutions.java | 4 +- .../core/pack/host/ResourcePackHosts.java | 6 +- .../core/pack/model/ItemModels.java | 11 +-- .../model/condition/ConditionProperties.java | 11 +-- .../RangeDispatchProperties.java | 11 +-- .../pack/model/select/SelectProperties.java | 11 +-- .../pack/model/special/SpecialModels.java | 13 ++- .../core/pack/model/tint/Tints.java | 11 +-- .../craftengine/core/plugin/CraftEngine.java | 10 ++- .../config/template/TemplateArguments.java | 6 +- .../plugin/context/event/EventConditions.java | 6 +- .../plugin/context/event/EventFunctions.java | 6 +- .../context/number/NumberProviders.java | 6 +- .../context/selector/PlayerSelectors.java | 6 +- ...istry.java => AbstractMappedRegistry.java} | 36 ++------- .../core/registry/BuiltInRegistries.java | 80 ++++++++++--------- .../core/registry/ConstantBoundRegistry.java | 57 +++++++++++++ .../core/registry/DynamicBoundRegistry.java | 48 +++++++++++ .../craftengine/core/registry/Holder.java | 16 ++++ .../craftengine/core/registry/Registries.java | 72 ++++++++--------- .../craftengine/core/registry/Registry.java | 4 + .../core/registry/WritableRegistry.java | 4 + .../core/util/FriendlyByteBuf.java | 4 + .../craftengine/core/util/ResourceKey.java | 13 ++- .../DefaultSectionSerializer.java | 2 +- 62 files changed, 746 insertions(+), 292 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCookingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCustomRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeHolder.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTrimRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyStoneCuttingRecipe.java rename core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/{RecipeDisplays.java => RecipeDisplayTypes.java} (76%) rename core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/{SlotDisplays.java => SlotDisplayTypes.java} (80%) rename core/src/main/java/net/momirealms/craftengine/core/registry/{MappedRegistry.java => AbstractMappedRegistry.java} (60%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/registry/ConstantBoundRegistry.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/registry/DynamicBoundRegistry.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 631593f36..d2931c4ef 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -276,7 +276,7 @@ public final class BukkitBlockManager extends AbstractBlockManager { } private void registerEmptyBlock() { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), Key.withDefaultNamespace("empty"))); + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(ResourceKey.create(BuiltInRegistries.BLOCK.key().location(), Key.withDefaultNamespace("empty"))); EmptyBlock emptyBlock = new EmptyBlock(Key.withDefaultNamespace("empty"), holder); holder.bindValue(emptyBlock); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java index af70dad99..95a28e719 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java @@ -254,9 +254,8 @@ public final class BukkitCustomBlock extends AbstractCustomBlock { @Override public @NotNull CustomBlock build() { // create or get block holder - Holder.Reference holder = BuiltInRegistries.BLOCK.get(id).orElseGet(() -> - ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), id))); - return new BukkitCustomBlock(id, holder, properties, appearances, variantMapper, settings, events, behavior, lootTable); + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).getOrRegisterForHolder(ResourceKey.create(BuiltInRegistries.BLOCK.key().location(), this.id)); + return new BukkitCustomBlock(this.id, holder, this.properties, this.appearances, this.variantMapper, this.settings, this.events, this.behavior, this.lootTable); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index aae463071..c70d85fb6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -374,7 +374,7 @@ public class BukkitItemManager extends AbstractItemManager { VANILLA_ITEMS.add(itemKey); Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(itemKey) .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) - .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), itemKey), itemKey)); + .register(ResourceKey.create(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), itemKey), itemKey)); Object mcHolder = FastNMS.INSTANCE.method$Registry$getHolderByResourceKey(MBuiltInRegistries.ITEM, FastNMS.INSTANCE.method$ResourceKey$create(MRegistries.ITEM, resourceLocation)).get(); Set tags = (Set) CoreReflections.field$Holder$Reference$tags.get(mcHolder); for (Object tag : tags) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java index 39129028d..7d7421f9b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java @@ -4,7 +4,6 @@ import com.google.gson.JsonElement; import it.unimi.dsi.fastutil.ints.IntArrayList; import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper; import net.momirealms.craftengine.bukkit.item.ComponentTypes; -import net.momirealms.craftengine.bukkit.item.LegacyItemWrapper; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 9fc237cc6..95ac62ed2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -42,6 +42,7 @@ import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.item.recipe.network.legacy.LegacyRecipeHolder; import net.momirealms.craftengine.core.item.recipe.network.modern.RecipeBookEntry; import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplay; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; @@ -2317,7 +2318,7 @@ public class PacketConsumers { } boolean isTerminal = action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$SUCCESSFULLY_LOADED || action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DOWNLOADED; - if (isTerminal) { + if (isTerminal && VersionHelper.isOrAbove1_20_2()) { event.setCancelled(true); Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection()); if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) return; @@ -2520,6 +2521,15 @@ public class PacketConsumers { try { if (VersionHelper.isOrAbove1_21_2()) return; FriendlyByteBuf buf = event.getBuffer(); + List holders = buf.readCollection(ArrayList::new, byteBuf -> { + LegacyRecipeHolder holder = LegacyRecipeHolder.read(byteBuf); + holder.recipe().applyClientboundData((BukkitServerPlayer) user); + return holder; + }); + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeCollection(holders, ((byteBuf, recipeHolder) -> recipeHolder.write(byteBuf))); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundUpdateRecipesPacket", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index d852c3bb3..b379e2a62 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java @@ -152,16 +152,16 @@ public class PacketIds1_20 implements PacketIds { @Override public int clientboundRecipeBookAddPacket() { - return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ClientboundRecipeBookAddPacket); + return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundRecipeBookAddPacket); } @Override public int clientboundPlaceGhostRecipePacket() { - return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ClientboundPlaceGhostRecipePacket); + return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundPlaceGhostRecipePacket); } @Override public int clientboundUpdateRecipesPacket() { - return PacketIdFinder.serverboundByClazz(NetworkReflections.clazz$ClientboundUpdateRecipesPacket); + return PacketIdFinder.clientboundByClazz(NetworkReflections.clazz$ClientboundUpdateRecipesPacket); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java index e6ebe7213..577f843bc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java @@ -1569,7 +1569,7 @@ public final class NetworkReflections { public static final Class clazz$ClientboundPlaceGhostRecipePacket = requireNonNull( BukkitReflectionUtils.findReobfOrMojmapClass( - "network.protocol.game.ClientboundPlaceGhostRecipePacket", + "network.protocol.game.PacketPlayOutAutoRecipe", "network.protocol.game.ClientboundPlaceGhostRecipePacket" ) ); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java index b10ac9687..1f35e3e90 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.nms.FastNMS; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java index b346ccf1f..d109bc77d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.block.BlockBehavior; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -18,9 +17,8 @@ public class BlockBehaviors { public static final Key EMPTY = Key.from("craftengine:empty"); public static void register(Key key, BlockBehaviorFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.BLOCK_BEHAVIOR_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY) + .register(ResourceKey.create(Registries.BLOCK_BEHAVIOR_FACTORY.location(), key), factory); } public static BlockBehavior fromMap(CustomBlock block, @Nullable Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java index 4edc88ae1..5636e7ae9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.block.properties; import net.momirealms.craftengine.core.block.state.properties.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.*; @@ -40,8 +39,7 @@ public class Properties { } public static void register(Key key, PropertyFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.PROPERTY_FACTORY).registerForHolder(new ResourceKey<>(Registries.PROPERTY_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.PROPERTY_FACTORY).register(ResourceKey.create(Registries.PROPERTY_FACTORY.location(), key), factory); } public static Property fromMap(String name, Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java index f77435813..2cb59c4b8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.entity.furniture; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -18,9 +17,8 @@ public class HitBoxTypes { public static final Key CUSTOM = Key.of("minecraft:custom"); public static void register(Key key, HitBoxFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.HITBOX_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.HITBOX_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.HITBOX_FACTORY) + .register(ResourceKey.create(Registries.HITBOX_FACTORY.location(), key), factory); } public static HitBox fromMap(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index ae8bb9b03..073a8d41c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -9,7 +9,6 @@ import net.momirealms.craftengine.core.sound.SoundSource; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.BlockPos; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 30ae96bae..377df86de 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -330,7 +330,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl // register for recipes Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id) .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) - .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); + .register(ResourceKey.create(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); boolean isVanillaItem = isVanillaItem(id); Key material = Key.from(isVanillaItem ? id.value() : ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("material"), "warning.config.item.missing_material").toLowerCase(Locale.ENGLISH)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java index 28c122108..6ab3f1d38 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.item.behavior; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -20,9 +19,8 @@ public class ItemBehaviors { public static final Key EMPTY = Key.withDefaultNamespace("empty", Key.DEFAULT_NAMESPACE); public static void register(Key key, ItemBehaviorFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_BEHAVIOR_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.ITEM_BEHAVIOR_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.ITEM_BEHAVIOR_FACTORY) + .register(ResourceKey.create(Registries.ITEM_BEHAVIOR_FACTORY.location(), key), factory); } public static ItemBehavior fromMap(Pack pack, Path path, Key id, Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java index 7aebaf64c..41ead315b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java @@ -9,7 +9,6 @@ import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class UseOnContext { private final Player player; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java index 6ce7822fd..9456b80db 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.item.equipment; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -21,9 +20,8 @@ public final class Equipments { } public static void register(Key key, EquipmentFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.EQUIPMENT_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.EQUIPMENT_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.EQUIPMENT_FACTORY) + .register(ResourceKey.create(Registries.EQUIPMENT_FACTORY.location(), key), factory); } public static Equipment fromMap(Key id, Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java index 98fa1c1cf..d1a09e1cc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java @@ -3,5 +3,11 @@ package net.momirealms.craftengine.core.item.recipe; public enum CookingRecipeCategory { FOOD, BLOCKS, - MISC + MISC; + + public static final CookingRecipeCategory[] VALUES = CookingRecipeCategory.values(); + + public static CookingRecipeCategory byId(final int id) { + return VALUES[id]; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java index a4c76c2bf..7680bef66 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java @@ -193,9 +193,8 @@ public class CustomSmithingTransformRecipe implements Recipe { } public static void register(Key key, ItemDataProcessor.ProcessorFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.SMITHING_RESULT_PROCESSOR_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY) + .register(ResourceKey.create(Registries.SMITHING_RESULT_PROCESSOR_FACTORY.location(), key), factory); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java index 8d716b772..8d7d79e20 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -34,9 +33,8 @@ public class RecipeTypes { } public static void register(Key key, RecipeFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.RECIPE_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.RECIPE_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.RECIPE_FACTORY) + .register(ResourceKey.create(Registries.RECIPE_FACTORY.location(), key), factory); } @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCookingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCookingRecipe.java new file mode 100644 index 000000000..ad7f11891 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCookingRecipe.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Obsolete +public class LegacyCookingRecipe implements LegacyRecipe { + private Item result; + private final CookingRecipeCategory category; + private final String group; + private final LegacyIngredient ingredient; + private final float experience; + private final int cookingTime; + + public LegacyCookingRecipe(LegacyIngredient ingredient, + CookingRecipeCategory category, + float experience, + int cookingTime, + Item result, + String group) { + this.ingredient = ingredient; + this.category = category; + this.experience = experience; + this.cookingTime = cookingTime; + this.result = result; + this.group = group; + } + + @Override + public void applyClientboundData(Player player) { + this.result = CraftEngine.instance().itemManager().s2c(this.result, player); + this.ingredient.applyClientboundData(player); + } + + public static LegacyCookingRecipe read(FriendlyByteBuf buf) { + String group = buf.readUtf(); + CookingRecipeCategory category = CookingRecipeCategory.byId(buf.readVarInt()); + LegacyIngredient ingredient = LegacyIngredient.read(buf); + Item result = CraftEngine.instance().itemManager().decode(buf); + float experience = buf.readFloat(); + int cookingTime = buf.readVarInt(); + return new LegacyCookingRecipe(ingredient, category, experience, cookingTime, result, group); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeUtf(this.group); + buf.writeVarInt(this.category.ordinal()); + this.ingredient.write(buf); + CraftEngine.instance().itemManager().encode(buf, this.result); + buf.writeFloat(this.experience); + buf.writeVarInt(this.cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCustomRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCustomRecipe.java new file mode 100644 index 000000000..cba9a2038 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyCustomRecipe.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Obsolete +public class LegacyCustomRecipe implements LegacyRecipe { + private final CraftingRecipeCategory category; + + public LegacyCustomRecipe(CraftingRecipeCategory category) { + this.category = category; + } + + public static LegacyCustomRecipe read(FriendlyByteBuf buf) { + CraftingRecipeCategory category = CraftingRecipeCategory.byId(buf.readVarInt()); + return new LegacyCustomRecipe(category); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeVarInt(this.category.ordinal()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyIngredient.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyIngredient.java index 5f78facb9..2d4871aa1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyIngredient.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyIngredient.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item.recipe.network.legacy; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import org.jetbrains.annotations.ApiStatus; @@ -18,6 +19,10 @@ public class LegacyIngredient { return items; } + public void write(FriendlyByteBuf buf) { + buf.writeArray(this.items, (byteBuf, item) -> CraftEngine.instance().itemManager().encode(byteBuf, item)); + } + @SuppressWarnings("unchecked") public static LegacyIngredient read(FriendlyByteBuf buf) { Item[] items = buf.readArray(byteBuf -> CraftEngine.instance().itemManager().decode(byteBuf), Item.class); @@ -25,9 +30,10 @@ public class LegacyIngredient { } public void applyClientboundData(Player player) { - for (int i = 0; i < items.length; i++) { - Item item = items[i]; - this.items[i] = CraftEngine.instance().itemManager().s2c(item, player); + ItemManager manager = CraftEngine.instance().itemManager(); + for (int i = 0; i < this.items.length; i++) { + Item item = this.items[i]; + this.items[i] = manager.s2c(item, player); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipe.java index ae7d4c298..4e41151da 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipe.java @@ -1,9 +1,7 @@ package net.momirealms.craftengine.core.item.recipe.network.legacy; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.util.FriendlyByteBuf; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.VersionHelper; import org.jetbrains.annotations.ApiStatus; import java.util.function.Function; @@ -11,23 +9,13 @@ import java.util.function.Function; @ApiStatus.Obsolete public interface LegacyRecipe { - void write(FriendlyByteBuf buf); + default void applyClientboundData(Player player) {} - static LegacyRecipe read(FriendlyByteBuf buf) { - if (VersionHelper.isOrAbove1_20_5()) { - Key id = buf.readKey(); - Key type = buf.readKey(); - return BuiltInRegistries.LEGACY_RECIPE_TYPE.getValue(type).read(id, buf); - } else { - Key type = buf.readKey(); - Key id = buf.readKey(); - return BuiltInRegistries.LEGACY_RECIPE_TYPE.getValue(type).read(id, buf); - } - } + void write(FriendlyByteBuf buf); record Type(Function reader) { - public LegacyRecipe read(Key id, FriendlyByteBuf buf) { + public LegacyRecipe read(FriendlyByteBuf buf) { return this.reader.apply(buf); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeHolder.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeHolder.java new file mode 100644 index 000000000..ca9d7e17e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeHolder.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; + +public interface LegacyRecipeHolder { + + void write(FriendlyByteBuf buf); + + LegacyRecipe recipe(); + + static LegacyRecipeHolder read(FriendlyByteBuf buf) { + if (VersionHelper.isOrAbove1_20_5()) { + return ModernRecipeHolderImpl.read(buf); + } else { + return LegacyRecipeHolderImpl.read(buf); + } + } + + record LegacyRecipeHolderImpl(Key id, Key type, LegacyRecipe recipe) implements LegacyRecipeHolder { + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeKey(this.type); + buf.writeKey(this.id); + this.recipe.write(buf); + } + + public static LegacyRecipeHolder read(FriendlyByteBuf buf) { + Key type = buf.readKey(); + Key id = buf.readKey(); + return new LegacyRecipeHolderImpl(id, type, BuiltInRegistries.LEGACY_RECIPE_TYPE.getValue(type).read(buf)); + } + } + + record ModernRecipeHolderImpl(Key id, int type, LegacyRecipe recipe) implements LegacyRecipeHolder { + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeKey(this.id); + buf.writeVarInt(this.type); + this.recipe.write(buf); + } + + public static LegacyRecipeHolder read(FriendlyByteBuf buf) { + Key id = buf.readKey(); + int type = buf.readVarInt(); + return new ModernRecipeHolderImpl(id, type, BuiltInRegistries.LEGACY_RECIPE_TYPE.getValue(type).read(buf)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeTypes.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeTypes.java index e61c58503..f162b1be0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeTypes.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyRecipeTypes.java @@ -1,6 +1,10 @@ package net.momirealms.craftengine.core.item.recipe.network.legacy; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; import org.jetbrains.annotations.ApiStatus; @ApiStatus.Obsolete @@ -31,4 +35,34 @@ public final class LegacyRecipeTypes { public static final Key SMITHING_TRIM = Key.of("smithing_trim"); public static final Key DECORATED_POT_RECIPE = Key.of("crafting_decorated_pot"); + public static void register() { + register(SHAPED_RECIPE, new LegacyRecipe.Type(LegacyShapedRecipe::read)); + register(SHAPELESS_RECIPE, new LegacyRecipe.Type(LegacyShapelessRecipe::read)); + register(ARMOR_DYE, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(BOOK_CLONING, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(MAP_CLONING, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(MAP_EXTENDING, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(FIREWORK_ROCKET, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(FIREWORK_STAR, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(FIREWORK_STAR_FADE, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(TIPPED_ARROW, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(BANNER_DUPLICATE, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(SHIELD_DECORATION, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(SHULKER_BOX_COLORING, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(SUSPICIOUS_STEW, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(REPAIR_ITEM, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + register(SMELTING_RECIPE, new LegacyRecipe.Type(LegacyCookingRecipe::read)); + register(BLASTING_RECIPE, new LegacyRecipe.Type(LegacyCookingRecipe::read)); + register(SMOKING_RECIPE, new LegacyRecipe.Type(LegacyCookingRecipe::read)); + register(CAMPFIRE_COOKING_RECIPE, new LegacyRecipe.Type(LegacyCookingRecipe::read)); + register(STONECUTTER, new LegacyRecipe.Type(LegacyStoneCuttingRecipe::read)); + register(SMITHING_TRANSFORM, new LegacyRecipe.Type(LegacySmithingTransformRecipe::read)); + register(SMITHING_TRIM, new LegacyRecipe.Type(LegacySmithingTrimRecipe::read)); + register(DECORATED_POT_RECIPE, new LegacyRecipe.Type(LegacyCustomRecipe::read)); + } + + public static void register(Key key, LegacyRecipe.Type type) { + ((WritableRegistry) BuiltInRegistries.LEGACY_RECIPE_TYPE) + .register(ResourceKey.create(Registries.LEGACY_RECIPE_TYPE.location(), key), type); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java index 88747ff9f..b83159779 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java @@ -1,41 +1,45 @@ package net.momirealms.craftengine.core.item.recipe.network.legacy; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.FriendlyByteBuf; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; import java.util.List; -import java.util.function.BiFunction; +import java.util.function.BiConsumer; +import java.util.function.Function; @ApiStatus.Obsolete public class LegacyShapedRecipe implements LegacyRecipe { private final int width; private final int height; private final List ingredients; - private final Item result; - private final Key id; + private Item result; private final String group; private final CraftingRecipeCategory category; private final boolean showNotification; - public LegacyShapedRecipe(int width, int height, List ingredients, Item result, Key id, String group, CraftingRecipeCategory category, boolean showNotification) { + public LegacyShapedRecipe(int width, int height, + List ingredients, + Item result, + String group, + CraftingRecipeCategory category, + boolean showNotification) { this.category = category; this.width = width; this.height = height; this.ingredients = ingredients; this.result = result; - this.id = id; this.group = group; this.showNotification = showNotification; } - private static final BiFunction READER = VersionHelper.isOrAbove1_20_3() ? - (id, buf) -> { + private static final Function READER = VersionHelper.isOrAbove1_20_3() ? + (buf) -> { String group = buf.readUtf(); int category = buf.readVarInt(); int width = buf.readVarInt(); @@ -43,13 +47,13 @@ public class LegacyShapedRecipe implements LegacyRecipe { int size = width * height; List ingredients = new ArrayList<>(size); for (int i = 0; i < size; i++) { - ingredients.set(i, LegacyIngredient.read(buf)); + ingredients.add(LegacyIngredient.read(buf)); } - Item result = CraftEngine.instance().itemManager().decode(buf); + Item result = CraftEngine.instance().itemManager().decode(buf); boolean flag = buf.readBoolean(); - return new LegacyShapedRecipe(width, height, ingredients, result, id, group, CraftingRecipeCategory.byId(category), flag); + return new LegacyShapedRecipe(width, height, ingredients, result, group, CraftingRecipeCategory.byId(category), flag); } : - (id, buf) -> { + (buf) -> { int width = buf.readVarInt(); int height = buf.readVarInt(); String group = buf.readUtf(); @@ -57,19 +61,51 @@ public class LegacyShapedRecipe implements LegacyRecipe { int size = width * height; List ingredients = new ArrayList<>(size); for (int i = 0; i < size; i++) { - ingredients.set(i, LegacyIngredient.read(buf)); + ingredients.add(LegacyIngredient.read(buf)); } - Item result = CraftEngine.instance().itemManager().decode(buf); + Item result = CraftEngine.instance().itemManager().decode(buf); boolean flag = buf.readBoolean(); - return new LegacyShapedRecipe(width, height, ingredients, result, id, group, CraftingRecipeCategory.byId(category), flag); + return new LegacyShapedRecipe(width, height, ingredients, result, group, CraftingRecipeCategory.byId(category), flag); }; - public static LegacyShapedRecipe read(Key id, FriendlyByteBuf buf) { - return READER.apply(id, buf); + private static final BiConsumer WRITER = VersionHelper.isOrAbove1_20_3() ? + (recipe, buf) -> { + buf.writeUtf(recipe.group); + buf.writeVarInt(recipe.category.ordinal()); + buf.writeVarInt(recipe.width); + buf.writeVarInt(recipe.height); + for (LegacyIngredient ingredient : recipe.ingredients) { + ingredient.write(buf); + } + CraftEngine.instance().itemManager().encode(buf, recipe.result); + buf.writeBoolean(recipe.showNotification); + } : + (recipe, buf) -> { + buf.writeVarInt(recipe.width); + buf.writeVarInt(recipe.height); + buf.writeUtf(recipe.group); + buf.writeVarInt(recipe.category.ordinal()); + for (LegacyIngredient ingredient : recipe.ingredients) { + ingredient.write(buf); + } + CraftEngine.instance().itemManager().encode(buf, recipe.result); + buf.writeBoolean(recipe.showNotification); + }; + + @Override + public void applyClientboundData(Player player) { + this.result = CraftEngine.instance().itemManager().s2c(this.result, player); + for (LegacyIngredient ingredient : this.ingredients) { + ingredient.applyClientboundData(player); + } + } + + public static LegacyShapedRecipe read(FriendlyByteBuf buf) { + return READER.apply(buf); } @Override public void write(FriendlyByteBuf buf) { - + WRITER.accept(this, buf); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java new file mode 100644 index 000000000..11e26ba43 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import org.jetbrains.annotations.ApiStatus; + +import java.util.ArrayList; +import java.util.List; + +@ApiStatus.Obsolete +public class LegacyShapelessRecipe implements LegacyRecipe { + private final List ingredients; + private Item result; + private final String group; + private final CraftingRecipeCategory category; + + public LegacyShapelessRecipe(List ingredients, + Item result, + String group, + CraftingRecipeCategory category) { + this.category = category; + this.ingredients = ingredients; + this.result = result; + this.group = group; + } + + @Override + public void applyClientboundData(Player player) { + this.result = CraftEngine.instance().itemManager().s2c(this.result, player); + for (LegacyIngredient ingredient : this.ingredients) { + ingredient.applyClientboundData(player); + } + } + + public static LegacyShapelessRecipe read(FriendlyByteBuf buf) { + String group = buf.readUtf(); + CraftingRecipeCategory category = CraftingRecipeCategory.byId(buf.readVarInt()); + List ingredient = buf.readCollection(ArrayList::new, LegacyIngredient::read); + Item result = CraftEngine.instance().itemManager().decode(buf); + return new LegacyShapelessRecipe(ingredient, result, group, category); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeUtf(this.group); + buf.writeVarInt(this.category.ordinal()); + buf.writeCollection(this.ingredients, (byteBuf, legacyIngredient) -> legacyIngredient.write(buf)); + CraftEngine.instance().itemManager().encode(buf, this.result); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java new file mode 100644 index 000000000..cf9f51314 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Obsolete +public class LegacySmithingTransformRecipe implements LegacyRecipe { + private final LegacyIngredient template; + private final LegacyIngredient base; + private final LegacyIngredient addition; + private Item result; + + public LegacySmithingTransformRecipe(LegacyIngredient addition, LegacyIngredient template, LegacyIngredient base, Item result) { + this.addition = addition; + this.template = template; + this.base = base; + this.result = result; + } + + @Override + public void applyClientboundData(Player player) { + this.result = CraftEngine.instance().itemManager().s2c(this.result, player); + this.template.applyClientboundData(player); + this.base.applyClientboundData(player); + this.addition.applyClientboundData(player); + } + + public static LegacySmithingTransformRecipe read(FriendlyByteBuf buf) { + LegacyIngredient template = LegacyIngredient.read(buf); + LegacyIngredient base = LegacyIngredient.read(buf); + LegacyIngredient addition = LegacyIngredient.read(buf); + Item result = CraftEngine.instance().itemManager().decode(buf); + return new LegacySmithingTransformRecipe(template, base, addition, result); + } + + @Override + public void write(FriendlyByteBuf buf) { + this.template.write(buf); + this.base.write(buf); + this.addition.write(buf); + CraftEngine.instance().itemManager().encode(buf, this.result); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTrimRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTrimRecipe.java new file mode 100644 index 000000000..55159bfab --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTrimRecipe.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Obsolete +public class LegacySmithingTrimRecipe implements LegacyRecipe { + private final LegacyIngredient template; + private final LegacyIngredient base; + private final LegacyIngredient addition; + + public LegacySmithingTrimRecipe(LegacyIngredient addition, LegacyIngredient template, LegacyIngredient base) { + this.addition = addition; + this.template = template; + this.base = base; + } + + @Override + public void applyClientboundData(Player player) { + this.template.applyClientboundData(player); + this.base.applyClientboundData(player); + this.addition.applyClientboundData(player); + } + + public static LegacySmithingTrimRecipe read(FriendlyByteBuf buf) { + LegacyIngredient template = LegacyIngredient.read(buf); + LegacyIngredient base = LegacyIngredient.read(buf); + LegacyIngredient addition = LegacyIngredient.read(buf); + return new LegacySmithingTrimRecipe(template, base, addition); + } + + @Override + public void write(FriendlyByteBuf buf) { + this.template.write(buf); + this.base.write(buf); + this.addition.write(buf); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyStoneCuttingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyStoneCuttingRecipe.java new file mode 100644 index 000000000..e07c6f7d9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyStoneCuttingRecipe.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.item.recipe.network.legacy; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Obsolete +public class LegacyStoneCuttingRecipe implements LegacyRecipe { + private Item result; + private final String group; + private final LegacyIngredient ingredient; + + public LegacyStoneCuttingRecipe(LegacyIngredient ingredient, + Item result, + String group) { + this.ingredient = ingredient; + this.result = result; + this.group = group; + } + + @Override + public void applyClientboundData(Player player) { + this.result = CraftEngine.instance().itemManager().s2c(this.result, player); + this.ingredient.applyClientboundData(player); + } + + public static LegacyStoneCuttingRecipe read(FriendlyByteBuf buf) { + String group = buf.readUtf(); + LegacyIngredient ingredient = LegacyIngredient.read(buf); + Item result = CraftEngine.instance().itemManager().decode(buf); + return new LegacyStoneCuttingRecipe(ingredient, result, group); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeUtf(this.group); + this.ingredient.write(buf); + CraftEngine.instance().itemManager().encode(buf, this.result); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/RecipeDisplays.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/RecipeDisplayTypes.java similarity index 76% rename from core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/RecipeDisplays.java rename to core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/RecipeDisplayTypes.java index e651019ad..da82d2a0d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/RecipeDisplays.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/RecipeDisplayTypes.java @@ -1,14 +1,13 @@ package net.momirealms.craftengine.core.item.recipe.network.modern.display; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; -public final class RecipeDisplays { - private RecipeDisplays() {} +public final class RecipeDisplayTypes { + private RecipeDisplayTypes() {} public static final Key CRAFTING_SHAPELESS = Key.of("crafting_shapeless"); public static final Key CRAFTING_SHAPED = Key.of("crafting_shaped"); @@ -25,8 +24,6 @@ public final class RecipeDisplays { } public static void register(Key key, RecipeDisplay.Type type) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RECIPE_DISPLAY_TYPE) - .registerForHolder(new ResourceKey<>(Registries.RECIPE_DISPLAY_TYPE.location(), key)); - holder.bindValue(type); + ((WritableRegistry) BuiltInRegistries.RECIPE_DISPLAY_TYPE).register(ResourceKey.create(Registries.RECIPE_DISPLAY_TYPE.location(), key), type); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/SlotDisplays.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/SlotDisplayTypes.java similarity index 80% rename from core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/SlotDisplays.java rename to core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/SlotDisplayTypes.java index 27d85ce02..36e63baf4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/SlotDisplays.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/modern/display/slot/SlotDisplayTypes.java @@ -1,14 +1,13 @@ package net.momirealms.craftengine.core.item.recipe.network.modern.display.slot; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; -public final class SlotDisplays { - private SlotDisplays() {} +public final class SlotDisplayTypes { + private SlotDisplayTypes() {} public static final Key EMPTY = Key.of("empty"); public static final Key ANY_FUEL = Key.of("any_fuel"); @@ -31,8 +30,7 @@ public final class SlotDisplays { } public static void register(Key key, SlotDisplay.Type type) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SLOT_DISPLAY_TYPE) - .registerForHolder(new ResourceKey<>(Registries.SLOT_DISPLAY_TYPE.location(), key)); - holder.bindValue(type); + ((WritableRegistry) BuiltInRegistries.SLOT_DISPLAY_TYPE) + .register(ResourceKey.create(Registries.SLOT_DISPLAY_TYPE.location(), key), type); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java index 0f43e96d8..1336472bd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -41,9 +40,8 @@ public class LootConditions { } public static void register(Key key, ConditionFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_CONDITION_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.LOOT_CONDITION_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.LOOT_CONDITION_FACTORY) + .register(ResourceKey.create(Registries.LOOT_CONDITION_FACTORY.location(), key), factory); } public static Predicate andConditions(List> predicates) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java index 2d27fb6f1..d2d8abaeb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -27,9 +26,8 @@ public class LootEntryContainers { } public static void register(Key key, LootEntryContainerFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.LOOT_ENTRY_CONTAINER_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY) + .register(ResourceKey.create(Registries.LOOT_ENTRY_CONTAINER_FACTORY.location(), key), factory); } public static List> fromMapList(List> mapList) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java index 1e6606081..c0475500d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -8,7 +8,6 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.*; @@ -81,9 +80,8 @@ public class ApplyBonusCountFunction extends AbstractLootConditionalFunction< } public static void register(Key key, FormulaFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.FORMULA_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.FORMULA_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.FORMULA_FACTORY) + .register(ResourceKey.create(Registries.FORMULA_FACTORY.location(), key), factory); } public static Formula fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java index e380bf022..c2233c20f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -30,9 +29,8 @@ public class LootFunctions { } public static void register(Key key, LootFunctionFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_FUNCTION_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.LOOT_FUNCTION_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.LOOT_FUNCTION_FACTORY) + .register(ResourceKey.create(Registries.LOOT_FUNCTION_FACTORY.location(), key), factory); } public static BiFunction, LootContext, Item> identity() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index 7bffb8178..c3674f5c0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -5,7 +5,6 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -37,9 +36,8 @@ public class PathMatchers { } public static void register(Key key, ConditionFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.PATH_MATCHER_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.PATH_MATCHER_FACTORY) + .register(ResourceKey.create(Registries.PATH_MATCHER_FACTORY.location(), key), factory); } public static List> fromMapList(List> arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java index b80302a07..9d16ffa7d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.pack.conflict.resolution; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -27,8 +26,7 @@ public class Resolutions { } public static void register(Key key, ResolutionFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RESOLUTION_FACTORY).registerForHolder(new ResourceKey<>(Registries.RESOLUTION_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.RESOLUTION_FACTORY).register(ResourceKey.create(Registries.RESOLUTION_FACTORY.location(), key), factory); } public static Resolution fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java index 3c88658fd..8d754cd62 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHosts.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.host; import net.momirealms.craftengine.core.pack.host.impl.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -35,9 +34,8 @@ public class ResourcePackHosts { } public static void register(Key key, ResourcePackHostFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RESOURCE_PACK_HOST_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.RESOURCE_PACK_HOST_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.RESOURCE_PACK_HOST_FACTORY) + .register(ResourceKey.create(Registries.RESOURCE_PACK_HOST_FACTORY.location(), key), factory); } public static ResourcePackHost fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java index c4e5618c7..60eaeedb5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.model; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -41,15 +40,13 @@ public class ItemModels { } public static void registerFactory(Key key, ItemModelFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_MODEL_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.ITEM_MODEL_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.ITEM_MODEL_FACTORY) + .register(ResourceKey.create(Registries.ITEM_MODEL_FACTORY.location(), key), factory); } public static void registerReader(Key key, ItemModelReader reader) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_MODEL_READER) - .registerForHolder(new ResourceKey<>(Registries.ITEM_MODEL_READER.location(), key)); - holder.bindValue(reader); + ((WritableRegistry) BuiltInRegistries.ITEM_MODEL_READER) + .register(ResourceKey.create(Registries.ITEM_MODEL_READER.location(), key), reader); } public static ItemModel fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java index 8c3c990b1..f2d5022fa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.model.condition; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -57,15 +56,13 @@ public class ConditionProperties { } public static void registerFactory(Key key, ConditionPropertyFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.CONDITION_PROPERTY_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.CONDITION_PROPERTY_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.CONDITION_PROPERTY_FACTORY) + .register(ResourceKey.create(Registries.CONDITION_PROPERTY_FACTORY.location(), key), factory); } public static void registerReader(Key key, ConditionPropertyReader reader) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.CONDITION_PROPERTY_READER) - .registerForHolder(new ResourceKey<>(Registries.CONDITION_PROPERTY_READER.location(), key)); - holder.bindValue(reader); + ((WritableRegistry) BuiltInRegistries.CONDITION_PROPERTY_READER) + .register(ResourceKey.create(Registries.CONDITION_PROPERTY_READER.location(), key), reader); } public static ConditionProperty fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java index 5b6033ce4..a8f09bcc0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.model.rangedisptach; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -48,15 +47,13 @@ public class RangeDispatchProperties { } public static void registerFactory(Key key, RangeDispatchPropertyFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.RANGE_DISPATCH_PROPERTY_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY) + .register(ResourceKey.create(Registries.RANGE_DISPATCH_PROPERTY_FACTORY.location(), key), factory); } public static void registerReader(Key key, RangeDispatchPropertyReader reader) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RANGE_DISPATCH_PROPERTY_READER) - .registerForHolder(new ResourceKey<>(Registries.RANGE_DISPATCH_PROPERTY_READER.location(), key)); - holder.bindValue(reader); + ((WritableRegistry) BuiltInRegistries.RANGE_DISPATCH_PROPERTY_READER) + .register(ResourceKey.create(Registries.RANGE_DISPATCH_PROPERTY_READER.location(), key), reader); } public static RangeDispatchProperty fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java index f1cd14106..3027db6ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.model.select; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -48,15 +47,13 @@ public class SelectProperties { } public static void registerFactory(Key key, SelectPropertyFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SELECT_PROPERTY_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.SELECT_PROPERTY_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.SELECT_PROPERTY_FACTORY) + .register(ResourceKey.create(Registries.SELECT_PROPERTY_FACTORY.location(), key), factory); } public static void registerReader(Key key, SelectPropertyReader reader) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SELECT_PROPERTY_READER) - .registerForHolder(new ResourceKey<>(Registries.SELECT_PROPERTY_READER.location(), key)); - holder.bindValue(reader); + ((WritableRegistry) BuiltInRegistries.SELECT_PROPERTY_READER) + .register(ResourceKey.create(Registries.SELECT_PROPERTY_READER.location(), key), reader); } public static SelectProperty fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java index 16256d869..73f91a271 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.model.special; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -54,15 +53,13 @@ public class SpecialModels { } public static void registerFactory(Key key, SpecialModelFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SPECIAL_MODEL_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.SPECIAL_MODEL_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.SPECIAL_MODEL_FACTORY) + .register(ResourceKey.create(Registries.SPECIAL_MODEL_FACTORY.location(), key), factory); } - public static void registerReader(Key key, SpecialModelReader factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SPECIAL_MODEL_READER) - .registerForHolder(new ResourceKey<>(Registries.SPECIAL_MODEL_READER.location(), key)); - holder.bindValue(factory); + public static void registerReader(Key key, SpecialModelReader reader) { + ((WritableRegistry) BuiltInRegistries.SPECIAL_MODEL_READER) + .register(ResourceKey.create(Registries.SPECIAL_MODEL_READER.location(), key), reader); } public static SpecialModel fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java index 2aa81c197..d44d3102d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.pack.model.tint; import com.google.gson.JsonObject; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -42,15 +41,13 @@ public class Tints { } public static void registerFactory(Key key, TintFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TINT_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.TINT_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.TINT_FACTORY) + .register(ResourceKey.create(Registries.TINT_FACTORY.location(), key), factory); } public static void registerReader(Key key, TintReader reader) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TINT_READER) - .registerForHolder(new ResourceKey<>(Registries.TINT_READER.location(), key)); - holder.bindValue(reader); + ((WritableRegistry) BuiltInRegistries.TINT_READER) + .register(ResourceKey.create(Registries.TINT_READER.location(), key), reader); } public static Tint fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index e5a06c02a..ea29e3598 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -7,8 +7,9 @@ import net.momirealms.craftengine.core.entity.projectile.ProjectileManager; import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.item.recipe.RecipeManager; -import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplays; -import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplays; +import net.momirealms.craftengine.core.item.recipe.network.legacy.LegacyRecipeTypes; +import net.momirealms.craftengine.core.item.recipe.network.modern.display.RecipeDisplayTypes; +import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.SlotDisplayTypes; import net.momirealms.craftengine.core.loot.VanillaLootManager; import net.momirealms.craftengine.core.pack.PackManager; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; @@ -95,8 +96,9 @@ public abstract class CraftEngine implements Plugin { } protected void onPluginLoad() { - RecipeDisplays.register(); - SlotDisplays.register(); + RecipeDisplayTypes.register(); + SlotDisplayTypes.register(); + LegacyRecipeTypes.register(); ((Logger) LogManager.getRootLogger()).addFilter(new LogFilter()); ((Logger) LogManager.getRootLogger()).addFilter(new DisconnectLogFilter()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java index b920c0d68..82fd38d45 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.core.plugin.config.template; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -19,9 +18,8 @@ public class TemplateArguments { public static final Key OBJECT = Key.of("craftengine:object"); // No Factory, internal use public static void register(Key key, TemplateArgumentFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.TEMPLATE_ARGUMENT_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY) + .register(ResourceKey.create(Registries.TEMPLATE_ARGUMENT_FACTORY.location(), key), factory); } static { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java index 5e6a110fa..e5fc50979 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java @@ -5,7 +5,6 @@ import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -40,9 +39,8 @@ public class EventConditions { } public static void register(Key key, ConditionFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.EVENT_CONDITION_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.EVENT_CONDITION_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.EVENT_CONDITION_FACTORY) + .register(ResourceKey.create(Registries.EVENT_CONDITION_FACTORY.location(), key), factory); } public static Condition fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java index 8613eb5c4..1541a39d2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.function.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -42,9 +41,8 @@ public class EventFunctions { } public static void register(Key key, FunctionFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.EVENT_FUNCTION_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.EVENT_FUNCTION_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.EVENT_FUNCTION_FACTORY) + .register(ResourceKey.create(Registries.EVENT_FUNCTION_FACTORY.location(), key), factory); } public static Function fromMap(Map map) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java index 2d7fb1591..22b698c86 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/number/NumberProviders.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.context.number; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -27,9 +26,8 @@ public class NumberProviders { } public static void register(Key key, NumberProviderFactory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.NUMBER_PROVIDER_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.NUMBER_PROVIDER_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry) BuiltInRegistries.NUMBER_PROVIDER_FACTORY) + .register(ResourceKey.create(Registries.NUMBER_PROVIDER_FACTORY.location(), key), factory); } public static List fromMapList(List> mapList) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java index c1198e8d9..ab5d4a7ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; @@ -26,9 +25,8 @@ public class PlayerSelectors { } public static void register(Key key, PlayerSelectorFactory factory) { - Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.PLAYER_SELECTOR_FACTORY) - .registerForHolder(new ResourceKey<>(Registries.PLAYER_SELECTOR_FACTORY.location(), key)); - holder.bindValue(factory); + ((WritableRegistry>) BuiltInRegistries.PLAYER_SELECTOR_FACTORY) + .register(ResourceKey.create(Registries.PLAYER_SELECTOR_FACTORY.location(), key), factory); } @Nullable diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/AbstractMappedRegistry.java similarity index 60% rename from core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java rename to core/src/main/java/net/momirealms/craftengine/core/registry/AbstractMappedRegistry.java index 85be047f2..efefaa5ba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/AbstractMappedRegistry.java @@ -7,13 +7,13 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -public class MappedRegistry implements WritableRegistry { - private final ResourceKey> key; - private final Map> byResourceLocation = new HashMap<>(512); - private final Map, Holder.Reference> byResourceKey = new HashMap<>(512); - private final List> byId = new ArrayList<>(512); +public abstract class AbstractMappedRegistry implements WritableRegistry { + protected final ResourceKey> key; + protected final Map> byResourceLocation = new HashMap<>(512); + protected final Map, Holder.Reference> byResourceKey = new HashMap<>(512); + protected final List> byId = new ArrayList<>(512); - public MappedRegistry(ResourceKey> key) { + protected AbstractMappedRegistry(ResourceKey> key) { this.key = key; } @@ -22,30 +22,6 @@ public class MappedRegistry implements WritableRegistry { return this.key; } - @Override - public Holder.Reference registerForHolder(ResourceKey key) { - Objects.requireNonNull(key); - if (!key.registry().equals(this.key.location())) { - throw new IllegalStateException(key + " is not allowed to be registered in " + this.key); - } - if (this.byResourceLocation.containsKey(key.location())) { - throw new IllegalStateException("Adding duplicate key '" + key + "' to registry"); - } else { - Holder.Reference reference = this.byResourceKey.computeIfAbsent(key, k -> Holder.Reference.create(this, k)); - this.byResourceKey.put(key, reference); - this.byResourceLocation.put(key.location(), reference); - this.byId.add(reference); - return reference; - } - } - - @Override - public Holder.Reference register(ResourceKey key, T value) { - Holder.Reference holder = registerForHolder(key); - holder.bindValue(value); - return holder; - } - @Nullable @Override public T getValue(@Nullable ResourceKey key) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index ebf61f2d6..b54673e5a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -40,44 +40,48 @@ import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; public class BuiltInRegistries { - public static final Registry BLOCK = createRegistry(Registries.BLOCK); - public static final Registry OPTIMIZED_ITEM_ID = createRegistry(Registries.OPTIMIZED_ITEM_ID); - public static final Registry BLOCK_BEHAVIOR_FACTORY = createRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); - public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); - public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); - public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); - public static final Registry> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); - public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); - public static final Registry NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); - public static final Registry TEMPLATE_ARGUMENT_FACTORY = createRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); - public static final Registry ITEM_MODEL_FACTORY = createRegistry(Registries.ITEM_MODEL_FACTORY); - public static final Registry ITEM_MODEL_READER = createRegistry(Registries.ITEM_MODEL_READER); - public static final Registry TINT_FACTORY = createRegistry(Registries.TINT_FACTORY); - public static final Registry TINT_READER = createRegistry(Registries.TINT_READER); - public static final Registry SPECIAL_MODEL_FACTORY = createRegistry(Registries.SPECIAL_MODEL_FACTORY); - public static final Registry SPECIAL_MODEL_READER = createRegistry(Registries.SPECIAL_MODEL_READER); - public static final Registry RANGE_DISPATCH_PROPERTY_FACTORY = createRegistry(Registries.RANGE_DISPATCH_PROPERTY_FACTORY); - public static final Registry RANGE_DISPATCH_PROPERTY_READER = createRegistry(Registries.RANGE_DISPATCH_PROPERTY_READER); - public static final Registry CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY); - public static final Registry CONDITION_PROPERTY_READER = createRegistry(Registries.CONDITION_PROPERTY_READER); - public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); - public static final Registry SELECT_PROPERTY_READER = createRegistry(Registries.SELECT_PROPERTY_READER); - public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); - public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); - public static final Registry> PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); - public static final Registry RESOLUTION_FACTORY = createRegistry(Registries.RESOLUTION_FACTORY); - public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); - public static final Registry HITBOX_FACTORY = createRegistry(Registries.HITBOX_FACTORY); - public static final Registry RESOURCE_PACK_HOST_FACTORY = createRegistry(Registries.RESOURCE_PACK_HOST_FACTORY); - public static final Registry> EVENT_FUNCTION_FACTORY = createRegistry(Registries.EVENT_FUNCTION_FACTORY); - public static final Registry> EVENT_CONDITION_FACTORY = createRegistry(Registries.EVENT_CONDITION_FACTORY); - public static final Registry> PLAYER_SELECTOR_FACTORY = createRegistry(Registries.PLAYER_SELECTOR_FACTORY); - public static final Registry EQUIPMENT_FACTORY = createRegistry(Registries.EQUIPMENT_FACTORY); - public static final Registry SLOT_DISPLAY_TYPE = createRegistry(Registries.SLOT_DISPLAY_TYPE); - public static final Registry RECIPE_DISPLAY_TYPE = createRegistry(Registries.RECIPE_DISPLAY_TYPE); - public static final Registry LEGACY_RECIPE_TYPE = createRegistry(Registries.LEGACY_RECIPE_TYPE); + public static final Registry BLOCK = createDynamicBoundRegistry(Registries.BLOCK); + public static final Registry OPTIMIZED_ITEM_ID = createConstantBoundRegistry(Registries.OPTIMIZED_ITEM_ID); + public static final Registry BLOCK_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); + public static final Registry ITEM_BEHAVIOR_FACTORY = createConstantBoundRegistry(Registries.ITEM_BEHAVIOR_FACTORY); + public static final Registry PROPERTY_FACTORY = createConstantBoundRegistry(Registries.PROPERTY_FACTORY); + public static final Registry> LOOT_FUNCTION_FACTORY = createConstantBoundRegistry(Registries.LOOT_FUNCTION_FACTORY); + public static final Registry> LOOT_CONDITION_FACTORY = createConstantBoundRegistry(Registries.LOOT_CONDITION_FACTORY); + public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createConstantBoundRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); + public static final Registry NUMBER_PROVIDER_FACTORY = createConstantBoundRegistry(Registries.NUMBER_PROVIDER_FACTORY); + public static final Registry TEMPLATE_ARGUMENT_FACTORY = createConstantBoundRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); + public static final Registry ITEM_MODEL_FACTORY = createConstantBoundRegistry(Registries.ITEM_MODEL_FACTORY); + public static final Registry ITEM_MODEL_READER = createConstantBoundRegistry(Registries.ITEM_MODEL_READER); + public static final Registry TINT_FACTORY = createConstantBoundRegistry(Registries.TINT_FACTORY); + public static final Registry TINT_READER = createConstantBoundRegistry(Registries.TINT_READER); + public static final Registry SPECIAL_MODEL_FACTORY = createConstantBoundRegistry(Registries.SPECIAL_MODEL_FACTORY); + public static final Registry SPECIAL_MODEL_READER = createConstantBoundRegistry(Registries.SPECIAL_MODEL_READER); + public static final Registry RANGE_DISPATCH_PROPERTY_FACTORY = createConstantBoundRegistry(Registries.RANGE_DISPATCH_PROPERTY_FACTORY); + public static final Registry RANGE_DISPATCH_PROPERTY_READER = createConstantBoundRegistry(Registries.RANGE_DISPATCH_PROPERTY_READER); + public static final Registry CONDITION_PROPERTY_FACTORY = createConstantBoundRegistry(Registries.CONDITION_PROPERTY_FACTORY); + public static final Registry CONDITION_PROPERTY_READER = createConstantBoundRegistry(Registries.CONDITION_PROPERTY_READER); + public static final Registry SELECT_PROPERTY_FACTORY = createConstantBoundRegistry(Registries.SELECT_PROPERTY_FACTORY); + public static final Registry SELECT_PROPERTY_READER = createConstantBoundRegistry(Registries.SELECT_PROPERTY_READER); + public static final Registry> RECIPE_FACTORY = createConstantBoundRegistry(Registries.RECIPE_FACTORY); + public static final Registry FORMULA_FACTORY = createConstantBoundRegistry(Registries.FORMULA_FACTORY); + public static final Registry> PATH_MATCHER_FACTORY = createConstantBoundRegistry(Registries.PATH_MATCHER_FACTORY); + public static final Registry RESOLUTION_FACTORY = createConstantBoundRegistry(Registries.RESOLUTION_FACTORY); + public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createConstantBoundRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); + public static final Registry HITBOX_FACTORY = createConstantBoundRegistry(Registries.HITBOX_FACTORY); + public static final Registry RESOURCE_PACK_HOST_FACTORY = createConstantBoundRegistry(Registries.RESOURCE_PACK_HOST_FACTORY); + public static final Registry> EVENT_FUNCTION_FACTORY = createConstantBoundRegistry(Registries.EVENT_FUNCTION_FACTORY); + public static final Registry> EVENT_CONDITION_FACTORY = createConstantBoundRegistry(Registries.EVENT_CONDITION_FACTORY); + public static final Registry> PLAYER_SELECTOR_FACTORY = createConstantBoundRegistry(Registries.PLAYER_SELECTOR_FACTORY); + public static final Registry EQUIPMENT_FACTORY = createConstantBoundRegistry(Registries.EQUIPMENT_FACTORY); + public static final Registry SLOT_DISPLAY_TYPE = createConstantBoundRegistry(Registries.SLOT_DISPLAY_TYPE); + public static final Registry RECIPE_DISPLAY_TYPE = createConstantBoundRegistry(Registries.RECIPE_DISPLAY_TYPE); + public static final Registry LEGACY_RECIPE_TYPE = createConstantBoundRegistry(Registries.LEGACY_RECIPE_TYPE); - private static Registry createRegistry(ResourceKey> key) { - return new MappedRegistry<>(key); + private static Registry createConstantBoundRegistry(ResourceKey> key) { + return new ConstantBoundRegistry<>(key); + } + + private static Registry createDynamicBoundRegistry(ResourceKey> key) { + return new DynamicBoundRegistry<>(key); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/ConstantBoundRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/ConstantBoundRegistry.java new file mode 100644 index 000000000..cf3da4675 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/ConstantBoundRegistry.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.registry; + +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Objects; + +public class ConstantBoundRegistry extends AbstractMappedRegistry { + protected final Reference2IntMap toId = MCUtils.make(new Reference2IntOpenHashMap<>(), map -> map.defaultReturnValue(-1)); + protected final Map> byValue = new IdentityHashMap<>(512); + + public ConstantBoundRegistry(ResourceKey> key) { + super(key); + } + + @Override + public Holder.Reference registerForHolder(ResourceKey key) { + throw new IllegalArgumentException("Cannot register a holder for a MappedRegistry"); + } + + @Override + public Holder.Reference register(ResourceKey key, T value) { + Objects.requireNonNull(key); + if (!key.registry().equals(super.key.location())) { + throw new IllegalStateException(key + " is not allowed to be registered in " + this.key); + } + if (this.byResourceLocation.containsKey(key.location())) { + throw new IllegalStateException("Adding duplicate key '" + key + "' to registry"); + } else { + Holder.Reference reference = this.byResourceKey.computeIfAbsent(key, k -> Holder.Reference.createConstant(this, k, value)); + this.byResourceKey.put(key, reference); + this.byResourceLocation.put(key.location(), reference); + int size = this.byId.size(); + this.byId.add(reference); + this.toId.put(value, size); + this.byValue.put(value, reference); + return reference; + } + } + + @Override + public int getId(T value) { + return this.toId.getInt(value); + } + + @Override + public Key getKey(T value) { + Holder.Reference reference = this.byValue.get(value); + if (reference == null) return null; + return reference.key().location(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/DynamicBoundRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/DynamicBoundRegistry.java new file mode 100644 index 000000000..47808d13f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/DynamicBoundRegistry.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class DynamicBoundRegistry extends AbstractMappedRegistry { + + public DynamicBoundRegistry(ResourceKey> key) { + super(key); + } + + @Override + public Holder.Reference registerForHolder(ResourceKey key) { + Objects.requireNonNull(key); + if (!key.registry().equals(this.key.location())) { + throw new IllegalStateException(key + " is not allowed to be registered in " + this.key); + } + if (this.byResourceLocation.containsKey(key.location())) { + throw new IllegalStateException("Adding duplicate key '" + key + "' to registry"); + } else { + Holder.Reference reference = this.byResourceKey.computeIfAbsent(key, k -> Holder.Reference.create(this, k)); + this.byResourceKey.put(key, reference); + this.byResourceLocation.put(key.location(), reference); + this.byId.add(reference); + return reference; + } + } + + @Override + public Holder.Reference register(ResourceKey key, T value) { + Holder.Reference holder = registerForHolder(key); + holder.bindValue(value); + return holder; + } + + @Override + public int getId(@Nullable T value) { + throw new UnsupportedOperationException("getId is not supported for dynamic bound registry"); + } + + @Override + public Key getKey(T value) { + throw new UnsupportedOperationException("getKey is not supported for dynamic bound registry"); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java index d4aae38ea..b1e319931 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java @@ -118,6 +118,10 @@ public interface Holder { return new Reference<>(owner, registryKey, null); } + public static Reference createConstant(Owner owner, ResourceKey registryKey, T value) { + return new Constant<>(owner, registryKey, value); + } + public ResourceKey key() { if (this.key == null) { throw new IllegalStateException("Trying to access unbound value '" + this.value + "' from registry " + this.owner); @@ -204,6 +208,18 @@ public interface Holder { public String toString() { return "Reference{" + this.key + "=" + this.value + "}"; } + + static class Constant extends Reference { + + public Constant(Owner owner, @Nullable ResourceKey key, @Nullable A value) { + super(owner, key, value); + } + + @Override + public void bindValue(A value) { + throw new UnsupportedOperationException(); + } + } } interface Owner { diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index ac5144e23..cbdfba555 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -41,40 +41,40 @@ import net.momirealms.craftengine.core.util.ResourceKey; public class Registries { public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root"); - public static final ResourceKey> BLOCK = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("block")); - public static final ResourceKey> OPTIMIZED_ITEM_ID = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("optimized_item_id")); - public static final ResourceKey> PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory")); - public static final ResourceKey> BLOCK_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_factory")); - public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); - public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); - public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); - public static final ResourceKey>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); - public static final ResourceKey> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); - public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); - public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); - public static final ResourceKey> ITEM_MODEL_READER = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_reader")); - public static final ResourceKey> TINT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("tint_factory")); - public static final ResourceKey> TINT_READER = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("tint_reader")); - public static final ResourceKey> SPECIAL_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("special_model_factory")); - public static final ResourceKey> SPECIAL_MODEL_READER = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("special_model_reader")); - public static final ResourceKey> RANGE_DISPATCH_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("range_dispatch_property_factory")); - public static final ResourceKey> RANGE_DISPATCH_PROPERTY_READER = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("range_dispatch_property_reader")); - public static final ResourceKey> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); - public static final ResourceKey> CONDITION_PROPERTY_READER = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_reader")); - public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); - public static final ResourceKey> SELECT_PROPERTY_READER = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_reader")); - public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); - public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); - public static final ResourceKey>> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); - public static final ResourceKey> RESOLUTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); - public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); - public static final ResourceKey> HITBOX_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("hitbox_factory")); - public static final ResourceKey> RESOURCE_PACK_HOST_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resource_pack_host_factory")); - public static final ResourceKey>> EVENT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("event_function_factory")); - public static final ResourceKey>> EVENT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("event_condition_factory")); - public static final ResourceKey>> PLAYER_SELECTOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_selector_factory")); - public static final ResourceKey> EQUIPMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("equipment_factory")); - public static final ResourceKey> SLOT_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("slot_display_type")); - public static final ResourceKey> RECIPE_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type")); - public static final ResourceKey> LEGACY_RECIPE_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("legacy_recipe_type")); + public static final ResourceKey> BLOCK = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block")); + public static final ResourceKey> OPTIMIZED_ITEM_ID = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("optimized_item_id")); + public static final ResourceKey> PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory")); + public static final ResourceKey> BLOCK_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_factory")); + public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); + public static final ResourceKey>> LOOT_FUNCTION_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); + public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); + public static final ResourceKey>> LOOT_CONDITION_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); + public static final ResourceKey> NUMBER_PROVIDER_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); + public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); + public static final ResourceKey> ITEM_MODEL_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); + public static final ResourceKey> ITEM_MODEL_READER = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_reader")); + public static final ResourceKey> TINT_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("tint_factory")); + public static final ResourceKey> TINT_READER = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("tint_reader")); + public static final ResourceKey> SPECIAL_MODEL_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("special_model_factory")); + public static final ResourceKey> SPECIAL_MODEL_READER = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("special_model_reader")); + public static final ResourceKey> RANGE_DISPATCH_PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("range_dispatch_property_factory")); + public static final ResourceKey> RANGE_DISPATCH_PROPERTY_READER = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("range_dispatch_property_reader")); + public static final ResourceKey> CONDITION_PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); + public static final ResourceKey> CONDITION_PROPERTY_READER = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_reader")); + public static final ResourceKey> SELECT_PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); + public static final ResourceKey> SELECT_PROPERTY_READER = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_reader")); + public static final ResourceKey>> RECIPE_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); + public static final ResourceKey> FORMULA_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); + public static final ResourceKey>> PATH_MATCHER_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); + public static final ResourceKey> RESOLUTION_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); + public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); + public static final ResourceKey> HITBOX_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("hitbox_factory")); + public static final ResourceKey> RESOURCE_PACK_HOST_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("resource_pack_host_factory")); + public static final ResourceKey>> EVENT_FUNCTION_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("event_function_factory")); + public static final ResourceKey>> EVENT_CONDITION_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("event_condition_factory")); + public static final ResourceKey>> PLAYER_SELECTOR_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("player_selector_factory")); + public static final ResourceKey> EQUIPMENT_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("equipment_factory")); + public static final ResourceKey> SLOT_DISPLAY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("slot_display_type")); + public static final ResourceKey> RECIPE_DISPLAY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type")); + public static final ResourceKey> LEGACY_RECIPE_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("legacy_recipe_type")); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java index e61adefe7..ef9a3438a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java @@ -21,6 +21,10 @@ public interface Registry extends Holder.Owner { @Nullable T getValue(int id); + int getId(T value); + + Key getKey(T value); + Set keySet(); Set, T>> entrySet(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java index bd485a885..a618f02c7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java @@ -6,6 +6,10 @@ public interface WritableRegistry extends Registry { Holder.Reference registerForHolder(ResourceKey key); + default Holder.Reference getOrRegisterForHolder(ResourceKey key) { + return this.get(key).orElseGet(() -> registerForHolder(key)); + } + Holder.Reference register(ResourceKey key, T value); boolean isEmpty(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java index 06fa2f6c9..c78cd94c4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java @@ -365,6 +365,10 @@ public class FriendlyByteBuf extends ByteBuf { return registry.getValue(id); } + public void writeById(Registry registry, T value) { + this.writeVarInt(registry.getId(value)); + } + public int readVarInt() { int value = 0; int shift = 0; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java index b8b65ed97..6e1ed0ded 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java @@ -1,16 +1,22 @@ package net.momirealms.craftengine.core.util; +import com.google.common.collect.MapMaker; + +import java.util.Map; + public class ResourceKey { + private static final Map> VALUES = (new MapMaker()).weakValues().makeMap(); private final Key registry; private final Key location; - public ResourceKey(Key registry, Key location) { + private ResourceKey(Key registry, Key location) { this.registry = registry; this.location = location; } + @SuppressWarnings("unchecked") public static ResourceKey create(Key registry, Key location) { - return new ResourceKey<>(registry, location); + return (ResourceKey) VALUES.computeIfAbsent(new Internal(registry, location), (key) -> new ResourceKey<>(key.registry, key.location)); } public Key registry() { @@ -25,4 +31,7 @@ public class ResourceKey { public String toString() { return "ResourceKey[" + this.registry + " / " + this.location + "]"; } + + record Internal(Key registry, Key location) { + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/DefaultSectionSerializer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/DefaultSectionSerializer.java index 9e6b41426..f95c1bde6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/DefaultSectionSerializer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/DefaultSectionSerializer.java @@ -61,7 +61,7 @@ public final class DefaultSectionSerializer { Key key = Key.of(id); Holder owner = BuiltInRegistries.BLOCK.get(key).orElseGet(() -> { Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder( - new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), key)); + ResourceKey.create(BuiltInRegistries.BLOCK.key().location(), key)); InactiveCustomBlock inactiveBlock = new InactiveCustomBlock(key, holder); holder.bindValue(inactiveBlock); return holder;