Skip to content

Commit 3325a2f

Browse files
authored
GH-285 Remove border when player is not in combat (#290)
* Remove border when player is not in combat. Add WorldEdit for easier tests * Add 5 tick delay which reduces 90% of done tests - remove initial solution * Resolve AI review * Use our scheduler, add isInCombat check to negate race condition * Add comment explaining race confition, follow rollczi suggestion
1 parent a0bd849 commit 3325a2f

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

eternalcombat-plugin/build.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ bukkit {
8888

8989
tasks {
9090
runServer {
91-
minecraftVersion("1.21.9")
91+
minecraftVersion("1.21.8")
92+
downloadPlugins.url("https://cdn.modrinth.com/data/1u6JkXh5/versions/Jk1z2u7n/worldedit-bukkit-7.3.16.jar")
93+
downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.9.5/packetevents-spigot-2.9.5.jar")
94+
downloadPlugins.url("https://cdn.modrinth.com/data/DKY9btbd/versions/PO4MKx7e/worldguard-bukkit-7.0.14-dist.jar")
9295
}
9396
}
9497

eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import com.eternalcode.commons.adventure.AdventureLegacyColorPostProcessor;
5151
import com.eternalcode.commons.adventure.AdventureLegacyColorPreProcessor;
5252
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
53-
import com.eternalcode.commons.scheduler.Scheduler;
5453
import com.eternalcode.multification.notice.Notice;
5554
import com.google.common.base.Stopwatch;
5655
import dev.rollczi.litecommands.LiteCommands;
@@ -180,7 +179,7 @@ public void onEnable() {
180179
new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, this.getServer()),
181180
new FightTagOutController(this.fightTagOutService),
182181
new FightMessageController(this.fightManager, noticeService, pluginConfig, this.getServer()),
183-
new BorderTriggerController(borderService, () -> pluginConfig.border, fightManager, server),
182+
new BorderTriggerController(borderService, () -> pluginConfig.border, fightManager, server, scheduler),
184183
new ParticleController(borderService, () -> pluginConfig.border.particle, scheduler, server),
185184
new BorderBlockController(borderService, () -> pluginConfig.border.block, scheduler, server),
186185
new EndCrystalListener(this, this.fightManager, pluginConfig),

eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderTriggerController.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.eternalcode.combat.fight.FightManager;
44
import com.eternalcode.combat.fight.event.FightTagEvent;
55
import com.eternalcode.combat.fight.event.FightUntagEvent;
6+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
7+
import java.time.Duration;
68
import java.util.function.Supplier;
79
import org.bukkit.Location;
810
import org.bukkit.Server;
@@ -15,16 +17,26 @@
1517

1618
public class BorderTriggerController implements Listener {
1719

20+
private static final long BORDER_WORK_AROUND_DELAY_MILLIS = 250;
21+
1822
private final BorderService borderService;
1923
private final Supplier<BorderSettings> border;
2024
private final FightManager fightManager;
2125
private final Server server;
22-
23-
public BorderTriggerController(BorderService borderService, Supplier<BorderSettings> border, FightManager fightManager, Server server) {
26+
private final MinecraftScheduler scheduler;
27+
28+
public BorderTriggerController(
29+
BorderService borderService,
30+
Supplier<BorderSettings> border,
31+
FightManager fightManager,
32+
Server server,
33+
MinecraftScheduler scheduler
34+
) {
2435
this.borderService = borderService;
2536
this.border = border;
2637
this.fightManager = fightManager;
2738
this.server = server;
39+
this.scheduler = scheduler;
2840
}
2941

3042
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
@@ -86,7 +98,11 @@ void onFightEnd(FightUntagEvent event) {
8698
return;
8799
}
88100

89-
borderService.clearBorder(player);
101+
// Due to race condition in PlayerMoveEvent and FightUntagEvent - border can be triggered after death and untag of player - solution delayed removal of border
102+
this.scheduler.runLater(() -> {
103+
if (!this.fightManager.isInCombat(player.getUniqueId())) {
104+
this.borderService.clearBorder(player);
105+
}
106+
}, Duration.ofMillis(BORDER_WORK_AROUND_DELAY_MILLIS));
90107
}
91-
92108
}

0 commit comments

Comments
 (0)