From 672314884ea0d571b7778fba008955d872ffd6d0 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Mon, 15 Sep 2025 00:47:47 +0200 Subject: [PATCH 01/23] Init commit --- .../java/ch/njol/skript/doc/Category.java | 62 +++++++++++++++++++ .../java/ch/njol/skript/doc/CategoryImpl.java | 51 +++++++++++++++ .../ch/njol/skript/doc/JSONGenerator.java | 51 +++++++++++++++ .../skriptlang/skript/addon/AddonModule.java | 18 ++++++ .../damagesource/DamageSourceModule.java | 3 + .../skript/registration/SyntaxOrigin.java | 52 ++++++++++++++++ 6 files changed, 237 insertions(+) create mode 100644 src/main/java/ch/njol/skript/doc/Category.java create mode 100644 src/main/java/ch/njol/skript/doc/CategoryImpl.java diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java new file mode 100644 index 00000000000..5c8b9bebf15 --- /dev/null +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -0,0 +1,62 @@ +package ch.njol.skript.doc; + +import com.google.common.base.Preconditions; +import org.jetbrains.annotations.NotNull; +import org.skriptlang.skript.addon.AddonModule; + +import java.util.HashSet; +import java.util.Set; + +/** + * Represents a category a documented element can belong to. + */ +public interface Category { + + Category ENTITIES = of("Entities", 200, "entity", "entities", "animal", "panda", "allay", + "zombie", "goat", "horse", "pig", "fish", "villager", "bee"); + Category BREEDING = of("Breeding"); + Category PLAYERS = of("Players", 250, "player", "operator"); + Category DAMAGE_SOURCES = of("Damage Sources", 250, "damage source"); + Category BLOCKS = of("Blocks", "block"); + Category STRINGS = of("Strings", "string", "text"); + Category COMMANDS = of("Commands", "command"); + Category ITEMS = of("Items", "item", "enchantment", "lore", "tooltip", "banner"); + Category WORLDS = of("Worlds", 400, "world"); + Category SCRIPTS = of("Scripts", "script"); + Category DISPLAYS = of("Displays", 50, "display"); + Category TIME = of("Time", "time", "unix"); + Category UUIDS = of("UUIDs", 300, "uuid"); + Category DATES = of("Dates", 300, "date"); + Category MATH = of("Math", 50, "angle", "degree", "radian", + "arithmetic", "vector", "vectors", "nan", "round", "rounds", "root", "quaternion", "permutations", + "combinations", "numbers", "infinity", "exponential"); + + @NotNull String name(); + + int priority(); + + @NotNull Set keywords(); + + @NotNull Set modules(); + + static Category of(@NotNull String name, int priority, String @NotNull ... keywords) { + Preconditions.checkNotNull(name, "name cannot be null"); + for (String keyword : keywords) { + Preconditions.checkNotNull(keyword, "keywords cannot have null values"); + } + + return new CategoryImpl(name, priority, new HashSet<>(Set.of(keywords))); + } + + static Category of(@NotNull String name, @NotNull String... keywords) { + return of(name, 100, keywords); + } + + /** + * @return All registered categories. + */ + static Set values() { + return CategoryImpl.getInstances(); + } + +} diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java new file mode 100644 index 00000000000..2653cd86fa4 --- /dev/null +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -0,0 +1,51 @@ +package ch.njol.skript.doc; + +import org.jetbrains.annotations.NotNull; +import org.skriptlang.skript.addon.AddonModule; +import org.skriptlang.skript.util.Priority; + +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +final class CategoryImpl implements Category { + + private static final Set instances = new HashSet<>(); + private final String name; + private final int priority; + private final Set keywords; + private final Set modules; + + public static Set getInstances() { + return instances; + } + + CategoryImpl(String name, int priority, Set keywords) { + instances.add(this); + this.name = name; + this.priority = priority; + this.keywords = keywords.stream().map(String::toLowerCase).collect(Collectors.toSet()); + this.modules = new HashSet<>(); + } + + @Override + public @NotNull String name() { + return name; + } + + @Override + public int priority() { + return priority; + } + + @Override + public @NotNull Set keywords() { + return keywords; + } + + @Override + public @NotNull Set modules() { + return modules; + } + +} diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index d30d0f039ac..e764e86246e 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -11,6 +11,7 @@ import ch.njol.skript.registrations.EventValues; import ch.njol.skript.registrations.EventValues.EventValueInfo; import ch.njol.skript.util.Version; +import com.google.common.base.Joiner; import com.google.common.collect.Multimap; import com.google.gson.*; import org.bukkit.event.Cancellable; @@ -18,8 +19,11 @@ import org.bukkit.event.block.BlockCanBuildEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.lang.structure.Structure; import org.skriptlang.skript.lang.structure.StructureInfo; +import org.skriptlang.skript.registration.SyntaxOrigin; +import org.skriptlang.skript.registration.SyntaxOrigin.ElementOrigin; import java.io.File; import java.io.IOException; @@ -126,6 +130,9 @@ private static JsonObject generatedAnnotatedElement(SyntaxElementInfo syntaxI Keywords keywords = syntaxClass.getAnnotation(Keywords.class); syntaxJsonObject.add("keywords", keywords == null ? null : convertToJsonArray(keywords.value())); + syntaxJsonObject.addProperty("category", getCategory(syntaxInfo.origin(), name.value(), + description == null ? null : description.value(), syntaxInfo.getPatterns())); + return syntaxJsonObject; } @@ -148,6 +155,7 @@ private static JsonObject generateEventElement(SkriptEventInfo info) { syntaxJsonObject.add("examples", convertToJsonArray(info.getExamples())); syntaxJsonObject.add("eventValues", getEventValues(info)); syntaxJsonObject.add("keywords", convertToJsonArray(info.getKeywords())); + syntaxJsonObject.addProperty("category", getCategory(info.origin(), info.getName(), info.getDescription(), info.getPatterns())); return syntaxJsonObject; } @@ -294,6 +302,8 @@ private static JsonObject generateClassInfoElement(ClassInfo classInfo) { syntaxJsonObject.add("description", convertToJsonArray(classInfo.getDescription())); syntaxJsonObject.add("requirements", convertToJsonArray(classInfo.getRequiredPlugins())); syntaxJsonObject.add("examples", convertToJsonArray(classInfo.getExamples())); + syntaxJsonObject.addProperty("category", getCategory(null, + Objects.requireNonNullElse(classInfo.getDocName(), classInfo.getCodeName()), classInfo.getDescription(), null)); return syntaxJsonObject; } @@ -332,6 +342,7 @@ private static JsonObject generateFunctionElement(JavaFunction function) { String functionSignature = function.getSignature().toString(false, false); functionJsonObject.add("patterns", convertToJsonArray(functionSignature)); + functionJsonObject.addProperty("category", getCategory(null, function.getName(), function.getDescription(), null)); return functionJsonObject; } @@ -382,6 +393,46 @@ private static JsonArray cleanPatterns(String... strings) { return convertToJsonArray(strings); } + private static @Nullable String getCategory(SyntaxOrigin origin, String name, String[] description, String[] patterns) { + if (origin instanceof ElementOrigin elementOrigin) { + for (Category category : Category.values()) { + if (category.modules().contains(elementOrigin.module())) { + return category.name(); + } + } + } + + if (patterns == null) patterns = new String[] { "" }; + String first = getCategory(String.join("", patterns)); + if (first != null) { + return first; + } else { + if (description == null) description = new String[] { "" }; + return getCategory(name + String.join("", description) + String.join("", patterns)); + } + } + + private static @Nullable String getCategory(String patterns) { + Set options = new HashSet<>(); + + for (Category value : Category.values()) { + for (String keyword : value.keywords()) { + if (patterns.toLowerCase().contains(keyword)) { + options.add(value); + break; + } + } + } + + if (options.isEmpty()) { + return null; + } else if (options.size() == 1) { + return options.stream().findAny().orElseThrow().name(); + } else { + return options.stream().max(Comparator.comparingInt(Category::priority)).orElseThrow().name(); + } + } + /** * Writes the documentation JsonObject to an output path * diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 16a414ddfa6..1a5295b3bb7 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -2,6 +2,9 @@ import org.jetbrains.annotations.ApiStatus; import org.skriptlang.skript.Skript; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxOrigin; +import org.skriptlang.skript.registration.SyntaxRegistry.Key; /** * A module is a component of a {@link SkriptAddon} used for registering syntax and other {@link Skript} components. @@ -44,4 +47,19 @@ default boolean canLoad(SkriptAddon addon) { return true; } + /** + * Registers syntax such that it belongs to the current module. + * + * @param addon The addon this module belongs to. + * @param registry The registry to add this syntax to. + * @param cls The syntax info. + * @param The type of syntax. + */ + default > void register(SkriptAddon addon, Key registry, I cls) { + //noinspection unchecked + addon.syntaxRegistry().register(registry, (I) cls.toBuilder() + .origin(SyntaxOrigin.of(addon, this)) + .build()); + } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index 3a286a3c218..1e557885ffb 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -3,6 +3,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.classes.ClassInfo; import ch.njol.skript.classes.registry.RegistryClassInfo; +import ch.njol.skript.doc.Category; import ch.njol.skript.expressions.base.EventValueExpression; import ch.njol.skript.registrations.Classes; import ch.njol.skript.registrations.EventValues; @@ -25,6 +26,8 @@ public boolean canLoad(SkriptAddon addon) { @Override public void init(SkriptAddon addon) { + Category.DAMAGE_SOURCES.modules().add(this); + Classes.registerClass(new ClassInfo<>(DamageSource.class, "damagesource") .user("damage ?sources?") .name("Damage Source") diff --git a/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java b/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java index b5e8aa9d552..d5d2c70540e 100644 --- a/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java +++ b/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; +import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; /** @@ -52,6 +53,57 @@ public SkriptAddon addon() { } + /** + * Constructs a syntax origin from an addon and module. + * @param addon The addon to construct this origin from. + * @param module The module to include in this origin. + * @return An origin pointing to the provided addon and module. + */ + @Contract("_, _ -> new") + static SyntaxOrigin of(SkriptAddon addon, AddonModule module) { + return new ElementOrigin(addon, module); + } + + /** + * An origin describing the addon and module a syntax has originated from. + * @see SyntaxOrigin#of(SkriptAddon, AddonModule) + */ + final class ElementOrigin implements SyntaxOrigin { + + private final SkriptAddon addon; + private final AddonModule module; + + private ElementOrigin(SkriptAddon addon, AddonModule module) { + this.addon = addon.unmodifiableView(); + this.module = module; + } + + /** + * @return A string representing the name of the addon this origin describes. + * Equivalent to {@link SkriptAddon#name()}. + */ + @Override + public String name() { + return addon.name(); + } + + /** + * @return An unmodifiable view of the addon this origin describes. + * @see SkriptAddon#unmodifiableView() + */ + public SkriptAddon addon() { + return addon; + } + + /** + * @return The module used for registering this element. + */ + public AddonModule module() { + return module; + } + + } + /** * @return A string representing this origin. */ From 421380634a708fc4f445932d584fae1971c46bcd Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:49:04 +0200 Subject: [PATCH 02/23] add example --- .../java/ch/njol/skript/doc/Category.java | 21 +++++++++++++----- .../java/ch/njol/skript/doc/CategoryImpl.java | 14 ++++++++---- .../ch/njol/skript/doc/JSONGenerator.java | 12 ++++++++-- .../damagesource/DamageSourceModule.java | 6 ++++- .../elements/CondScalesWithDifficulty.java | 22 +++++++++---------- 5 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java index 5c8b9bebf15..a9493e9b1f7 100644 --- a/src/main/java/ch/njol/skript/doc/Category.java +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -2,6 +2,7 @@ import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.AddonModule; import java.util.HashSet; @@ -10,7 +11,8 @@ /** * Represents a category a documented element can belong to. */ -public interface Category { +public sealed interface Category + permits CategoryImpl { Category ENTITIES = of("Entities", 200, "entity", "entities", "animal", "panda", "allay", "zombie", "goat", "horse", "pig", "fish", "villager", "bee"); @@ -31,13 +33,22 @@ public interface Category { "arithmetic", "vector", "vectors", "nan", "round", "rounds", "root", "quaternion", "permutations", "combinations", "numbers", "infinity", "exponential"); + /** + * @return The display name of this category. + */ @NotNull String name(); - int priority(); - - @NotNull Set keywords(); + /** + * Adds a module to this category. + * + * @param module The module to add. + */ + void addModule(@NotNull AddonModule module); - @NotNull Set modules(); + /** + * @return The modules that are represented by this category. + */ + @Unmodifiable @NotNull Set modules(); static Category of(@NotNull String name, int priority, String @NotNull ... keywords) { Preconditions.checkNotNull(name, "name cannot be null"); diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index 2653cd86fa4..b502920c524 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -1,9 +1,10 @@ package ch.njol.skript.doc; +import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; import org.skriptlang.skript.addon.AddonModule; -import org.skriptlang.skript.util.Priority; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -33,19 +34,24 @@ public static Set getInstances() { return name; } - @Override public int priority() { return priority; } - @Override public @NotNull Set keywords() { return keywords; } + @Override + public void addModule(@NotNull AddonModule module) { + Preconditions.checkNotNull(module, "module cannot be null"); + + modules.add(module); + } + @Override public @NotNull Set modules() { - return modules; + return Collections.unmodifiableSet(modules); } } diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index e764e86246e..fe5888e34fd 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -416,7 +416,11 @@ private static JsonArray cleanPatterns(String... strings) { Set options = new HashSet<>(); for (Category value : Category.values()) { - for (String keyword : value.keywords()) { + if (!(value instanceof CategoryImpl impl)) { + break; + } + + for (String keyword : impl.keywords()) { if (patterns.toLowerCase().contains(keyword)) { options.add(value); break; @@ -429,7 +433,11 @@ private static JsonArray cleanPatterns(String... strings) { } else if (options.size() == 1) { return options.stream().findAny().orElseThrow().name(); } else { - return options.stream().max(Comparator.comparingInt(Category::priority)).orElseThrow().name(); + return options.stream() + .filter(it -> it instanceof CategoryImpl) + .map(it -> (CategoryImpl) it) + .max(Comparator.comparingInt(CategoryImpl::priority)) + .orElseThrow().name(); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index 1e557885ffb..3694c87b01f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -14,6 +14,8 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; +import org.skriptlang.skript.bukkit.damagesource.elements.CondScalesWithDifficulty; +import org.skriptlang.skript.registration.SyntaxRegistry; import java.io.IOException; @@ -26,7 +28,7 @@ public boolean canLoad(SkriptAddon addon) { @Override public void init(SkriptAddon addon) { - Category.DAMAGE_SOURCES.modules().add(this); + Category.DAMAGE_SOURCES.addModule(this); Classes.registerClass(new ClassInfo<>(DamageSource.class, "damagesource") .user("damage ?sources?") @@ -57,6 +59,8 @@ public void init(SkriptAddon addon) { @Override public void load(SkriptAddon addon) { + register(addon, SyntaxRegistry.CONDITION, CondScalesWithDifficulty.info()); + try { Skript.getAddonInstance().loadClasses("org.skriptlang.skript.bukkit.damagesource", "elements"); } catch (IOException e) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java index 0b1f2c2a72a..1d9060d5694 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java @@ -1,6 +1,5 @@ package org.skriptlang.skript.bukkit.damagesource.elements; -import ch.njol.skript.Skript; import ch.njol.skript.conditions.base.PropertyCondition; import ch.njol.skript.doc.*; import ch.njol.skript.lang.Expression; @@ -11,24 +10,25 @@ import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Does Scale With Difficulty") @Description("Whether the damage from a damage source scales with the difficulty of the server.") @Example(""" - on death: - if event-damage source scales damage with difficulty: - """) + on death: + if event-damage source scales damage with difficulty: + """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class CondScalesWithDifficulty extends PropertyCondition implements DamageSourceExperimentSyntax { - static { - Skript.registerCondition(CondScalesWithDifficulty.class, - "%damagesources% ((does|do) scale|scales) damage with difficulty", - "%damagesources% (do not|don't|does not|doesn't) scale damage with difficulty", - "%damagesources%'[s] damage ((does|do) scale|scales) with difficulty", - "%damagesources%'[s] damage (do not|don't|does not|doesn't) scale with difficulty"); + public static SyntaxInfo info() { + return SyntaxInfo.builder(CondScalesWithDifficulty.class) + .addPatterns("%damagesources% ((does|do) scale|scales) damage with difficulty", + "%damagesources% (do not|don't|does not|doesn't) scale damage with difficulty", + "%damagesources%'[s] damage ((does|do) scale|scales) with difficulty", + "%damagesources%'[s] damage (do not|don't|does not|doesn't) scale with difficulty") + .build(); } @Override From aa11019b4ecab4dbd57e38732fc677d740d93cf9 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Mon, 15 Sep 2025 22:25:10 +0200 Subject: [PATCH 03/23] Move to new registration API --- .../java/ch/njol/skript/doc/Category.java | 31 ++++++++++--------- .../java/ch/njol/skript/doc/CategoryImpl.java | 8 +---- .../ch/njol/skript/doc/JSONGenerator.java | 11 ++----- .../skriptlang/skript/addon/AddonModule.java | 16 ++++++++++ .../damagesource/DamageSourceModule.java | 17 +++++----- .../elements/CondScalesWithDifficulty.java | 1 + .../elements/CondWasIndirect.java | 13 ++++---- .../elements/ExprCausingEntity.java | 8 +++-- .../elements/ExprCreatedDamageSource.java | 9 ++++-- .../elements/ExprDamageLocation.java | 9 ++++-- .../damagesource/elements/ExprDamageType.java | 9 ++++-- .../elements/ExprDirectEntity.java | 10 ++++-- .../elements/ExprFoodExhaustion.java | 9 ++++-- .../elements/ExprSecDamageSource.java | 9 ++++++ .../elements/ExprSourceLocation.java | 9 ++++-- 15 files changed, 105 insertions(+), 64 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java index a9493e9b1f7..49a830e6a08 100644 --- a/src/main/java/ch/njol/skript/doc/Category.java +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -14,22 +14,22 @@ public sealed interface Category permits CategoryImpl { - Category ENTITIES = of("Entities", 200, "entity", "entities", "animal", "panda", "allay", + Category ENTITIES = of("Entities", "entity", "entities", "animal", "panda", "allay", "zombie", "goat", "horse", "pig", "fish", "villager", "bee"); Category BREEDING = of("Breeding"); - Category PLAYERS = of("Players", 250, "player", "operator"); - Category DAMAGE_SOURCES = of("Damage Sources", 250, "damage source"); + Category PLAYERS = of("Players", "player", "operator"); + Category DAMAGE_SOURCES = of("Damage Sources", "damage source"); Category BLOCKS = of("Blocks", "block"); Category STRINGS = of("Strings", "string", "text"); Category COMMANDS = of("Commands", "command"); Category ITEMS = of("Items", "item", "enchantment", "lore", "tooltip", "banner"); - Category WORLDS = of("Worlds", 400, "world"); + Category WORLDS = of("Worlds", "world"); Category SCRIPTS = of("Scripts", "script"); - Category DISPLAYS = of("Displays", 50, "display"); + Category DISPLAYS = of("Displays", "display"); Category TIME = of("Time", "time", "unix"); - Category UUIDS = of("UUIDs", 300, "uuid"); - Category DATES = of("Dates", 300, "date"); - Category MATH = of("Math", 50, "angle", "degree", "radian", + Category UUIDS = of("UUIDs", "uuid"); + Category DATES = of("Dates", "date"); + Category MATH = of("Math", "angle", "degree", "radian", "arithmetic", "vector", "vectors", "nan", "round", "rounds", "root", "quaternion", "permutations", "combinations", "numbers", "infinity", "exponential"); @@ -50,17 +50,20 @@ public sealed interface Category */ @Unmodifiable @NotNull Set modules(); - static Category of(@NotNull String name, int priority, String @NotNull ... keywords) { + /** + * Creates a new category. + * + * @param name The name. + * @param keywords The keywords. + * @return The new category. + */ + static Category of(@NotNull String name, String @NotNull ... keywords) { Preconditions.checkNotNull(name, "name cannot be null"); for (String keyword : keywords) { Preconditions.checkNotNull(keyword, "keywords cannot have null values"); } - return new CategoryImpl(name, priority, new HashSet<>(Set.of(keywords))); - } - - static Category of(@NotNull String name, @NotNull String... keywords) { - return of(name, 100, keywords); + return new CategoryImpl(name, new HashSet<>(Set.of(keywords))); } /** diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index b502920c524..f64503cf00f 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -13,7 +13,6 @@ final class CategoryImpl implements Category { private static final Set instances = new HashSet<>(); private final String name; - private final int priority; private final Set keywords; private final Set modules; @@ -21,10 +20,9 @@ public static Set getInstances() { return instances; } - CategoryImpl(String name, int priority, Set keywords) { + CategoryImpl(String name, Set keywords) { instances.add(this); this.name = name; - this.priority = priority; this.keywords = keywords.stream().map(String::toLowerCase).collect(Collectors.toSet()); this.modules = new HashSet<>(); } @@ -34,10 +32,6 @@ public static Set getInstances() { return name; } - public int priority() { - return priority; - } - public @NotNull Set keywords() { return keywords; } diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index fe5888e34fd..03de8516014 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -172,7 +172,7 @@ private static JsonArray getEventValues(SkriptEventInfo info) { Multimap, EventValueInfo> allEventValues = EventValues.getPerEventEventValues(); for (Class supportedEvent : info.events) { for (Class event : allEventValues.keySet()) { - if (!event.isAssignableFrom(supportedEvent)) { + if (event == null || !event.isAssignableFrom(supportedEvent)) { continue; } @@ -430,15 +430,8 @@ private static JsonArray cleanPatterns(String... strings) { if (options.isEmpty()) { return null; - } else if (options.size() == 1) { - return options.stream().findAny().orElseThrow().name(); - } else { - return options.stream() - .filter(it -> it instanceof CategoryImpl) - .map(it -> (CategoryImpl) it) - .max(Comparator.comparingInt(CategoryImpl::priority)) - .orElseThrow().name(); } + return options.stream().findAny().orElseThrow().name(); } /** diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 1a5295b3bb7..777f04d2001 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -6,6 +6,8 @@ import org.skriptlang.skript.registration.SyntaxOrigin; import org.skriptlang.skript.registration.SyntaxRegistry.Key; +import java.util.Set; + /** * A module is a component of a {@link SkriptAddon} used for registering syntax and other {@link Skript} components. *
@@ -62,4 +64,18 @@ default > void register(SkriptAddon addon, Key regist .build()); } + /** + * Registers syntax such that it belongs to the current module. + * + * @param addon The addon this module belongs to. + * @param registry The registry to add this syntax to. + * @param classes The syntax infos. + * @param The type of syntax. + */ + default > void register(SkriptAddon addon, Key registry, Set classes) { + for (I cls : classes) { + register(addon, registry, cls); + } + } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index 3694c87b01f..d3157fda6c8 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -14,10 +14,10 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; -import org.skriptlang.skript.bukkit.damagesource.elements.CondScalesWithDifficulty; +import org.skriptlang.skript.bukkit.damagesource.elements.*; import org.skriptlang.skript.registration.SyntaxRegistry; -import java.io.IOException; +import java.util.Set; public class DamageSourceModule implements AddonModule { @@ -59,13 +59,14 @@ public void init(SkriptAddon addon) { @Override public void load(SkriptAddon addon) { - register(addon, SyntaxRegistry.CONDITION, CondScalesWithDifficulty.info()); + register(addon, SyntaxRegistry.CONDITION, + Set.of(CondScalesWithDifficulty.info(), CondWasIndirect.info())); - try { - Skript.getAddonInstance().loadClasses("org.skriptlang.skript.bukkit.damagesource", "elements"); - } catch (IOException e) { - throw new RuntimeException(e); - } + register(addon, SyntaxRegistry.EXPRESSION, + Set.of(ExprCausingEntity.info(), ExprCreatedDamageSource.info(), + ExprDamageLocation.info(), ExprDamageType.info(), + ExprDirectEntity.info(), ExprFoodExhaustion.info(), + ExprSecDamageSource.info(), ExprSourceLocation.info())); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java index 1d9060d5694..e855e49dccd 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java @@ -24,6 +24,7 @@ public class CondScalesWithDifficulty extends PropertyCondition im public static SyntaxInfo info() { return SyntaxInfo.builder(CondScalesWithDifficulty.class) + .supplier(CondScalesWithDifficulty::new) .addPatterns("%damagesources% ((does|do) scale|scales) damage with difficulty", "%damagesources% (do not|don't|does not|doesn't) scale damage with difficulty", "%damagesources%'[s] damage ((does|do) scale|scales) with difficulty", diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java index c9ee8dafd92..a0de9806a91 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java @@ -11,6 +11,7 @@ import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Was Indirectly Caused") @Description({ @@ -24,14 +25,14 @@ """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class CondWasIndirect extends PropertyCondition implements DamageSourceExperimentSyntax { - static { - Skript.registerCondition(CondWasIndirect.class, ConditionType.PROPERTY, - "%damagesources% (was|were) ([:in]directly caused|caused [:in]directly)", - "%damagesources% (was not|wasn't|were not|weren't) ([:in]directly caused|caused [:in]directly)" - ); + public static SyntaxInfo info() { + return SyntaxInfo.builder(CondWasIndirect.class) + .supplier(CondWasIndirect::new) + .addPatterns("%damagesources% (was|were) ([:in]directly caused|caused [:in]directly)", + "%damagesources% (was not|wasn't|were not|weren't) ([:in]directly caused|caused [:in]directly)") + .build(); } private boolean indirect; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java index 46cbac41fec..8e8695eaf69 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Damage Source - Causing Entity") @Description({ @@ -37,8 +38,11 @@ set the damage location to location(0, 0, 10) @RequiredPlugins("Minecraft 1.20.4+") public class ExprCausingEntity extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - static { - registerDefault(ExprCausingEntity.class, Entity.class, "(causing|responsible) entity", "damagesources"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprCausingEntity.class, Entity.class) + .supplier(ExprCausingEntity::new) + .addPatterns(getDefaultPatterns("(causing|responsible) entity", "damagesources")) + .build(); } private boolean isEvent; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java index 6efbec5f8c2..d849edee931 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java @@ -7,6 +7,7 @@ import org.bukkit.damage.DamageSource; import org.bukkit.event.Event; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Created Damage Source") @Description("Get the created damage source being created/modified in a 'custom damage source' section.") @@ -16,11 +17,13 @@ """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class ExprCreatedDamageSource extends EventValueExpression implements EventRestrictedSyntax { - static { - register(ExprCreatedDamageSource.class, DamageSource.class, "created damage source"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprCreatedDamageSource.class, DamageSource.class) + .supplier(ExprCreatedDamageSource::new) + .addPatterns("created damage source") + .build(); } public ExprCreatedDamageSource() { diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java index 8ef78b71d15..6e03d995233 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Damage Source - Damage Location") @Description({ @@ -34,11 +35,13 @@ set the damage location to location(0, 0, 10) """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class ExprDamageLocation extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - static { - registerDefault(ExprDamageLocation.class, Location.class, "damage location", "damagesources"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprDamageLocation.class, Location.class) + .supplier(ExprDamageLocation::new) + .addPatterns(getDefaultPatterns("damage location", "damagesources")) + .build(); } private boolean isEvent; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java index 54171a3c407..ae1851fbcee 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Damage Source - Damage Type") @Description({ @@ -34,11 +35,13 @@ set the damage location to location(0, 0, 10) """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class ExprDamageType extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - static { - registerDefault(ExprDamageType.class, DamageType.class, "damage type", "damagesources"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprDamageType.class, DamageType.class) + .supplier(ExprDamageType::new) + .addPatterns(getDefaultPatterns("damage type", "damagesources")) + .build(); } private boolean isEvent; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java index 9561eba3360..914cb4a2421 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java @@ -9,11 +9,13 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; import org.bukkit.entity.Entity; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Damage Source - Direct Entity") @Description({ @@ -35,11 +37,13 @@ set the damage location to location(0, 0, 10) """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class ExprDirectEntity extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - static { - registerDefault(ExprDirectEntity.class, Entity.class, "direct entity", "damagesources"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprDirectEntity.class, Entity.class) + .supplier(ExprDirectEntity::new) + .addPatterns(getDefaultPatterns("direct entity", "damagesources")) + .build(); } private boolean isEvent; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java index 11752bb491f..3c4d9eed4ca 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java @@ -5,6 +5,7 @@ import org.bukkit.damage.DamageSource; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Damage Source - Food Exhaustion") @Description("The amount of hunger exhaustion caused by a damage source.") @@ -14,11 +15,13 @@ """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class ExprFoodExhaustion extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - static { - registerDefault(ExprFoodExhaustion.class, Float.class, "food exhaustion", "damagesources"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprFoodExhaustion.class, Float.class) + .supplier(ExprFoodExhaustion::new) + .addPatterns(getDefaultPatterns("food exhaustion", "damagesources")) + .build(); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java index 6c7168a3788..70fa103630e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -80,6 +81,14 @@ public DamageSourceSectionEvent() {} } } + + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprSecDamageSource.class, DamageSource.class) + .supplier(ExprSecDamageSource::new) + .addPatterns("[a] custom damage source [(with|using) [the|a] [damage type [of]] %-damagetype%]") + .build(); + } + static { Skript.registerExpression(ExprSecDamageSource.class, DamageSource.class, ExpressionType.COMBINED, "[a] custom damage source [(with|using) [the|a] [damage type [of]] %-damagetype%]"); diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java index 291e649a7e7..d00938019f2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java @@ -6,6 +6,7 @@ import org.bukkit.damage.DamageSource; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; +import org.skriptlang.skript.registration.DefaultSyntaxInfos; @Name("Damage Source - Source Location") @Description({ @@ -20,11 +21,13 @@ """) @Since("2.12") @RequiredPlugins("Minecraft 1.20.4+") -@SuppressWarnings("UnstableApiUsage") public class ExprSourceLocation extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - static { - registerDefault(ExprSourceLocation.class, Location.class, "source location", "damagesources"); + public static DefaultSyntaxInfos.Expression info() { + return DefaultSyntaxInfos.Expression.builder(ExprSourceLocation.class, Location.class) + .supplier(ExprSourceLocation::new) + .addPatterns(getDefaultPatterns("source location", "damagesources")) + .build(); } @Override From d4c7b512dad8508e2ee87f8c669782afa037263a Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Wed, 17 Sep 2025 13:07:06 +0200 Subject: [PATCH 04/23] wait :( --- .../java/ch/njol/skript/doc/Category.java | 41 ++++++++----------- .../java/ch/njol/skript/doc/CategoryImpl.java | 4 ++ .../ch/njol/skript/doc/JSONGenerator.java | 26 ++++++++---- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java index 49a830e6a08..2fa7d7cf4d2 100644 --- a/src/main/java/ch/njol/skript/doc/Category.java +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -11,25 +11,24 @@ /** * Represents a category a documented element can belong to. */ -public sealed interface Category - permits CategoryImpl { +public interface Category { - Category ENTITIES = of("Entities", "entity", "entities", "animal", "panda", "allay", + Category ENTITIES = new CategoryImpl("Entities", "entity", "entities", "animal", "panda", "allay", "zombie", "goat", "horse", "pig", "fish", "villager", "bee"); - Category BREEDING = of("Breeding"); - Category PLAYERS = of("Players", "player", "operator"); - Category DAMAGE_SOURCES = of("Damage Sources", "damage source"); - Category BLOCKS = of("Blocks", "block"); - Category STRINGS = of("Strings", "string", "text"); - Category COMMANDS = of("Commands", "command"); - Category ITEMS = of("Items", "item", "enchantment", "lore", "tooltip", "banner"); - Category WORLDS = of("Worlds", "world"); - Category SCRIPTS = of("Scripts", "script"); - Category DISPLAYS = of("Displays", "display"); - Category TIME = of("Time", "time", "unix"); - Category UUIDS = of("UUIDs", "uuid"); - Category DATES = of("Dates", "date"); - Category MATH = of("Math", "angle", "degree", "radian", + Category BREEDING = new CategoryImpl("Breeding"); + Category PLAYERS = new CategoryImpl("Players", "player", "operator"); + Category DAMAGE_SOURCES = new CategoryImpl("Damage Sources", "damage source"); + Category BLOCKS = new CategoryImpl("Blocks", "block"); + Category STRINGS = new CategoryImpl("Strings", "string", "text"); + Category COMMANDS = new CategoryImpl("Commands", "command"); + Category ITEMS = new CategoryImpl("Items", "item", "enchantment", "lore", "tooltip", "banner"); + Category WORLDS = new CategoryImpl("Worlds", "world"); + Category SCRIPTS = new CategoryImpl("Scripts", "script"); + Category DISPLAYS = new CategoryImpl("Displays", "display"); + Category TIME = new CategoryImpl("Time", "time", "unix"); + Category UUIDS = new CategoryImpl("UUIDs", "uuid"); + Category DATES = new CategoryImpl("Dates", "date"); + Category MATH = new CategoryImpl("Math", "angle", "degree", "radian", "arithmetic", "vector", "vectors", "nan", "round", "rounds", "root", "quaternion", "permutations", "combinations", "numbers", "infinity", "exponential"); @@ -54,16 +53,12 @@ public sealed interface Category * Creates a new category. * * @param name The name. - * @param keywords The keywords. * @return The new category. */ - static Category of(@NotNull String name, String @NotNull ... keywords) { + static Category of(@NotNull String name) { Preconditions.checkNotNull(name, "name cannot be null"); - for (String keyword : keywords) { - Preconditions.checkNotNull(keyword, "keywords cannot have null values"); - } - return new CategoryImpl(name, new HashSet<>(Set.of(keywords))); + return new CategoryImpl(name, new HashSet<>()); } /** diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index f64503cf00f..6181279061b 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -20,6 +20,10 @@ public static Set getInstances() { return instances; } + CategoryImpl(String name, String... keywords) { + this(name, new HashSet<>(Set.of(keywords))); + } + CategoryImpl(String name, Set keywords) { instances.add(this); this.name = name; diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index 03de8516014..8a9a9babc16 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -22,6 +22,7 @@ import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.lang.structure.Structure; import org.skriptlang.skript.lang.structure.StructureInfo; +import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxOrigin; import org.skriptlang.skript.registration.SyntaxOrigin.ElementOrigin; @@ -84,7 +85,8 @@ private static JsonArray convertToJsonArray(String @Nullable ... strings) { * @param syntaxInfo the syntax info element to generate the documentation object of * @return the JsonObject representing the documentation of the provided syntax element */ - private static JsonObject generatedAnnotatedElement(SyntaxElementInfo syntaxInfo) { + // TODO WAIT FOR JSONGENERATOR IMPROVEMENTS + private static JsonObject generatedAnnotatedElement(SyntaxInfo syntaxInfo) { Class syntaxClass = syntaxInfo.getElementClass(); Name name = syntaxClass.getAnnotation(Name.class); if (name == null || syntaxClass.getAnnotation(NoDoc.class) != null) @@ -394,22 +396,28 @@ private static JsonArray cleanPatterns(String... strings) { } private static @Nullable String getCategory(SyntaxOrigin origin, String name, String[] description, String[] patterns) { + System.out.println("x"); if (origin instanceof ElementOrigin elementOrigin) { + System.out.println("==="); for (Category category : Category.values()) { + System.out.println(category.name()); + System.out.println(Arrays.toString(category.modules().stream().map(it -> it.getClass().getSimpleName()).toArray())); if (category.modules().contains(elementOrigin.module())) { return category.name(); } } } - if (patterns == null) patterns = new String[] { "" }; - String first = getCategory(String.join("", patterns)); - if (first != null) { - return first; - } else { - if (description == null) description = new String[] { "" }; - return getCategory(name + String.join("", description) + String.join("", patterns)); - } + return null; + +// if (patterns == null) patterns = new String[] { "" }; +// String first = getCategory(String.join("", patterns)); +// if (first != null) { +// return first; +// } else { +// if (description == null) description = new String[] { "" }; +// return getCategory(name + String.join("", description) + String.join("", patterns)); +// } } private static @Nullable String getCategory(String patterns) { From 34bc9264f0e3ffdce633c15f690f295b812930d8 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Wed, 17 Sep 2025 23:14:13 +0200 Subject: [PATCH 05/23] Add location, fix merge --- .../java/ch/njol/skript/doc/Category.java | 1 + .../ch/njol/skript/doc/JSONGenerator.java | 36 +++++++++---------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java index 2fa7d7cf4d2..8329944b749 100644 --- a/src/main/java/ch/njol/skript/doc/Category.java +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -28,6 +28,7 @@ public interface Category { Category TIME = new CategoryImpl("Time", "time", "unix"); Category UUIDS = new CategoryImpl("UUIDs", "uuid"); Category DATES = new CategoryImpl("Dates", "date"); + Category LOCATIONS = new CategoryImpl("Locations", "location"); Category MATH = new CategoryImpl("Math", "angle", "degree", "radian", "arithmetic", "vector", "vectors", "nan", "round", "rounds", "root", "quaternion", "permutations", "combinations", "numbers", "infinity", "exponential"); diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index d6fc4d252c8..a55313e9e00 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -21,12 +21,14 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys; import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; import org.skriptlang.skript.lang.structure.Structure; import org.skriptlang.skript.registration.DefaultSyntaxInfos; import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxOrigin; import org.skriptlang.skript.registration.SyntaxOrigin.ElementOrigin; import org.skriptlang.skript.registration.SyntaxRegistry; @@ -161,7 +163,7 @@ private static JsonObject generatedAnnotatedElement(SyntaxInfo syntaxInfo) { syntaxJsonObject.add("keywords", keywords == null ? null : convertToJsonArray(keywords.value())); syntaxJsonObject.addProperty("category", getCategory(syntaxInfo.origin(), name.value(), - description == null ? null : description.value(), syntaxInfo.getPatterns())); + description == null ? null : List.of(description.value()), syntaxInfo.patterns())); if (syntaxInfo instanceof SyntaxInfo.Expression expression) { syntaxJsonObject.add("returns", getExpressionReturnTypes(expression)); @@ -228,8 +230,7 @@ private static JsonObject generateEventElement(BukkitSyntaxInfos.Event info) syntaxJsonObject.add("requirements", convertToJsonArray(info.requiredPlugins().toArray(new String[0]))); syntaxJsonObject.add("examples", convertToJsonArray(info.examples().toArray(new String[0]))); syntaxJsonObject.add("eventValues", getEventValues(info)); - syntaxJsonObject.add("keywords", convertToJsonArray(info.getKeywords())); - syntaxJsonObject.addProperty("category", getCategory(info.origin(), info.getName(), info.getDescription(), info.getPatterns())); + syntaxJsonObject.addProperty("category", getCategory(info.origin(), info.name(), info.description(), info.patterns())); return syntaxJsonObject; } @@ -376,7 +377,8 @@ private static JsonObject generateClassInfoElement(ClassInfo classInfo) { syntaxJsonObject.add("requirements", convertToJsonArray(classInfo.getRequiredPlugins())); syntaxJsonObject.add("examples", convertToJsonArray(classInfo.getExamples())); syntaxJsonObject.addProperty("category", getCategory(null, - Objects.requireNonNullElse(classInfo.getDocName(), classInfo.getCodeName()), classInfo.getDescription(), null)); + Objects.requireNonNullElse(classInfo.getDocName(), classInfo.getCodeName()), + List.of(classInfo.getDescription()), null)); return syntaxJsonObject; } @@ -415,7 +417,7 @@ private static JsonObject generateFunctionElement(JavaFunction function) { String functionSignature = function.getSignature().toString(false, false); functionJsonObject.add("patterns", convertToJsonArray(functionSignature)); - functionJsonObject.addProperty("category", getCategory(null, function.getName(), function.getDescription(), null)); + functionJsonObject.addProperty("category", getCategory(null, function.getName(), List.of(function.getDescription()), null)); return functionJsonObject; } @@ -467,29 +469,23 @@ private static JsonArray cleanPatterns(String... strings) { return convertToJsonArray(strings); } - private static @Nullable String getCategory(SyntaxOrigin origin, String name, String[] description, String[] patterns) { - System.out.println("x"); + private static @Nullable String getCategory(SyntaxOrigin origin, String name, Collection description, Collection patterns) { if (origin instanceof ElementOrigin elementOrigin) { - System.out.println("==="); for (Category category : Category.values()) { - System.out.println(category.name()); - System.out.println(Arrays.toString(category.modules().stream().map(it -> it.getClass().getSimpleName()).toArray())); if (category.modules().contains(elementOrigin.module())) { return category.name(); } } } - return null; - -// if (patterns == null) patterns = new String[] { "" }; -// String first = getCategory(String.join("", patterns)); -// if (first != null) { -// return first; -// } else { -// if (description == null) description = new String[] { "" }; -// return getCategory(name + String.join("", description) + String.join("", patterns)); -// } + if (patterns == null) patterns = List.of(); + String first = getCategory(String.join("", patterns)); + if (first != null) { + return first; + } else { + if (description == null) description = List.of(); + return getCategory(name + String.join("", description) + String.join("", patterns)); + } } private static @Nullable String getCategory(String patterns) { From 5616181c21c6b2a651c3d2d3c37dfdbc94a20caf Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Wed, 17 Sep 2025 23:21:43 +0200 Subject: [PATCH 06/23] Remove set from register --- src/main/java/org/skriptlang/skript/addon/AddonModule.java | 3 ++- .../skript/bukkit/damagesource/DamageSourceModule.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 777f04d2001..beca701b2a0 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -72,7 +72,8 @@ default > void register(SkriptAddon addon, Key regist * @param classes The syntax infos. * @param The type of syntax. */ - default > void register(SkriptAddon addon, Key registry, Set classes) { + @SuppressWarnings("unchecked") + default > void register(SkriptAddon addon, Key registry, I... classes) { for (I cls : classes) { register(addon, registry, cls); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index d3157fda6c8..a1b4cf12be9 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -60,13 +60,13 @@ public void init(SkriptAddon addon) { @Override public void load(SkriptAddon addon) { register(addon, SyntaxRegistry.CONDITION, - Set.of(CondScalesWithDifficulty.info(), CondWasIndirect.info())); + CondScalesWithDifficulty.info(), CondWasIndirect.info()); register(addon, SyntaxRegistry.EXPRESSION, - Set.of(ExprCausingEntity.info(), ExprCreatedDamageSource.info(), + ExprCausingEntity.info(), ExprCreatedDamageSource.info(), ExprDamageLocation.info(), ExprDamageType.info(), ExprDirectEntity.info(), ExprFoodExhaustion.info(), - ExprSecDamageSource.info(), ExprSourceLocation.info())); + ExprSecDamageSource.info(), ExprSourceLocation.info()); } } From 6fe255e216ab81229a15c3e30055d9fcf51e5f30 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Thu, 18 Sep 2025 00:10:13 +0200 Subject: [PATCH 07/23] Make CategoryImpl use classes instead of instances --- src/main/java/ch/njol/skript/doc/Category.java | 5 ++--- src/main/java/ch/njol/skript/doc/CategoryImpl.java | 6 +++--- .../java/org/skriptlang/skript/addon/AddonModule.java | 9 +++++++++ .../java/org/skriptlang/skript/addon/SkriptAddon.java | 6 ++++++ .../skript/bukkit/damagesource/DamageSourceModule.java | 10 ++++++---- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java index 8329944b749..5fb00798d4b 100644 --- a/src/main/java/ch/njol/skript/doc/Category.java +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -2,7 +2,6 @@ import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.AddonModule; import java.util.HashSet; @@ -43,12 +42,12 @@ public interface Category { * * @param module The module to add. */ - void addModule(@NotNull AddonModule module); + void addModule(@NotNull Class module); /** * @return The modules that are represented by this category. */ - @Unmodifiable @NotNull Set modules(); + Set> modules(); /** * Creates a new category. diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index 6181279061b..95cd655c09b 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -14,7 +14,7 @@ final class CategoryImpl implements Category { private static final Set instances = new HashSet<>(); private final String name; private final Set keywords; - private final Set modules; + private final Set> modules; public static Set getInstances() { return instances; @@ -41,14 +41,14 @@ public static Set getInstances() { } @Override - public void addModule(@NotNull AddonModule module) { + public void addModule(@NotNull Class module) { Preconditions.checkNotNull(module, "module cannot be null"); modules.add(module); } @Override - public @NotNull Set modules() { + public Set> modules() { return Collections.unmodifiableSet(modules); } diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index beca701b2a0..305b171db0f 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -1,6 +1,8 @@ package org.skriptlang.skript.addon; +import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.Skript; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxOrigin; @@ -49,6 +51,13 @@ default boolean canLoad(SkriptAddon addon) { return true; } + /** + * @return The category to which this module belongs, or null if this module belongs to no category. + */ + default @Nullable Category category() { + return null; + } + /** * Registers syntax such that it belongs to the current module. * diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java index d99ac58085b..d65b8182e06 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java @@ -1,5 +1,6 @@ package org.skriptlang.skript.addon; +import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.skriptlang.skript.Skript; @@ -97,6 +98,11 @@ default void loadModules(AddonModule... modules) { for (AddonModule module : filtered) { module.init(this); + + Category category = module.category(); + if (category != null) { + category.addModule(module.getClass()); + } } for (AddonModule module : filtered) { module.load(this); diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index a1b4cf12be9..90f0fa33388 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -12,13 +12,12 @@ import org.bukkit.damage.DamageType; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.damagesource.elements.*; import org.skriptlang.skript.registration.SyntaxRegistry; -import java.util.Set; - public class DamageSourceModule implements AddonModule { @Override @@ -28,8 +27,6 @@ public boolean canLoad(SkriptAddon addon) { @Override public void init(SkriptAddon addon) { - Category.DAMAGE_SOURCES.addModule(this); - Classes.registerClass(new ClassInfo<>(DamageSource.class, "damagesource") .user("damage ?sources?") .name("Damage Source") @@ -69,4 +66,9 @@ public void load(SkriptAddon addon) { ExprSecDamageSource.info(), ExprSourceLocation.info()); } + @Override + public @Nullable Category category() { + return Category.DAMAGE_SOURCES; + } + } From afd70a7e4c26763086f24564c45c413591045901 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Thu, 18 Sep 2025 00:24:02 +0200 Subject: [PATCH 08/23] Add docs, bug fix --- .../ch/njol/skript/doc/JSONGenerator.java | 38 ++++++++++++++----- .../skriptlang/skript/addon/AddonModule.java | 4 +- .../skriptlang/skript/addon/SkriptAddon.java | 6 +-- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index a55313e9e00..181d9b12d1e 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -21,7 +21,6 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys; import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; @@ -162,7 +161,7 @@ private static JsonObject generatedAnnotatedElement(SyntaxInfo syntaxInfo) { Keywords keywords = syntaxClass.getAnnotation(Keywords.class); syntaxJsonObject.add("keywords", keywords == null ? null : convertToJsonArray(keywords.value())); - syntaxJsonObject.addProperty("category", getCategory(syntaxInfo.origin(), name.value(), + syntaxJsonObject.addProperty("category", getCategoryName(syntaxInfo.origin(), name.value(), description == null ? null : List.of(description.value()), syntaxInfo.patterns())); if (syntaxInfo instanceof SyntaxInfo.Expression expression) { @@ -230,7 +229,7 @@ private static JsonObject generateEventElement(BukkitSyntaxInfos.Event info) syntaxJsonObject.add("requirements", convertToJsonArray(info.requiredPlugins().toArray(new String[0]))); syntaxJsonObject.add("examples", convertToJsonArray(info.examples().toArray(new String[0]))); syntaxJsonObject.add("eventValues", getEventValues(info)); - syntaxJsonObject.addProperty("category", getCategory(info.origin(), info.name(), info.description(), info.patterns())); + syntaxJsonObject.addProperty("category", getCategoryName(info.origin(), info.name(), info.description(), info.patterns())); return syntaxJsonObject; } @@ -376,7 +375,7 @@ private static JsonObject generateClassInfoElement(ClassInfo classInfo) { syntaxJsonObject.add("description", convertToJsonArray(classInfo.getDescription())); syntaxJsonObject.add("requirements", convertToJsonArray(classInfo.getRequiredPlugins())); syntaxJsonObject.add("examples", convertToJsonArray(classInfo.getExamples())); - syntaxJsonObject.addProperty("category", getCategory(null, + syntaxJsonObject.addProperty("category", getCategoryName(null, Objects.requireNonNullElse(classInfo.getDocName(), classInfo.getCodeName()), List.of(classInfo.getDescription()), null)); @@ -417,7 +416,7 @@ private static JsonObject generateFunctionElement(JavaFunction function) { String functionSignature = function.getSignature().toString(false, false); functionJsonObject.add("patterns", convertToJsonArray(functionSignature)); - functionJsonObject.addProperty("category", getCategory(null, function.getName(), List.of(function.getDescription()), null)); + functionJsonObject.addProperty("category", getCategoryName(null, function.getName(), List.of(function.getDescription()), null)); return functionJsonObject; } @@ -469,10 +468,25 @@ private static JsonArray cleanPatterns(String... strings) { return convertToJsonArray(strings); } - private static @Nullable String getCategory(SyntaxOrigin origin, String name, Collection description, Collection patterns) { + /** + * Returns the category name of an element given its origin, name, description and patterns. + * + *

Attempts to find a category by using pattern first. + * If this has no results, then it will use the name and description.

+ * + * @param origin The origin of this element. + * @param name The name of this element. + * @param description The description of this element. + * @param patterns The patterns of this element. + * @return The category name, or null if none is found. + */ + private static @Nullable String getCategoryName( + @Nullable SyntaxOrigin origin, @NotNull String name, + @Nullable Collection description, @Nullable Collection patterns + ) { if (origin instanceof ElementOrigin elementOrigin) { for (Category category : Category.values()) { - if (category.modules().contains(elementOrigin.module())) { + if (category.modules().contains(elementOrigin.module().getClass())) { return category.name(); } } @@ -488,7 +502,13 @@ private static JsonArray cleanPatterns(String... strings) { } } - private static @Nullable String getCategory(String patterns) { + /** + * Attempts to find a category based on the input. + * + * @param input The input. + * @return A category, or null if none is found. + */ + private static @Nullable String getCategory(String input) { Set options = new HashSet<>(); for (Category value : Category.values()) { @@ -497,7 +517,7 @@ private static JsonArray cleanPatterns(String... strings) { } for (String keyword : impl.keywords()) { - if (patterns.toLowerCase().contains(keyword)) { + if (input.toLowerCase().contains(keyword)) { options.add(value); break; } diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 305b171db0f..8f63da14cb8 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -52,7 +52,9 @@ default boolean canLoad(SkriptAddon addon) { } /** - * @return The category to which this module belongs, or null if this module belongs to no category. + * Returns the documentation category which this module belongs to. + * + * @return The category of this module, or null if this module belongs to no category. */ default @Nullable Category category() { return null; diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java index d65b8182e06..ed1aa62130d 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java @@ -98,15 +98,15 @@ default void loadModules(AddonModule... modules) { for (AddonModule module : filtered) { module.init(this); + } + for (AddonModule module : filtered) { + module.load(this); Category category = module.category(); if (category != null) { category.addModule(module.getClass()); } } - for (AddonModule module : filtered) { - module.load(this); - } } /** From 1d926c8ebcd04b9c8be605e1bc2b3c4eaa046da8 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Thu, 18 Sep 2025 00:32:00 +0200 Subject: [PATCH 09/23] Add multiple categories per module --- .../ch/njol/skript/doc/JSONGenerator.java | 44 ++++++++++--------- .../skriptlang/skript/addon/AddonModule.java | 7 +-- .../skriptlang/skript/addon/SkriptAddon.java | 6 ++- .../damagesource/DamageSourceModule.java | 7 ++- 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index 181d9b12d1e..55266cc9200 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -161,13 +161,13 @@ private static JsonObject generatedAnnotatedElement(SyntaxInfo syntaxInfo) { Keywords keywords = syntaxClass.getAnnotation(Keywords.class); syntaxJsonObject.add("keywords", keywords == null ? null : convertToJsonArray(keywords.value())); - syntaxJsonObject.addProperty("category", getCategoryName(syntaxInfo.origin(), name.value(), - description == null ? null : List.of(description.value()), syntaxInfo.patterns())); - if (syntaxInfo instanceof SyntaxInfo.Expression expression) { syntaxJsonObject.add("returns", getExpressionReturnTypes(expression)); } + syntaxJsonObject.add("categories", getCategoriesArray(syntaxInfo.origin(), name.value(), + description == null ? null : List.of(description.value()), syntaxInfo.patterns())); + return syntaxJsonObject; } @@ -229,7 +229,7 @@ private static JsonObject generateEventElement(BukkitSyntaxInfos.Event info) syntaxJsonObject.add("requirements", convertToJsonArray(info.requiredPlugins().toArray(new String[0]))); syntaxJsonObject.add("examples", convertToJsonArray(info.examples().toArray(new String[0]))); syntaxJsonObject.add("eventValues", getEventValues(info)); - syntaxJsonObject.addProperty("category", getCategoryName(info.origin(), info.name(), info.description(), info.patterns())); + syntaxJsonObject.add("categories", getCategoriesArray(info.origin(), info.name(), info.description(), info.patterns())); return syntaxJsonObject; } @@ -375,7 +375,7 @@ private static JsonObject generateClassInfoElement(ClassInfo classInfo) { syntaxJsonObject.add("description", convertToJsonArray(classInfo.getDescription())); syntaxJsonObject.add("requirements", convertToJsonArray(classInfo.getRequiredPlugins())); syntaxJsonObject.add("examples", convertToJsonArray(classInfo.getExamples())); - syntaxJsonObject.addProperty("category", getCategoryName(null, + syntaxJsonObject.add("categories", getCategoriesArray(null, Objects.requireNonNullElse(classInfo.getDocName(), classInfo.getCodeName()), List.of(classInfo.getDescription()), null)); @@ -416,7 +416,7 @@ private static JsonObject generateFunctionElement(JavaFunction function) { String functionSignature = function.getSignature().toString(false, false); functionJsonObject.add("patterns", convertToJsonArray(functionSignature)); - functionJsonObject.addProperty("category", getCategoryName(null, function.getName(), List.of(function.getDescription()), null)); + functionJsonObject.add("categories", getCategoriesArray(null, function.getName(), List.of(function.getDescription()), null)); return functionJsonObject; } @@ -480,26 +480,32 @@ private static JsonArray cleanPatterns(String... strings) { * @param patterns The patterns of this element. * @return The category name, or null if none is found. */ - private static @Nullable String getCategoryName( + private static @Nullable JsonArray getCategoriesArray( @Nullable SyntaxOrigin origin, @NotNull String name, @Nullable Collection description, @Nullable Collection patterns ) { + JsonArray categories = new JsonArray(); if (origin instanceof ElementOrigin elementOrigin) { for (Category category : Category.values()) { if (category.modules().contains(elementOrigin.module().getClass())) { - return category.name(); + categories.add(category.name()); } } + return categories; } if (patterns == null) patterns = List.of(); - String first = getCategory(String.join("", patterns)); - if (first != null) { + JsonArray first = getCategories(String.join("", patterns)); + if (!first.isEmpty()) { return first; - } else { - if (description == null) description = List.of(); - return getCategory(name + String.join("", description) + String.join("", patterns)); } + if (description == null) description = List.of(); + + JsonArray second = getCategories(name + String.join("", description) + String.join("", patterns)); + if (second.isEmpty()) { + return null; + } + return second; } /** @@ -508,9 +514,8 @@ private static JsonArray cleanPatterns(String... strings) { * @param input The input. * @return A category, or null if none is found. */ - private static @Nullable String getCategory(String input) { - Set options = new HashSet<>(); - + private static JsonArray getCategories(String input) { + JsonArray options = new JsonArray(); for (Category value : Category.values()) { if (!(value instanceof CategoryImpl impl)) { break; @@ -518,16 +523,13 @@ private static JsonArray cleanPatterns(String... strings) { for (String keyword : impl.keywords()) { if (input.toLowerCase().contains(keyword)) { - options.add(value); + options.add(value.name()); break; } } } - if (options.isEmpty()) { - return null; - } - return options.stream().findAny().orElseThrow().name(); + return options; } /** diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 8f63da14cb8..0a48072cd7d 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -2,6 +2,7 @@ import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.Skript; import org.skriptlang.skript.registration.SyntaxInfo; @@ -54,10 +55,10 @@ default boolean canLoad(SkriptAddon addon) { /** * Returns the documentation category which this module belongs to. * - * @return The category of this module, or null if this module belongs to no category. + * @return The category of this module. */ - default @Nullable Category category() { - return null; + default @NotNull Set category() { + return Set.of(); } /** diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java index ed1aa62130d..9b2c62afa77 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java @@ -3,6 +3,7 @@ import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import org.skriptlang.skript.Skript; import org.skriptlang.skript.localization.Localizer; import org.skriptlang.skript.registration.SyntaxRegistry; @@ -11,6 +12,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.function.Supplier; /** @@ -102,8 +104,8 @@ default void loadModules(AddonModule... modules) { for (AddonModule module : filtered) { module.load(this); - Category category = module.category(); - if (category != null) { + Set categories = module.category(); + for (Category category : categories) { category.addModule(module.getClass()); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index 90f0fa33388..ec1d12e12ce 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -12,12 +12,15 @@ import org.bukkit.damage.DamageType; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.damagesource.elements.*; import org.skriptlang.skript.registration.SyntaxRegistry; +import java.util.Set; + public class DamageSourceModule implements AddonModule { @Override @@ -67,8 +70,8 @@ public void load(SkriptAddon addon) { } @Override - public @Nullable Category category() { - return Category.DAMAGE_SOURCES; + public @NotNull Set category() { + return Set.of(Category.DAMAGE_SOURCES); } } From 4b79f1fb7e162b1decc0fa36b5a27f444659bdbd Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:06:25 +0200 Subject: [PATCH 10/23] Apply suggestion from @Absolutionism Co-authored-by: SirSmurfy2 <82696841+Absolutionism@users.noreply.github.com> --- src/main/java/ch/njol/skript/doc/CategoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index 95cd655c09b..f3c32300bfc 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -48,7 +48,7 @@ public void addModule(@NotNull Class module) { } @Override - public Set> modules() { + public @Unmodifiable Set> modules() { return Collections.unmodifiableSet(modules); } From 3369e17df125f483eaab3262bc73574171bfa6ca Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:06:40 +0200 Subject: [PATCH 11/23] Apply suggestion from @Absolutionism Co-authored-by: SirSmurfy2 <82696841+Absolutionism@users.noreply.github.com> --- src/main/java/ch/njol/skript/doc/JSONGenerator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index a55313e9e00..1bf0af7a720 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -478,7 +478,8 @@ private static JsonArray cleanPatterns(String... strings) { } } - if (patterns == null) patterns = List.of(); + if (patterns == null) + patterns = List.of(); String first = getCategory(String.join("", patterns)); if (first != null) { return first; From 278377cae9fdf3fd5817185bffd4699d36430a71 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:06:58 +0200 Subject: [PATCH 12/23] Apply suggestion from @Absolutionism Co-authored-by: SirSmurfy2 <82696841+Absolutionism@users.noreply.github.com> --- src/main/java/ch/njol/skript/doc/JSONGenerator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index 1bf0af7a720..41d40adf348 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -484,7 +484,8 @@ private static JsonArray cleanPatterns(String... strings) { if (first != null) { return first; } else { - if (description == null) description = List.of(); + if (description == null) + description = List.of(); return getCategory(name + String.join("", description) + String.join("", patterns)); } } From 87caeadd501fa35858ac5dd56f360fb4245e51ed Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:50:14 +0200 Subject: [PATCH 13/23] Update docs --- src/main/java/ch/njol/skript/doc/JSONGenerator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index 59fbb01db2b..ea577ee81bf 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -472,7 +472,8 @@ private static JsonArray cleanPatterns(String... strings) { * Returns the category name of an element given its origin, name, description and patterns. * *

Attempts to find a category by using pattern first. - * If this has no results, then it will use the name and description.

+ * If this has no results, then it will use the name and description. + *

* * @param origin The origin of this element. * @param name The name of this element. From 5b914e8dc7cf575d17b60cf517e6207cb53581d4 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:52:00 +0200 Subject: [PATCH 14/23] Update annotation --- src/main/java/ch/njol/skript/doc/CategoryImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index f3c32300bfc..58669ee1dc8 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -2,6 +2,7 @@ import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.AddonModule; import java.util.Collections; From 5f7eded99b28a7dc45334e9c86108b95747e6f49 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Fri, 19 Sep 2025 18:06:54 +0200 Subject: [PATCH 15/23] Add subcategories --- .../java/ch/njol/skript/doc/Category.java | 27 ++++++++++++++++--- .../java/ch/njol/skript/doc/CategoryImpl.java | 18 ++++++++++--- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Category.java b/src/main/java/ch/njol/skript/doc/Category.java index 5fb00798d4b..f50b393d3c6 100644 --- a/src/main/java/ch/njol/skript/doc/Category.java +++ b/src/main/java/ch/njol/skript/doc/Category.java @@ -4,7 +4,6 @@ import org.jetbrains.annotations.NotNull; import org.skriptlang.skript.addon.AddonModule; -import java.util.HashSet; import java.util.Set; /** @@ -29,14 +28,20 @@ public interface Category { Category DATES = new CategoryImpl("Dates", "date"); Category LOCATIONS = new CategoryImpl("Locations", "location"); Category MATH = new CategoryImpl("Math", "angle", "degree", "radian", - "arithmetic", "vector", "vectors", "nan", "round", "rounds", "root", "quaternion", "permutations", + "arithmetic", "nan", "round", "rounds", "root", "quaternion", "permutations", "combinations", "numbers", "infinity", "exponential"); + Category VECTORS = new CategoryImpl("Vectors", Category.MATH, "vector"); /** * @return The display name of this category. */ @NotNull String name(); + /** + * @return The parent category of this category. + */ + Category parent(); + /** * Adds a module to this category. * @@ -47,7 +52,7 @@ public interface Category { /** * @return The modules that are represented by this category. */ - Set> modules(); + @NotNull Set> modules(); /** * Creates a new category. @@ -58,7 +63,21 @@ public interface Category { static Category of(@NotNull String name) { Preconditions.checkNotNull(name, "name cannot be null"); - return new CategoryImpl(name, new HashSet<>()); + return new CategoryImpl(name); + } + + /** + * Creates a new category. + * + * @param name The name. + * @param category The category. + * @return The new category. + */ + static Category of(@NotNull String name, @NotNull Category category) { + Preconditions.checkNotNull(name, "name cannot be null"); + Preconditions.checkNotNull(category, "category cannot be null"); + + return new CategoryImpl(name, category); } /** diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index 58669ee1dc8..9eaa3b90bcf 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.AddonModule; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -14,6 +15,7 @@ final class CategoryImpl implements Category { private static final Set instances = new HashSet<>(); private final String name; + private final Category parent; private final Set keywords; private final Set> modules; @@ -22,13 +24,16 @@ public static Set getInstances() { } CategoryImpl(String name, String... keywords) { - this(name, new HashSet<>(Set.of(keywords))); + this(name, (Category) null); } - CategoryImpl(String name, Set keywords) { + CategoryImpl(String name, Category parent, String... keywords) { instances.add(this); this.name = name; - this.keywords = keywords.stream().map(String::toLowerCase).collect(Collectors.toSet()); + this.parent = parent; + this.keywords = Arrays.stream(keywords) + .map(String::toLowerCase) + .collect(Collectors.toUnmodifiableSet()); this.modules = new HashSet<>(); } @@ -37,6 +42,11 @@ public static Set getInstances() { return name; } + @Override + public Category parent() { + return parent; + } + public @NotNull Set keywords() { return keywords; } @@ -49,7 +59,7 @@ public void addModule(@NotNull Class module) { } @Override - public @Unmodifiable Set> modules() { + public @Unmodifiable @NotNull Set> modules() { return Collections.unmodifiableSet(modules); } From 9ab683374338792798032560e91b5f9c8e5d0106 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sat, 20 Sep 2025 15:42:22 +0200 Subject: [PATCH 16/23] update module registration code --- .../elements/CondScalesWithDifficulty.java | 1 + .../damagesource/elements/CondWasIndirect.java | 1 + .../damagesource/elements/ExprCausingEntity.java | 6 +++--- .../elements/ExprCreatedDamageSource.java | 5 +++-- .../damagesource/elements/ExprDamageLocation.java | 6 +++--- .../bukkit/damagesource/elements/ExprDamageType.java | 6 +++--- .../damagesource/elements/ExprDirectEntity.java | 6 +++--- .../damagesource/elements/ExprFoodExhaustion.java | 6 +++--- .../damagesource/elements/ExprSecDamageSource.java | 12 ++++-------- .../damagesource/elements/ExprSourceLocation.java | 6 +++--- 10 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java index e855e49dccd..23412f63a10 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondScalesWithDifficulty.java @@ -24,6 +24,7 @@ public class CondScalesWithDifficulty extends PropertyCondition im public static SyntaxInfo info() { return SyntaxInfo.builder(CondScalesWithDifficulty.class) + .priority(DEFAULT_PRIORITY) .supplier(CondScalesWithDifficulty::new) .addPatterns("%damagesources% ((does|do) scale|scales) damage with difficulty", "%damagesources% (do not|don't|does not|doesn't) scale damage with difficulty", diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java index a0de9806a91..a26cff2b502 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/CondWasIndirect.java @@ -29,6 +29,7 @@ public class CondWasIndirect extends PropertyCondition implements public static SyntaxInfo info() { return SyntaxInfo.builder(CondWasIndirect.class) + .priority(DEFAULT_PRIORITY) .supplier(CondWasIndirect::new) .addPatterns("%damagesources% (was|were) ([:in]directly caused|caused [:in]directly)", "%damagesources% (was not|wasn't|were not|weren't) ([:in]directly caused|caused [:in]directly)") diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java index 8e8695eaf69..bfefc552ffc 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java @@ -15,6 +15,7 @@ import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Causing Entity") @Description({ @@ -38,10 +39,9 @@ set the damage location to location(0, 0, 10) @RequiredPlugins("Minecraft 1.20.4+") public class ExprCausingEntity extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprCausingEntity.class, Entity.class) + public static SyntaxInfo.Expression info() { + return infoBuilder(ExprCausingEntity.class, Entity.class, "(causing|responsible) entity", "damagesources", false) .supplier(ExprCausingEntity::new) - .addPatterns(getDefaultPatterns("(causing|responsible) entity", "damagesources")) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java index d849edee931..d85b4346936 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java @@ -8,6 +8,7 @@ import org.bukkit.event.Event; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Created Damage Source") @Description("Get the created damage source being created/modified in a 'custom damage source' section.") @@ -19,8 +20,8 @@ @RequiredPlugins("Minecraft 1.20.4+") public class ExprCreatedDamageSource extends EventValueExpression implements EventRestrictedSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprCreatedDamageSource.class, DamageSource.class) + public static SyntaxInfo.Expression info() { + return SyntaxInfo.Expression.builder(ExprCreatedDamageSource.class, DamageSource.class) .supplier(ExprCreatedDamageSource::new) .addPatterns("created damage source") .build(); diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java index 6e03d995233..d597fd92fd8 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java @@ -15,6 +15,7 @@ import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Damage Location") @Description({ @@ -37,10 +38,9 @@ set the damage location to location(0, 0, 10) @RequiredPlugins("Minecraft 1.20.4+") public class ExprDamageLocation extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprDamageLocation.class, Location.class) + public static SyntaxInfo.Expression info() { + return infoBuilder(ExprDamageLocation.class, Location.class, "damage location", "damagesources", false) .supplier(ExprDamageLocation::new) - .addPatterns(getDefaultPatterns("damage location", "damagesources")) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java index ae1851fbcee..5cd0631a952 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java @@ -15,6 +15,7 @@ import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Damage Type") @Description({ @@ -37,10 +38,9 @@ set the damage location to location(0, 0, 10) @RequiredPlugins("Minecraft 1.20.4+") public class ExprDamageType extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprDamageType.class, DamageType.class) + public static SyntaxInfo.Expression info() { + return infoBuilder(ExprDamageType.class, DamageType.class, "damage type", "damagesources", false) .supplier(ExprDamageType::new) - .addPatterns(getDefaultPatterns("damage type", "damagesources")) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java index 914cb4a2421..efc41389a0d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java @@ -16,6 +16,7 @@ import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.bukkit.damagesource.elements.ExprSecDamageSource.DamageSourceSectionEvent; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Direct Entity") @Description({ @@ -39,10 +40,9 @@ set the damage location to location(0, 0, 10) @RequiredPlugins("Minecraft 1.20.4+") public class ExprDirectEntity extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprDirectEntity.class, Entity.class) + public static SyntaxInfo.Expression info() { + return infoBuilder(ExprDirectEntity.class, Entity.class, "direct entity", "damagesources", false) .supplier(ExprDirectEntity::new) - .addPatterns(getDefaultPatterns("direct entity", "damagesources")) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java index 3c4d9eed4ca..ab58511f7e7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Food Exhaustion") @Description("The amount of hunger exhaustion caused by a damage source.") @@ -17,10 +18,9 @@ @RequiredPlugins("Minecraft 1.20.4+") public class ExprFoodExhaustion extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprFoodExhaustion.class, Float.class) + public static SyntaxInfo.Expression info() { + return infoBuilder(ExprFoodExhaustion.class, Float.class, "food exhaustion", "damagesources", false) .supplier(ExprFoodExhaustion::new) - .addPatterns(getDefaultPatterns("food exhaustion", "damagesources")) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java index 70fa103630e..51d7051623b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSecDamageSource.java @@ -27,6 +27,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -81,20 +82,15 @@ public DamageSourceSectionEvent() {} } } + public static SyntaxInfo.Expression info() { + EventValues.registerEventValue(DamageSourceSectionEvent.class, DamageSource.class, DamageSourceSectionEvent::buildDamageSource); - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprSecDamageSource.class, DamageSource.class) + return SyntaxInfo.Expression.builder(ExprSecDamageSource.class, DamageSource.class) .supplier(ExprSecDamageSource::new) .addPatterns("[a] custom damage source [(with|using) [the|a] [damage type [of]] %-damagetype%]") .build(); } - static { - Skript.registerExpression(ExprSecDamageSource.class, DamageSource.class, ExpressionType.COMBINED, - "[a] custom damage source [(with|using) [the|a] [damage type [of]] %-damagetype%]"); - EventValues.registerEventValue(DamageSourceSectionEvent.class, DamageSource.class, DamageSourceSectionEvent::buildDamageSource); - } - private @Nullable Expression damageType; private Trigger trigger = null; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java index d00938019f2..3a7e6cf7a00 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.damagesource.DamageSourceExperimentSyntax; import org.skriptlang.skript.registration.DefaultSyntaxInfos; +import org.skriptlang.skript.registration.SyntaxInfo; @Name("Damage Source - Source Location") @Description({ @@ -23,10 +24,9 @@ @RequiredPlugins("Minecraft 1.20.4+") public class ExprSourceLocation extends SimplePropertyExpression implements DamageSourceExperimentSyntax { - public static DefaultSyntaxInfos.Expression info() { - return DefaultSyntaxInfos.Expression.builder(ExprSourceLocation.class, Location.class) + public static SyntaxInfo.Expression info() { + return infoBuilder(ExprSourceLocation.class, Location.class, "source location", "damagesources", false) .supplier(ExprSourceLocation::new) - .addPatterns(getDefaultPatterns("source location", "damagesources")) .build(); } From 62544552a157c9787ce7870d9452afbe07a917d3 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sat, 20 Sep 2025 15:44:59 +0200 Subject: [PATCH 17/23] requested changes part 1 --- .../ch/njol/skript/doc/Categorizable.java | 20 +++++++++++++++++++ .../java/ch/njol/skript/doc/CategoryImpl.java | 2 +- .../ch/njol/skript/doc/JSONGenerator.java | 4 ++-- .../skriptlang/skript/addon/AddonModule.java | 9 +++------ .../skript/registration/SyntaxOrigin.java | 6 +++--- 5 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 src/main/java/ch/njol/skript/doc/Categorizable.java diff --git a/src/main/java/ch/njol/skript/doc/Categorizable.java b/src/main/java/ch/njol/skript/doc/Categorizable.java new file mode 100644 index 00000000000..20d76feb422 --- /dev/null +++ b/src/main/java/ch/njol/skript/doc/Categorizable.java @@ -0,0 +1,20 @@ +package ch.njol.skript.doc; + +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * Represents anything that can be categorized. + */ +@FunctionalInterface +public interface Categorizable { + + /** + * Returns the documentation category which this module belongs to. + * + * @return The category of this module. + */ + @NotNull Set category(); + +} diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index 9eaa3b90bcf..5da677b8fdb 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -60,7 +60,7 @@ public void addModule(@NotNull Class module) { @Override public @Unmodifiable @NotNull Set> modules() { - return Collections.unmodifiableSet(modules); + return Set.copyOf(modules); } } diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index ea577ee81bf..2460544496e 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -28,7 +28,7 @@ import org.skriptlang.skript.registration.DefaultSyntaxInfos; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxOrigin; -import org.skriptlang.skript.registration.SyntaxOrigin.ElementOrigin; +import org.skriptlang.skript.registration.SyntaxOrigin.ModuleOrigin; import org.skriptlang.skript.registration.SyntaxRegistry; import java.io.File; @@ -486,7 +486,7 @@ private static JsonArray cleanPatterns(String... strings) { @Nullable Collection description, @Nullable Collection patterns ) { JsonArray categories = new JsonArray(); - if (origin instanceof ElementOrigin elementOrigin) { + if (origin instanceof ModuleOrigin elementOrigin) { for (Category category : Category.values()) { if (category.modules().contains(elementOrigin.module().getClass())) { categories.add(category.name()); diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 0a48072cd7d..ac80b4ce240 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -1,5 +1,6 @@ package org.skriptlang.skript.addon; +import ch.njol.skript.doc.Categorizable; import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -24,7 +25,7 @@ */ @FunctionalInterface @ApiStatus.Experimental -public interface AddonModule { +public interface AddonModule extends Categorizable { /** * Used for loading the components of this module that are needed first or by other modules (e.g. class infos). @@ -52,11 +53,7 @@ default boolean canLoad(SkriptAddon addon) { return true; } - /** - * Returns the documentation category which this module belongs to. - * - * @return The category of this module. - */ + @Override default @NotNull Set category() { return Set.of(); } diff --git a/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java b/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java index d5d2c70540e..5a901e00cd1 100644 --- a/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java +++ b/src/main/java/org/skriptlang/skript/registration/SyntaxOrigin.java @@ -61,19 +61,19 @@ public SkriptAddon addon() { */ @Contract("_, _ -> new") static SyntaxOrigin of(SkriptAddon addon, AddonModule module) { - return new ElementOrigin(addon, module); + return new ModuleOrigin(addon, module); } /** * An origin describing the addon and module a syntax has originated from. * @see SyntaxOrigin#of(SkriptAddon, AddonModule) */ - final class ElementOrigin implements SyntaxOrigin { + final class ModuleOrigin implements SyntaxOrigin { private final SkriptAddon addon; private final AddonModule module; - private ElementOrigin(SkriptAddon addon, AddonModule module) { + private ModuleOrigin(SkriptAddon addon, AddonModule module) { this.addon = addon.unmodifiableView(); this.module = module; } From 310880fae67a126f0b42a9711145fbbc896860a3 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sat, 20 Sep 2025 15:51:33 +0200 Subject: [PATCH 18/23] requested changes part 2 --- src/main/java/org/skriptlang/skript/addon/SkriptAddon.java | 1 - .../bukkit/damagesource/elements/ExprCreatedDamageSource.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java index 9b2c62afa77..e2937be0c42 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java @@ -3,7 +3,6 @@ import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; import org.skriptlang.skript.Skript; import org.skriptlang.skript.localization.Localizer; import org.skriptlang.skript.registration.SyntaxRegistry; diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java index d85b4346936..496b7ee7e5a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCreatedDamageSource.java @@ -21,9 +21,8 @@ public class ExprCreatedDamageSource extends EventValueExpression implements EventRestrictedSyntax { public static SyntaxInfo.Expression info() { - return SyntaxInfo.Expression.builder(ExprCreatedDamageSource.class, DamageSource.class) + return infoBuilder(ExprCreatedDamageSource.class, DamageSource.class, "created damage source") .supplier(ExprCreatedDamageSource::new) - .addPatterns("created damage source") .build(); } From ec002bde960ae28457c44406e6ecf0060e823ad0 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:17:07 +0200 Subject: [PATCH 19/23] set isDefault in infoBuilder to false --- .../java/ch/njol/skript/doc/CategoryImpl.java | 5 ++- .../ch/njol/skript/doc/JSONGenerator.java | 32 +++++++++++++++---- .../elements/ExprCausingEntity.java | 2 +- .../elements/ExprDamageLocation.java | 2 +- .../damagesource/elements/ExprDamageType.java | 2 +- .../elements/ExprDirectEntity.java | 2 +- .../elements/ExprFoodExhaustion.java | 2 +- .../elements/ExprSourceLocation.java | 2 +- 8 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/CategoryImpl.java b/src/main/java/ch/njol/skript/doc/CategoryImpl.java index 5da677b8fdb..892871ce4b4 100644 --- a/src/main/java/ch/njol/skript/doc/CategoryImpl.java +++ b/src/main/java/ch/njol/skript/doc/CategoryImpl.java @@ -6,7 +6,6 @@ import org.skriptlang.skript.addon.AddonModule; import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -19,12 +18,12 @@ final class CategoryImpl implements Category { private final Set keywords; private final Set> modules; - public static Set getInstances() { + static Set getInstances() { return instances; } CategoryImpl(String name, String... keywords) { - this(name, (Category) null); + this(name, null, keywords); } CategoryImpl(String name, Category parent, String... keywords) { diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index 2460544496e..bdba7e837ae 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -489,7 +489,7 @@ private static JsonArray cleanPatterns(String... strings) { if (origin instanceof ModuleOrigin elementOrigin) { for (Category category : Category.values()) { if (category.modules().contains(elementOrigin.module().getClass())) { - categories.add(category.name()); + categories.add(getCategory(category)); } } return categories; @@ -503,10 +503,10 @@ private static JsonArray cleanPatterns(String... strings) { if (description == null) description = List.of(); JsonArray second = getCategories(name + String.join("", description) + String.join("", patterns)); - if (second.isEmpty()) { - return null; + if (!second.isEmpty()) { + return second; } - return second; + return null; } /** @@ -517,14 +517,14 @@ private static JsonArray cleanPatterns(String... strings) { */ private static JsonArray getCategories(String input) { JsonArray options = new JsonArray(); - for (Category value : Category.values()) { - if (!(value instanceof CategoryImpl impl)) { + for (Category category : Category.values()) { + if (!(category instanceof CategoryImpl impl)) { break; } for (String keyword : impl.keywords()) { if (input.toLowerCase().contains(keyword)) { - options.add(value.name()); + options.add(getCategory(category)); break; } } @@ -533,6 +533,24 @@ private static JsonArray getCategories(String input) { return options; } + /** + * Transforms a category into a json object. + * @param category The category. + * @return The transformed category. + */ + private static JsonObject getCategory(@NotNull Category category) { + JsonObject object = new JsonObject(); + + object.addProperty("name", category.name()); + if (category.parent() != null) { + object.addProperty("parent", category.parent().name()); + } else { + object.add("parent", null); + } + + return object; + } + /** * Gets the json object representing the addon. * diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java index bfefc552ffc..69614484094 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprCausingEntity.java @@ -40,7 +40,7 @@ set the damage location to location(0, 0, 10) public class ExprCausingEntity extends SimplePropertyExpression implements DamageSourceExperimentSyntax { public static SyntaxInfo.Expression info() { - return infoBuilder(ExprCausingEntity.class, Entity.class, "(causing|responsible) entity", "damagesources", false) + return infoBuilder(ExprCausingEntity.class, Entity.class, "(causing|responsible) entity", "damagesources", true) .supplier(ExprCausingEntity::new) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java index d597fd92fd8..3e7c01914aa 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageLocation.java @@ -39,7 +39,7 @@ set the damage location to location(0, 0, 10) public class ExprDamageLocation extends SimplePropertyExpression implements DamageSourceExperimentSyntax { public static SyntaxInfo.Expression info() { - return infoBuilder(ExprDamageLocation.class, Location.class, "damage location", "damagesources", false) + return infoBuilder(ExprDamageLocation.class, Location.class, "damage location", "damagesources", true) .supplier(ExprDamageLocation::new) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java index 5cd0631a952..f8ab8ba69e3 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDamageType.java @@ -39,7 +39,7 @@ set the damage location to location(0, 0, 10) public class ExprDamageType extends SimplePropertyExpression implements DamageSourceExperimentSyntax { public static SyntaxInfo.Expression info() { - return infoBuilder(ExprDamageType.class, DamageType.class, "damage type", "damagesources", false) + return infoBuilder(ExprDamageType.class, DamageType.class, "damage type", "damagesources", true) .supplier(ExprDamageType::new) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java index efc41389a0d..5f413b19e40 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprDirectEntity.java @@ -41,7 +41,7 @@ set the damage location to location(0, 0, 10) public class ExprDirectEntity extends SimplePropertyExpression implements DamageSourceExperimentSyntax { public static SyntaxInfo.Expression info() { - return infoBuilder(ExprDirectEntity.class, Entity.class, "direct entity", "damagesources", false) + return infoBuilder(ExprDirectEntity.class, Entity.class, "direct entity", "damagesources", true) .supplier(ExprDirectEntity::new) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java index ab58511f7e7..243725cacf1 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprFoodExhaustion.java @@ -19,7 +19,7 @@ public class ExprFoodExhaustion extends SimplePropertyExpression implements DamageSourceExperimentSyntax { public static SyntaxInfo.Expression info() { - return infoBuilder(ExprFoodExhaustion.class, Float.class, "food exhaustion", "damagesources", false) + return infoBuilder(ExprFoodExhaustion.class, Float.class, "food exhaustion", "damagesources", true) .supplier(ExprFoodExhaustion::new) .build(); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java index 3a7e6cf7a00..752cb20e4e0 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/elements/ExprSourceLocation.java @@ -25,7 +25,7 @@ public class ExprSourceLocation extends SimplePropertyExpression implements DamageSourceExperimentSyntax { public static SyntaxInfo.Expression info() { - return infoBuilder(ExprSourceLocation.class, Location.class, "source location", "damagesources", false) + return infoBuilder(ExprSourceLocation.class, Location.class, "source location", "damagesources", true) .supplier(ExprSourceLocation::new) .build(); } From 35cf06b71ff4c660587edaf7d00aaccdd93ea72d Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sun, 21 Sep 2025 02:25:00 +0200 Subject: [PATCH 20/23] move DamageSourceModule to implement Categorizable instead of AddonModule --- src/main/java/ch/njol/skript/doc/Categorizable.java | 6 +++--- .../org/skriptlang/skript/addon/AddonModule.java | 13 +------------ .../org/skriptlang/skript/addon/SkriptAddon.java | 9 ++++++--- .../bukkit/damagesource/DamageSourceModule.java | 6 +++--- 4 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Categorizable.java b/src/main/java/ch/njol/skript/doc/Categorizable.java index 20d76feb422..c5aa0e8f5aa 100644 --- a/src/main/java/ch/njol/skript/doc/Categorizable.java +++ b/src/main/java/ch/njol/skript/doc/Categorizable.java @@ -11,10 +11,10 @@ public interface Categorizable { /** - * Returns the documentation category which this module belongs to. + * Returns the documentation categories which this module belongs to. * - * @return The category of this module. + * @return The categories of this module. */ - @NotNull Set category(); + @NotNull Set categories(); } diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index ac80b4ce240..596fa08b983 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -1,17 +1,11 @@ package org.skriptlang.skript.addon; -import ch.njol.skript.doc.Categorizable; -import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.Skript; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxOrigin; import org.skriptlang.skript.registration.SyntaxRegistry.Key; -import java.util.Set; - /** * A module is a component of a {@link SkriptAddon} used for registering syntax and other {@link Skript} components. *
@@ -25,7 +19,7 @@ */ @FunctionalInterface @ApiStatus.Experimental -public interface AddonModule extends Categorizable { +public interface AddonModule { /** * Used for loading the components of this module that are needed first or by other modules (e.g. class infos). @@ -53,11 +47,6 @@ default boolean canLoad(SkriptAddon addon) { return true; } - @Override - default @NotNull Set category() { - return Set.of(); - } - /** * Registers syntax such that it belongs to the current module. * diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java index e2937be0c42..d2a0d4ee540 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java @@ -1,5 +1,6 @@ package org.skriptlang.skript.addon; +import ch.njol.skript.doc.Categorizable; import ch.njol.skript.doc.Category; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; @@ -103,9 +104,11 @@ default void loadModules(AddonModule... modules) { for (AddonModule module : filtered) { module.load(this); - Set categories = module.category(); - for (Category category : categories) { - category.addModule(module.getClass()); + if (module instanceof Categorizable categorizable) { + Set categories = categorizable.categories(); + for (Category category : categories) { + category.addModule(module.getClass()); + } } } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index ec1d12e12ce..63e5a5c4419 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -3,6 +3,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.classes.ClassInfo; import ch.njol.skript.classes.registry.RegistryClassInfo; +import ch.njol.skript.doc.Categorizable; import ch.njol.skript.doc.Category; import ch.njol.skript.expressions.base.EventValueExpression; import ch.njol.skript.registrations.Classes; @@ -13,7 +14,6 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.damagesource.elements.*; @@ -21,7 +21,7 @@ import java.util.Set; -public class DamageSourceModule implements AddonModule { +public class DamageSourceModule implements AddonModule, Categorizable { @Override public boolean canLoad(SkriptAddon addon) { @@ -70,7 +70,7 @@ public void load(SkriptAddon addon) { } @Override - public @NotNull Set category() { + public @NotNull Set categories() { return Set.of(Category.DAMAGE_SOURCES); } From efe75367aaa12240431679ebcd230f08ca07235b Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sun, 21 Sep 2025 15:37:37 +0200 Subject: [PATCH 21/23] requested changes --- .../ch/njol/skript/doc/Categorizable.java | 4 +-- .../ch/njol/skript/doc/JSONGenerator.java | 19 ++++++++------ .../skriptlang/skript/addon/AddonModule.java | 25 +++++++++++++++---- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Categorizable.java b/src/main/java/ch/njol/skript/doc/Categorizable.java index c5aa0e8f5aa..7feae37008a 100644 --- a/src/main/java/ch/njol/skript/doc/Categorizable.java +++ b/src/main/java/ch/njol/skript/doc/Categorizable.java @@ -11,9 +11,9 @@ public interface Categorizable { /** - * Returns the documentation categories which this module belongs to. + * Returns the documentation categories which this object belongs to. * - * @return The categories of this module. + * @return The categories of this object. */ @NotNull Set categories(); diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index bdba7e837ae..0d80a6db404 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys; import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; @@ -487,9 +488,10 @@ private static JsonArray cleanPatterns(String... strings) { ) { JsonArray categories = new JsonArray(); if (origin instanceof ModuleOrigin elementOrigin) { + Class moduleClass = elementOrigin.module().getClass(); for (Category category : Category.values()) { - if (category.modules().contains(elementOrigin.module().getClass())) { - categories.add(getCategory(category)); + if (category.modules().contains(moduleClass)) { + categories.add(getCategoryJson(category)); } } return categories; @@ -510,12 +512,13 @@ private static JsonArray cleanPatterns(String... strings) { } /** - * Attempts to find a category based on the input. + * Attempts to find the categories based on the input. * * @param input The input. - * @return A category, or null if none is found. + * @return The categories, or null if no are found. */ - private static JsonArray getCategories(String input) { + private static @NotNull JsonArray getCategories(@NotNull String input) { + String lower = input.toLowerCase(); JsonArray options = new JsonArray(); for (Category category : Category.values()) { if (!(category instanceof CategoryImpl impl)) { @@ -523,8 +526,8 @@ private static JsonArray getCategories(String input) { } for (String keyword : impl.keywords()) { - if (input.toLowerCase().contains(keyword)) { - options.add(getCategory(category)); + if (lower.contains(keyword)) { + options.add(getCategoryJson(category)); break; } } @@ -538,7 +541,7 @@ private static JsonArray getCategories(String input) { * @param category The category. * @return The transformed category. */ - private static JsonObject getCategory(@NotNull Category category) { + private static JsonObject getCategoryJson(@NotNull Category category) { JsonObject object = new JsonObject(); object.addProperty("name", category.name()); diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index 596fa08b983..f084cc77f17 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -4,6 +4,7 @@ import org.skriptlang.skript.Skript; import org.skriptlang.skript.registration.SyntaxInfo; import org.skriptlang.skript.registration.SyntaxOrigin; +import org.skriptlang.skript.registration.SyntaxRegistry; import org.skriptlang.skript.registration.SyntaxRegistry.Key; /** @@ -56,10 +57,7 @@ default boolean canLoad(SkriptAddon addon) { * @param The type of syntax. */ default > void register(SkriptAddon addon, Key registry, I cls) { - //noinspection unchecked - addon.syntaxRegistry().register(registry, (I) cls.toBuilder() - .origin(SyntaxOrigin.of(addon, this)) - .build()); + register(addon, addon.syntaxRegistry(), registry, cls); } /** @@ -72,9 +70,26 @@ default > void register(SkriptAddon addon, Key regist */ @SuppressWarnings("unchecked") default > void register(SkriptAddon addon, Key registry, I... classes) { + SyntaxRegistry syntaxRegistry = addon.syntaxRegistry(); for (I cls : classes) { - register(addon, registry, cls); + register(addon, syntaxRegistry, registry, cls); } } + /** + * Registers syntax such that it belongs to the current module. + * + * @param addon The addon this module belongs to. + * @param syntaxRegistry The syntax registry. + * @param registry The registry to add this syntax to. + * @param cls The syntax info. + * @param The type of syntax. + */ + default > void register(SkriptAddon addon, SyntaxRegistry syntaxRegistry, Key registry, I cls) { + //noinspection unchecked + syntaxRegistry.register(registry, (I) cls.toBuilder() + .origin(SyntaxOrigin.of(addon, this)) + .build()); + } + } From 03a7f866c9475de47569d85de6b643a6e7c601f8 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sun, 21 Sep 2025 22:40:45 +0200 Subject: [PATCH 22/23] Update src/main/java/ch/njol/skript/doc/JSONGenerator.java Co-authored-by: sovdee <10354869+sovdeeth@users.noreply.github.com> --- src/main/java/ch/njol/skript/doc/JSONGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/doc/JSONGenerator.java b/src/main/java/ch/njol/skript/doc/JSONGenerator.java index 0d80a6db404..6d1907c093b 100644 --- a/src/main/java/ch/njol/skript/doc/JSONGenerator.java +++ b/src/main/java/ch/njol/skript/doc/JSONGenerator.java @@ -515,7 +515,7 @@ private static JsonArray cleanPatterns(String... strings) { * Attempts to find the categories based on the input. * * @param input The input. - * @return The categories, or null if no are found. + * @return The categories, or null if none are found. */ private static @NotNull JsonArray getCategories(@NotNull String input) { String lower = input.toLowerCase(); From 7023f3a01501b745bf709d510910e033d4f47a44 Mon Sep 17 00:00:00 2001 From: Efnilite <35348263+Efnilite@users.noreply.github.com> Date: Sun, 28 Sep 2025 20:20:16 +0200 Subject: [PATCH 23/23] minor changes to annotations --- src/main/java/ch/njol/skript/doc/Categorizable.java | 3 ++- src/main/java/org/skriptlang/skript/addon/AddonModule.java | 3 +++ .../skript/bukkit/damagesource/DamageSourceModule.java | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/doc/Categorizable.java b/src/main/java/ch/njol/skript/doc/Categorizable.java index 7feae37008a..ea42e427f44 100644 --- a/src/main/java/ch/njol/skript/doc/Categorizable.java +++ b/src/main/java/ch/njol/skript/doc/Categorizable.java @@ -1,6 +1,7 @@ package ch.njol.skript.doc; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; import java.util.Set; @@ -15,6 +16,6 @@ public interface Categorizable { * * @return The categories of this object. */ - @NotNull Set categories(); + @Unmodifiable @NotNull Set categories(); } diff --git a/src/main/java/org/skriptlang/skript/addon/AddonModule.java b/src/main/java/org/skriptlang/skript/addon/AddonModule.java index f084cc77f17..c7723821d27 100644 --- a/src/main/java/org/skriptlang/skript/addon/AddonModule.java +++ b/src/main/java/org/skriptlang/skript/addon/AddonModule.java @@ -56,6 +56,7 @@ default boolean canLoad(SkriptAddon addon) { * @param cls The syntax info. * @param The type of syntax. */ + @ApiStatus.Experimental default > void register(SkriptAddon addon, Key registry, I cls) { register(addon, addon.syntaxRegistry(), registry, cls); } @@ -68,6 +69,7 @@ default > void register(SkriptAddon addon, Key regist * @param classes The syntax infos. * @param The type of syntax. */ + @ApiStatus.Experimental @SuppressWarnings("unchecked") default > void register(SkriptAddon addon, Key registry, I... classes) { SyntaxRegistry syntaxRegistry = addon.syntaxRegistry(); @@ -85,6 +87,7 @@ default > void register(SkriptAddon addon, Key regist * @param cls The syntax info. * @param The type of syntax. */ + @ApiStatus.Experimental default > void register(SkriptAddon addon, SyntaxRegistry syntaxRegistry, Key registry, I cls) { //noinspection unchecked syntaxRegistry.register(registry, (I) cls.toBuilder() diff --git a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java index 63e5a5c4419..cd8b2f37580 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java @@ -14,6 +14,7 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.addon.AddonModule; import org.skriptlang.skript.addon.SkriptAddon; import org.skriptlang.skript.bukkit.damagesource.elements.*; @@ -70,7 +71,7 @@ public void load(SkriptAddon addon) { } @Override - public @NotNull Set categories() { + public @Unmodifiable @NotNull Set categories() { return Set.of(Category.DAMAGE_SOURCES); }