From 8724b88a1c1ac19a223fd671a34d8316862276c9 Mon Sep 17 00:00:00 2001 From: _tud <98935832+UnderscoreTud@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:19:47 +0300 Subject: [PATCH 1/3] Make the 'do' check in do-while local to the event its run on --- src/main/java/ch/njol/skript/sections/SecWhile.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/sections/SecWhile.java b/src/main/java/ch/njol/skript/sections/SecWhile.java index 18626490ee3..fed4952863d 100644 --- a/src/main/java/ch/njol/skript/sections/SecWhile.java +++ b/src/main/java/ch/njol/skript/sections/SecWhile.java @@ -12,7 +12,10 @@ import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.WeakHashMap; @Name("While Loop") @Description("While Loop sections are loops that will just keep repeating as long as a condition is met.") @@ -46,7 +49,7 @@ public class SecWhile extends LoopSection { private TriggerItem actualNext; private boolean doWhile; - private boolean ranDoWhile = false; + private final Set ranDoWhile = Collections.newSetFromMap(new WeakHashMap<>()); @Override public boolean init(Expression[] exprs, @@ -70,8 +73,7 @@ public boolean init(Expression[] exprs, @Nullable @Override protected TriggerItem walk(Event event) { - if ((doWhile && !ranDoWhile) || condition.check(event)) { - ranDoWhile = true; + if ((doWhile && ranDoWhile.add(event)) || condition.check(event)) { currentLoopCounter.put(event, (currentLoopCounter.getOrDefault(event, 0L)) + 1); return walk(event, true); } else { @@ -104,7 +106,7 @@ public String toString(@Nullable Event event, boolean debug) { @Override public void exit(Event event) { - ranDoWhile = false; + ranDoWhile.remove(event); super.exit(event); } From 406cca2c05d2ac4298bc573003c58a8a476d6d83 Mon Sep 17 00:00:00 2001 From: _tud <98935832+UnderscoreTud@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:19:47 +0300 Subject: [PATCH 2/3] Make the 'do' check in do-while local to the event its run on --- src/main/java/ch/njol/skript/sections/SecWhile.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/sections/SecWhile.java b/src/main/java/ch/njol/skript/sections/SecWhile.java index 18626490ee3..fed4952863d 100644 --- a/src/main/java/ch/njol/skript/sections/SecWhile.java +++ b/src/main/java/ch/njol/skript/sections/SecWhile.java @@ -12,7 +12,10 @@ import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.WeakHashMap; @Name("While Loop") @Description("While Loop sections are loops that will just keep repeating as long as a condition is met.") @@ -46,7 +49,7 @@ public class SecWhile extends LoopSection { private TriggerItem actualNext; private boolean doWhile; - private boolean ranDoWhile = false; + private final Set ranDoWhile = Collections.newSetFromMap(new WeakHashMap<>()); @Override public boolean init(Expression[] exprs, @@ -70,8 +73,7 @@ public boolean init(Expression[] exprs, @Nullable @Override protected TriggerItem walk(Event event) { - if ((doWhile && !ranDoWhile) || condition.check(event)) { - ranDoWhile = true; + if ((doWhile && ranDoWhile.add(event)) || condition.check(event)) { currentLoopCounter.put(event, (currentLoopCounter.getOrDefault(event, 0L)) + 1); return walk(event, true); } else { @@ -104,7 +106,7 @@ public String toString(@Nullable Event event, boolean debug) { @Override public void exit(Event event) { - ranDoWhile = false; + ranDoWhile.remove(event); super.exit(event); } From 452f9ca04fcc4f2e6f4fc7b2f5c40e09129c1e48 Mon Sep 17 00:00:00 2001 From: _tud <98935832+UnderscoreTud@users.noreply.github.com> Date: Sun, 2 Nov 2025 23:13:29 +0300 Subject: [PATCH 3/3] Add test --- .../regressions/8262-concurrent do while loops.sk | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/test/skript/tests/regressions/8262-concurrent do while loops.sk diff --git a/src/test/skript/tests/regressions/8262-concurrent do while loops.sk b/src/test/skript/tests/regressions/8262-concurrent do while loops.sk new file mode 100644 index 00000000000..e46d451fa7c --- /dev/null +++ b/src/test/skript/tests/regressions/8262-concurrent do while loops.sk @@ -0,0 +1,10 @@ +local function test(id: integer): + do while true is true: + add {_id} to {-%script%::*} + wait 1 tick + exit + +test "concurrent do while loops": + test(1) + test(2) + assert size of {-%script%::*} is 2 with "Didn't run multiple do-while loops concurrently"