diff --git a/src/main/java/ch/njol/skript/classes/ClassInfo.java b/src/main/java/ch/njol/skript/classes/ClassInfo.java
index da8dfd1c50e..2852a33ac26 100644
--- a/src/main/java/ch/njol/skript/classes/ClassInfo.java
+++ b/src/main/java/ch/njol/skript/classes/ClassInfo.java
@@ -17,7 +17,7 @@
import org.skriptlang.skript.addon.SkriptAddon;
import org.skriptlang.skript.lang.properties.Property;
import org.skriptlang.skript.lang.properties.Property.PropertyInfo;
-import org.skriptlang.skript.lang.properties.PropertyHandler;
+import org.skriptlang.skript.lang.properties.handlers.base.PropertyHandler;
import java.util.*;
import java.util.function.Supplier;
diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
index 9794bfc2e22..551f2935b17 100644
--- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
+++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
@@ -50,12 +50,11 @@
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.CachedServerIcon;
-import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.bukkit.base.types.*;
import org.skriptlang.skript.bukkit.base.types.EntityClassInfo.EntityChanger;
import org.skriptlang.skript.lang.properties.Property;
-import org.skriptlang.skript.lang.properties.PropertyHandler.ExpressionPropertyHandler;
+import org.skriptlang.skript.lang.properties.handlers.base.ExpressionPropertyHandler;
import java.io.StreamCorruptedException;
import java.util.Arrays;
@@ -164,172 +163,8 @@ protected boolean canBeInstantiated() {
}
}).cloner(BlockData::clone));
- Classes.registerClass(new ClassInfo<>(Location.class, "location")
- .user("locations?")
- .name("Location")
- .description("A location in a world. Locations are world-specific and even store a direction, " +
- "e.g. if you save a location and later teleport to it you will face the exact same direction you did when you saved the location.")
- .usage("")
- .examples("teleport player to location at 0, 69, 0",
- "set {home::%uuid of player%} to location of the player")
- .since("1.0")
- .defaultExpression(new EventValueExpression<>(Location.class))
- .parser(new Parser() {
- @Override
- @Nullable
- public Location parse(final String s, final ParseContext context) {
- return null;
- }
-
- @Override
- public boolean canParse(final ParseContext context) {
- return false;
- }
-
- @Override
- public String toString(final Location l, final int flags) {
- String worldPart = l.getWorld() == null ? "" : " in '" + l.getWorld().getName() + "'"; // Safety: getWorld is marked as Nullable by spigot
- return "x: " + Skript.toString(l.getX()) + ", y: " + Skript.toString(l.getY()) + ", z: " + Skript.toString(l.getZ()) + ", yaw: " + Skript.toString(l.getYaw()) + ", pitch: " + Skript.toString(l.getPitch()) + worldPart;
- }
-
- @Override
- public String toVariableNameString(final Location l) {
- return l.getWorld().getName() + ":" + l.getX() + "," + l.getY() + "," + l.getZ();
- }
-
- @Override
- public String getDebugMessage(final Location l) {
- return "(" + l.getWorld().getName() + ":" + l.getX() + "," + l.getY() + "," + l.getZ() + "|yaw=" + l.getYaw() + "/pitch=" + l.getPitch() + ")";
- }
- }).serializer(new Serializer() {
- @Override
- public Fields serialize(Location location) {
- Fields fields = new Fields();
- World world = null;
- try {
- world = location.getWorld();
- } catch (IllegalArgumentException exception) {
- Skript.warning("A location failed to serialize with its defined world, as the world was unloaded.");
- }
- fields.putObject("world", world);
- fields.putPrimitive("x", location.getX());
- fields.putPrimitive("y", location.getY());
- fields.putPrimitive("z", location.getZ());
- fields.putPrimitive("yaw", location.getYaw());
- fields.putPrimitive("pitch", location.getPitch());
- return fields;
- }
-
- @Override
- public void deserialize(final Location o, final Fields f) {
- assert false;
- }
-
- @Override
- public Location deserialize(final Fields f) throws StreamCorruptedException {
- return new Location(f.getObject("world", World.class),
- f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class),
- f.getPrimitive("yaw", float.class), f.getPrimitive("pitch", float.class));
- }
-
- @Override
- public boolean canBeInstantiated() {
- return false; // no nullary constructor - also, saving the location manually prevents errors should Location ever be changed
- }
-
- @Override
- public boolean mustSyncDeserialization() {
- return true;
- }
-
- // return l.getWorld().getName() + ":" + l.getX() + "," + l.getY() + "," + l.getZ() + "|" + l.getYaw() + "/" + l.getPitch();
- @Override
- @Nullable
- public Location deserialize(final String s) {
- final String[] split = s.split("[:,|/]");
- if (split.length != 6)
- return null;
- final World w = Bukkit.getWorld(split[0]);
- if (w == null)
- return null;
- try {
- final double[] l = new double[5];
- for (int i = 0; i < 5; i++)
- l[i] = Double.parseDouble(split[i + 1]);
- return new Location(w, l[0], l[1], l[2], (float) l[3], (float) l[4]);
- } catch (final NumberFormatException e) {
- return null;
- }
- }
- })
- .cloner(Location::clone));
-
- Classes.registerClass(new ClassInfo<>(Vector.class, "vector")
- .user("vectors?")
- .name("Vector")
- .description("Vector is a collection of numbers. In Minecraft, 3D vectors are used to express velocities of entities.")
- .usage("vector(x, y, z)")
- .examples("")
- .since("2.2-dev23")
- .defaultExpression(new EventValueExpression<>(Vector.class))
- .parser(new Parser() {
- @Override
- @Nullable
- public Vector parse(final String s, final ParseContext context) {
- return null;
- }
-
- @Override
- public boolean canParse(final ParseContext context) {
- return false;
- }
-
- @Override
- public String toString(final Vector vec, final int flags) {
- return "x: " + Skript.toString(vec.getX()) + ", y: " + Skript.toString(vec.getY()) + ", z: " + Skript.toString(vec.getZ());
- }
-
- @Override
- public String toVariableNameString(final Vector vec) {
- return "vector:" + vec.getX() + "," + vec.getY() + "," + vec.getZ();
- }
-
- @Override
- public String getDebugMessage(final Vector vec) {
- return "(" + vec.getX() + "," + vec.getY() + "," + vec.getZ() + ")";
- }
- })
- .serializer(new Serializer() {
- @Override
- public Fields serialize(Vector o) {
- Fields f = new Fields();
- f.putPrimitive("x", o.getX());
- f.putPrimitive("y", o.getY());
- f.putPrimitive("z", o.getZ());
- return f;
- }
-
- @Override
- public void deserialize(Vector o, Fields f) {
- assert false;
- }
-
- @Override
- public Vector deserialize(final Fields f) throws StreamCorruptedException {
- return new Vector(f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class));
- }
-
- @Override
- public boolean mustSyncDeserialization() {
- return false;
- }
-
- @Override
- protected boolean canBeInstantiated() {
- return false;
- }
- })
- .cloner(Vector::clone));
+ Classes.registerClass(new LocationClassInfo());
+ Classes.registerClass(new VectorClassInfo());
Classes.registerClass(new ClassInfo<>(World.class, "world")
.user("worlds?")
diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java
index 63f3e5accf6..d97924fdba1 100644
--- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java
+++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java
@@ -5,7 +5,6 @@
import ch.njol.skript.classes.ClassInfo;
import ch.njol.skript.classes.Parser;
import ch.njol.skript.classes.Serializer;
-import ch.njol.skript.expressions.base.EventValueExpression;
import ch.njol.skript.lang.ParseContext;
import ch.njol.skript.lang.VariableString;
import ch.njol.skript.lang.util.SimpleLiteral;
@@ -17,10 +16,10 @@
import ch.njol.yggdrasil.Fields;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Nullable;
-import org.joml.Quaternionf;
+import org.skriptlang.skript.common.types.QuaternionClassInfo;
import org.skriptlang.skript.lang.properties.Property;
-import org.skriptlang.skript.lang.properties.PropertyHandler.ConditionPropertyHandler;
-import org.skriptlang.skript.lang.properties.PropertyHandler.ContainsHandler;
+import org.skriptlang.skript.lang.properties.handlers.ContainsHandler;
+import org.skriptlang.skript.lang.properties.handlers.base.ConditionPropertyHandler;
import java.io.StreamCorruptedException;
import java.util.UUID;
@@ -326,37 +325,8 @@ public Class extends String>[] elementTypes() {
ConditionPropertyHandler.of(String::isEmpty)));
// joml type - for display entities
- if (Skript.classExists("org.joml.Quaternionf"))
- Classes.registerClass(new ClassInfo<>(Quaternionf.class, "quaternion")
- .user("quaternionf?s?")
- .name("Quaternion")
- .description("Quaternions are four dimensional vectors, often used for representing rotations.")
- .since("2.10")
- .parser(new Parser<>() {
- public boolean canParse(ParseContext context) {
- return false;
- }
-
- @Override
- public String toString(Quaternionf quaternion, int flags) {
- return "w:" + Skript.toString(quaternion.w()) + ", x:" + Skript.toString(quaternion.x()) + ", y:" + Skript.toString(quaternion.y()) + ", z:" + Skript.toString(quaternion.z());
- }
+ Classes.registerClass(new QuaternionClassInfo());
- @Override
- public String toVariableNameString(Quaternionf quaternion) {
- return quaternion.w() + "," + quaternion.x() + "," + quaternion.y() + "," + quaternion.z();
- }
- })
- .defaultExpression(new EventValueExpression<>(Quaternionf.class))
- .cloner(quaternion -> {
- try {
- // Implements cloneable, but doesn't return a Quaternionf.
- // org.joml improper override. Returns Object.
- return (Quaternionf) quaternion.clone();
- } catch (CloneNotSupportedException e) {
- return null;
- }
- }));
Classes.registerClass(new ClassInfo<>(UUID.class, "uuid")
.user("uuids?")
diff --git a/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java b/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java
index 87df08749ad..cdcfa97e3d1 100644
--- a/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java
+++ b/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java
@@ -28,10 +28,10 @@
import org.skriptlang.skript.common.types.QueueClassInfo;
import org.skriptlang.skript.common.types.ScriptClassInfo;
import org.skriptlang.skript.lang.properties.Property;
-import org.skriptlang.skript.lang.properties.PropertyHandler.ConditionPropertyHandler;
-import org.skriptlang.skript.lang.properties.PropertyHandler.ContainsHandler;
-import org.skriptlang.skript.lang.properties.PropertyHandler.ExpressionPropertyHandler;
-import org.skriptlang.skript.lang.properties.PropertyHandler.TypedValuePropertyHandler;
+import org.skriptlang.skript.lang.properties.handlers.ContainsHandler;
+import org.skriptlang.skript.lang.properties.handlers.TypedValueHandler;
+import org.skriptlang.skript.lang.properties.handlers.base.ConditionPropertyHandler;
+import org.skriptlang.skript.lang.properties.handlers.base.ExpressionPropertyHandler;
import org.skriptlang.skript.util.Executable;
import java.io.File;
@@ -583,7 +583,7 @@ public String toVariableNameString(Node node) {
.property(Property.TYPED_VALUE,
"The value of the node, if it is an entry node, as text.",
Skript.instance(),
- new TypedValuePropertyHandler() {
+ new TypedValueHandler() {
@Override
public @Nullable String convert(Node propertyHolder) {
@@ -751,7 +751,7 @@ public void change(AnyAmount named, Object @Nullable [] delta, ChangeMode mode)
.property(Property.TYPED_VALUE,
"The value of something. Can be set.",
Skript.instance(),
- new TypedValuePropertyHandler() {
+ new TypedValueHandler() {
@Override
public Object convert(AnyValued propertyHolder) {
return propertyHolder.value();
diff --git a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java
index 9f4380e0a7a..63f58e7469d 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java
@@ -1,5 +1,6 @@
package ch.njol.skript.expressions;
+import ch.njol.skript.SkriptConfig;
import ch.njol.skript.classes.Changer;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.doc.Description;
@@ -27,7 +28,8 @@
public class ExprCoordinate extends SimplePropertyExpression {
static {
- register(ExprCoordinate.class, Number.class, "(0¦x|1¦y|2¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", "locations");
+ if (!SkriptConfig.useTypeProperties.value())
+ register(ExprCoordinate.class, Number.class, "(0¦x|1¦y|2¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", "locations");
}
private final static char[] axes = {'x', 'y', 'z'};
diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java
index 30930124c05..f6ec47c964b 100644
--- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java
+++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java
@@ -1,6 +1,7 @@
package ch.njol.skript.expressions;
import ch.njol.skript.Skript;
+import ch.njol.skript.SkriptConfig;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.classes.Changer.ChangerUtils;
import ch.njol.skript.doc.Description;
@@ -48,7 +49,8 @@ public class ExprXYZComponent extends SimplePropertyExpression