diff --git a/src/main/java/org/skriptlang/skript/bukkit/tags/elements/ExprTag.java b/src/main/java/org/skriptlang/skript/bukkit/tags/elements/ExprTag.java index 9b39b1508f4..c812f564dbd 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/tags/elements/ExprTag.java +++ b/src/main/java/org/skriptlang/skript/bukkit/tags/elements/ExprTag.java @@ -80,46 +80,55 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override protected Tag @Nullable [] get(Event event) { - String[] names = this.names.getArray(event); List> tags = new ArrayList<>(); - String namespace = switch (origin) { - case ANY, BUKKIT -> "minecraft"; - case PAPER -> "paper"; - case SKRIPT -> "skript"; + String[] namespaces = switch (origin) { + case ANY -> new String[]{"minecraft", "paper", "skript"}; + case BUKKIT -> new String[]{"minecraft"}; + case PAPER -> new String[]{"paper"}; + case SKRIPT -> new String[]{"skript"}; }; - nextName: for (String name : names) { - // get key - NamespacedKey key; + nextName: for (String name : this.names.getArray(event)) { + boolean invalidKey = false; try { if (name.contains(":")) { - key = NamespacedKey.fromString(name); + NamespacedKey key = NamespacedKey.fromString(name); + invalidKey = key == null; + if (!invalidKey) { + tags.add(findTag(key)); + } } else { - // populate namespace if not provided - key = new NamespacedKey(namespace, name); + for (String namespace : namespaces) { + Tag tag = findTag(new NamespacedKey(namespace, name)); + if (tag != null) { + tags.add(tag); + continue nextName; + } + } } } catch (IllegalArgumentException e) { - key = null; + invalidKey = true; } - if (key == null) { + if (invalidKey) { error("Invalid tag key: '" + name + "'. Tags may only contain a-z, 0-9, _, ., /, or - characters."); continue; } + } + return tags.toArray(Tag[]::new); + } - Tag tag; - for (TagType type : types) { - tag = TagModule.tagRegistry.getTag(origin, type, key); - if (tag != null - // ensures that only datapack/minecraft tags are sent when specifically requested - && (origin != TagOrigin.BUKKIT || (datapackOnly ^ tag.getKey().getNamespace().equals("minecraft"))) - ) { - tags.add(tag); - continue nextName; // ensure 1:1 - } + private @Nullable Tag findTag(NamespacedKey key) { + for (TagType type : types) { + Tag tag = TagModule.tagRegistry.getTag(origin, type, key); + if (tag != null + // ensures that only datapack/minecraft tags are sent when specifically requested + && (origin != TagOrigin.BUKKIT || (datapackOnly ^ tag.getKey().getNamespace().equals(NamespacedKey.MINECRAFT))) + ) { + return tag; } } - return tags.toArray(new Tag[0]); + return null; } @Override diff --git a/src/test/skript/tests/regressions/7449-tag lookup only does minecraft.sk b/src/test/skript/tests/regressions/7449-tag lookup only does minecraft.sk new file mode 100644 index 00000000000..ad830f21fa0 --- /dev/null +++ b/src/test/skript/tests/regressions/7449-tag lookup only does minecraft.sk @@ -0,0 +1,5 @@ +test "7449 - tag lookup only uses minecraft namespace": + register an item tag named "my_favorite_blocks" using oak log, stone, and podzol + assert tag "my_favorite_blocks" is tag "skript:my_favorite_blocks" with "Tag lookup didn't find a skript tag ""helmets"" namespace" + assert tag "helmets" is tag "paper:helmets" with "Tag lookup didn't find a paper tag ""helmets"" namespace" + assert tag "dirt" is tag "minecraft:dirt" with "Tag lookup didn't find a minecraft tag ""dirt"" namespace"