Use @LinkedTimer for the timers of linked classes

The repeating timers that linked classes and the plugin main classes started
once for the whole runtime now use @LinkedTimer, on Spigot (BauSystem,
SpigotCore, LobbySystem, MissileWars, TowerRun, Teamserver) and Velocity.
The FightInfoPacketSenders of MissileWars and TowerRun are linked themselves
instead of being started by the main class.
This commit is contained in:
2026-10-31 16:26:34 +01:00
parent 9598b1c961
commit 9fd2bd17d4
23 changed files with 241 additions and 217 deletions
@@ -24,6 +24,7 @@ import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
import de.steamwar.core.SWPlayer;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
@@ -43,13 +44,12 @@ public class ObserverTracerListener implements Listener {
static Set<Player> enabled = new HashSet<>();
public ObserverTracerListener() {
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
SWPlayer.allWithSingleComponent(ObserverTracer.class).forEach(pair -> {
if (pair.getSwPlayer().getPlayer().getGameMode() != GameMode.SPECTATOR) return;
pair.getComponent().show();
});
}, 15L, 15L);
@LinkedTimer(delay = 15, period = 15)
private void showTracers() {
SWPlayer.allWithSingleComponent(ObserverTracer.class).forEach(pair -> {
if (pair.getSwPlayer().getPlayer().getGameMode() != GameMode.SPECTATOR) return;
pair.getComponent().show();
});
}
@EventHandler
@@ -28,6 +28,7 @@ import de.steamwar.command.SWCommand;
import de.steamwar.entity.CRay;
import de.steamwar.entity.REntityServer;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import org.bukkit.*;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
@@ -104,15 +105,16 @@ public class RayVisualizerCommand extends SWCommand implements Listener {
public RayVisualizerCommand() {
super("rayvisualizer");
}
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
if (server.getPlayers().isEmpty()) return;
List<TNTPrimed> primedList = WORLD.getEntitiesByClass(TNTPrimed.class)
.stream().toList();
rayData.reset();
if (primedList.isEmpty()) return;
calculateRays(primedList, primedList);
}, 1, 1);
@LinkedTimer(delay = 1, period = 1)
private void updateRays() {
if (server.getPlayers().isEmpty()) return;
List<TNTPrimed> primedList = WORLD.getEntitiesByClass(TNTPrimed.class)
.stream().toList();
rayData.reset();
if (primedList.isEmpty()) return;
calculateRays(primedList, primedList);
}
private void calculateRays(List<TNTPrimed> fromTNTs, List<TNTPrimed> toTNTs) {
@@ -27,6 +27,7 @@ import de.steamwar.bausystem.features.script.lua.libs.StorageLib;
import de.steamwar.bausystem.region.Region;
import de.steamwar.core.SWPlayer;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
@@ -47,13 +48,12 @@ import org.luaj.vm2.LuaValue;
@Linked
public class EventListener implements Listener {
static {
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
long millis = System.currentTimeMillis();
SWPlayer.allWithSingleComponent(ScriptRunner.ScriptData.class)
.filter(pair -> millis - pair.getComponent().getLastF() > 200)
.forEach(pair -> pair.getComponent().setLastF(Long.MAX_VALUE));
}, 1, 1);
@LinkedTimer(delay = 1, period = 1)
private static void resetLastF() {
long millis = System.currentTimeMillis();
SWPlayer.allWithSingleComponent(ScriptRunner.ScriptData.class)
.filter(pair -> millis - pair.getComponent().getLastF() > 200)
.forEach(pair -> pair.getComponent().setLastF(Long.MAX_VALUE));
}
@EventHandler(priority = EventPriority.MONITOR)
@@ -44,9 +44,9 @@ import de.steamwar.entity.REntity;
import de.steamwar.entity.REntityServer;
import de.steamwar.inventory.SWAnvilInv;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -136,11 +136,10 @@ public class SimulatorCursor implements Listener {
private static final Map<Player, Long> LAST_SNEAKS = new HashMap<>();
static {
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
long millis = System.currentTimeMillis();
LAST_SNEAKS.entrySet().removeIf(entry -> millis - entry.getValue() > 200);
}, 1, 1);
@LinkedTimer(delay = 1, period = 1)
private static void clearLastSneaks() {
long millis = System.currentTimeMillis();
LAST_SNEAKS.entrySet().removeIf(entry -> millis - entry.getValue() > 200);
}
@EventHandler(priority = EventPriority.HIGH)
@@ -19,11 +19,10 @@
package de.steamwar.bausystem.features.team.boundary;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Point;
import de.steamwar.bausystem.region.Region;
import de.steamwar.linkage.Linked;
import org.bukkit.Bukkit;
import de.steamwar.linkage.LinkedTimer;
import org.bukkit.Particle;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -38,17 +37,16 @@ public class BoundaryViewer implements Listener {
public static Set<Player> viewers = new HashSet<>();
{
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
if (viewers.isEmpty()) {
return;
}
viewers.forEach(player -> {
Region region = Region.getRegion(player.getLocation());
if (region.getType().isGlobal()) return;
showRegion(region, player);
});
}, 20, 20);
@LinkedTimer(delay = 20, period = 20)
private void showBoundaries() {
if (viewers.isEmpty()) {
return;
}
viewers.forEach(player -> {
Region region = Region.getRegion(player.getLocation());
if (region.getType().isGlobal()) return;
showRegion(region, player);
});
}
private void showRegion(Region region, Player player) {
@@ -23,6 +23,7 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.core.CRIUWakeupEvent;
import de.steamwar.core.CheckpointUtils;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -38,17 +39,16 @@ public class AFKStopperListener implements Listener {
private long lastMovementTime = System.currentTimeMillis();
public AFKStopperListener() {
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
long currentTime = System.currentTimeMillis();
if (currentTime - lastMovementTime > 10 * 60000) { // 10 Minutes
for (Player p : Bukkit.getOnlinePlayers()) {
p.kickPlayer(BauSystem.MESSAGE.parse("AFK_KICK_MESSAGE", p));
}
} else if (currentTime - lastMovementTime > 9 * 60000) {
BauSystem.MESSAGE.broadcast("AFK_WARNING_MESSAGE");
@LinkedTimer(delay = 1, period = 1, unit = LinkedTimer.Unit.MINUTES)
private void checkAfk() {
long currentTime = System.currentTimeMillis();
if (currentTime - lastMovementTime > 10 * 60000) { // 10 Minutes
for (Player p : Bukkit.getOnlinePlayers()) {
p.kickPlayer(BauSystem.MESSAGE.parse("AFK_KICK_MESSAGE", p));
}
}, 1200, 1200); //every minute
} else if (currentTime - lastMovementTime > 9 * 60000) {
BauSystem.MESSAGE.broadcast("AFK_WARNING_MESSAGE");
}
}
@EventHandler