diff --git a/api/pom.xml b/api/pom.xml
index f6a16be3..c25e8e4d 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -5,12 +5,12 @@
4.0.0
ultimate-spell-system-api
- 2.6.1-SNAPSHOT
+ 3.0.0-SNAPSHOT
fr.jamailun.paper
ultimate-spell-system
- 2.6.1-SNAPSHOT
+ 3.0.0-SNAPSHOT
@@ -22,8 +22,8 @@
fr.jamailun.paper
- 2.6.1-SNAPSHOT
- ultimate-spell-system-dsl
+ 3.0.0-SNAPSHOT
+ ultimate-spell-system-dsl2
compile
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/ItemBinder.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/ItemBinder.java
index 994d7caf..40f792b7 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/ItemBinder.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/ItemBinder.java
@@ -1,7 +1,7 @@
package fr.jamailun.ultimatespellsystem.api.bind;
import fr.jamailun.ultimatespellsystem.api.spells.Spell;
-import fr.jamailun.ultimatespellsystem.dsl.nodes.type.Duration;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.type.Duration;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/SpellBindData.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/SpellBindData.java
index 759c8d91..59855b05 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/SpellBindData.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/bind/SpellBindData.java
@@ -1,7 +1,7 @@
package fr.jamailun.ultimatespellsystem.api.bind;
import fr.jamailun.ultimatespellsystem.api.spells.Spell;
-import fr.jamailun.ultimatespellsystem.dsl.nodes.type.Duration;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.type.Duration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CallbackAction.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CallbackAction.java
index fa6dec38..db149fa7 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CallbackAction.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CallbackAction.java
@@ -2,7 +2,7 @@
import fr.jamailun.ultimatespellsystem.api.runner.RuntimeStatement;
import fr.jamailun.ultimatespellsystem.api.runner.SpellRuntime;
-import fr.jamailun.ultimatespellsystem.dsl.objects.CallbackEvent;
+import fr.jamailun.ultimatespellsystem.dsl2.callbacks.CallbackEvent;
import lombok.Getter;
import org.bukkit.event.Event;
import org.jetbrains.annotations.NotNull;
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CustomEntity.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CustomEntity.java
index 741e9538..be7292df 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CustomEntity.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/CustomEntity.java
@@ -117,4 +117,15 @@ public void remove() {
public @NotNull PersistentDataContainer getNBT() {
return transientDataContainer;
}
+
+ @Override
+ public Optional getEntityAs(Class clazz) {
+ return getBukkitEntity().map(e -> {
+ try {
+ return clazz.cast(e);
+ } catch(Exception ex) {
+ return null;
+ }
+ });
+ }
}
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SpellEntity.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SpellEntity.java
index 1932af97..708369f2 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SpellEntity.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SpellEntity.java
@@ -22,6 +22,7 @@ public interface SpellEntity {
* Get the UUID of the entity.
* @return a non-null, unique UUID.
*/
+ @Contract(pure = true)
@NotNull UUID getUniqueId();
/**
@@ -31,10 +32,21 @@ public interface SpellEntity {
@Contract(pure = true)
@NotNull Optional getBukkitEntity();
+ /**
+ * Get the entity as a specific bukkit class.
+ * @param clazz the class to cast the bukkit entity to.
+ * @return an empty optional if the entity is not bukkit-based, or if the instance cannot be
+ * cast to the parameter.
+ * @param the output requested type.
+ */
+ @Contract(pure = true)
+ Optional getEntityAs(Class clazz);
+
/**
* Test if the current entity has a bukkit representation.
* @return true if a call to {@link #getBukkitEntity()} returns something.
*/
+ @Contract(pure = true)
default boolean isBukkit() {
return getBukkitEntity().isPresent();
}
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SummonAttributes.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SummonAttributes.java
index 92f7e046..5541214e 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SummonAttributes.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/entities/SummonAttributes.java
@@ -2,7 +2,7 @@
import fr.jamailun.ultimatespellsystem.api.runner.SpellRuntime;
import fr.jamailun.ultimatespellsystem.api.utils.AttributesHolder;
-import fr.jamailun.ultimatespellsystem.dsl.nodes.type.Duration;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.type.Duration;
import org.bukkit.Location;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/CallbackEventProvider.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/CallbackEventProvider.java
index 425d57d8..2025a4fa 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/CallbackEventProvider.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/CallbackEventProvider.java
@@ -1,8 +1,8 @@
package fr.jamailun.ultimatespellsystem.api.providers;
import fr.jamailun.ultimatespellsystem.api.entities.CallbackAction;
-import fr.jamailun.ultimatespellsystem.dsl.objects.CallbackEvent;
-import fr.jamailun.ultimatespellsystem.dsl.registries.CallbackEventRegistry;
+import fr.jamailun.ultimatespellsystem.dsl2.callbacks.CallbackEvent;
+import fr.jamailun.ultimatespellsystem.dsl2.registries.CallbackEventRegistry;
import org.jetbrains.annotations.NotNull;
import java.util.Optional;
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/EntityTypeProvider.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/EntityTypeProvider.java
index 29b17afb..de7357d2 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/EntityTypeProvider.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/EntityTypeProvider.java
@@ -1,7 +1,7 @@
package fr.jamailun.ultimatespellsystem.api.providers;
import fr.jamailun.ultimatespellsystem.api.entities.UssEntityType;
-import fr.jamailun.ultimatespellsystem.dsl.registries.EntityTypeRegistry;
+import fr.jamailun.ultimatespellsystem.dsl2.registries.EntityTypeRegistry;
import org.jetbrains.annotations.NotNull;
/**
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/JavaFunctionProvider.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/JavaFunctionProvider.java
index 9f039e93..2df10919 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/JavaFunctionProvider.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/providers/JavaFunctionProvider.java
@@ -1,7 +1,7 @@
package fr.jamailun.ultimatespellsystem.api.providers;
import fr.jamailun.ultimatespellsystem.api.runner.functions.RunnableJavaFunction;
-import fr.jamailun.ultimatespellsystem.dsl.registries.FunctionDefinitionsRegistry;
+import fr.jamailun.ultimatespellsystem.dsl2.registries.FunctionDefinitionsRegistry;
import org.jetbrains.annotations.NotNull;
/**
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/FunctionsSet.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/FunctionsSet.java
new file mode 100644
index 00000000..c6cb4bbb
--- /dev/null
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/FunctionsSet.java
@@ -0,0 +1,35 @@
+package fr.jamailun.ultimatespellsystem.api.runner;
+
+import fr.jamailun.ultimatespellsystem.api.runner.functions.GlobalFunction;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.expressions.functions.FunctionSignature;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * A set of functions.
+ */
+public interface FunctionsSet {
+
+ /**
+ * Get a function.
+ * @param signature the function signature key.
+ * @return the content of the variable, or {@code null} if not defined.
+ */
+ @Nullable GlobalFunction get(@NotNull FunctionSignature signature);
+
+ /**
+ * Create an inherited functions set.
+ * @return a new instance. Mutating existing vars of the instance will mutate {@code this} instance.
+ * But adding new functions will not.
+ */
+ @Contract(" -> new")
+ @NotNull FunctionsSet inherit();
+
+ /**
+ * Register a new function.
+ * @param function the function to register.
+ */
+ void register(@NotNull GlobalFunction function);
+
+}
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/SpellRuntime.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/SpellRuntime.java
index ccd64235..1659fd99 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/SpellRuntime.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/SpellRuntime.java
@@ -1,6 +1,7 @@
package fr.jamailun.ultimatespellsystem.api.runner;
import fr.jamailun.ultimatespellsystem.api.entities.SpellEntity;
+import fr.jamailun.ultimatespellsystem.api.runner.structs.Struct;
import fr.jamailun.ultimatespellsystem.api.spells.Spell;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
@@ -32,16 +33,16 @@ public interface SpellRuntime {
@NotNull VariablesSet variables();
/**
- * Test if the runtime has been stopped.
- * @return true if no more statements should be executed.
+ * A reference to the functions set.
+ * @return the final reference to the functions.
*/
- boolean isStopped();
+ @NotNull FunctionsSet functions();
/**
- * Stop the current execution.
- * @param exitCode the exit code to use.
+ * Test if the runtime has been stopped.
+ * @return true if no more statements should be executed.
*/
- void stop(int exitCode);
+ boolean isStopped();
/**
* Break the flow.
@@ -58,6 +59,12 @@ public interface SpellRuntime {
*/
void acceptContinue();
+ /**
+ * Handle a return statement.
+ * @param value output-ed value.
+ */
+ void statementReturn(@Nullable Object value);
+
/**
* Get the state of the control flow.
* @return a state.
@@ -69,7 +76,17 @@ public interface SpellRuntime {
* @return a new instance of a runtime, with the same context.
*/
@Contract(" -> new")
- @NotNull SpellRuntime makeChild();
+ default @NotNull SpellRuntime makeChild() {
+ return makeChild(false);
+ }
+
+ /**
+ * Create a child of this runtime.
+ * @param function if {@code true}, the child runtime will be a function.
+ * @return a new instance of a runtime, with the same context.
+ */
+ @Contract("_ -> new")
+ @NotNull SpellRuntime makeChild(boolean function);
/**
* Create a child instance of this runtime, but with a different caster.
@@ -80,11 +97,26 @@ public interface SpellRuntime {
@NotNull SpellRuntime makeChildNewCaster(@NotNull SpellEntity newCaster);
/**
- * Get the final exit code.
- * @return {@code zero} if it's a success (or not stopped). Any other value means an error occurred.
+ * Get the structure out of a value.
+ * @param structDefinitionName name of the structure of the type.
+ * @param value the value to wrap.
+ * @return {@code null} if cannot match.
+ */
+ @Contract("_,null->null;_,!null->!null")
+ @Nullable Struct getStructOf(@NotNull String structDefinitionName, @Nullable Object value);
+
+ /**
+ * Get the returned value.
+ * @return something.
* @see #isStopped()
*/
- int getFinalExitCode();
+ @Nullable Object getReturnedValue();
+
+ /**
+ * Test if the returned value is considered as a success.
+ * @return true if return value is {@code null}, or {@code 0}, or {@code true}.
+ */
+ boolean isReturnValueSuccess();
/**
* Evaluate a value.
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/GlobalFunction.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/GlobalFunction.java
new file mode 100644
index 00000000..f66ca413
--- /dev/null
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/GlobalFunction.java
@@ -0,0 +1,32 @@
+package fr.jamailun.ultimatespellsystem.api.runner.functions;
+
+import fr.jamailun.ultimatespellsystem.api.runner.RuntimeExpression;
+import fr.jamailun.ultimatespellsystem.api.runner.SpellRuntime;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.expressions.functions.FunctionSignature;
+import fr.jamailun.ultimatespellsystem.dsl2.tokenization.TokenPosition;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * A global function. Either from the Java code, or from the USS script.
+ */
+public interface GlobalFunction {
+
+ /**
+ * Get the signature of the function.
+ * @return the instance function signature.
+ */
+ @NotNull FunctionSignature getSignature();
+
+ /**
+ * Call the function with parameters.
+ * @param pos token position.
+ * @param arguments params of the function.
+ * @param runtime spell runtime.
+ * @return the output value.
+ */
+ @Nullable Object call(@NotNull TokenPosition pos, @NotNull List arguments, @NotNull SpellRuntime runtime);
+
+}
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/RunnableJavaFunction.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/RunnableJavaFunction.java
index 38a2a9d7..ed3eaa3b 100644
--- a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/RunnableJavaFunction.java
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/functions/RunnableJavaFunction.java
@@ -2,12 +2,15 @@
import fr.jamailun.ultimatespellsystem.api.runner.RuntimeExpression;
import fr.jamailun.ultimatespellsystem.api.runner.SpellRuntime;
-import fr.jamailun.ultimatespellsystem.dsl.nodes.expressions.functions.FunctionArgument;
-import fr.jamailun.ultimatespellsystem.dsl.nodes.expressions.functions.FunctionDefinition;
-import fr.jamailun.ultimatespellsystem.dsl.nodes.type.Type;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.expressions.functions.FunctionArgument;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.expressions.functions.FunctionDefinition;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.expressions.functions.FunctionSignature;
+import fr.jamailun.ultimatespellsystem.dsl2.nodes.type.Type;
+import fr.jamailun.ultimatespellsystem.dsl2.tokenization.TokenPosition;
import lombok.Getter;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -15,7 +18,7 @@
* A runnable code declaration
*/
@Getter
-public abstract class RunnableJavaFunction {
+public abstract class RunnableJavaFunction implements GlobalFunction {
private final @NotNull String id;
private final @NotNull Type type;
@@ -34,6 +37,16 @@ public RunnableJavaFunction(@NotNull String id, @NotNull Type type, @NotNull Lis
this.arguments = arguments;
}
+ @Override
+ public @NotNull FunctionSignature getSignature() {
+ return FunctionSignature.of(id, arguments);
+ }
+
+ @Override
+ public @Nullable Object call(@NotNull TokenPosition pos, @NotNull List arguments, @NotNull SpellRuntime runtime) {
+ return compute(arguments, runtime);
+ }
+
/**
* Compute the value, using the arguments.
* @param arguments the arguments values returned. Must be computed in the runtime.
diff --git a/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/structs/Struct.java b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/structs/Struct.java
new file mode 100644
index 00000000..473db0b8
--- /dev/null
+++ b/api/src/main/java/fr/jamailun/ultimatespellsystem/api/runner/structs/Struct.java
@@ -0,0 +1,39 @@
+package fr.jamailun.ultimatespellsystem.api.runner.structs;
+
+import fr.jamailun.ultimatespellsystem.dsl2.tokenization.TokenPosition;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Instance of a structured object.
+ */
+public interface Struct {
+
+ /**
+ * Get a field value.
+ * @param pos token position requesting the data.
+ * @param fieldName name of the field.
+ * @return the field value.
+ */
+ @Nullable Object getField(@NotNull TokenPosition pos, @NotNull String fieldName);
+
+ /**
+ * Set a field value.
+ * @param pos token position requesting the data.
+ * @param fieldName name of the field.
+ * @param value the field new value.
+ */
+ void setField(@NotNull TokenPosition pos, @NotNull String fieldName, @Nullable Object value);
+
+ /**
+ * Call a function of the object.
+ * @param pos token position requesting the data.
+ * @param functionName name fo the function.
+ * @param parameters parameters of the function.
+ * @return the function output.
+ */
+ @Nullable Object callFunction(@NotNull TokenPosition pos, @NotNull String functionName, @NotNull List