From 73aa6c797d9ed18c6bfdb0fba70e1097084ff5fb Mon Sep 17 00:00:00 2001 From: mugu Date: Thu, 20 Nov 2025 01:16:45 +0100 Subject: [PATCH] Adds interaction entity syntaxes --- .../interactions/InteractionModule.java | 12 +++ .../elements/conditions/CondIsResponsive.java | 48 +++++++++++ .../expressions/ExprInteractionHeight.java | 79 +++++++++++++++++++ .../ExprInteractionResponsiveness.java | 72 +++++++++++++++++ .../expressions/ExprInteractionWidth.java | 79 +++++++++++++++++++ .../expressions/ExprLastInteractionDate.java | 62 +++++++++++++++ .../ExprLastInteractionPlayer.java | 62 +++++++++++++++ 7 files changed, 414 insertions(+) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/InteractionModule.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/elements/conditions/CondIsResponsive.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionHeight.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionResponsiveness.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionWidth.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionDate.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionPlayer.java diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/InteractionModule.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/InteractionModule.java new file mode 100644 index 00000000000..125b1198833 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/InteractionModule.java @@ -0,0 +1,12 @@ +package org.skriptlang.skript.bukkit.interactions; + +import ch.njol.skript.Skript; + +import java.io.IOException; + +public class InteractionModule { + + public static void load() throws IOException { + Skript.getAddonInstance().loadClasses("org.skriptlang.skript.bukkit.interactions", "elements"); + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/conditions/CondIsResponsive.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/conditions/CondIsResponsive.java new file mode 100644 index 00000000000..856edc84ccb --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/conditions/CondIsResponsive.java @@ -0,0 +1,48 @@ +package org.skriptlang.skript.bukkit.interactions.elements.conditions; + +import ch.njol.skript.conditions.base.PropertyCondition; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.Expression; +import ch.njol.util.Kleenean; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; + +@Name("Is Responsive") +@Description({ + "Checks whether an interaction entity is responsive" +}) +@Examples({ + "if last spawned interaction is responsive:", "if last spawned interaction is unresponsive:" +}) +@Since("INSERT VERSION") +public class CondIsResponsive extends PropertyCondition { + + static { + register(CondIsResponsive.class, "(responsive|1¦unresponsive)", "entities"); + } + + private boolean isNegated; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + isNegated = parseResult.mark == 1; + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + public boolean check(Entity entity) { + if (entity instanceof Interaction i) { + return !isNegated == i.isResponsive(); + } + return false; + } + + @Override + protected String getPropertyName() { + return isNegated ? "unresponsive" : "responsive"; + } +} \ No newline at end of file diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionHeight.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionHeight.java new file mode 100644 index 00000000000..230680b630f --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionHeight.java @@ -0,0 +1,79 @@ +package org.skriptlang.skript.bukkit.interactions.elements.expressions; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + + +@Name("Interaction Height") +@Description({ + "Returns the interaction height of an interaction entity" +}) +@Examples({ + "set interaction height of last spawned interaction to 5.3" +}) +@Since("INSERT VERSION") +public class ExprInteractionHeight extends SimplePropertyExpression { + + static { + register(ExprInteractionHeight.class, Number.class, "interaction height[s]", "entities"); + } + + @Override + public @Nullable Number convert(Entity interaction) { + if (interaction instanceof Interaction i) { + return i.getInteractionHeight(); + } + + return null; + } + + @Override + protected String getPropertyName() { + return "interaction height"; + } + + @Override + public Class getReturnType() { + return Number.class; + } + + @Override + @Nullable + public Class[] acceptChange(final ChangeMode mode) { + if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.RESET) + && getExpr().isSingle()) + return new Class[] {Number.class}; + return null; + } + + @Override + public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) throws UnsupportedOperationException { + assert !(getExpr().getSingle(e) instanceof Interaction) || delta != null; + final Interaction i = (Interaction) getExpr().getSingle(e); + if (i == null) + return; + float n = ((Number) delta[0]).floatValue(); + switch (mode) { + case REMOVE: + i.setInteractionHeight(i.getInteractionHeight() - n); + break; + case ADD: + i.setInteractionHeight(i.getInteractionHeight() + n); + break; + case SET: + i.setInteractionHeight(n); + break; + case RESET: + i.setInteractionHeight(1.0f); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionResponsiveness.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionResponsiveness.java new file mode 100644 index 00000000000..1af8bb8d7eb --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionResponsiveness.java @@ -0,0 +1,72 @@ +package org.skriptlang.skript.bukkit.interactions.elements.expressions; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +@Name("Interaction Responsiveness") +@Description({ + "Returns the responsiveness of an interaction entity" +}) +@Examples({ + "set interaction responsiveness of last spawned interaction to false" +}) +@Since("INSERT VERSION") +public class ExprInteractionResponsiveness extends SimplePropertyExpression { + + static { + register(ExprInteractionResponsiveness.class, Boolean.class, "interaction Responsiveness[es]", "entities"); + } + + @Override + public @Nullable Boolean convert(Entity interaction) { + if (interaction instanceof Interaction i) { + return i.isResponsive(); + } + + return null; + } + + @Override + protected String getPropertyName() { + return "interaction responsiveness"; + } + + @Override + public Class getReturnType() { + return Boolean.class; + } + + @Override + @Nullable + public Class[] acceptChange(final ChangeMode mode) { + if ((mode == ChangeMode.SET || mode == ChangeMode.RESET) + && getExpr().isSingle()) + return new Class[] {Boolean.class}; + return null; + } + + @Override + public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) throws UnsupportedOperationException { + assert !(getExpr().getSingle(e) instanceof Interaction) || delta != null; + final Interaction i = (Interaction) getExpr().getSingle(e); + if (i == null) + return; + Boolean b = ((Boolean) delta[0]); + switch (mode) { + case SET: + i.setResponsive(b); + break; + case RESET: + i.setResponsive(true); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionWidth.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionWidth.java new file mode 100644 index 00000000000..260fff3a4de --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprInteractionWidth.java @@ -0,0 +1,79 @@ +package org.skriptlang.skript.bukkit.interactions.elements.expressions; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + + +@Name("Interaction Width") +@Description({ + "Returns the interaction width of an interaction entity" +}) +@Examples({ + "set interaction width of last spawned interaction to 5.3" +}) +@Since("INSERT VERSION") +public class ExprInteractionWidth extends SimplePropertyExpression { + + static { + register(ExprInteractionWidth.class, Number.class, "interaction width[s]", "entities"); + } + + @Override + public @Nullable Number convert(Entity interaction) { + if (interaction instanceof Interaction i) { + return i.getInteractionWidth(); + } + + return null; + } + + @Override + protected String getPropertyName() { + return "interaction width"; + } + + @Override + public Class getReturnType() { + return Number.class; + } + + @Override + @Nullable + public Class[] acceptChange(final ChangeMode mode) { + if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.RESET) + && getExpr().isSingle()) + return new Class[] {Number.class}; + return null; + } + + @Override + public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) throws UnsupportedOperationException { + assert !(getExpr().getSingle(e) instanceof Interaction) || delta != null; + final Interaction i = (Interaction) getExpr().getSingle(e); + if (i == null) + return; + float n = ((Number) delta[0]).floatValue(); + switch (mode) { + case REMOVE: + i.setInteractionWidth(i.getInteractionWidth() - n); + break; + case ADD: + i.setInteractionWidth(i.getInteractionWidth() + n); + break; + case SET: + i.setInteractionWidth(n); + break; + case RESET: + i.setInteractionWidth(1.0f); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionDate.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionDate.java new file mode 100644 index 00000000000..3abcacb8ff9 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionDate.java @@ -0,0 +1,62 @@ +package org.skriptlang.skript.bukkit.interactions.elements.expressions; + +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.util.Date; +import ch.njol.util.Kleenean; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; +import org.jetbrains.annotations.Nullable; + +@Name("Last Interaction Date") +@Description({ + "Returns the date of the last attack (left click), or interaction (right click) on an interaction entity" +}) +@Examples({ + "if last interaction date of last spawned interaction < 5 seconds ago" +}) +@Since("INSERT VERSION") +public class ExprLastInteractionDate extends SimplePropertyExpression { + + static { + register(ExprLastInteractionDate.class, Date.class, "last (attack|1¦interaction) date", "entities"); + } + + private boolean interaction; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + interaction = parseResult.mark == 1; + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + + + @Override + public @Nullable Date convert(Entity entity) { + if (entity instanceof Interaction i) { + if (interaction) { + return new Date(i.getLastInteraction().getTimestamp()); + } else { + return new Date(i.getLastAttack().getTimestamp()); + } + + } + return null; + } + + @Override + protected String getPropertyName() { + return "last attack/interaction date"; + } + + @Override + public Class getReturnType() { + return Date.class; + } +} \ No newline at end of file diff --git a/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionPlayer.java b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionPlayer.java new file mode 100644 index 00000000000..0023632bf17 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/interactions/elements/expressions/ExprLastInteractionPlayer.java @@ -0,0 +1,62 @@ +package org.skriptlang.skript.bukkit.interactions.elements.expressions; + +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.util.Kleenean; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Interaction; +import org.jetbrains.annotations.Nullable; + +@Name("Last Interaction Player") +@Description({ + "Returns the last player to attack (left click), or interact (right click) with an interaction entity" +}) +@Examples({ + "kill last attack player of last spawned interaction" , "feed last interaction player of {_i}" +}) +@Since("INSERT VERSION") +public class ExprLastInteractionPlayer extends SimplePropertyExpression { + + static { + register(ExprLastInteractionPlayer.class, OfflinePlayer.class, "last (attack|1¦interaction) player", "entities"); + } + + private boolean interaction; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + interaction = parseResult.mark == 1; + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + + + @Override + public @Nullable OfflinePlayer convert(Entity entity) { + if (entity instanceof Interaction i) { + if (interaction) { + return i.getLastInteraction().getPlayer(); + } else { + return i.getLastAttack().getPlayer(); + } + + } + return null; + } + + @Override + protected String getPropertyName() { + return "last attack/interaction player"; + } + + @Override + public Class getReturnType() { + return OfflinePlayer.class; + } +} \ No newline at end of file