From f832614755c2beb89d37f0a6fbef0c5b3c6786fc Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 15 Feb 2025 01:44:26 +0800 Subject: [PATCH] Seeing Through the Trick --- .../default/configuration/palm_tree.yml | 4 + .../api/event/CustomBlockPlaceEvent.java | 1 - .../bukkit/api/event/FurniturePlaceEvent.java | 3 - .../bukkit/item/ItemEventListener.java | 4 +- .../item/behavior/FurnitureItemBehavior.java | 2 - .../item/recipe/BukkitRecipeManager.java | 204 ++++++++++++++++-- .../item/recipe/RecipeEventListener.java | 135 +++++++++++- .../bukkit/util/AttributeUtils.java | 4 - .../craftengine/bukkit/util/BlockTags.java | 2 + .../bukkit/util/BukkitReflectionUtils.java | 3 +- .../bukkit/util/ComponentUtils.java | 2 + .../bukkit/util/DirectionUtils.java | 2 + .../bukkit/util/EnchantmentUtils.java | 2 + .../craftengine/bukkit/util/EntityUtils.java | 2 + .../craftengine/bukkit/util/EventUtils.java | 2 + .../bukkit/util/InteractUtils.java | 2 + .../bukkit/util/InventoryUtils.java | 2 + .../craftengine/bukkit/util/ItemTags.java | 2 + .../craftengine/bukkit/util/ItemUtils.java | 9 + .../craftengine/bukkit/util/KeyUtils.java | 2 + .../craftengine/bukkit/util/LightUtils.java | 2 + .../bukkit/util/LocationUtils.java | 2 + .../bukkit/util/MaterialUtils.java | 2 + .../bukkit/util/MobEffectUtils.java | 2 + .../util/NoteBlockChainUpdateUtils.java | 2 + .../bukkit/util/PlaceholderAPIUtils.java | 2 + .../craftengine/bukkit/util/PlayerUtils.java | 2 + .../craftengine/bukkit/util/Reflections.java | 77 ++++++- .../craftengine/bukkit/util/SoundUtils.java | 2 + .../craftengine/bukkit/util/WorldUtils.java | 13 -- .../core/block/properties/StringProperty.java | 6 +- .../item/modifier/UnbreakableModifier.java | 3 - .../core/item/recipe/AbstractRecipe.java | 10 +- .../core/item/recipe/CookingInput.java | 15 ++ .../core/item/recipe/CookingRecipe.java | 57 +++++ .../item/recipe/CookingRecipeCategory.java | 7 + ...egory.java => CraftingRecipeCategory.java} | 2 +- .../core/item/recipe/CraftingTableRecipe.java | 10 +- .../item/recipe/CustomBlastingRecipe.java | 52 +++++ .../item/recipe/CustomCampfireRecipe.java | 52 +++++ .../core/item/recipe/CustomShapedRecipe.java | 4 +- .../item/recipe/CustomShapelessRecipe.java | 4 +- .../item/recipe/CustomSmeltingRecipe.java | 52 +++++ .../core/item/recipe/CustomSmokingRecipe.java | 52 +++++ .../craftengine/core/item/recipe/Recipe.java | 3 - .../core/item/recipe/RecipeTypes.java | 8 + .../recipe/vanilla/VanillaBlastingRecipe.java | 12 ++ .../recipe/vanilla/VanillaCampfireRecipe.java | 12 ++ .../recipe/vanilla/VanillaCookingRecipe.java | 36 ++++ .../recipe/vanilla/VanillaCraftingRecipe.java | 16 ++ .../item/recipe/vanilla/VanillaRecipe.java | 10 +- .../recipe/vanilla/VanillaRecipeReader.java | 8 + .../recipe/vanilla/VanillaShapedRecipe.java | 6 +- .../vanilla/VanillaShapelessRecipe.java | 6 +- .../recipe/vanilla/VanillaSmeltingRecipe.java | 12 ++ .../recipe/vanilla/VanillaSmokingRecipe.java | 12 ++ .../vanilla/impl/AbstractRecipeReader.java | 20 +- .../vanilla/impl/VanillaRecipeReader1_20.java | 72 ++++++- .../impl/VanillaRecipeReader1_21_2.java | 14 ++ .../loot/entry/ExpLootEntryContainer.java | 1 - .../core/loot/function/DropExpFunction.java | 7 +- .../craftengine/core/plugin/CraftEngine.java | 1 - .../craftengine/core/util/HexaFunction.java | 6 + .../craftengine/core/util/PentaFunction.java | 6 + .../craftengine/mod/CraftEnginePlugin.java | 2 - 65 files changed, 985 insertions(+), 106 deletions(-) delete mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java delete mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingInput.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java rename core/src/main/java/net/momirealms/craftengine/core/item/recipe/{RecipeCategory.java => CraftingRecipeCategory.java} (74%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml b/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml index 2538029f4..ae342596f 100644 --- a/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml +++ b/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml @@ -154,6 +154,7 @@ items: tags: - "default:palm_logs" - "minecraft:logs" + - "minecraft:logs_that_burn" data: display-name: "Palm Log" model: @@ -170,6 +171,7 @@ items: tags: - "default:palm_logs" - "minecraft:logs" + - "minecraft:logs_that_burn" data: display-name: "Stripped Palm Log" model: @@ -186,6 +188,7 @@ items: tags: - "default:palm_logs" - "minecraft:logs" + - "minecraft:logs_that_burn" data: display-name: "Palm Wood" model: @@ -202,6 +205,7 @@ items: tags: - "default:palm_logs" - "minecraft:logs" + - "minecraft:logs_that_burn" data: display-name: "Stripped Palm Wood" model: diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java index bdcf57322..1c8619e91 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java index 7b0f33b03..8191c9a09 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java @@ -1,11 +1,8 @@ package net.momirealms.craftengine.bukkit.api.event; import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; -import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; -import net.momirealms.craftengine.core.entity.furniture.AnchorType; import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java index a80d0928d..8f3be4306 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java @@ -33,7 +33,9 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import java.util.*; +import java.util.List; +import java.util.Objects; +import java.util.Optional; public class ItemEventListener implements Listener { private final BukkitCraftEngine plugin; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 8f0de4bcd..ab1136262 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.bukkit.item.behavior; import net.momirealms.craftengine.bukkit.api.event.FurnitureAttemptPlaceEvent; import net.momirealms.craftengine.bukkit.api.event.FurniturePlaceEvent; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; -import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.bukkit.util.EventUtils; import net.momirealms.craftengine.core.block.BlockSounds; @@ -28,7 +27,6 @@ import org.bukkit.persistence.PersistentDataType; import org.bukkit.util.Transformation; import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; -import org.joml.Vector3d; import org.joml.Vector3f; import java.util.*; 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 3721e9f5e..928ef674c 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 @@ -11,12 +11,11 @@ import net.momirealms.craftengine.bukkit.util.MaterialUtils; import net.momirealms.craftengine.bukkit.util.RecipeUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.recipe.CookingRecipe; +import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.*; import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; -import net.momirealms.craftengine.core.item.recipe.vanilla.RecipeResult; -import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaRecipeReader; -import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapedRecipe; -import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapelessRecipe; +import net.momirealms.craftengine.core.item.recipe.vanilla.*; import net.momirealms.craftengine.core.item.recipe.vanilla.impl.VanillaRecipeReader1_20; import net.momirealms.craftengine.core.item.recipe.vanilla.impl.VanillaRecipeReader1_20_5; import net.momirealms.craftengine.core.item.recipe.vanilla.impl.VanillaRecipeReader1_21_2; @@ -25,21 +24,22 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.HexaFunction; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.PentaFunction; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.event.HandlerList; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.RecipeChoice; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.*; +import org.bukkit.inventory.recipe.CookingBookCategory; import org.bukkit.inventory.recipe.CraftingBookCategory; import org.jetbrains.annotations.Nullable; import java.io.Reader; import java.lang.reflect.Array; +import java.lang.reflect.Method; import java.nio.file.Path; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -69,7 +69,7 @@ public class BukkitRecipeManager implements RecipeManager { try { Object craftRecipe = Reflections.method$CraftShapedRecipe$fromBukkitRecipe.invoke(null, shapedRecipe); Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); - injectShapedRecipe(new Key(key.namespace(), key.value()), recipe); + injectShapedRecipe(new Key(key.namespace(), key.value()), ceRecipe); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to convert shaped recipe", e); } @@ -89,11 +89,95 @@ public class BukkitRecipeManager implements RecipeManager { try { Object craftRecipe = Reflections.method$CraftShapelessRecipe$fromBukkitRecipe.invoke(null, shapelessRecipe); Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); - injectShapelessRecipe(new Key(key.namespace(), key.value()), recipe); + injectShapelessRecipe(new Key(key.namespace(), key.value()), ceRecipe); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to convert shapeless recipe", e); } }); + BUKKIT_RECIPE_REGISTER.put(RecipeTypes.SMELTING, (key, recipe) -> { + CustomSmeltingRecipe ceRecipe = (CustomSmeltingRecipe) recipe; + FurnaceRecipe furnaceRecipe = new FurnaceRecipe( + key, ceRecipe.getResult(null), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + furnaceRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + furnaceRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftFurnaceRecipe$fromBukkitRecipe.invoke(null, furnaceRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert smelting recipe", e); + } + }); + BUKKIT_RECIPE_REGISTER.put(RecipeTypes.SMOKING, (key, recipe) -> { + CustomSmokingRecipe ceRecipe = (CustomSmokingRecipe) recipe; + SmokingRecipe smokingRecipe = new SmokingRecipe( + key, ceRecipe.getResult(null), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + smokingRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + smokingRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftSmokingRecipe$fromBukkitRecipe.invoke(null, smokingRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert smoking recipe", e); + } + }); + BUKKIT_RECIPE_REGISTER.put(RecipeTypes.BLASTING, (key, recipe) -> { + CustomBlastingRecipe ceRecipe = (CustomBlastingRecipe) recipe; + BlastingRecipe blastingRecipe = new BlastingRecipe( + key, ceRecipe.getResult(null), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + blastingRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + blastingRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftBlastingRecipe$fromBukkitRecipe.invoke(null, blastingRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert blasting recipe", e); + } + }); + BUKKIT_RECIPE_REGISTER.put(RecipeTypes.CAMPFIRE_COOKING, (key, recipe) -> { + CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) recipe; + CampfireRecipe campfireRecipe = new CampfireRecipe( + key, ceRecipe.getResult(null), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + campfireRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + campfireRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftCampfireRecipe$fromBukkitRecipe.invoke(null, campfireRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert campfire recipe", e); + } + }); } private final BukkitCraftEngine plugin; @@ -333,6 +417,22 @@ public class BukkitRecipeManager implements RecipeManager { VanillaShapelessRecipe recipe = this.recipeReader.readShapeless(jsonObject); handleDataPackShapelessRecipe(id, recipe, (injectLogics::add)); } + case "minecraft:smelting" -> { + VanillaSmeltingRecipe recipe = this.recipeReader.readSmelting(jsonObject); + handleDataPackCookingRecipe(id, recipe, FurnaceRecipe::new, CustomSmeltingRecipe::new, Reflections.method$CraftFurnaceRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:blasting" -> { + VanillaBlastingRecipe recipe = this.recipeReader.readBlasting(jsonObject); + handleDataPackCookingRecipe(id, recipe, BlastingRecipe::new, CustomBlastingRecipe::new, Reflections.method$CraftBlastingRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:smoking" -> { + VanillaSmokingRecipe recipe = this.recipeReader.readSmoking(jsonObject); + handleDataPackCookingRecipe(id, recipe, SmokingRecipe::new, CustomSmokingRecipe::new, Reflections.method$CraftSmokingRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:campfire_cooking" -> { + VanillaCampfireRecipe recipe = this.recipeReader.readCampfire(jsonObject); + handleDataPackCookingRecipe(id, recipe, CampfireRecipe::new, CustomCampfireRecipe::new, Reflections.method$CraftCampfireRecipe$fromBukkitRecipe, (injectLogics::add)); + } } } } @@ -471,6 +571,65 @@ public class BukkitRecipeManager implements RecipeManager { this.addVanillaInternalRecipe(id, ceRecipe); } + private void handleDataPackCookingRecipe(Key id, + VanillaCookingRecipe recipe, + PentaFunction> constructor1, + HexaFunction, Integer, Float, CustomRecipeResult, CookingRecipe> constructor2, + Method fromBukkitRecipeMethod, + Consumer callback) { + NamespacedKey key = new NamespacedKey(id.namespace(), id.value()); + ItemStack result = createResultStack(recipe.result()); + + Set materials = new HashSet<>(); + Set> holders = new HashSet<>(); + + boolean hasCustomItemInTag = false; + for (String item : recipe.ingredient()) { + if (item.charAt(0) == '#') { + Key tag = Key.from(item.substring(1)); + materials.addAll(tagToMaterials(tag)); + if (!hasCustomItemInTag) { + if (!plugin.itemManager().tagToCustomItems(tag).isEmpty()) { + hasCustomItemInTag = true; + } + } + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + materials.add(MaterialUtils.getMaterial(item)); + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + org.bukkit.inventory.CookingRecipe cookingRecipe = constructor1.apply(key, result, new RecipeChoice.MaterialChoice(new ArrayList<>(materials)), recipe.experience(), recipe.cookingTime()); + if (recipe.group() != null) { + cookingRecipe.setGroup(recipe.group()); + } + if (recipe.category() != null) { + cookingRecipe.setCategory(CookingBookCategory.valueOf(recipe.category().name())); + } + + CookingRecipe ceRecipe = constructor2.apply( + recipe.category(), + recipe.group(), + Ingredient.of(holders), + recipe.cookingTime(), + recipe.experience(), + new CustomRecipeResult<>(new CloneableConstantItem(result), recipe.result().count()) + ); + if (hasCustomItemInTag) { + callback.accept(() -> { + try { + unregisterRecipe(key); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(fromBukkitRecipeMethod.invoke(null, cookingRecipe)); + injectCookingRecipe(id, ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert smelting recipe", e); + } + }); + this.injectedDataPackRecipes.add(key); + } + this.addVanillaInternalRecipe(id, ceRecipe); + } + private List tagToMaterials(Key tag) { Set materials = new HashSet<>(); List> holders = this.plugin.itemManager().tagToVanillaItems(tag); @@ -547,8 +706,8 @@ public class BukkitRecipeManager implements RecipeManager { return itemStacks; } - private static void injectShapedRecipe(Key id, Recipe recipe) throws ReflectiveOperationException { - List> actualIngredients = ((CustomShapedRecipe) recipe).parsedPattern().ingredients() + private static void injectShapedRecipe(Key id, CustomShapedRecipe recipe) throws ReflectiveOperationException { + List> actualIngredients = recipe.parsedPattern().ingredients() .stream() .filter(Optional::isPresent) .map(Optional::get) @@ -568,8 +727,8 @@ public class BukkitRecipeManager implements RecipeManager { } @SuppressWarnings("unchecked") - private static void injectShapelessRecipe(Key id, Recipe recipe) throws ReflectiveOperationException { - List> actualIngredients = ((CustomShapelessRecipe) recipe).ingredients(); + private static void injectShapelessRecipe(Key id, CustomShapelessRecipe recipe) throws ReflectiveOperationException { + List> actualIngredients = recipe.ingredients(); Object shapelessRecipe = getNMSRecipe(id); recipeToMcRecipeHolder.put(recipe, shapelessRecipe); @@ -584,6 +743,23 @@ public class BukkitRecipeManager implements RecipeManager { injectIngredients(ingredients, actualIngredients); } + private static void injectCookingRecipe(Key id, CookingRecipe recipe) throws ReflectiveOperationException { + Ingredient actualIngredient = recipe.ingredient(); + Object smeltingRecipe = getNMSRecipe(id); + recipeToMcRecipeHolder.put(recipe, smeltingRecipe); + if (VersionHelper.isVersionNewerThan1_20_2()) { + smeltingRecipe = Reflections.field$RecipeHolder$recipe.get(smeltingRecipe); + } + + Object ingredient; + if (VersionHelper.isVersionNewerThan1_21_2()) { + ingredient = Reflections.field$SingleItemRecipe$input.get(smeltingRecipe); + } else { + ingredient = Reflections.field$AbstractCookingRecipe$input.get(smeltingRecipe); + } + injectIngredients(List.of(ingredient), List.of(actualIngredient)); + } + // recipe on 1.20.1 and holder on 1.20.2+ private static Object getNMSRecipe(Key id) throws ReflectiveOperationException { if (VersionHelper.isVersionNewerThan1_21_2()) { 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 5968b8685..c6963341d 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 @@ -6,6 +6,7 @@ import net.momirealms.craftengine.bukkit.util.ItemUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.CookingInput; import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; @@ -14,12 +15,15 @@ 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.VersionHelper; +import org.bukkit.Chunk; import org.bukkit.Material; +import org.bukkit.block.*; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.event.inventory.*; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.EntitiesLoadEvent; import org.bukkit.inventory.*; import java.util.ArrayList; @@ -38,7 +42,7 @@ public class RecipeEventListener implements Listener { this.plugin = plugin; } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onClickCartographyTable(InventoryClickEvent event) { if (VersionHelper.isPaper()) return; if (!(event.getClickedInventory() instanceof CartographyInventory cartographyInventory)) { @@ -51,7 +55,14 @@ public class RecipeEventListener implements Listener { }); } - @EventHandler + @EventHandler(ignoreCancelled = true) + public void onChunkLoad(ChunkLoadEvent event) { + for (BlockState state : event.getChunk().getTileEntities()) { + + } + } + + @EventHandler(ignoreCancelled = true) public void onSpecialRecipe(PrepareItemCraftEvent event) { org.bukkit.inventory.Recipe recipe = event.getRecipe(); if (recipe == null) @@ -64,8 +75,8 @@ public class RecipeEventListener implements Listener { } } - @EventHandler - public void onCrafting(PrepareItemCraftEvent event) { + @EventHandler(ignoreCancelled = true) + public void onCraftingRecipe(PrepareItemCraftEvent event) { org.bukkit.inventory.Recipe recipe = event.getRecipe(); if (recipe == null) return; @@ -143,21 +154,21 @@ public class RecipeEventListener implements Listener { if (ceRecipe != null) { inventory.setResult(ceRecipe.getResult(serverPlayer)); serverPlayer.setLastUsedRecipe(ceRecipe); - correctRecipeUsed(inventory, ceRecipe); + correctCraftingRecipeUsed(inventory, ceRecipe); return; } ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPED, input); if (ceRecipe != null) { inventory.setResult(ceRecipe.getResult(serverPlayer)); serverPlayer.setLastUsedRecipe(ceRecipe); - correctRecipeUsed(inventory, ceRecipe); + correctCraftingRecipeUsed(inventory, ceRecipe); return; } // clear result if not met inventory.setResult(null); } - private void correctRecipeUsed(CraftingInventory inventory, Recipe recipe) { + private void correctCraftingRecipeUsed(CraftingInventory inventory, Recipe recipe) { Object holderOrRecipe = recipeManager.getRecipeHolderByRecipe(recipe); if (holderOrRecipe == null) return; try { @@ -167,4 +178,110 @@ public class RecipeEventListener implements Listener { plugin.logger().warn("Failed to correct used recipe", e); } } + + // TODO find a lighter way + @EventHandler(ignoreCancelled = true) + public void onFurnaceBurn(FurnaceBurnEvent event) { + if (!(event.getBlock().getState() instanceof Furnace furnace)) { + return; + } + FurnaceInventory inventory = furnace.getInventory(); + } + + @EventHandler(ignoreCancelled = true) + public void onFurnaceStartSmelt(FurnaceStartSmeltEvent event) { + CookingRecipe recipe = event.getRecipe(); + + Key recipeId = Key.of(recipe.getKey().namespace(), recipe.getKey().value()); + boolean isCustom = this.recipeManager.isCustomRecipe(recipeId); + ItemStack sourceItem = event.getSource(); + + if (this.recipeManager.isDataPackRecipe(recipeId) && !isCustom) { + if (ItemUtils.isCustomItem(sourceItem)) { + event.setTotalCookTime(Integer.MAX_VALUE); + } + return; + } + + if (!isCustom) { + return; + } + + Item wrappedItem = this.itemManager.wrap(sourceItem); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + event.setTotalCookTime(Integer.MAX_VALUE); + return; + } + + CookingInput input = new CookingInput<>(new OptimizedIDItem<>(idHolder.get(), event.getSource())); + net.momirealms.craftengine.core.item.recipe.CookingRecipe ceRecipe; + if (recipe instanceof FurnaceRecipe) { + ceRecipe = (net.momirealms.craftengine.core.item.recipe.CookingRecipe) this.recipeManager.getRecipe(RecipeTypes.SMELTING, input); + } else if (recipe instanceof SmokingRecipe) { + ceRecipe = (net.momirealms.craftengine.core.item.recipe.CookingRecipe) this.recipeManager.getRecipe(RecipeTypes.SMOKING, input); + } else if (recipe instanceof BlastingRecipe) { + ceRecipe = (net.momirealms.craftengine.core.item.recipe.CookingRecipe) this.recipeManager.getRecipe(RecipeTypes.BLASTING, input); + } else { + event.setTotalCookTime(Integer.MAX_VALUE); + return; + } + + if (ceRecipe == null) { + event.setTotalCookTime(Integer.MAX_VALUE); + return; + } + + event.setTotalCookTime(ceRecipe.cookingTime()); + } + + @EventHandler(ignoreCancelled = true) + public void onFurnaceSmelt(FurnaceSmeltEvent event) { + CookingRecipe recipe = event.getRecipe(); + if (recipe == null) return; + + Key recipeId = Key.of(recipe.getKey().namespace(), recipe.getKey().value()); + boolean isCustom = this.recipeManager.isCustomRecipe(recipeId); + + if (this.recipeManager.isDataPackRecipe(recipeId) && !isCustom) { + if (ItemUtils.isCustomItem(event.getSource())) { + event.setCancelled(true); + } + return; + } + + if (!isCustom) { + return; + } + + Item wrappedItem = this.itemManager.wrap(event.getSource()); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + event.setCancelled(true); + return; + } + + CookingInput input = new CookingInput<>(new OptimizedIDItem<>(idHolder.get(), event.getSource())); + if (recipe instanceof FurnaceRecipe furnaceRecipe) { + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SMELTING, input); + if (ceRecipe != null) { + event.setResult(ceRecipe.getResult(null)); + return; + } + } else if (recipe instanceof SmokingRecipe smokingRecipe) { + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SMOKING, input); + if (ceRecipe != null) { + event.setResult(ceRecipe.getResult(null)); + return; + } + } else if (recipe instanceof BlastingRecipe blastingRecipe) { + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.BLASTING, input); + if (ceRecipe != null) { + event.setResult(ceRecipe.getResult(null)); + return; + } + } + + event.setCancelled(true); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java deleted file mode 100644 index 3d9236aa6..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.momirealms.craftengine.bukkit.util; - -public class AttributeUtils { -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java index 309379562..9642e8cfd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java @@ -8,6 +8,8 @@ import java.util.Map; public class BlockTags { private static final Map CACHE = new HashMap<>(); + private BlockTags() {} + public static Object getOrCreate(Key key) { Object value = CACHE.get(key); if (value == null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java index 6ed052ede..9bd26a702 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java @@ -13,8 +13,7 @@ public final class BukkitReflectionUtils { private static final String CB_PKG_VERSION; public static final int MAJOR_REVISION; - private BukkitReflectionUtils() { - } + private BukkitReflectionUtils() {} static { final Class serverClass; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java index 6311420ab..ac86735e0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java @@ -6,6 +6,8 @@ import net.momirealms.craftengine.core.util.VersionHelper; public class ComponentUtils { + private ComponentUtils() {} + public static Object adventureToMinecraft(Component component) { String json = AdventureHelper.componentToJson(component); if (VersionHelper.isVersionNewerThan1_20_5()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java index c94f41da0..8e9b08ab0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java @@ -5,6 +5,8 @@ import org.bukkit.block.BlockFace; public class DirectionUtils { + private DirectionUtils() {} + public static Direction toDirection(BlockFace face) { return switch (face) { case UP -> Direction.UP; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java index ffa626173..f184091e8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java @@ -5,6 +5,8 @@ import java.util.Map; public class EnchantmentUtils { + private EnchantmentUtils() {} + @SuppressWarnings("unchecked") public static Map toMap(Object itemEnchantments) throws ReflectiveOperationException { Map map = new HashMap<>(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java index 7dba40e20..cb44a126b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java @@ -10,6 +10,8 @@ import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityUtils { + private EntityUtils() {} + public static BlockPos getOnPos(Player player) { try { Object serverPlayer = Reflections.method$CraftPlayer$getHandle.invoke(player); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java index 0e4895c95..2a09a636b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java @@ -6,6 +6,8 @@ import org.bukkit.event.Event; public class EventUtils { + private EventUtils() {} + public static void fireAndForget(Event event) { Bukkit.getPluginManager().callEvent(event); } 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 55abc8abe..04702bbf5 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 @@ -20,6 +20,8 @@ public class InteractUtils { private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); private static final Key NOTE_BLOCK_TOP_INSTRUMENTS = Key.of("minecraft:noteblock_top_instruments"); + private InteractUtils() {} + static { register(BlockKeys.NOTE_BLOCK, (player, item, blockState, result) -> result.getDirection() != Direction.UP || !item.is(NOTE_BLOCK_TOP_INSTRUMENTS)); register(BlockKeys.CAKE, (player, item, blockState, result) -> !canEat(player, false)); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java index 40c84192f..8949bb975 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java @@ -5,6 +5,8 @@ import org.bukkit.inventory.PlayerInventory; public class InventoryUtils { + private InventoryUtils() {} + public static int getSuitableHotbarSlot(PlayerInventory inventory) { int selectedSlot = inventory.getHeldItemSlot(); int i; 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 029ee94c2..4ff38788e 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 @@ -11,6 +11,8 @@ public class ItemTags { public static final Key AXES = Key.of("minecraft:axes"); public static final Key SWORDS = Key.of("minecraft:swords"); + private ItemTags() {} + public static Object getOrCreate(Key key) { Object value = CACHE.get(key); if (value == null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java index ce9141e39..4dc9840be 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java @@ -11,6 +11,8 @@ import java.lang.reflect.InvocationTargetException; public class ItemUtils { + private ItemUtils() {} + @Contract("null -> true") public static boolean isEmpty(final ItemStack item) { if (item == null) return true; @@ -40,4 +42,11 @@ public class ItemUtils { } return false; } + + public static boolean isCustomItem(ItemStack stack) { + if (!ItemUtils.isEmpty(stack)) { + return BukkitItemManager.instance().wrap(stack).customId().isPresent(); + } + return false; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java index 2549288c6..6c60650df 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java @@ -5,6 +5,8 @@ import org.bukkit.NamespacedKey; public class KeyUtils { + private KeyUtils() {} + public static Key namespacedKey2Key(NamespacedKey key) { return Key.of(key.namespace(), key.value()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java index 1b71588ba..11d772e19 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java @@ -9,6 +9,8 @@ import java.util.Map; public class LightUtils { + private LightUtils() {} + public static void updateChunkLight(World world, Map sectionPosSet) { try { Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java index 65c7bfa32..9f8560795 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java @@ -6,6 +6,8 @@ import org.jetbrains.annotations.NotNull; public class LocationUtils { + private LocationUtils() {} + public static Object toBlockPos(BlockPos pos) { try { return Reflections.constructor$BlockPos.newInstance(pos.x(), pos.y(), pos.z()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java index c36efe7f9..f6cc84aa0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java @@ -22,6 +22,8 @@ public class MaterialUtils { } } + private MaterialUtils() {} + @Nullable public static Material getMaterial(String name) { if (name == null || name.isEmpty()) return null; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java index ad8e78149..f61c6f023 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java @@ -2,6 +2,8 @@ package net.momirealms.craftengine.bukkit.util; public class MobEffectUtils { + private MobEffectUtils() {} + public static byte pack(boolean isAmbient, boolean isVisible, boolean showIcon) { byte b = 0; if (isAmbient) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java index 494fb7261..badab57bf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java @@ -4,6 +4,8 @@ import net.momirealms.craftengine.core.plugin.config.ConfigManager; public class NoteBlockChainUpdateUtils { + private NoteBlockChainUpdateUtils() {} + public static void noteBlockChainUpdate(Object level, Object chunkSource, Object direction, Object blockPos, int times) throws ReflectiveOperationException { if (times >= ConfigManager.maxChainUpdate()) return; Object relativePos = Reflections.method$BlockPos$relative.invoke(blockPos, direction); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java index 3e5c9ce07..200ab0b88 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java @@ -5,6 +5,8 @@ import org.bukkit.OfflinePlayer; public class PlaceholderAPIUtils { + private PlaceholderAPIUtils() {} + public static String parse(OfflinePlayer player, String text) { return PlaceholderAPI.setPlaceholders(player, text); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java index 698413bc6..0030b1a93 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java @@ -15,6 +15,8 @@ import static java.util.Objects.requireNonNull; public class PlayerUtils { + private PlayerUtils() {} + public static void dropItem(@NotNull Player player, @NotNull ItemStack itemStack, boolean retainOwnership, boolean noPickUpDelay, boolean throwRandomly) { requireNonNull(player, "player"); requireNonNull(itemStack, "itemStack"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index f89118fff..6f2bddd42 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -20,9 +20,7 @@ import org.bukkit.entity.HumanEntity; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.*; import sun.misc.Unsafe; import java.io.BufferedReader; @@ -4173,4 +4171,77 @@ public class Reflections { ReflectionUtils.getMethod( clazz$ItemStack, void.class, int.class, clazz$LivingEntity, clazz$EquipmentSlot ); + + // for 1.20.1-1.21.1 + public static final Class clazz$AbstractCookingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.AbstractCookingRecipe") + ) + ); + + // for 1.20.1-1.21.1 + public static final Field field$AbstractCookingRecipe$input = + ReflectionUtils.getDeclaredField( + clazz$AbstractCookingRecipe, clazz$Ingredient, 0 + ); + + // for 1.21.2+ + public static final Class clazz$SingleItemRecipe = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.SingleItemRecipe") + ); + + // for 1.21.2+ + public static final Field field$SingleItemRecipe$input = + Optional.ofNullable(clazz$SingleItemRecipe) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$Ingredient, 0)) + .orElse(null); + + public static final Class clazz$CraftFurnaceRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftFurnaceRecipe") + ) + ); + + public static final Method method$CraftFurnaceRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftFurnaceRecipe, clazz$CraftFurnaceRecipe, FurnaceRecipe.class + ) + ); + + public static final Class clazz$CraftBlastingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftBlastingRecipe") + ) + ); + + public static final Method method$CraftBlastingRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlastingRecipe, clazz$CraftBlastingRecipe, BlastingRecipe.class + ) + ); + + public static final Class clazz$CraftSmokingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftSmokingRecipe") + ) + ); + + public static final Method method$CraftSmokingRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftSmokingRecipe, clazz$CraftSmokingRecipe, SmokingRecipe.class + ) + ); + + public static final Class clazz$CraftCampfireRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftCampfireRecipe") + ) + ); + + public static final Method method$CraftCampfireRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftCampfireRecipe, clazz$CraftCampfireRecipe, CampfireRecipe.class + ) + ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java index 74e4c4b3f..b5fca65a4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java @@ -5,6 +5,8 @@ import net.momirealms.craftengine.core.util.Key; public class SoundUtils { + private SoundUtils() {} + public static Object toSoundType(BlockSounds sounds) throws ReflectiveOperationException { return Reflections.constructor$SoundType.newInstance( 1f, 1f, diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java deleted file mode 100644 index be7f62267..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.momirealms.craftengine.bukkit.util; - -import net.momirealms.craftengine.core.world.SectionPos; -import org.bukkit.World; - -public class WorldUtils { - - public static int getSectionCount(World world) { - int min = SectionPos.blockToSectionCoord(world.getMinHeight()); - int max = SectionPos.blockToSectionCoord(world.getMaxHeight() - 1) + 1; - return max - min; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java index e8871053f..ee1e88cff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java @@ -6,8 +6,10 @@ import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.sparrow.nbt.StringTag; import net.momirealms.sparrow.nbt.Tag; -import java.lang.reflect.Array; -import java.util.*; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; public class StringProperty extends Property { public static final Factory FACTORY = new Factory(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java index 421e8555d..09e93049e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java @@ -2,9 +2,6 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.plugin.minimessage.ImageTag; -import net.momirealms.craftengine.core.plugin.minimessage.PlaceholderTag; -import net.momirealms.craftengine.core.util.AdventureHelper; public class UnbreakableModifier implements ItemModifier { private final boolean argument; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java index 579896e58..65c47fbe0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java @@ -3,20 +3,12 @@ package net.momirealms.craftengine.core.item.recipe; import org.jetbrains.annotations.Nullable; public abstract class AbstractRecipe implements Recipe { - protected RecipeCategory category; protected String group; - protected AbstractRecipe(RecipeCategory category, String group) { - this.category = category; + protected AbstractRecipe(String group) { this.group = group; } - @Override - @Nullable - public RecipeCategory category() { - return category; - } - @Override @Nullable public String group() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingInput.java new file mode 100644 index 000000000..4fbd5270f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingInput.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; + +public class CookingInput implements RecipeInput { + private final OptimizedIDItem input; + + public CookingInput(OptimizedIDItem input) { + this.input = input; + } + + public OptimizedIDItem input() { + return input; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipe.java new file mode 100644 index 000000000..9243790a9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipe.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; + +public abstract class CookingRecipe extends AbstractRecipe { + protected final CookingRecipeCategory category; + protected final Ingredient ingredient; + protected final CustomRecipeResult result; + protected final float experience; + protected final int cookingTime; + + protected CookingRecipe(CookingRecipeCategory category, + String group, + Ingredient ingredient, + int cookingTime, + float experience, + CustomRecipeResult result) { + super(group); + this.category = category; + this.ingredient = ingredient; + this.result = result; + this.experience = experience; + this.cookingTime = cookingTime; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return this.ingredient.test(((CookingInput) input).input()); + } + + @Override + public T getResult(Player player) { + return this.result.buildItemStack(player); + } + + public CookingRecipeCategory category() { + return category; + } + + public Ingredient ingredient() { + return ingredient; + } + + public CustomRecipeResult result() { + return result; + } + + public float experience() { + return experience; + } + + public int cookingTime() { + return cookingTime; + } +} 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 new file mode 100644 index 000000000..98fa1c1cf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.item.recipe; + +public enum CookingRecipeCategory { + FOOD, + BLOCKS, + MISC +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeCategory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingRecipeCategory.java similarity index 74% rename from core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeCategory.java rename to core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingRecipeCategory.java index e8d44c57e..f656cc754 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeCategory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingRecipeCategory.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.item.recipe; -public enum RecipeCategory { +public enum CraftingRecipeCategory { BUILDING, REDSTONE, EQUIPMENT, diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java index 968c0e885..a90fda93e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java @@ -1,8 +1,14 @@ package net.momirealms.craftengine.core.item.recipe; public abstract class CraftingTableRecipe extends AbstractRecipe { + protected final CraftingRecipeCategory category; - protected CraftingTableRecipe(RecipeCategory category, String group) { - super(category, group); + protected CraftingTableRecipe(CraftingRecipeCategory category, String group) { + super(group); + this.category = category; + } + + public CraftingRecipeCategory category() { + return category; } } 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 new file mode 100644 index 000000000..146769322 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +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 org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomBlastingRecipe extends CookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomBlastingRecipe(CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.BLASTING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + 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 IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomBlastingRecipe( + recipeCategory, + 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 new file mode 100644 index 000000000..77a84024a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +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 org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomCampfireRecipe extends CookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomCampfireRecipe(CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.CAMPFIRE_COOKING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + 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 IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomCampfireRecipe( + recipeCategory, + 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 e69d99caa..b559dd8f3 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 @@ -18,7 +18,7 @@ public class CustomShapedRecipe extends CraftingTableRecipe { private final Pattern pattern; private final CustomRecipeResult result; - public CustomShapedRecipe(RecipeCategory category, String group, Pattern pattern, CustomRecipeResult result) { + public CustomShapedRecipe(CraftingRecipeCategory category, String group, Pattern pattern, CustomRecipeResult result) { super(category, group); this.pattern = pattern; this.parsedPattern = pattern.parse(); @@ -152,7 +152,7 @@ public class CustomShapedRecipe extends CraftingTableRecipe { if (ingredientMap == null) { throw new IllegalArgumentException("ingredients cannot be empty"); } - RecipeCategory recipeCategory = arguments.containsKey("category") ? RecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + CraftingRecipeCategory recipeCategory = arguments.containsKey("category") ? CraftingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; Map> ingredients = new HashMap<>(); for (Map.Entry entry : ingredientMap.entrySet()) { 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 36774f423..5af1fe30b 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 @@ -18,7 +18,7 @@ public class CustomShapelessRecipe extends CraftingTableRecipe { private final PlacementInfo placementInfo; private final CustomRecipeResult result; - public CustomShapelessRecipe(RecipeCategory category, String group, List> ingredients, CustomRecipeResult result) { + public CustomShapelessRecipe(CraftingRecipeCategory category, String group, List> ingredients, CustomRecipeResult result) { super(category, group); this.ingredients = ingredients; this.result = result; @@ -68,7 +68,7 @@ public class CustomShapelessRecipe extends CraftingTableRecipe { if (ingredientMap == null) { throw new IllegalArgumentException("ingredients cannot be empty"); } - RecipeCategory recipeCategory = arguments.containsKey("category") ? RecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + CraftingRecipeCategory recipeCategory = arguments.containsKey("category") ? CraftingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; List> ingredients = new ArrayList<>(); for (Map.Entry entry : ingredientMap.entrySet()) { 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 new file mode 100644 index 000000000..ee4fcb155 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +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 org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomSmeltingRecipe extends CookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomSmeltingRecipe(CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SMELTING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + 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 IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomSmeltingRecipe( + recipeCategory, + group, + Ingredient.of(holders), + cookingTime, + experience, + parseResult(arguments) + ); + } + } +} 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 new file mode 100644 index 000000000..6a994edb7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +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 org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomSmokingRecipe extends CookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomSmokingRecipe(CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SMOKING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + 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 IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomSmokingRecipe( + recipeCategory, + group, + Ingredient.of(holders), + cookingTime, + experience, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java index f44d5955c..3b3084c28 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java @@ -15,9 +15,6 @@ public interface Recipe { @NotNull Key type(); - @Nullable - RecipeCategory category(); - @Nullable String group(); } 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 21d258a69..d76f6ea7f 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 @@ -12,10 +12,18 @@ import java.util.Map; public class RecipeTypes { public static final Key SHAPED = Key.of("minecraft:shaped"); public static final Key SHAPELESS = Key.of("minecraft:shapeless"); + public static final Key SMELTING = Key.of("minecraft:smelting"); + public static final Key BLASTING = Key.of("minecraft:blasting"); + public static final Key SMOKING = Key.of("minecraft:smoking"); + public static final Key CAMPFIRE_COOKING = Key.of("minecraft:campfire_cooking"); static { register(SHAPED, CustomShapedRecipe.FACTORY); register(SHAPELESS, CustomShapelessRecipe.FACTORY); + register(SMELTING, CustomSmeltingRecipe.FACTORY); + register(SMOKING, CustomSmokingRecipe.FACTORY); + register(BLASTING, CustomBlastingRecipe.FACTORY); + register(CAMPFIRE_COOKING, CustomCampfireRecipe.FACTORY); } public static void register(Key key, RecipeFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java new file mode 100644 index 000000000..9e6775d69 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaBlastingRecipe extends VanillaCookingRecipe { + + public VanillaBlastingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java new file mode 100644 index 000000000..b2d8cae30 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaCampfireRecipe extends VanillaCookingRecipe { + + public VanillaCampfireRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java new file mode 100644 index 000000000..594d372ac --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public abstract class VanillaCookingRecipe extends VanillaRecipe { + protected final List ingredient; + protected final CookingRecipeCategory category; + protected final float experience; + protected final int cookingTime; + + protected VanillaCookingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(group, result); + this.ingredient = ingredient; + this.experience = experience; + this.cookingTime = cookingTime; + this.category = category; + } + + public CookingRecipeCategory category() { + return category; + } + + public List ingredient() { + return ingredient; + } + + public float experience() { + return experience; + } + + public int cookingTime() { + return cookingTime; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java new file mode 100644 index 000000000..2ba1d3c09 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; + +public class VanillaCraftingRecipe extends VanillaRecipe { + protected final CraftingRecipeCategory category; + + protected VanillaCraftingRecipe(CraftingRecipeCategory category, String group, RecipeResult result) { + super(group, result); + this.category = category; + } + + public CraftingRecipeCategory category() { + return category; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java index bfcd63726..000077538 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java @@ -1,22 +1,14 @@ package net.momirealms.craftengine.core.item.recipe.vanilla; -import net.momirealms.craftengine.core.item.recipe.RecipeCategory; - public abstract class VanillaRecipe { protected final String group; - protected final RecipeCategory category; protected final RecipeResult result; - protected VanillaRecipe(RecipeCategory category, String group, RecipeResult result) { - this.category = category; + protected VanillaRecipe(String group, RecipeResult result) { this.group = group; this.result = result; } - public RecipeCategory category() { - return category; - } - public String group() { return group; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java index 2db9351a3..bca7b26ef 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java @@ -7,4 +7,12 @@ public interface VanillaRecipeReader { VanillaShapedRecipe readShaped(JsonObject json); VanillaShapelessRecipe readShapeless(JsonObject json); + + VanillaBlastingRecipe readBlasting(JsonObject json); + + VanillaSmeltingRecipe readSmelting(JsonObject json); + + VanillaSmokingRecipe readSmoking(JsonObject json); + + VanillaCampfireRecipe readCampfire(JsonObject json); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java index bffe26c1a..3b8f5d127 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java @@ -1,15 +1,15 @@ package net.momirealms.craftengine.core.item.recipe.vanilla; -import net.momirealms.craftengine.core.item.recipe.RecipeCategory; +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; import java.util.List; import java.util.Map; -public class VanillaShapedRecipe extends VanillaRecipe { +public class VanillaShapedRecipe extends VanillaCraftingRecipe { private final String[] pattern; private final Map> key; - public VanillaShapedRecipe(RecipeCategory category, + public VanillaShapedRecipe(CraftingRecipeCategory category, String group, Map> key, String[] pattern, diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java index 878662b39..613a2f7e8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java @@ -1,13 +1,13 @@ package net.momirealms.craftengine.core.item.recipe.vanilla; -import net.momirealms.craftengine.core.item.recipe.RecipeCategory; +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; import java.util.List; -public class VanillaShapelessRecipe extends VanillaRecipe { +public class VanillaShapelessRecipe extends VanillaCraftingRecipe { private final List> ingredients; - public VanillaShapelessRecipe(RecipeCategory category, String group, List> ingredients, RecipeResult result) { + public VanillaShapelessRecipe(CraftingRecipeCategory category, String group, List> ingredients, RecipeResult result) { super(category, group, result); this.ingredients = ingredients; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java new file mode 100644 index 000000000..5aa346c26 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaSmeltingRecipe extends VanillaCookingRecipe { + + public VanillaSmeltingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java new file mode 100644 index 000000000..df919f810 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaSmokingRecipe extends VanillaCookingRecipe { + + public VanillaSmokingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java index a6be31749..ba3878e9f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java @@ -3,7 +3,8 @@ package net.momirealms.craftengine.core.item.recipe.vanilla.impl; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.item.recipe.RecipeCategory; +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaRecipeReader; import org.jetbrains.annotations.Nullable; @@ -28,7 +29,20 @@ public abstract class AbstractRecipeReader implements VanillaRecipeReader { } @Nullable - protected RecipeCategory readCategory(JsonObject object) { - return object.has("category") ? RecipeCategory.valueOf(object.get("category").getAsString().toUpperCase(Locale.ENGLISH)) : null; + protected CraftingRecipeCategory readCraftingCategory(JsonObject object) { + return object.has("category") ? CraftingRecipeCategory.valueOf(object.get("category").getAsString().toUpperCase(Locale.ENGLISH)) : null; + } + + @Nullable + protected CookingRecipeCategory readCookingCategory(JsonObject object) { + return object.has("category") ? CookingRecipeCategory.valueOf(object.get("category").getAsString().toUpperCase(Locale.ENGLISH)) : null; + } + + protected float readExperience(JsonObject object) { + return object.has("experience") ? object.get("experience").getAsFloat() : 0; + } + + protected int readCookingTime(JsonObject object) { + return object.has("cookingtime") ? object.get("cookingtime").getAsInt() : 200; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java index 1ba03642f..27fd04af0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java @@ -3,9 +3,7 @@ package net.momirealms.craftengine.core.item.recipe.vanilla.impl; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.item.recipe.vanilla.RecipeResult; -import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapedRecipe; -import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapelessRecipe; +import net.momirealms.craftengine.core.item.recipe.vanilla.*; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -18,7 +16,7 @@ public class VanillaRecipeReader1_20 extends AbstractRecipeReader { @Override public VanillaShapedRecipe readShaped(JsonObject json) { return new VanillaShapedRecipe( - readCategory(json), + readCraftingCategory(json), readGroup(json), readShapedIngredientMap(json.getAsJsonObject("key")), readPattern(json), @@ -29,13 +27,77 @@ public class VanillaRecipeReader1_20 extends AbstractRecipeReader { @Override public VanillaShapelessRecipe readShapeless(JsonObject json) { return new VanillaShapelessRecipe( - readCategory(json), + readCraftingCategory(json), readGroup(json), readShapelessIngredients(json.getAsJsonArray("ingredients")), readResult(json.getAsJsonObject("result")) ); } + @Override + public VanillaBlastingRecipe readBlasting(JsonObject json) { + return new VanillaBlastingRecipe( + readCookingCategory(json), + readGroup(json), + readResult(json.getAsJsonObject("result")), + readCookingIngredients(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaSmeltingRecipe readSmelting(JsonObject json) { + return new VanillaSmeltingRecipe( + readCookingCategory(json), + readGroup(json), + readResult(json.getAsJsonObject("result")), + readCookingIngredients(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaSmokingRecipe readSmoking(JsonObject json) { + return new VanillaSmokingRecipe( + readCookingCategory(json), + readGroup(json), + readResult(json.getAsJsonObject("result")), + readCookingIngredients(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaCampfireRecipe readCampfire(JsonObject json) { + return new VanillaCampfireRecipe( + readCookingCategory(json), + readGroup(json), + readResult(json.getAsJsonObject("result")), + readCookingIngredients(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + protected List readCookingIngredients(JsonElement json) { + List ingredients = new ArrayList<>(); + if (json.isJsonObject()) { + JsonObject argument = json.getAsJsonObject(); + if (argument.has("item")) { + ingredients.add(argument.get("item").getAsString()); + } else if (argument.has("tag")) { + ingredients.add("#" + argument.get("tag").getAsString()); + } + } else if (json.isJsonArray()) { + List items = readIngredientList((JsonArray) json); + ingredients.addAll(items); + } + return ingredients; + } + @NotNull protected RecipeResult readResult(JsonObject object) { String item = object.get("item").getAsString(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java index 7bbf3c69b..6cd09e8d5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java @@ -11,6 +11,20 @@ import java.util.Map; public class VanillaRecipeReader1_21_2 extends VanillaRecipeReader1_20_5 { + @Override + protected List readCookingIngredients(JsonElement json) { + if (json.isJsonPrimitive()) { + return List.of(json.getAsString()); + } else { + JsonArray array = json.getAsJsonArray(); + List ingredients = new ArrayList<>(); + for (JsonElement element : array) { + ingredients.add(element.getAsString()); + } + return ingredients; + } + } + @Override protected Map> readShapedIngredientMap(JsonObject json) { Map> ingredients = new HashMap<>(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java index 330eb3349..2a8545531 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -7,7 +7,6 @@ import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.loot.provider.NumberProvider; import net.momirealms.craftengine.core.loot.provider.NumberProviders; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java index abc6c5441..19a769501 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java @@ -8,10 +8,11 @@ import net.momirealms.craftengine.core.loot.parameter.LootParameters; import net.momirealms.craftengine.core.loot.provider.NumberProvider; import net.momirealms.craftengine.core.loot.provider.NumberProviders; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.world.Vec3d; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class DropExpFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); 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 a5ffe77b0..f809461eb 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,7 +7,6 @@ import net.momirealms.craftengine.core.font.FontManagerImpl; import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.item.recipe.RecipeManager; import net.momirealms.craftengine.core.pack.PackManager; -import net.momirealms.craftengine.core.pack.PackManagerImpl; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java new file mode 100644 index 000000000..ceefc32a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface HexaFunction { + R apply(T t, U u, V v, W w, X x, Y y); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java new file mode 100644 index 000000000..028a6a84d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface PentaFunction { + R apply(T t, U u, V v, W w, X x); +} \ No newline at end of file diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java index 2f1391c90..6cb356a90 100644 --- a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java @@ -1,7 +1,5 @@ package net.momirealms.craftengine.mod; -import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket; -import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode;