From db9f6afc6afa1dcee7b638dd4211db5b597e3de0 Mon Sep 17 00:00:00 2001 From: TPGamesNL Date: Sun, 28 Mar 2021 19:04:53 +0200 Subject: [PATCH 1/2] Update files --- src/main/java/ch/njol/skript/effects/EffExit.java | 2 +- src/main/java/ch/njol/skript/lang/Loop.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffExit.java b/src/main/java/ch/njol/skript/effects/EffExit.java index 9630d20b9b7..eedbe8e86f8 100644 --- a/src/main/java/ch/njol/skript/effects/EffExit.java +++ b/src/main/java/ch/njol/skript/effects/EffExit.java @@ -123,7 +123,7 @@ protected TriggerItem walk(final Event e) { i--; } if (n instanceof Loop) { - ((Loop) n).getCurrentIter().remove(e); + ((Loop) n).exit(e); } return n instanceof Loop ? ((Loop) n).getActualNext() : n instanceof While ? ((While) n).getActualNext() : n.getNext(); } diff --git a/src/main/java/ch/njol/skript/lang/Loop.java b/src/main/java/ch/njol/skript/lang/Loop.java index a37aac6bbad..aee444c0f50 100644 --- a/src/main/java/ch/njol/skript/lang/Loop.java +++ b/src/main/java/ch/njol/skript/lang/Loop.java @@ -41,14 +41,14 @@ public class Loop extends TriggerSection { private final Expression expr; - private transient Map current = new WeakHashMap<>(); - private transient Map> currentIter = new WeakHashMap<>(); + private final transient Map current = new WeakHashMap<>(); + private final transient Map> currentIter = new WeakHashMap<>(); @Nullable private TriggerItem actualNext; @SuppressWarnings("unchecked") - public Loop(final Expression expr, final SectionNode node) { + public Loop(final Expression expr, final SectionNode node) { assert expr != null; assert node != null; if (Container.class.isAssignableFrom(expr.getReturnType())) { @@ -84,8 +84,7 @@ protected TriggerItem walk(final Event e) { } } if (iter == null || !iter.hasNext()) { - if (iter != null) - currentIter.remove(e); // a loop inside another loop can be called multiple times in the same event + exit(e); debug(e, false); return actualNext; } else { @@ -119,7 +118,9 @@ public TriggerItem getActualNext() { return actualNext; } - public Map> getCurrentIter() { - return currentIter; + public void exit(Event event) { + current.remove(event); + currentIter.remove(event); } + } From 2a263ea256d89e98e36702a0cb2107b556035216 Mon Sep 17 00:00:00 2001 From: TPGamesNL Date: Thu, 13 May 2021 13:45:16 +0200 Subject: [PATCH 2/2] Update files --- .../java/ch/njol/skript/effects/EffExit.java | 7 ++++--- .../java/ch/njol/skript/effects/EffReturn.java | 10 ++++++++++ src/main/java/ch/njol/skript/lang/Loop.java | 17 ++++++++--------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffExit.java b/src/main/java/ch/njol/skript/effects/EffExit.java index eedbe8e86f8..dd5758a9d1c 100644 --- a/src/main/java/ch/njol/skript/effects/EffExit.java +++ b/src/main/java/ch/njol/skript/effects/EffExit.java @@ -119,12 +119,13 @@ protected TriggerItem walk(final Event e) { assert false : this; return null; } + if (n instanceof Loop) { + ((Loop) n).exit(e); + } + if (type == EVERYTHING || type == CONDITIONALS && n instanceof Conditional || type == LOOPS && (n instanceof Loop || n instanceof While)) i--; } - if (n instanceof Loop) { - ((Loop) n).exit(e); - } return n instanceof Loop ? ((Loop) n).getActualNext() : n instanceof While ? ((While) n).getActualNext() : n.getNext(); } diff --git a/src/main/java/ch/njol/skript/effects/EffReturn.java b/src/main/java/ch/njol/skript/effects/EffReturn.java index 6b76898aa36..9c3fb9b6c4c 100644 --- a/src/main/java/ch/njol/skript/effects/EffReturn.java +++ b/src/main/java/ch/njol/skript/effects/EffReturn.java @@ -18,6 +18,8 @@ */ package ch.njol.skript.effects; +import ch.njol.skript.lang.Loop; +import ch.njol.skript.lang.TriggerSection; import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; @@ -111,6 +113,14 @@ protected TriggerItem walk(final Event e) { } else { assert false : e; } + + TriggerSection parent = getParent(); + while (parent != null) { + if (parent instanceof Loop) + ((Loop) parent).exit(e); + parent = parent.getParent(); + } + return null; } diff --git a/src/main/java/ch/njol/skript/lang/Loop.java b/src/main/java/ch/njol/skript/lang/Loop.java index aee444c0f50..1ff73ddb010 100644 --- a/src/main/java/ch/njol/skript/lang/Loop.java +++ b/src/main/java/ch/njol/skript/lang/Loop.java @@ -18,19 +18,18 @@ */ package ch.njol.skript.lang; -import java.util.Iterator; -import java.util.Map; -import java.util.WeakHashMap; - -import org.bukkit.event.Event; -import org.eclipse.jdt.annotation.Nullable; - import ch.njol.skript.ScriptLoader; import ch.njol.skript.SkriptAPIException; import ch.njol.skript.config.SectionNode; import ch.njol.skript.lang.util.ContainerExpression; import ch.njol.skript.util.Container; import ch.njol.skript.util.Container.ContainerType; +import org.bukkit.event.Event; +import org.eclipse.jdt.annotation.Nullable; + +import java.util.Iterator; +import java.util.Map; +import java.util.WeakHashMap; /** * A trigger section which represents a loop. @@ -38,9 +37,9 @@ * @author Peter Güttinger */ public class Loop extends TriggerSection { - + private final Expression expr; - + private final transient Map current = new WeakHashMap<>(); private final transient Map> currentIter = new WeakHashMap<>();