From 5244524d4bc8fd6413aa85ea542ab00c07a91357 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 13 Jul 2025 23:28:44 +0800 Subject: [PATCH] =?UTF-8?q?trim=E9=85=8D=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/recipe/BukkitRecipeManager.java | 77 ++++++++----- .../src/main/resources/translations/en.yml | 2 + .../item/recipe/AbstractRecipeManager.java | 12 +-- .../core/item/recipe/CustomBrewingRecipe.java | 102 ++++++++++++++++++ .../recipe/CustomSmithingTransformRecipe.java | 16 +-- .../item/recipe/CustomSmithingTrimRecipe.java | 27 +++-- .../core/item/recipe/RecipeFactory.java | 16 +++ .../core/item/recipe/RecipeTypes.java | 2 + .../core/item/recipe/input/BrewingInput.java | 21 ++++ .../core/item/recipe/input/CraftingInput.java | 2 +- .../core/item/recipe/input/SmithingInput.java | 2 +- .../core/pack/AbstractPackManager.java | 3 + gradle.properties | 4 +- 13 files changed, 215 insertions(+), 71 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBrewingRecipe.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/BrewingInput.java 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 3968ed84b..ac76df75b 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,6 +2,7 @@ package net.momirealms.craftengine.bukkit.item.recipe; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import io.papermc.paper.potion.PotionMix; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; @@ -273,6 +274,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager { private Object stolenFeatureFlagSet; // Some delayed tasks on main thread private final List delayedTasksOnMainThread = new ArrayList<>(); + private final Map brewingRecipes = new HashMap<>(); public BukkitRecipeManager(BukkitCraftEngine plugin) { instance = this; @@ -324,24 +326,16 @@ public class BukkitRecipeManager extends AbstractRecipeManager { @Override public void unload() { if (!Config.enableRecipeSystem()) return; - super.unload(); - if (VersionHelper.isOrAbove1_21_2()) { - if (Bukkit.getServer().isStopping()) { - try { - CoreReflections.method$RecipeManager$finalizeRecipeLoading.invoke(nmsRecipeManager); - } catch (ReflectiveOperationException e) { - this.plugin.logger().warn("Failed to unregister recipes", e); - } - } else { - this.plugin.scheduler().executeSync(() -> { - try { - CoreReflections.method$RecipeManager$finalizeRecipeLoading.invoke(nmsRecipeManager); - } catch (ReflectiveOperationException e) { - this.plugin.logger().warn("Failed to unregister recipes", e); - } - }); + // 安排卸载任务,这些任务会在load后执行。如果没有load说明服务器已经关闭了,那就不需要管卸载了。 + if (!Bukkit.isStopping()) { + for (Map.Entry> entry : this.byId.entrySet()) { + Key id = entry.getKey(); + if (isDataPackRecipe(id)) continue; + boolean isBrewingRecipe = entry.getValue() instanceof CustomBrewingRecipe; + this.delayedTasksOnMainThread.add(() -> this.unregisterPlatformRecipe(id, isBrewingRecipe)); } } + super.unload(); } @Override @@ -354,6 +348,12 @@ public class BukkitRecipeManager extends AbstractRecipeManager { public void disable() { unload(); CE_RECIPE_2_NMS_HOLDER.clear(); + // 不是服务器关闭造成disable,那么需要把配方卸载干净 + if (!Bukkit.isStopping()) { + for (Runnable task : this.delayedTasksOnMainThread) { + task.run(); + } + } HandlerList.unregisterAll(this.recipeEventListener); if (this.crafterEventListener != null) { HandlerList.unregisterAll(this.crafterEventListener); @@ -361,21 +361,42 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } @Override - protected void unregisterPlatformRecipe(Key key) { - unregisterNMSRecipe(new NamespacedKey(key.namespace(), key.value())); + protected void unregisterPlatformRecipe(Key key, boolean isBrewingRecipe) { + if (isBrewingRecipe) { + Bukkit.getPotionBrewer().removePotionMix(new NamespacedKey(key.namespace(), key.value())); + } else { + unregisterNMSRecipe(new NamespacedKey(key.namespace(), key.value())); + } } @Override protected void registerPlatformRecipe(Key id, Recipe recipe) { - try { - Runnable converted = findNMSRecipeConvertor(recipe).convert(id, recipe); - if (converted != null) { - this.delayedTasksOnMainThread.add(converted); + if (recipe instanceof CustomBrewingRecipe brewingRecipe) { + PotionMix potionMix = new PotionMix(new NamespacedKey(id.namespace(), id.value()), + brewingRecipe.result(ItemBuildContext.EMPTY), + PotionMix.createPredicateChoice(container -> { + Item wrapped = this.plugin.itemManager().wrap(container); + return brewingRecipe.container().test(new UniqueIdItem<>(wrapped.recipeIngredientId(), wrapped)); + }), + PotionMix.createPredicateChoice(ingredient -> { + Item wrapped = this.plugin.itemManager().wrap(ingredient); + return brewingRecipe.ingredient().test(new UniqueIdItem<>(wrapped.recipeIngredientId(), wrapped)); + }) + ); + this.delayedTasksOnMainThread.add(() -> { + Bukkit.getPotionBrewer().addPotionMix(potionMix); + }); + } else { + try { + Runnable converted = findNMSRecipeConvertor(recipe).convert(id, recipe); + 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); } - } 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); } } @@ -420,11 +441,11 @@ public class BukkitRecipeManager extends AbstractRecipeManager { // continue; // } if (Config.disableAllVanillaRecipes()) { - this.delayedTasksOnMainThread.add(() -> unregisterPlatformRecipe(id)); + this.delayedTasksOnMainThread.add(() -> unregisterPlatformRecipe(id, false)); continue; } if (hasDisabledAny && Config.disabledVanillaRecipes().contains(id)) { - this.delayedTasksOnMainThread.add(() -> unregisterPlatformRecipe(id)); + this.delayedTasksOnMainThread.add(() -> unregisterPlatformRecipe(id, false)); continue; } markAsDataPackRecipe(id); diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 5dd4723e5..71e4ff2ca 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -140,6 +140,8 @@ warning.config.recipe.smithing_trim.missing_base: "Issue found in file < warning.config.recipe.smithing_trim.missing_template_type: "Issue found in file - The smithing trim recipe '' is missing the required 'template-type' argument." warning.config.recipe.smithing_trim.missing_addition: "Issue found in file - The smithing trim recipe '' is missing the required 'addition' argument." warning.config.recipe.smithing_trim.missing_pattern: "Issue found in file - The smithing trim recipe '' is missing the required 'pattern' argument." +warning.config.recipe.brewing.missing_container: "Issue found in file - The brewing recipe '' is missing the required 'container' argument." +warning.config.recipe.brewing.missing_ingredient: "Issue found in file - The brewing recipe '' is missing the required 'ingredient' argument." warning.config.i18n.unknown_locale: "Issue found in file - Unknown locale ''." warning.config.template.duplicate: "Issue found in file - Duplicated template ''. Please check if there is the same configuration in other files." warning.config.template.invalid: "Issue found in file - The config '' is using an invalid template ''." 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 3f1036f91..b39dbb002 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 @@ -27,7 +27,6 @@ public abstract class AbstractRecipeManager implements RecipeManager { protected final Map>> byResult = new HashMap<>(); protected final Map>> byIngredient = new HashMap<>(); protected final Set dataPackRecipes = new HashSet<>(); - protected final Set customRecipes = new HashSet<>(); protected final RecipeParser recipeParser; protected boolean isReloading; @@ -60,20 +59,12 @@ public abstract class AbstractRecipeManager implements RecipeManager { this.byId.clear(); this.byResult.clear(); this.byIngredient.clear(); - for (Key key : this.customRecipes) { - unregisterPlatformRecipe(key); - } - this.customRecipes.clear(); } protected void markAsDataPackRecipe(Key key) { this.dataPackRecipes.add(key); } - protected void markAsCustomRecipe(Key key) { - this.customRecipes.add(key); - } - @Override public boolean isDataPackRecipe(Key key) { if (this.isReloading) return false; @@ -175,7 +166,6 @@ public abstract class AbstractRecipeManager implements RecipeManager { } Recipe recipe = RecipeTypes.fromMap(id, section); try { - markAsCustomRecipe(id); registerInternalRecipe(id, recipe); registerPlatformRecipe(id, recipe); } catch (LocalizedResourceConfigException e) { @@ -186,7 +176,7 @@ public abstract class AbstractRecipeManager implements RecipeManager { } } - protected abstract void unregisterPlatformRecipe(Key key); + protected abstract void unregisterPlatformRecipe(Key key, boolean isBrewingRecipe); protected abstract void registerPlatformRecipe(Key key, Recipe recipe); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBrewingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBrewingRecipe.java new file mode 100644 index 000000000..7cb0e8763 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBrewingRecipe.java @@ -0,0 +1,102 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.recipe.input.BrewingInput; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CustomBrewingRecipe implements FixedResultRecipe { + public static final Factory FACTORY = new Factory<>(); + private final Key id; + private final Ingredient container; + private final Ingredient ingredient; + private final CustomRecipeResult result; + + public CustomBrewingRecipe(@NotNull Key id, + @NotNull Ingredient container, + @NotNull Ingredient ingredient, + @NotNull CustomRecipeResult result) { + this.id = id; + this.container = container; + this.ingredient = ingredient; + this.result = result; + } + + @Override + public CustomRecipeResult result() { + return this.result; + } + + @Override + public T result(ItemBuildContext context) { + return this.result.buildItemStack(context); + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + BrewingInput brewingInput = (BrewingInput) input; + return this.container.test(brewingInput.container()) && this.ingredient.test(brewingInput.ingredient()); + } + + @Override + public T assemble(RecipeInput input, ItemBuildContext context) { + return this.result(context); + } + + @Override + public List> ingredientsInUse() { + List> ingredients = new ArrayList<>(); + ingredients.add(this.container); + ingredients.add(this.ingredient); + return ingredients; + } + + @Override + public @NotNull Key type() { + return RecipeTypes.BREWING; + } + + @NotNull + public Ingredient container() { + return this.container; + } + + @NotNull + public Ingredient ingredient() { + return this.ingredient; + } + + @Override + public Key id() { + return this.id; + } + + @SuppressWarnings({"DuplicatedCode"}) + public static class Factory implements RecipeFactory { + + @Override + public Recipe create(Key id, Map arguments) { + List container = MiscUtils.getAsStringList(arguments.get("container")); + if (container.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.recipe.brewing.missing_container"); + } + List ingredient = MiscUtils.getAsStringList(arguments.get("ingredient")); + if (ingredient.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.recipe.brewing.missing_ingredient"); + } + return new CustomBrewingRecipe<>(id, + ResourceConfigUtils.requireNonNullOrThrow(toIngredient(container), "warning.config.recipe.brewing.missing_container"), + ResourceConfigUtils.requireNonNullOrThrow(toIngredient(ingredient), "warning.config.recipe.brewing.missing_ingredient"), + 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 f06dff32f..e80872c11 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 @@ -13,7 +13,9 @@ import net.momirealms.craftengine.core.util.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class CustomSmithingTransformRecipe implements FixedResultRecipe { public static final Factory FACTORY = new Factory<>(); @@ -147,18 +149,6 @@ public class CustomSmithingTransformRecipe implements FixedResultRecipe { ItemDataProcessors.fromMapList(processors) ); } - - private Ingredient toIngredient(List items) { - 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(UniqueKey.create(Key.of(item))); - } - } - return holders.isEmpty() ? null : Ingredient.of(holders); - } } public static class ItemDataProcessors { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTrimRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTrimRecipe.java index dd9382a5c..993fb1a31 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTrimRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTrimRecipe.java @@ -6,11 +6,16 @@ import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; 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.util.*; +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.VersionHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class CustomSmithingTrimRecipe implements Recipe { public static final Factory FACTORY = new Factory<>(); @@ -122,19 +127,11 @@ public class CustomSmithingTrimRecipe implements Recipe { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_trim.missing_template_type"); } Key pattern = VersionHelper.isOrAbove1_21_5() ? Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("pattern"), "warning.config.recipe.smithing_trim.missing_pattern")) : null; - return new CustomSmithingTrimRecipe<>(id, toIngredient(base), toIngredient(template), toIngredient(addition), pattern); - } - - private Ingredient toIngredient(List items) { - 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(UniqueKey.create(Key.of(item))); - } - } - return Ingredient.of(holders); + return new CustomSmithingTrimRecipe<>(id, + ResourceConfigUtils.requireNonNullOrThrow(toIngredient(base), "warning.config.recipe.smithing_trim.missing_base"), + ResourceConfigUtils.requireNonNullOrThrow(toIngredient(template), "warning.config.recipe.smithing_trim.missing_template_type"), + ResourceConfigUtils.requireNonNullOrThrow(toIngredient(addition), "warning.config.recipe.smithing_trim.missing_addition"), + pattern); } } } 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 bf03b41ad..6620b3b5c 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 @@ -5,8 +5,12 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigExce 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.UniqueKey; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; public interface RecipeFactory { @@ -26,4 +30,16 @@ public interface RecipeFactory { count ); } + + default Ingredient toIngredient(List items) { + 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(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/RecipeTypes.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java index e45df9785..603c76840 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 @@ -20,6 +20,7 @@ public class RecipeTypes { public static final Key STONECUTTING = Key.of("minecraft:stonecutting"); public static final Key SMITHING_TRANSFORM = Key.of("minecraft:smithing_transform"); public static final Key SMITHING_TRIM = Key.of("minecraft:smithing_trim"); + public static final Key BREWING = Key.of("minecraft:brewing"); static { register(SHAPED, CustomShapedRecipe.FACTORY); @@ -31,6 +32,7 @@ public class RecipeTypes { register(STONECUTTING, CustomStoneCuttingRecipe.FACTORY); register(SMITHING_TRANSFORM, CustomSmithingTransformRecipe.FACTORY); register(SMITHING_TRIM, CustomSmithingTrimRecipe.FACTORY); + register(BREWING, CustomBrewingRecipe.FACTORY); } public static void register(Key key, RecipeFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/BrewingInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/BrewingInput.java new file mode 100644 index 000000000..c04443a34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/BrewingInput.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.item.recipe.input; + +import net.momirealms.craftengine.core.item.recipe.UniqueIdItem; + +public final class BrewingInput implements RecipeInput { + private final UniqueIdItem container; + private final UniqueIdItem ingredient; + + public BrewingInput(UniqueIdItem container, UniqueIdItem ingredient) { + this.container = container; + this.ingredient = ingredient; + } + + public UniqueIdItem container() { + return container; + } + + public UniqueIdItem ingredient() { + return ingredient; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java index 1db8029b6..e07cac354 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class CraftingInput implements RecipeInput { +public final class CraftingInput implements RecipeInput { private final int width; private final int height; private final List> items; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SmithingInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SmithingInput.java index e186b7e5c..ec1757f31 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SmithingInput.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SmithingInput.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.core.item.recipe.UniqueIdItem; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class SmithingInput implements RecipeInput { +public final class SmithingInput implements RecipeInput { private final UniqueIdItem base; private final UniqueIdItem template; private final UniqueIdItem addition; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 25aae41d0..ffebf8bff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -211,6 +211,9 @@ public abstract class AbstractPackManager implements PackManager { } TranslationManager.instance().log(e.node(), e.arguments()); this.resourcePackHost = NoneHost.INSTANCE; + } catch (Exception e) { + this.plugin.logger().warn("Failed to load resource pack host", e); + this.resourcePackHost = NoneHost.INSTANCE; } } diff --git a/gradle.properties b/gradle.properties index 09e48e202..97a04172c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.59.9 +project_version=0.0.59.10 config_version=41 lang_version=22 project_group=net.momirealms @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.18 -nms_helper_version=1.0.32 +nms_helper_version=1.0.33 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23