diff --git a/src/main/java/ch/njol/skript/aliases/Aliases.java b/src/main/java/ch/njol/skript/aliases/Aliases.java index 3e67971698a..84234052724 100644 --- a/src/main/java/ch/njol/skript/aliases/Aliases.java +++ b/src/main/java/ch/njol/skript/aliases/Aliases.java @@ -25,7 +25,6 @@ import ch.njol.skript.config.Node; import ch.njol.skript.config.SectionNode; import ch.njol.skript.entity.EntityData; -import org.bukkit.entity.EntityType; import org.skriptlang.skript.lang.script.Script; import ch.njol.skript.lang.parser.ParserInstance; import ch.njol.skript.localization.ArgsMessage; @@ -403,8 +402,14 @@ private static void loadMissingAliases() { for (Material material : Material.values()) { if (!material.isLegacy() && !provider.hasAliasForMaterial(material)) { NamespacedKey key = material.getKey(); - String name = key.getKey().replace("_", " "); - parser.loadAlias(name + "¦s", key.toString()); + // mod:an_item -> (mod's an item) | (an item from mod) + // minecraft:dirt -> dirt + if (NamespacedKey.MINECRAFT.equals(key.getNamespace())) { + parser.loadAlias(key.getKey().replace("_", " ") + "¦s", key.toString()); + } else { + parser.loadAlias((key.getNamespace() + "'s " + key.getKey() + "¦s").replace("_", " "), key.toString()); + parser.loadAlias((key.getKey() + "¦s from " + key.getNamespace()).replace("_", " "), key.toString()); + } Skript.debug(ChatColor.YELLOW + "Creating temporary alias for: " + key); } } diff --git a/src/main/java/ch/njol/skript/aliases/AliasesProvider.java b/src/main/java/ch/njol/skript/aliases/AliasesProvider.java index 06ae5317f78..c09501636ed 100644 --- a/src/main/java/ch/njol/skript/aliases/AliasesProvider.java +++ b/src/main/java/ch/njol/skript/aliases/AliasesProvider.java @@ -290,7 +290,7 @@ public void addAlias(AliasName name, String id, @Nullable Map ta datas = typeOfId.getTypes(); } else { // ... but quite often, we just got Vanilla id // Prepare and modify ItemStack (using somewhat Unsafe methods) - Material material = BukkitUnsafe.getMaterialFromMinecraftId(id); + Material material = BukkitUnsafe.getMaterialFromNamespacedId(id); if (material == null) { // If server doesn't recognize id, do not proceed throw new InvalidMinecraftIdException(id); } diff --git a/src/main/java/ch/njol/skript/bukkitutil/BukkitUnsafe.java b/src/main/java/ch/njol/skript/bukkitutil/BukkitUnsafe.java index f47a3f5d8d7..66b7fa13a34 100644 --- a/src/main/java/ch/njol/skript/bukkitutil/BukkitUnsafe.java +++ b/src/main/java/ch/njol/skript/bukkitutil/BukkitUnsafe.java @@ -20,9 +20,6 @@ import java.io.IOException; import java.io.InputStream; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.HashMap; @@ -30,6 +27,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.UnsafeValues; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; @@ -39,7 +37,6 @@ import com.google.gson.reflect.TypeToken; import ch.njol.util.EnumTypeAdapter; import ch.njol.skript.Skript; -import ch.njol.skript.util.Version; /** * Contains helpers for Bukkit's not so safe stuff. @@ -68,9 +65,32 @@ public class BukkitUnsafe { @Nullable private static Map idMappings; - @Nullable - public static Material getMaterialFromMinecraftId(String id) { - return Material.matchMaterial(id); + /** + * Get a material from a minecraft id. + * + * @param id Namespaced ID with or without a namespace. IDs without a namespace will be treated + * as minecraft namespaced IDs. ('minecraft:dirt' and 'dirt' are equivalent.) + * @return The Material which the id represents, or null if no material can be matched. + * @deprecated Prefer {@link BukkitUnsafe#getMaterialFromNamespacedId(String)} for including modded item support + */ + @Deprecated + public static @Nullable Material getMaterialFromMinecraftId(String id) { + return getMaterialFromNamespacedId(id); + } + + /** + * Get a material from a namespaced ID. + * For example, 'minecraft:iron_ingot' -> Material.IRON_INGOT; 'mod:an_item' -> Material.MOD_AN_ITEM + * + * @param id Namespaced ID with or without a namespace. IDs without a namespace will be treated + * as minecraft namespaced IDs. ('minecraft:dirt' and 'dirt' are equivalent.) + * @return The Material which the id represents, or null if no material can be matched. + */ + public static @Nullable Material getMaterialFromNamespacedId(String id) { + return Material.matchMaterial(id.toLowerCase().startsWith(NamespacedKey.MINECRAFT + ":") + ? id + : id.replace(":", "_") //For Hybrid Server + ); } public static void modifyItemStack(ItemStack stack, String arguments) {