diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java index 6d1300ded..c8e7cbb25 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java @@ -14,7 +14,7 @@ import java.util.Optional; public class CustomFishingProvider implements ExternalItemProvider { @Override public String plugin() { - return "CustomFishing"; + return "customfishing"; } @SuppressWarnings("UnstableApiUsage") diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java index 49d38b9f9..8888553e4 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java @@ -15,18 +15,22 @@ public class MMOItemsProvider implements ExternalItemProvider { @Override public String plugin() { - return "MMOItems"; + return "mmoitems"; } @Override public @Nullable ItemStack build(String id, ItemBuildContext context) { String[] split = id.split(":", 2); + if (split.length == 1) { + split = split[0].split("_", 2); + } + if (split.length == 1) return new ItemStack(Material.AIR); MMOItem mmoItem = MMOItems.plugin.getMMOItem(Type.get(split[0]), split[1].toUpperCase()); return mmoItem == null ? new ItemStack(Material.AIR) : requireNonNull(mmoItem.newBuilder().build()); } @Override public String id(ItemStack item) { - return MMOItems.getType(item) + ":" + MMOItems.getID(item); + return MMOItems.getType(item) + "_" + MMOItems.getID(item); } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java index 21df07ef8..70c111499 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java @@ -11,7 +11,7 @@ public class MythicMobsProvider implements ExternalItemProvider { @Override public String plugin() { - return "MythicMobs"; + return "mythicmobs"; } @Nullable diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java index d4b79a345..a6b5ca3ec 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java @@ -12,7 +12,7 @@ public class NeigeItemsProvider implements ExternalItemProvider { @Override public String plugin() { - return "NeigeItems"; + return "neigeitems"; } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 2158202eb..ab907daee 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -77,6 +77,21 @@ public class BukkitItemManager extends AbstractItemManager { this.emptyUniqueItem = new UniqueIdItem<>(UniqueKey.AIR, this.emptyItem); } + @SuppressWarnings("unchecked") + @Override + public void delayedLoad() { + super.delayedLoad(); + List> sources = new ArrayList<>(); + for (String externalSource : Config.recipeIngredientSources()) { + String sourceId = externalSource.toLowerCase(Locale.ENGLISH); + ExternalItemProvider provider = getExternalItemProvider(sourceId); + if (provider != null) { + sources.add(provider); + } + } + this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new ExternalItemProvider[0])); + } + @Override public UniqueIdItem uniqueEmptyItem() { return this.emptyUniqueItem; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index 591369a9f..7ea6d8056 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -6,22 +6,28 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.bukkit.util.ItemTags; import net.momirealms.craftengine.bukkit.util.KeyUtils; +import net.momirealms.craftengine.core.item.ExternalItemProvider; import net.momirealms.craftengine.core.item.ItemFactory; import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.item.ItemWrapper; import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.CharacterUtils; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.StringUtils; import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; +import java.util.Locale; import java.util.Objects; import java.util.Optional; public abstract class BukkitItemFactory> extends ItemFactory { + private boolean hasExternalRecipeSource = false; + private ExternalItemProvider[] recipeIngredientSources = null; protected BukkitItemFactory(CraftEngine plugin) { super(plugin); @@ -52,6 +58,16 @@ public abstract class BukkitItemFactory> extend } } + public void resetRecipeIngredientSources(ExternalItemProvider[] recipeIngredientSources) { + if (recipeIngredientSources == null || recipeIngredientSources.length == 0) { + this.recipeIngredientSources = null; + this.hasExternalRecipeSource = false; + } else { + this.recipeIngredientSources = recipeIngredientSources; + this.hasExternalRecipeSource = true; + } + } + @SuppressWarnings("deprecation") @Override protected byte[] toByteArray(W item) { @@ -82,6 +98,14 @@ public abstract class BukkitItemFactory> extend @Override protected UniqueKey recipeIngredientID(W item) { + if (this.hasExternalRecipeSource) { + for (ExternalItemProvider source : this.recipeIngredientSources) { + String id = source.id(item.getItem()); + if (id != null) { + return UniqueKey.create(Key.of(source.plugin(), StringUtils.toLowerCase(id))); + } + } + } return UniqueKey.create(id(item)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index 6cdb33ec7..ac1028f94 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -227,7 +227,6 @@ public class BukkitCraftEngine extends CraftEngine { } }, 1, 1); } - super.compatibilityManager().onDelayedEnable(); } @Override diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index 06eb8285b..0e96af5e6 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -296,6 +296,8 @@ recipe: # Selective recipe disabling (safer alternative to 'all: true') # Example: ["minecraft:wooden_sword", "minecraft:stone_hoe"] list: [] + # You can use items from other plugins by adding the supported plugin names here + ingredient-sources: [] gui: browser: diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index ae246230c..34a97ec8d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -105,6 +105,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl @Override public boolean registerExternalItemProvider(ExternalItemProvider externalItemProvider) { + if (!ResourceLocation.isValidNamespace(externalItemProvider.plugin())) return false; if (this.externalItemProviders.containsKey(externalItemProvider.plugin())) return false; this.externalItemProviders.put(externalItemProvider.plugin(), externalItemProvider); return true; @@ -510,7 +511,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl Map data = MiscUtils.castToMap(obj, false); String plugin = data.get("plugin").toString(); String id = data.get("id").toString(); - ExternalItemProvider provider = AbstractItemManager.this.getExternalItemProvider(plugin); + ExternalItemProvider provider = AbstractItemManager.this.getExternalItemProvider(plugin.toLowerCase(Locale.ENGLISH)); return new ExternalModifier<>(id, Objects.requireNonNull(provider, "Item provider " + plugin + " not found")); }, "external"); if (VersionHelper.isOrAbove1_20_5()) { 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 ea29e3598..7cc4f0f3f 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 @@ -217,6 +217,7 @@ public abstract class CraftEngine implements Plugin { this.fontManager.delayedInit(); this.vanillaLootManager.delayedInit(); this.advancementManager.delayedInit(); + this.compatibilityManager.onDelayedEnable(); // reload the plugin try { this.reloadPlugin(Runnable::run, Runnable::run, true); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/StringUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/StringUtils.java index a0cbe3adb..4c44e0054 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/StringUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/StringUtils.java @@ -25,4 +25,18 @@ public final class StringUtils { result[index] = s.substring(start); return result; } + + public static String toLowerCase(String str) { + if (str == null) { + return null; + } + char[] chars = str.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + if (c >= 'A' && c <= 'Z') { + chars[i] = (char) (c + 32); + } + } + return new String(chars); + } } diff --git a/gradle.properties b/gradle.properties index 15f69b2fb..f397c7222 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] project_version=0.0.60.1 -config_version=41 +config_version=42 lang_version=22 project_group=net.momirealms latest_supported_version=1.21.7