diff --git a/src/main/java/ch/njol/skript/effects/EffExit.java b/src/main/java/ch/njol/skript/effects/EffExit.java index 9630d20b9b7..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).getCurrentIter().remove(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 a37aac6bbad..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,17 +37,17 @@ * @author Peter Güttinger */ 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 +83,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 +117,9 @@ public TriggerItem getActualNext() { return actualNext; } - public Map> getCurrentIter() { - return currentIter; + public void exit(Event event) { + current.remove(event); + currentIter.remove(event); } + }