From 1681820818ec3d3a710bc8645703187c1ab3292b Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 4 Jan 2025 22:18:24 -0500 Subject: [PATCH 1/2] adds delay checks to input key syntaxes --- .../elements/conditions/CondIsPressingKey.java | 13 ++++++++++--- .../elements/expressions/ExprCurrentInputKeys.java | 5 ++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java b/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java index 223274c0c02..1583528fb77 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java +++ b/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java @@ -46,6 +46,7 @@ public class CondIsPressingKey extends Condition { private Expression players; private Expression inputKeys; private boolean past; + private boolean delayed; @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { @@ -54,8 +55,14 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is //noinspection unchecked inputKeys = (Expression) expressions[1]; past = matchedPattern > 1; - if (past && !getParser().isCurrentEvent(PlayerInputEvent.class)) - Skript.warning("Checking the past state of a player's input outside the 'player input' event has no effect."); + delayed = !isDelayed.isFalse(); + if (past) { + if (!getParser().isCurrentEvent(PlayerInputEvent.class)) { + Skript.warning("Checking the past state of a player's input outside the 'player input' event has no effect."); + } else if (delayed) { + Skript.warning("Checking the past state of a player's input after the event has passed has no effect."); + } + } setNegated(matchedPattern == 1 || matchedPattern == 3); return true; } @@ -68,7 +75,7 @@ public boolean check(Event event) { return players.check(event, player -> { Input input; // If we want to get the new input of the event-player, we must get it from the event - if (!past && player.equals(eventPlayer)) { + if (!delayed && !past && player.equals(eventPlayer)) { input = ((PlayerInputEvent) event).getInput(); } else { // Otherwise, we get the current (or past in case of an event-player) input input = player.getCurrentInput(); diff --git a/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java b/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java index f57d735ff55..f618c1112f2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java +++ b/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java @@ -29,9 +29,12 @@ public class ExprCurrentInputKeys extends PropertyExpression { register(ExprCurrentInputKeys.class, InputKey.class, "[current] (inputs|input keys)", "players"); } + private boolean delayed; + @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { setExpr((Expression) expressions[0]); + delayed = !isDelayed.isFalse(); return true; } @@ -43,7 +46,7 @@ protected InputKey[] get(Event event, Player[] source) { List inputKeys = new ArrayList<>(); for (Player player : source) { - if (player.equals(eventPlayer)) { + if (!delayed && player.equals(eventPlayer)) { inputKeys.addAll(InputKey.fromInput(((PlayerInputEvent) event).getInput())); } else { inputKeys.addAll(InputKey.fromInput(player.getCurrentInput())); From 536a43e74c2cf9d679a58ec0734dfd6d0025f641 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 4 Jan 2025 23:17:24 -0500 Subject: [PATCH 2/2] temp fix via Delay.isDelayed() --- .../bukkit/input/elements/conditions/CondIsPressingKey.java | 2 ++ .../input/elements/expressions/ExprCurrentInputKeys.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java b/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java index 1583528fb77..98d3616df9d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java +++ b/src/main/java/org/skriptlang/skript/bukkit/input/elements/conditions/CondIsPressingKey.java @@ -2,6 +2,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.doc.*; +import ch.njol.skript.effects.Delay; import ch.njol.skript.lang.Condition; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -72,6 +73,7 @@ public boolean check(Event event) { Player eventPlayer = event instanceof PlayerInputEvent inputEvent ? inputEvent.getPlayer() : null; InputKey[] inputKeys = this.inputKeys.getAll(event); boolean and = this.inputKeys.getAnd(); + boolean delayed = this.delayed || Delay.isDelayed(event); return players.check(event, player -> { Input input; // If we want to get the new input of the event-player, we must get it from the event diff --git a/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java b/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java index f618c1112f2..5aaa079f769 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java +++ b/src/main/java/org/skriptlang/skript/bukkit/input/elements/expressions/ExprCurrentInputKeys.java @@ -2,6 +2,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.doc.*; +import ch.njol.skript.effects.Delay; import ch.njol.skript.expressions.base.PropertyExpression; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -44,6 +45,8 @@ protected InputKey[] get(Event event, Player[] source) { if (SUPPORTS_TIME_STATES && getTime() == EventValues.TIME_NOW && event instanceof PlayerInputEvent inputEvent) eventPlayer = inputEvent.getPlayer(); + boolean delayed = this.delayed || Delay.isDelayed(event); + List inputKeys = new ArrayList<>(); for (Player player : source) { if (!delayed && player.equals(eventPlayer)) {