diff --git a/src/main/java/io/github/syst3ms/skriptparser/Skript.java b/src/main/java/io/github/syst3ms/skriptparser/Skript.java index c43447260..f0ed8a2fa 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/Skript.java +++ b/src/main/java/io/github/syst3ms/skriptparser/Skript.java @@ -8,6 +8,7 @@ import io.github.syst3ms.skriptparser.structures.functions.StructFunction; import org.jetbrains.annotations.Nullable; +import java.util.Comparator; import java.util.List; /** @@ -30,7 +31,7 @@ public void finishedLoading(@Nullable String scriptName) { } else { triggers = TriggerMap.getTriggersByScript(scriptName).values().stream().flatMap(List::stream).toList(); } - triggers.forEach(trigger -> { + triggers.stream().sorted(Comparator.comparing(trigger -> trigger.getEvent().getLoadingPriority())).forEach(trigger -> { if (trigger.getEvent() instanceof StartOnLoadEvent event) { event.onInitialLoad(trigger); } else if (trigger.getEvent() instanceof StructFunction func) { diff --git a/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java b/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java index d18d3a754..143e3eed5 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java +++ b/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java @@ -6,13 +6,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; /** * A map that holds triggers based on a script and {@link TriggerContext}. */ public class TriggerMap { - private static final Map, List>> TRIGGERS = new HashMap<>(); + private static final Map, List>> TRIGGERS = new TreeMap<>(); /** * Add a trigger to the map. diff --git a/src/main/java/io/github/syst3ms/skriptparser/lang/properties/PropertyExpression.java b/src/main/java/io/github/syst3ms/skriptparser/lang/properties/PropertyExpression.java index 596679838..59f0dbc85 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/lang/properties/PropertyExpression.java +++ b/src/main/java/io/github/syst3ms/skriptparser/lang/properties/PropertyExpression.java @@ -7,6 +7,8 @@ import io.github.syst3ms.skriptparser.registration.SyntaxManager; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Array; +import java.util.List; import java.util.Objects; /** @@ -58,7 +60,8 @@ public boolean init(Expression[] expressions, int matchedPattern, ParseContex @SuppressWarnings("unchecked") @Override public T[] getValues(TriggerContext ctx) { - return (T[]) owner.stream(ctx).map(this::getProperty).filter(Objects::nonNull).toArray(Object[]::new); + List list = this.owner.stream(ctx).map( this::getProperty).filter(Objects::nonNull).toList(); + return list.toArray((T[]) Array.newInstance(getReturnType(), list.size())); } /** diff --git a/src/main/java/io/github/syst3ms/skriptparser/registration/DefaultRegistration.java b/src/main/java/io/github/syst3ms/skriptparser/registration/DefaultRegistration.java index 7913746eb..c79749af8 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/registration/DefaultRegistration.java +++ b/src/main/java/io/github/syst3ms/skriptparser/registration/DefaultRegistration.java @@ -129,6 +129,7 @@ public Float deserialize(Gson gson, JsonElement element) { return gson.fromJson(element, Float.class); } }) + .toStringFunction(f -> String.format("%.2f", f)) .register(); registration.newType(Double.class, "double", "double@s") @@ -174,6 +175,7 @@ public Double deserialize(Gson gson, JsonElement element) { return gson.fromJson(element, Double.class); } }) + .toStringFunction(d -> String.format("%.2f", d)) .register(); registration.newType(Number.class, "number", "number@s") @@ -221,6 +223,13 @@ public Number deserialize(Gson gson, JsonElement element) { return gson.fromJson(element, Double.class); } }) + .toStringFunction(n -> { + if (n instanceof Integer || n instanceof Long) { + return n.toString(); + } else { + return String.format("%.2f", n.doubleValue()); + } + }) .register(); registration.newType(String.class, "string", "string@s") diff --git a/src/main/java/io/github/syst3ms/skriptparser/structures/functions/Functions.java b/src/main/java/io/github/syst3ms/skriptparser/structures/functions/Functions.java index e2cf11e01..7e6b2b455 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/structures/functions/Functions.java +++ b/src/main/java/io/github/syst3ms/skriptparser/structures/functions/Functions.java @@ -16,7 +16,7 @@ public class Functions { private static final Map>> functionsMap = new HashMap<>(); - private static final String GLOBAL_FUNCTIONS_NAME = "global_functions_dont_change"; + private static final String JAVA_FUNCTION_NAME = "java_functions_dont_change"; static final String FUNCTION_NAME_REGEX = "^[a-zA-Z0-9_]*"; private static final Pattern FUNCTION_NAME_PATTERN = Pattern.compile(FUNCTION_NAME_REGEX); static final String FUNCTION_CALL_PATTERN = "<(" + Functions.FUNCTION_NAME_REGEX + ")\\((.*)\\)>"; @@ -28,8 +28,12 @@ public static List> getFunctions(String scriptName) { return functionsMap.getOrDefault(scriptName, List.of()); } - public static List> getGlobalFunctions() { - return functionsMap.getOrDefault(GLOBAL_FUNCTIONS_NAME, List.of()); + public static List> getAllFunctions() { + return functionsMap.values().stream().flatMap(List::stream).toList(); + } + + public static List> getJavaFunctions() { + return functionsMap.getOrDefault(JAVA_FUNCTION_NAME, List.of()); } static void preRegisterFunction(ScriptFunction function) { @@ -53,7 +57,7 @@ public static void removeFunctions(String scriptName) { } public static void registerFunction(JavaFunction function) { - functionsMap.computeIfAbsent(GLOBAL_FUNCTIONS_NAME, k -> new ArrayList<>()).add(function); + functionsMap.computeIfAbsent(JAVA_FUNCTION_NAME, k -> new ArrayList<>()).add(function); } public static boolean isValidFunction(ScriptFunction function, SkriptLogger logger) { @@ -90,16 +94,17 @@ public static boolean isValidFunction(ScriptFunction function, SkriptLogger l } public static Optional> getFunctionByName(String name, String scriptName) { - // Find a global function - for (Function function : functionsMap.computeIfAbsent(GLOBAL_FUNCTIONS_NAME, k -> new ArrayList<>())) { + // Find a JavaFunction + for (Function function : functionsMap.computeIfAbsent(JAVA_FUNCTION_NAME, k -> new ArrayList<>())) { if (function.getName().equals(name)) { return Optional.of(function); } } + // Find a function in a script file if (scriptName.endsWith(".sk")) scriptName = scriptName.substring(0, scriptName.length() - 3); - for (Function registeredFunction : functionsMap.computeIfAbsent(scriptName, k -> new ArrayList<>())) { + for (Function registeredFunction : getAllFunctions()) { if (!registeredFunction.getName().equals(name)) continue; // we don't care then!!!! goodbye continue to the next one if (registeredFunction instanceof ScriptFunction registeredScriptFunction diff --git a/src/main/java/io/github/syst3ms/skriptparser/types/conversions/Converters.java b/src/main/java/io/github/syst3ms/skriptparser/types/conversions/Converters.java index 005443f81..b528868bb 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/types/conversions/Converters.java +++ b/src/main/java/io/github/syst3ms/skriptparser/types/conversions/Converters.java @@ -302,7 +302,7 @@ public static T[] convertUnsafe(F[] from, Class to, Function T[] convert(F[] from, Class to, Function> converter) { - @SuppressWarnings("unchecked") + if (from == null) return (T[])Array.newInstance(to, 0); var ts = (T[]) Array.newInstance(to, from.length); var j = 0; for (var f : from) { @@ -314,4 +314,4 @@ public static T[] convert(F[] from, Class to, Function