diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java index 71aa3f6d1..40954b670 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java @@ -8,8 +8,8 @@ import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; import net.momirealms.craftengine.core.plugin.context.function.Function; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -21,7 +21,7 @@ public class BukkitCustomItem extends AbstractCustomItem { private final Object item; private final Object clientItem; - public BukkitCustomItem(Holder id, Object item, Object clientItem, Key materialKey, Key clientBoundMaterialKey, + public BukkitCustomItem(UniqueKey id, Object item, Object clientItem, Key materialKey, Key clientBoundMaterialKey, List behaviors, List> modifiers, List> clientBoundModifiers, ItemSettings settings, @@ -64,7 +64,7 @@ public class BukkitCustomItem extends AbstractCustomItem { } public static class BuilderImpl implements Builder { - private Holder id; + private UniqueKey id; private Key itemKey; private final Object item; private Key clientBoundItemKey; @@ -81,7 +81,7 @@ public class BukkitCustomItem extends AbstractCustomItem { } @Override - public Builder id(Holder id) { + public Builder id(UniqueKey id) { this.id = id; return this; } 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 c70d85fb6..927c64665 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 @@ -26,9 +26,6 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.logger.Debugger; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.*; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -349,7 +346,7 @@ public class BukkitItemManager extends AbstractItemManager { } @Override - protected CustomItem.Builder createPlatformItemBuilder(Holder id, Key materialId, Key clientBoundMaterialId) { + protected CustomItem.Builder createPlatformItemBuilder(UniqueKey id, Key materialId, Key clientBoundMaterialId) { Object item = FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(materialId)); Object clientBoundItem = materialId == clientBoundMaterialId ? item : FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(clientBoundMaterialId)); if (item == null) { @@ -372,14 +369,12 @@ public class BukkitItemManager extends AbstractItemManager { Key itemKey = KeyUtils.resourceLocationToKey(resourceLocation); if (itemKey.namespace().equals("minecraft")) { VANILLA_ITEMS.add(itemKey); - Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(itemKey) - .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) - .register(ResourceKey.create(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), itemKey), itemKey)); + UniqueKey uniqueKey = UniqueKey.create(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) { Key tagId = Key.of(CoreReflections.field$TagKey$location.get(tag).toString()); - VANILLA_ITEM_TAGS.computeIfAbsent(tagId, (key) -> new ArrayList<>()).add(holder); + VANILLA_ITEM_TAGS.computeIfAbsent(tagId, (key) -> new ArrayList<>()).add(uniqueKey); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java index 69da455b7..9b3f0b628 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -2,29 +2,28 @@ package net.momirealms.craftengine.bukkit.item.recipe; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.CloneableConstantItem; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MItems; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.MaterialUtils; import net.momirealms.craftengine.bukkit.util.RecipeUtils; -import net.momirealms.craftengine.core.item.CustomItem; -import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.recipe.*; import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.vanilla.*; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.HeptaFunction; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.*; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -135,6 +134,8 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } Object finalNmsRecipe = nmsRecipe; return () -> registerNMSSmithingRecipe(finalNmsRecipe); + } catch (InvalidRecipeIngredientException e) { + throw e; } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to convert smithing transform recipe", e); return null; @@ -220,8 +221,8 @@ public class BukkitRecipeManager extends AbstractRecipeManager { }); MIXED_RECIPE_CONVERTORS.put(RecipeTypes.STONECUTTING, (BukkitRecipeConvertor>) (id, recipe) -> { List itemStacks = new ArrayList<>(); - for (Holder item : recipe.ingredient().items()) { - itemStacks.add(BukkitItemManager.instance().buildItemStack(item.value(), null)); + for (UniqueKey item : recipe.ingredient().items()) { + itemStacks.add(BukkitItemManager.instance().buildItemStack(item.key(), null)); } StonecuttingRecipe stonecuttingRecipe = new StonecuttingRecipe( new NamespacedKey(id.namespace(), id.value()), recipe.result(ItemBuildContext.EMPTY), @@ -351,6 +352,8 @@ public class BukkitRecipeManager extends AbstractRecipeManager { if (converted != null) { this.delayedTasksOnMainThread.add(converted); } + } catch (InvalidRecipeIngredientException e) { + throw new LocalizedResourceConfigException("warning.config.recipe.invalid_ingredient", e.ingredient()); } catch (Exception e) { this.plugin.logger().warn("Failed to convert recipe " + id, e); } @@ -502,13 +505,13 @@ public class BukkitRecipeManager extends AbstractRecipeManager { private void handleDataPackStoneCuttingRecipe(Key id, VanillaStoneCuttingRecipe recipe) { ItemStack result = createDataPackResultStack(recipe.result()); - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : recipe.ingredient()) { if (item.charAt(0) == '#') { Key tag = Key.from(item.substring(1)); holders.addAll(this.plugin.itemManager().tagToItems(tag)); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + holders.add(UniqueKey.create(Key.from(item))); } } CustomStoneCuttingRecipe ceRecipe = new CustomStoneCuttingRecipe<>( @@ -524,7 +527,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { boolean hasCustomItemInTag = false; List> ingredientList = new ArrayList<>(); for (List list : recipe.ingredients()) { - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : list) { if (item.charAt(0) == '#') { Key tag = Key.of(item.substring(1)); @@ -535,7 +538,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } holders.addAll(plugin.itemManager().tagToItems(tag)); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + holders.add(UniqueKey.create(Key.from(item))); } } ingredientList.add(Ingredient.of(holders)); @@ -560,7 +563,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { boolean hasCustomItemInTag = false; Map> ingredients = new HashMap<>(); for (Map.Entry> entry : recipe.ingredients().entrySet()) { - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : entry.getValue()) { if (item.charAt(0) == '#') { Key tag = Key.from(item.substring(1)); @@ -571,7 +574,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } holders.addAll(plugin.itemManager().tagToItems(tag)); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + holders.add(UniqueKey.create(Key.from(item))); } } ingredients.put(entry.getKey(), Ingredient.of(holders)); @@ -597,7 +600,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { Consumer callback) { NamespacedKey key = new NamespacedKey(id.namespace(), id.value()); ItemStack result = createDataPackResultStack(recipe.result()); - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); boolean hasCustomItemInTag = readVanillaIngredients(false, recipe.ingredient(), holders::add); CustomCookingRecipe ceRecipe = constructor2.apply( id, recipe.category(), recipe.group(), @@ -620,11 +623,11 @@ public class BukkitRecipeManager extends AbstractRecipeManager { ItemStack result = createDataPackResultStack(recipe.result()); boolean hasCustomItemInTag; - Set> additionHolders = new HashSet<>(); + Set additionHolders = new HashSet<>(); hasCustomItemInTag = readVanillaIngredients(false, recipe.addition(), additionHolders::add); - Set> templateHolders = new HashSet<>(); + Set templateHolders = new HashSet<>(); hasCustomItemInTag = readVanillaIngredients(hasCustomItemInTag, recipe.template(), templateHolders::add); - Set> baseHolders = new HashSet<>(); + Set baseHolders = new HashSet<>(); hasCustomItemInTag = readVanillaIngredients(hasCustomItemInTag, recipe.base(), baseHolders::add); CustomSmithingTransformRecipe ceRecipe = new CustomSmithingTransformRecipe<>( @@ -647,7 +650,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { this.registerInternalRecipe(id, ceRecipe); } - private boolean readVanillaIngredients(boolean hasCustomItemInTag, List ingredients, Consumer> holderConsumer) { + private boolean readVanillaIngredients(boolean hasCustomItemInTag, List ingredients, Consumer holderConsumer) { for (String item : ingredients) { if (item.charAt(0) == '#') { Key tag = Key.from(item.substring(1)); @@ -656,11 +659,11 @@ public class BukkitRecipeManager extends AbstractRecipeManager { hasCustomItemInTag = true; } } - for (Holder holder : this.plugin.itemManager().tagToItems(tag)) { + for (UniqueKey holder : this.plugin.itemManager().tagToItems(tag)) { holderConsumer.accept(holder); } } else { - holderConsumer.accept(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + holderConsumer.accept(UniqueKey.create(Key.from(item))); } } return hasCustomItemInTag; @@ -703,8 +706,8 @@ public class BukkitRecipeManager extends AbstractRecipeManager { private static RecipeChoice ingredientToBukkitRecipeChoice(Ingredient ingredient) { Set materials = new HashSet<>(); - for (Holder holder : ingredient.items()) { - materials.add(getMaterialById(holder.value())); + for (UniqueKey holder : ingredient.items()) { + materials.add(getMaterialById(holder.key())); } return new RecipeChoice.MaterialChoice(new ArrayList<>(materials)); } @@ -715,15 +718,21 @@ public class BukkitRecipeManager extends AbstractRecipeManager { return material; } Optional> optionalItem = BukkitItemManager.instance().getCustomItem(key); - return optionalItem.map(itemStackCustomItem -> MaterialUtils.getMaterial(itemStackCustomItem.material())).orElse(null); + return optionalItem.map(itemStackCustomItem -> MaterialUtils.getMaterial(itemStackCustomItem.material())).orElseThrow(() -> new InvalidRecipeIngredientException(key.asString())); } - private static List getIngredientLooks(List> holders) { + private static List getIngredientLooks(List holders) { List itemStacks = new ArrayList<>(); - for (Holder holder : holders) { - ItemStack itemStack = BukkitItemManager.instance().getBuildableItem(holder.value()).get().buildItemStack(ItemBuildContext.EMPTY, 1); - Object nmsStack = FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack); - itemStacks.add(nmsStack); + for (UniqueKey holder : holders) { + Optional> buildableItem = BukkitItemManager.instance().getBuildableItem(holder.key()); + if (buildableItem.isPresent()) { + ItemStack itemStack = buildableItem.get().buildItemStack(ItemBuildContext.EMPTY, 1); + Object nmsStack = FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack); + itemStacks.add(nmsStack); + } else { + Item barrier = BukkitItemManager.instance().createWrappedItem(ItemKeys.BARRIER, null); + barrier.customNameJson(AdventureHelper.componentToJson(Component.text(holder.key().asString()).color(NamedTextColor.RED))); + } } return itemStacks; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java index d2b10e92a..4890f744e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java @@ -10,9 +10,8 @@ import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import org.bukkit.block.Crafter; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -23,7 +22,6 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; -import java.util.Optional; public class CrafterEventListener implements Listener { private static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); @@ -62,14 +60,8 @@ public class CrafterEventListener implements Listener { optimizedIDItems.add(EMPTY); } else { Item wrappedItem = this.itemManager.wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - // an invalid item is used in recipe, we disallow it - event.setCancelled(true); - return; - } else { - optimizedIDItems.add(new OptimizedIDItem<>(idHolder.get(), itemStack)); - } + UniqueKey uniqueId = UniqueKey.create(wrappedItem.id()); + optimizedIDItems.add(new OptimizedIDItem<>(uniqueId, itemStack)); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index 63f423d96..a21544377 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -25,12 +25,7 @@ import net.momirealms.craftengine.core.item.setting.AnvilRepairItem; import net.momirealms.craftengine.core.item.setting.ItemEquipment; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.ContextHolder; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.AdventureHelper; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.Pair; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Campfire; @@ -42,6 +37,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.event.inventory.*; +import org.bukkit.event.inventory.ClickType; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.*; import org.bukkit.inventory.view.AnvilView; @@ -79,10 +75,9 @@ public class RecipeEventListener implements Listener { if (ItemStackUtils.isEmpty(item)) return; if (ItemStackUtils.isEmpty(fuelStack)) { Item wrappedItem = BukkitItemManager.instance().wrap(item); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) return; + UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), item)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, item)); Key recipeType; if (furnaceInventory.getType() == InventoryType.FURNACE) { recipeType = RecipeTypes.SMELTING; @@ -92,7 +87,7 @@ public class RecipeEventListener implements Listener { recipeType = RecipeTypes.SMOKING; } - Recipe ceRecipe = recipeManager.recipeByInput(recipeType, input); + Recipe ceRecipe = this.recipeManager.recipeByInput(recipeType, input); // The item is an ingredient, we should never consider it as fuel firstly if (ceRecipe != null) return; @@ -360,11 +355,8 @@ public class RecipeEventListener implements Listener { return; } Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - return; - } - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.recipeByInput(RecipeTypes.CAMPFIRE_COOKING, input); if (ceRecipe == null) { event.setCancelled(true); @@ -390,13 +382,8 @@ public class RecipeEventListener implements Listener { ItemStack itemStack = event.getSource(); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - event.setTotalCookTime(Integer.MAX_VALUE); - return; - } - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + UniqueKey itemId = UniqueKey.create(wrappedItem.id()); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(itemId, itemStack)); CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.recipeByInput(RecipeTypes.CAMPFIRE_COOKING, input); if (ceRecipe == null) { event.setTotalCookTime(Integer.MAX_VALUE); @@ -425,13 +412,8 @@ public class RecipeEventListener implements Listener { ItemStack itemStack = event.getSource(); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - event.setCancelled(true); - return; - } - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + UniqueKey itemId = UniqueKey.create(wrappedItem.id()); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(itemId, itemStack)); CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.recipeByInput(RecipeTypes.CAMPFIRE_COOKING, input); if (ceRecipe == null) { event.setCancelled(true); @@ -893,14 +875,8 @@ public class RecipeEventListener implements Listener { optimizedIDItems.add(EMPTY); } else { Item wrappedItem = this.itemManager.wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - // an invalid item is used in recipe, we disallow it - inventory.setResult(null); - return; - } else { - optimizedIDItems.add(new OptimizedIDItem<>(idHolder.get(), itemStack)); - } + UniqueKey itemUniqueId = UniqueKey.create(wrappedItem.id()); + optimizedIDItems.add(new OptimizedIDItem<>(itemUniqueId, itemStack)); } } @@ -1040,8 +1016,7 @@ public class RecipeEventListener implements Listener { return EMPTY; } else { Item wrappedItem = this.itemManager.wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - return idHolder.map(keyReference -> new OptimizedIDItem<>(keyReference, itemStack)).orElse(EMPTY); + return new OptimizedIDItem<>(UniqueKey.create(wrappedItem.id()), itemStack); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java index c05455611..f3322b291 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java @@ -23,10 +23,9 @@ import net.momirealms.craftengine.core.item.recipe.CustomCookingRecipe; import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.inventory.ItemStack; @@ -135,12 +134,9 @@ public class RecipeInjector { ); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - return Optional.empty(); - } + UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); if (ceRecipe == null) { return Optional.empty(); @@ -186,12 +182,9 @@ public class RecipeInjector { } Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - return Optional.empty(); - } + UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); if (ceRecipe == null) { return Optional.empty(); @@ -232,12 +225,9 @@ public class RecipeInjector { ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.field$SingleRecipeInput$item(args[0])); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - return Optional.empty(); - } + UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); if (ceRecipe == null) { return Optional.empty(); @@ -282,12 +272,9 @@ public class RecipeInjector { // 获取唯一内存地址id ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.field$SingleRecipeInput$item(args[0])); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); - if (idHolder.isEmpty()) { - return Optional.empty(); - } + UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); // 这个ce配方并不存在,那么应该返回空 if (ceRecipe == null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MItems.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MItems.java index 2bed3e2a2..cfe080d81 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MItems.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MItems.java @@ -7,6 +7,7 @@ public final class MItems { public static final Object AIR; public static final Object WATER_BUCKET; + public static final Object BARRIER; private static Object getById(String id) { Object rl = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", id); @@ -16,5 +17,6 @@ public final class MItems { static { AIR = getById("air"); WATER_BUCKET = getById("water_bucket"); + BARRIER = getById("barrier"); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java index 2f5cadd12..3bfcc6b6d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -9,11 +9,10 @@ import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.QuadFunction; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.craftengine.core.world.BlockHitResult; import net.momirealms.craftengine.core.world.BlockPos; import org.bukkit.block.data.BlockData; @@ -24,7 +23,6 @@ import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; -import java.util.Optional; public class InteractUtils { private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); @@ -81,17 +79,17 @@ public class InteractUtils { }); registerInteraction(BlockKeys.SOUL_CAMPFIRE, (player, item, blockState, result) -> { if (!Config.enableRecipeSystem()) return false; - Optional> optional = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(item.id()); - return optional.filter(keyReference -> BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( - keyReference, item.getItem() - ))) != null).isPresent(); + UniqueKey uniqueKey = UniqueKey.create(item.id()); + return BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( + uniqueKey, item.getItem() + ))) != null; }); registerInteraction(BlockKeys.CAMPFIRE, (player, item, blockState, result) -> { if (!Config.enableRecipeSystem()) return false; - Optional> optional = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(item.id()); - return optional.filter(keyReference -> BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( - keyReference, item.getItem() - ))) != null).isPresent(); + UniqueKey uniqueKey = UniqueKey.create(item.id()); + return BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( + uniqueKey, item.getItem() + ))) != null; }); registerInteraction(BlockKeys.DECORATED_POT, (player, item, blockState, result) -> true); registerInteraction(BlockKeys.HOPPER, (player, item, blockState, result) -> true); diff --git a/common-files/src/main/resources/translations/de.yml b/common-files/src/main/resources/translations/de.yml index 2af081c0e..863854368 100644 --- a/common-files/src/main/resources/translations/de.yml +++ b/common-files/src/main/resources/translations/de.yml @@ -120,7 +120,8 @@ warning.config.image.invalid_hex_value: "Problem in Datei gefund warning.config.recipe.duplicate: "Problem in Datei gefunden - Dupliziertes Rezept ''. Bitte überprüfen Sie, ob dieselbe Konfiguration in anderen Dateien vorhanden ist." warning.config.recipe.missing_type: "Problem in Datei gefunden - Dem Rezept '' fehlt das erforderliche 'type'-Argument." warning.config.recipe.invalid_type: "Problem in Datei gefunden - Das Rezept '' verwendet einen ungültigen Rezepttyp ''." -warning.config.recipe.invalid_item: "Problem in Datei gefunden - Das Rezept '' verwendet einen ungültigen Gegenstand ''." +warning.config.recipe.invalid_ingredient: "Issue found in file - The recipe '' is using an invalid ingredient ''." +warning.config.recipe.invalid_result: "Issue found in file - The recipe '' is using an invalid result ''." warning.config.recipe.missing_ingredient: "Problem in Datei gefunden - Dem Kochrezept '' fehlt das erforderliche 'ingredient'-Argument." warning.config.recipe.missing_result: "Problem in Datei gefunden - Dem Rezept '' fehlt das erforderliche 'result'-Argument." warning.config.recipe.result.missing_id: "Problem in Datei gefunden - Dem Rezept '' fehlt das erforderliche Argument 'id' für das Rezeptresultat." diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index b6bb8ac81..1b4014f2e 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -121,7 +121,8 @@ warning.config.image.invalid_hex_value: "Issue found in file - T warning.config.recipe.duplicate: "Issue found in file - Duplicated recipe ''. Please check if there is the same configuration in other files." warning.config.recipe.missing_type: "Issue found in file - The recipe '' is missing the required 'type' argument." warning.config.recipe.invalid_type: "Issue found in file - The recipe '' is using an invalid recipe type ''." -warning.config.recipe.invalid_item: "Issue found in file - The recipe '' is using an invalid item ''." +warning.config.recipe.invalid_ingredient: "Issue found in file - The recipe '' is using an invalid ingredient ''." +warning.config.recipe.invalid_result: "Issue found in file - The recipe '' is using an invalid result ''." warning.config.recipe.missing_ingredient: "Issue found in file - The cooking recipe '' is missing the required 'ingredient' argument." warning.config.recipe.missing_result: "Issue found in file - The recipe '' is missing the required 'result' argument." warning.config.recipe.result.missing_id: "Issue found in file - The recipe '' is missing the required argument 'id' for recipe result." diff --git a/common-files/src/main/resources/translations/es.yml b/common-files/src/main/resources/translations/es.yml index 6e489ea9e..9eb382a17 100644 --- a/common-files/src/main/resources/translations/es.yml +++ b/common-files/src/main/resources/translations/es.yml @@ -84,7 +84,8 @@ warning.config.image.invalid_hex_value: "Problema encontrado en el archi warning.config.recipe.duplicate: "Problema encontrado en el archivo - Receta duplicada ''. Verifica si hay la misma configuración en otros archivos." warning.config.recipe.missing_type: "Problema encontrado en el archivo - La receta '' carece del argumento requerido 'type'." warning.config.recipe.invalid_type: "Problema encontrado en el archivo - La receta '' está usando un tipo de receta inválido ''." -warning.config.recipe.invalid_item: "Problema encontrado en el archivo - La receta '' está usando un objeto inválido ''." +warning.config.recipe.invalid_ingredient: "Issue found in file - The recipe '' is using an invalid ingredient ''." +warning.config.recipe.invalid_result: "Issue found in file - The recipe '' is using an invalid result ''." warning.config.recipe.missing_ingredient: "Problema encontrado en el archivo - La receta de cocción '' carece del argumento requerido 'ingredient'." warning.config.recipe.missing_result: "Problema encontrado en el archivo - La receta '' carece del argumento requerido 'result'." warning.config.recipe.result.missing_id: "Problema encontrado en el archivo - La receta '' carece del argumento requerido 'id' para el resultado de la receta." diff --git a/common-files/src/main/resources/translations/ru_ru.yml b/common-files/src/main/resources/translations/ru_ru.yml index 0c9e092a2..73b8fa55b 100644 --- a/common-files/src/main/resources/translations/ru_ru.yml +++ b/common-files/src/main/resources/translations/ru_ru.yml @@ -120,7 +120,8 @@ warning.config.image.invalid_hex_value: "Проблема найдена warning.config.recipe.duplicate: "Проблема найдена в файле - Дублированный рецепт ''. Проверьте, есть ли такая же конфигурация в других файлах." warning.config.recipe.missing_type: "Проблема найдена в файле - В рецепте '' отсутствует необходимый 'type' аргумент." warning.config.recipe.invalid_type: "Проблема найдена в файле - Рецепт '' использует недопустимый тип рецепта ''." -warning.config.recipe.invalid_item: "Проблема найдена в файле - Рецепт '' использует недопустимый предмет ''." +warning.config.recipe.invalid_ingredient: "Issue found in file - The recipe '' is using an invalid ingredient ''." +warning.config.recipe.invalid_result: "Issue found in file - The recipe '' is using an invalid result ''." warning.config.recipe.missing_ingredient: "Проблема найдена в файле - В рецепт приготовления '' отсутствует необходимый 'ingredient' аргумент." warning.config.recipe.missing_result: "Проблема найдена в файле - В рецепте '' отсутствует необходимый 'result' аргумент." warning.config.recipe.result.missing_id: "Проблема найдена в файле - В рецепте '' отсутствует необходимый аргумент 'id' для результата рецепта." diff --git a/common-files/src/main/resources/translations/tr.yml b/common-files/src/main/resources/translations/tr.yml index 8cdcd859c..c8d9cc602 100644 --- a/common-files/src/main/resources/translations/tr.yml +++ b/common-files/src/main/resources/translations/tr.yml @@ -83,7 +83,8 @@ warning.config.image.invalid_hex_value: " dosyasında sorun bulun warning.config.recipe.duplicate: " dosyasında sorun bulundu - Yinelenen tarif ''. Diğer dosyalarda aynı yapılandırmanın olup olmadığını kontrol edin." warning.config.recipe.missing_type: " dosyasında sorun bulundu - '' tarifi gerekli 'type' argümanı eksik." warning.config.recipe.invalid_type: " dosyasında sorun bulundu - '' tarifi geçersiz bir tarif türü '' kullanıyor." -warning.config.recipe.invalid_item: " dosyasında sorun bulundu - '' tarifi geçersiz bir eşya '' kullanıyor." +warning.config.recipe.invalid_ingredient: "Issue found in file - The recipe '' is using an invalid ingredient ''." +warning.config.recipe.invalid_result: "Issue found in file - The recipe '' is using an invalid result ''." warning.config.recipe.missing_ingredient: " dosyasında sorun bulundu - '' pişirme tarifi gerekli 'ingredient' argümanı eksik." warning.config.recipe.missing_result: " dosyasında sorun bulundu - '' tarifi gerekli 'result' argümanı eksik." warning.config.recipe.result.missing_id: " dosyasında sorun bulundu - '' tarifi, tarif sonucu için gerekli 'id' argümanı eksik." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 56a24600f..271ed135f 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -121,7 +121,8 @@ warning.config.image.invalid_hex_value: "在文件 发现问题 warning.config.recipe.duplicate: "在文件 发现问题 - 重复的配方 '' 请检查其他文件中是否存在相同配置" warning.config.recipe.missing_type: "在文件 发现问题 - 配方 '' 缺少必需的 'type' 参数" warning.config.recipe.invalid_type: "在文件 发现问题 - 配方 '' 使用了无效的配方类型 ''" -warning.config.recipe.invalid_item: "在文件 发现问题 - 配方 '' 使用了无效的物品 ''" +warning.config.recipe.invalid_ingredient: "在文件 发现问题 - 配方 '' 使用了无效的原料 ''" +warning.config.recipe.invalid_result: "在文件 发现问题 - 配方 '' 使用了无效的结果 ''" warning.config.recipe.missing_ingredient: "在文件 发现问题 - 烧炼配方 '' 缺少必需的 'ingredient' 参数" warning.config.recipe.missing_result: "在文件 发现问题 - 配方 '' 缺少必需的 'result' 参数" warning.config.recipe.result.missing_id: "在文件 发现问题 - 配方 '' 的结果缺少必需的 'id' 参数" diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java index 736f2c6a2..db56a096f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java @@ -5,8 +5,8 @@ import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; import net.momirealms.craftengine.core.plugin.context.function.Function; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -15,7 +15,7 @@ import java.util.Map; import java.util.Optional; public abstract class AbstractCustomItem implements CustomItem { - protected final Holder id; + protected final UniqueKey id; protected final Key material; protected final Key clientBoundMaterial; protected final ItemDataModifier[] modifiers; @@ -25,7 +25,7 @@ public abstract class AbstractCustomItem implements CustomItem { protected final Map>> events; @SuppressWarnings("unchecked") - public AbstractCustomItem(Holder id, Key material, Key clientBoundMaterial, + public AbstractCustomItem(UniqueKey id, Key material, Key clientBoundMaterial, List behaviors, List> modifiers, List> clientBoundModifiers, @@ -52,11 +52,11 @@ public abstract class AbstractCustomItem implements CustomItem { @Override public Key id() { - return this.id.value(); + return this.id.key(); } @Override - public Holder idHolder() { + public UniqueKey uniqueId() { return this.id; } 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 377df86de..b05558f79 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 @@ -25,9 +25,6 @@ import net.momirealms.craftengine.core.plugin.context.text.TextProvider; import net.momirealms.craftengine.core.plugin.context.text.TextProviders; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; -import net.momirealms.craftengine.core.registry.BuiltInRegistries; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.*; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.type.Either; @@ -42,14 +39,14 @@ import java.util.stream.Stream; public abstract class AbstractItemManager extends AbstractModelGenerator implements ItemManager { protected static final Map> VANILLA_ITEM_EXTRA_BEHAVIORS = new HashMap<>(); protected static final Set VANILLA_ITEMS = new HashSet<>(1024); - protected static final Map>> VANILLA_ITEM_TAGS = new HashMap<>(); + protected static final Map> VANILLA_ITEM_TAGS = new HashMap<>(); private final ItemParser itemParser; private final EquipmentParser equipmentParser; protected final Map> externalItemProviders = new HashMap<>(); protected final Map>> dataFunctions = new HashMap<>(); protected final Map> customItems = new HashMap<>(); - protected final Map>> customItemTags = new HashMap<>(); + protected final Map> customItemTags = new HashMap<>(); protected final Map> cmdConflictChecker = new HashMap<>(); protected final Map modernItemModels1_21_4 = new HashMap<>(); protected final Map> modernItemModels1_21_2 = new HashMap<>(); @@ -157,19 +154,19 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl // tags Set tags = customItem.settings().tags(); for (Key tag : tags) { - this.customItemTags.computeIfAbsent(tag, k -> new ArrayList<>()).add(customItem.idHolder()); + this.customItemTags.computeIfAbsent(tag, k -> new ArrayList<>()).add(customItem.uniqueId()); } return true; } @Override - public List> tagToItems(Key tag) { - List> items = new ArrayList<>(); - List> holders = VANILLA_ITEM_TAGS.get(tag); + public List tagToItems(Key tag) { + List items = new ArrayList<>(); + List holders = VANILLA_ITEM_TAGS.get(tag); if (holders != null) { items.addAll(holders); } - List> customItems = this.customItemTags.get(tag); + List customItems = this.customItemTags.get(tag); if (customItems != null) { items.addAll(customItems); } @@ -177,12 +174,12 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl } @Override - public List> tagToVanillaItems(Key tag) { + public List tagToVanillaItems(Key tag) { return Collections.unmodifiableList(VANILLA_ITEM_TAGS.getOrDefault(tag, List.of())); } @Override - public List> tagToCustomItems(Key tag) { + public List tagToCustomItems(Key tag) { return Collections.unmodifiableList(this.customItemTags.getOrDefault(tag, List.of())); } @@ -253,7 +250,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return VANILLA_ITEMS.contains(item); } - protected abstract CustomItem.Builder createPlatformItemBuilder(Holder id, Key material, Key clientBoundMaterial); + protected abstract CustomItem.Builder createPlatformItemBuilder(UniqueKey id, Key material, Key clientBoundMaterial); protected abstract void registerArmorTrimPattern(Collection equipments); @@ -327,11 +324,9 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl throw new LocalizedResourceConfigException("warning.config.item.duplicate"); } - // register for recipes - Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id) - .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) - .register(ResourceKey.create(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); + UniqueKey uniqueId = UniqueKey.create(id); + // register for recipes boolean isVanillaItem = isVanillaItem(id); Key material = Key.from(isVanillaItem ? id.value() : ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("material"), "warning.config.item.missing_material").toLowerCase(Locale.ENGLISH)); Key clientBoundMaterial = section.containsKey("client-bound-material") ? Key.from(section.get("client-bound-material").toString().toLowerCase(Locale.ENGLISH)) : material; @@ -346,7 +341,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl Key itemModelKey = null; - CustomItem.Builder itemBuilder = createPlatformItemBuilder(holder, material, clientBoundMaterial); + CustomItem.Builder itemBuilder = createPlatformItemBuilder(uniqueId, material, clientBoundMaterial); boolean hasItemModelSection = section.containsKey("item-model"); // To get at least one model provider diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java index 1381c9a71..b1f37784b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -6,8 +6,8 @@ import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; import net.momirealms.craftengine.core.plugin.context.function.Function; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -17,7 +17,7 @@ public interface CustomItem extends BuildableItem { Key id(); - Holder idHolder(); + UniqueKey uniqueId(); Key material(); @@ -47,7 +47,7 @@ public interface CustomItem extends BuildableItem { List behaviors(); interface Builder { - Builder id(Holder id); + Builder id(UniqueKey id); Builder clientBoundMaterial(Key clientBoundMaterialKey); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index e166fbb00..279be34f1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -9,9 +9,9 @@ import net.momirealms.craftengine.core.pack.model.ModernItemModel; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigParser; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import org.incendo.cloud.suggestion.Suggestion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -82,11 +82,11 @@ public interface ItemManager extends Manageable, ModelGenerator { boolean addCustomItem(CustomItem customItem); - List> tagToItems(Key tag); + List tagToItems(Key tag); - List> tagToVanillaItems(Key tag); + List tagToVanillaItems(Key tag); - List> tagToCustomItems(Key tag); + List tagToCustomItems(Key tag); int fuelTime(T itemStack); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java index 4ecd81f55..42f10cfae 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeFactory.java @@ -2,12 +2,7 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.plugin.CraftEngine; 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.util.EnumUtils; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.*; import java.util.*; @@ -21,14 +16,13 @@ public abstract class AbstractRecipeFactory implements RecipeFactory { return MiscUtils.castToMap(getIngredientOrThrow(arguments), true); } - protected Set> ingredientHolders(Map arguments) { - Set> holders = new HashSet<>(); + protected Set ingredientHolders(Map arguments) { + Set holders = new HashSet<>(); for (String item : ingredients(arguments)) { if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } } return holders; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java index 280e6b7e3..b3eb7cbb0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeManager.java @@ -11,8 +11,8 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.craftengine.core.util.VersionHelper; import org.jetbrains.annotations.Nullable; @@ -140,8 +140,8 @@ public abstract class AbstractRecipeManager implements RecipeManager { this.byResult.computeIfAbsent(recipe.result().item().id(), k -> new ArrayList<>()).add(recipe); HashSet usedKeys = new HashSet<>(); for (Ingredient ingredient : recipe.ingredientsInUse()) { - for (Holder holder : ingredient.items()) { - Key key = holder.value(); + for (UniqueKey holder : ingredient.items()) { + Key key = holder.key(); if (usedKeys.add(key)) { this.byIngredient.computeIfAbsent(key, k -> new ArrayList<>()).add(recipe); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java index d7f2e531d..127d5a6b4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -28,7 +28,7 @@ public class CustomBlastingRecipe extends CustomCookingRecipe { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); - Set> holders = ingredientHolders(arguments); + Set holders = ingredientHolders(arguments); return new CustomBlastingRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java index 007381419..38d7e5aff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -28,7 +28,7 @@ public class CustomCampfireRecipe extends CustomCookingRecipe { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); - Set> holders = ingredientHolders(arguments); + Set holders = ingredientHolders(arguments); return new CustomCampfireRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java index de8f7e4f0..951ac6d96 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java @@ -4,10 +4,9 @@ import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; import net.momirealms.craftengine.core.plugin.CraftEngine; 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.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -156,13 +155,12 @@ public class CustomShapedRecipe extends CustomCraftingTableRecipe { } char ch = key.charAt(0); List items = MiscUtils.getAsStringList(entry.getValue()); - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : items) { if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } } ingredients.put(ch, Ingredient.of(holders)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java index 2f71fd2d4..5ff9494e0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java @@ -3,11 +3,9 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; import net.momirealms.craftengine.core.plugin.CraftEngine; -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.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -64,13 +62,12 @@ public class CustomShapelessRecipe extends CustomCraftingTableRecipe { if (ingredientsObject instanceof Map map) { for (Map.Entry entry : (MiscUtils.castToMap(map, false)).entrySet()) { List items = MiscUtils.getAsStringList(entry.getValue()); - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : items) { if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } } ingredients.add(Ingredient.of(holders)); @@ -78,36 +75,33 @@ public class CustomShapelessRecipe extends CustomCraftingTableRecipe { } else if (ingredientsObject instanceof List list) { for (Object obj : list) { if (obj instanceof List inner) { - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : MiscUtils.getAsStringList(inner)) { if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } } ingredients.add(Ingredient.of(holders)); } else { String item = obj.toString(); - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } ingredients.add(Ingredient.of(holders)); } } } else { String item = ingredientsObject.toString(); - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } ingredients.add(Ingredient.of(holders)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java index 0a667cdff..8d7c2be96 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -28,7 +28,7 @@ public class CustomSmeltingRecipe extends CustomCookingRecipe { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); - Set> holders = ingredientHolders(arguments); + Set holders = ingredientHolders(arguments); return new CustomSmeltingRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } } 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 7680bef66..c588501e4 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 @@ -7,7 +7,6 @@ import net.momirealms.craftengine.core.item.recipe.input.SmithingInput; import net.momirealms.craftengine.core.plugin.CraftEngine; 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.*; @@ -145,13 +144,12 @@ public class CustomSmithingTransformRecipe implements Recipe { } private Ingredient toIngredient(List items) { - Set> holders = new HashSet<>(); + Set holders = new HashSet<>(); for (String item : items) { if (item.charAt(0) == '#') { holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); } else { - holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", item))); + holders.add(UniqueKey.create(Key.of(item))); } } return holders.isEmpty() ? null : Ingredient.of(holders); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java index 9054a2b02..83939ac29 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -28,7 +28,7 @@ public class CustomSmokingRecipe extends CustomCookingRecipe { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; int cookingTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("time", 80), "time"); float experience = ResourceConfigUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f), "experience"); - Set> holders = ingredientHolders(arguments); + Set holders = ingredientHolders(arguments); return new CustomSmokingRecipe(id, cookingRecipeCategory(arguments), group, Ingredient.of(holders), cookingTime, experience, parseResult(arguments)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java index 1d9b4b528..95e91ef77 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.item.recipe; import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; -import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -45,7 +45,7 @@ public class CustomStoneCuttingRecipe extends AbstractGroupedRecipe { @Override public Recipe create(Key id, Map arguments) { String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; - Set> holders = ingredientHolders(arguments); + Set holders = ingredientHolders(arguments); return new CustomStoneCuttingRecipe<>(id, group, Ingredient.of(holders), parseResult(arguments)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java index dac02bfb9..e731407d3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java @@ -1,15 +1,14 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import java.util.*; import java.util.function.Predicate; -public class Ingredient implements Predicate>, StackedContents.IngredientInfo> { - private final List> items; +public class Ingredient implements Predicate>, StackedContents.IngredientInfo { + private final List items; - public Ingredient(List> items) { + public Ingredient(List items) { this.items = items; } @@ -18,17 +17,17 @@ public class Ingredient implements Predicate>, StackedCont .orElseGet(stack::isEmpty); } - public static Ingredient of(List> items) { + public static Ingredient of(List items) { return new Ingredient<>(items); } - public static Ingredient of(Set> items) { + public static Ingredient of(Set items) { return new Ingredient<>(new ArrayList<>(items)); } @Override public boolean test(OptimizedIDItem optimizedIDItem) { - for (Holder item : this.items()) { + for (UniqueKey item : this.items()) { if (optimizedIDItem.is(item)) { return true; } @@ -36,14 +35,14 @@ public class Ingredient implements Predicate>, StackedCont return false; } - public List> items() { + public List items() { return this.items; } @Override public String toString() { StringJoiner joiner = new StringJoiner(", "); - for (Holder item : this.items()) { + for (UniqueKey item : this.items()) { joiner.add(item.toString()); } return "Ingredient: [" + joiner + "]"; @@ -54,7 +53,7 @@ public class Ingredient implements Predicate>, StackedCont } @Override - public boolean acceptsItem(Holder entry) { + public boolean acceptsItem(UniqueKey entry) { return this.items.contains(entry); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/InvalidRecipeIngredientException.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/InvalidRecipeIngredientException.java new file mode 100644 index 000000000..36ed4d887 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/InvalidRecipeIngredientException.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.item.recipe; + +public class InvalidRecipeIngredientException extends RuntimeException { + private final String ingredient; + + public InvalidRecipeIngredientException(String ingredient) { + this.ingredient = ingredient; + } + + public String ingredient() { + return ingredient; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java index fc899ff76..fcc026ef6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java @@ -1,37 +1,36 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; public class OptimizedIDItem { private final T rawItem; - private final Holder idHolder; + private final UniqueKey uniqueId; - public OptimizedIDItem(Holder idHolder, T rawItem) { - this.idHolder = idHolder; + public OptimizedIDItem(UniqueKey uniqueId, T rawItem) { + this.uniqueId = uniqueId; this.rawItem = rawItem; } - public Holder id() { - return idHolder; + public UniqueKey id() { + return uniqueId; } public T rawItem() { return rawItem; } - public boolean is(Holder id) { - return idHolder == id; + public boolean is(UniqueKey id) { + return uniqueId == id; } public boolean isEmpty() { - return idHolder == null; + return uniqueId == null; } @Override public String toString() { return "OptimizedIDItem{" + - "idHolder=" + idHolder + + "uniqueId=" + uniqueId + '}'; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java index 63c75b959..bf03b41ad 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java @@ -22,7 +22,7 @@ public interface RecipeFactory { int count = ResourceConfigUtils.getAsInt(resultMap.getOrDefault("count", 1), "count"); return new CustomRecipeResult( CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_item", id)), + () -> new LocalizedResourceConfigException("warning.config.recipe.invalid_result", id)), count ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java index 4266cf808..e4f360164 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java @@ -1,12 +1,11 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import java.util.List; public class RecipeFinder { - private final StackedContents> stackedContents = new StackedContents<>(); + private final StackedContents stackedContents = new StackedContents<>(); public void addInput(OptimizedIDItem item) { if (!item.isEmpty()) { @@ -19,7 +18,7 @@ public class RecipeFinder { return !placementInfo.isImpossibleToPlace() && canCraft(placementInfo.ingredients()); } - private boolean canCraft(List>> rawIngredients) { + private boolean canCraft(List> rawIngredients) { return this.stackedContents.tryPick(rawIngredients); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index 88a341729..5cbd7632a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -16,11 +16,7 @@ import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.gui.*; import net.momirealms.craftengine.core.plugin.gui.Ingredient; -import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.AdventureHelper; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.*; import java.nio.file.Path; import java.util.*; @@ -506,8 +502,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { List> templates = new ArrayList<>(); Optional.ofNullable(recipe.template()).ifPresent(it -> { - for (Holder in : it.items()) { - templates.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : it.items()) { + templates.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } }); layout.addIngredient('A', templates.isEmpty() ? GuiElement.EMPTY : GuiElement.recipeIngredient(templates, (e, c) -> { @@ -539,8 +535,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { List> bases = new ArrayList<>(); Optional.ofNullable(recipe.base()).ifPresent(it -> { - for (Holder in : it.items()) { - bases.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : it.items()) { + bases.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } }); layout.addIngredient('B', bases.isEmpty() ? GuiElement.EMPTY : GuiElement.recipeIngredient(bases, (e, c) -> { @@ -572,8 +568,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { List> additions = new ArrayList<>(); Optional.ofNullable(recipe.addition()).ifPresent(it -> { - for (Holder in : it.items()) { - additions.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : it.items()) { + additions.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } }); layout.addIngredient('C', additions.isEmpty() ? GuiElement.EMPTY : GuiElement.recipeIngredient(additions, (e, c) -> { @@ -623,8 +619,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { List> ingredients = new ArrayList<>(); net.momirealms.craftengine.core.item.recipe.Ingredient ingredient = recipe.ingredient(); - for (Holder in : ingredient.items()) { - ingredients.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : ingredient.items()) { + ingredients.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } GuiLayout layout = new GuiLayout( " ", @@ -756,8 +752,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { List> ingredients = new ArrayList<>(); net.momirealms.craftengine.core.item.recipe.Ingredient ingredient = recipe.ingredient(); - for (Holder in : ingredient.items()) { - ingredients.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : ingredient.items()) { + ingredients.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } GuiLayout layout = new GuiLayout( " ", @@ -1001,8 +997,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { layout.addIngredient(currentChar, Ingredient.EMPTY); } else { List> ingredients = new ArrayList<>(); - for (Holder in : ingredient.items()) { - ingredients.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : ingredient.items()) { + ingredients.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } layout.addIngredient(currentChar, GuiElement.recipeIngredient(ingredients, (e, c) -> { c.cancel(); @@ -1044,8 +1040,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { char currentChar = (char) (start + x + y * 3); if (i < ingredients.size()) { List> ingredientItems = new ArrayList<>(); - for (Holder in : ingredients.get(i).items()) { - ingredientItems.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + for (UniqueKey in : ingredients.get(i).items()) { + ingredientItems.add(this.plugin.itemManager().createWrappedItem(in.key(), player)); } layout.addIngredient(currentChar, GuiElement.recipeIngredient(ingredientItems, (e, c) -> { c.cancel(); 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 b54673e5a..0314031ad 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 @@ -36,12 +36,10 @@ import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory import net.momirealms.craftengine.core.plugin.context.function.FunctionFactory; import net.momirealms.craftengine.core.plugin.context.number.NumberProviderFactory; import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectorFactory; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceKey; public class BuiltInRegistries { 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); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/UniqueKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/UniqueKey.java new file mode 100644 index 000000000..66b1a877e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/UniqueKey.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public final class UniqueKey { + private static final Map CACHE = new HashMap<>(4096, 0.5f); + private final Key key; + + private UniqueKey(Key key) { + this.key = key; + } + + public static UniqueKey create(Key key) { + return CACHE.computeIfAbsent(key, UniqueKey::new); + } + + @Nullable + public static UniqueKey getCached(Key key) { + return CACHE.get(key); + } + + public Key key() { + return key; + } +}