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
@@ -20,6 +20,7 @@
package de.steamwar.lobby.jumpandrun;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import de.steamwar.lobby.LobbySystem;
import de.steamwar.lobby.listener.PlayerSpawn;
import de.steamwar.lobby.util.LeaderboardManager;
@@ -60,52 +61,51 @@ public class JumpAndRun implements Listener {
private static final LeaderboardManager LEADERBOARD = new LeaderboardManager(LobbySystem.getEntityServer(false), JUMP_AND_RUN_CONFIG, new Location(Bukkit.getWorlds().get(0), 2338.5, 42.5, 1231.5));
{
Bukkit.getScheduler().runTaskTimer(LobbySystem.getInstance(), () -> {
Set<Player> toReset = new HashSet<>();
CURRENT_POS.forEach((player, index) -> {
if (System.currentTimeMillis() - CLICKED.getOrDefault(player, 0L) > 500) {
CLICKED.remove(player);
CLICKED_COUNT.remove(player);
} else {
CLICKED_COUNT.put(player, CLICKED_COUNT.getOrDefault(player, -1) + 1);
}
@LinkedTimer(delay = 1, period = 1)
private void updatePlayers() {
Set<Player> toReset = new HashSet<>();
CURRENT_POS.forEach((player, index) -> {
if (System.currentTimeMillis() - CLICKED.getOrDefault(player, 0L) > 500) {
CLICKED.remove(player);
CLICKED_COUNT.remove(player);
} else {
CLICKED_COUNT.put(player, CLICKED_COUNT.getOrDefault(player, -1) + 1);
}
Location location = player.getLocation();
Vector point = points.get(index);
if (index < points.size() - 1) {
Vector nextPoint = points.get(index + 1);
double y = Math.min(point.getY(), nextPoint.getY()) - 2;
if (location.getY() < y) {
location.setX(point.getX());
location.setY(point.getY());
location.setZ(point.getZ());
player.teleport(location);
player.playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, 1, 1);
FAILS.put(player, FAILS.getOrDefault(player, 0) + 1);
}
Location location = player.getLocation();
Vector point = points.get(index);
if (index < points.size() - 1) {
Vector nextPoint = points.get(index + 1);
double y = Math.min(point.getY(), nextPoint.getY()) - 2;
if (location.getY() < y) {
location.setX(point.getX());
location.setY(point.getY());
location.setZ(point.getZ());
player.teleport(location);
player.playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, 1, 1);
FAILS.put(player, FAILS.getOrDefault(player, 0) + 1);
}
}
int count = CLICKED_COUNT.getOrDefault(player, -1);
if (count >= 0) {
if (count > 20) {
toReset.add(player);
return;
}
count = Math.min(count / 2, 30);
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_CANCEL", player, ChatMessageType.ACTION_BAR, "§e" + BAR_EMPTY.substring(0, count) + "§7" + BAR_EMPTY.substring(count));
} else {
long time = System.currentTimeMillis() - START.get(player);
SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT);
String parsed = format.format(new Date(time));
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed);
int count = CLICKED_COUNT.getOrDefault(player, -1);
if (count >= 0) {
if (count > 20) {
toReset.add(player);
return;
}
});
toReset.forEach(player -> {
reset(player);
player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, 0, 0.5));
});
}, 1, 1);
count = Math.min(count / 2, 30);
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_CANCEL", player, ChatMessageType.ACTION_BAR, "§e" + BAR_EMPTY.substring(0, count) + "§7" + BAR_EMPTY.substring(count));
} else {
long time = System.currentTimeMillis() - START.get(player);
SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT);
String parsed = format.format(new Date(time));
LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed);
}
});
toReset.forEach(player -> {
reset(player);
player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, 0, 0.5));
});
}
public static boolean isPlayerInJumpAndRun(Player player) {
@@ -20,7 +20,7 @@
package de.steamwar.lobby.listener;
import de.steamwar.linkage.Linked;
import de.steamwar.lobby.LobbySystem;
import de.steamwar.linkage.LinkedTimer;
import org.bukkit.*;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.type.Stairs;
@@ -34,7 +34,6 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashSet;
import java.util.Set;
@@ -46,15 +45,11 @@ public class PlayerSeatListener implements Listener {
private Set<Location> seats = new HashSet<>();
static {
new BukkitRunnable() {
@Override
public void run() {
for (Arrow arrow : world.getEntitiesByClass(Arrow.class)) {
arrow.setTicksLived(1);
}
}
}.runTaskTimer(LobbySystem.getInstance(), 20 * 60, 20 * 60);
@LinkedTimer(delay = 1, period = 1, unit = LinkedTimer.Unit.MINUTES)
private static void keepArrows() {
for (Arrow arrow : world.getEntitiesByClass(Arrow.class)) {
arrow.setTicksLived(1);
}
}
@EventHandler
@@ -20,7 +20,7 @@
package de.steamwar.lobby.particle;
import de.steamwar.linkage.Linked;
import de.steamwar.lobby.LobbySystem;
import de.steamwar.linkage.LinkedTimer;
import de.steamwar.lobby.jumpandrun.JumpAndRun;
import de.steamwar.lobby.listener.PlayerSpawn;
import de.steamwar.lobby.util.LobbyPlayer;
@@ -49,25 +49,24 @@ public class ParticleListener implements Listener {
private static Map<Player, Integer> movingPlayers = new HashMap<>();
public ParticleListener() {
Bukkit.getScheduler().runTaskTimer(LobbySystem.getInstance(), () -> {
movingPlayers.replaceAll((player, integer) -> integer - 1);
movingPlayers.entrySet().removeIf(entry -> entry.getValue() <= 0);
deg += 0.1;
if (deg > 360) deg = 0;
Bukkit.getOnlinePlayers().forEach(player -> {
if (disabled(player)) return;
if (JumpAndRun.isPlayerInJumpAndRun(player)) return;
LobbyPlayer lobbyPlayer = LobbyPlayer.getLobbyPlayer(player.getUniqueId());
ParticleEnum particle = lobbyPlayer.getParticle();
if (particle == null) return;
ParticleData particleData = particle.getParticle();
ParticleElement particleElement = particleData.getParticleElement();
if (particleElement.tickType() == ParticleTickType.ALWAYS) {
particleElement.tick(new ParticleTickData(player.getWorld(), player, deg, movingPlayers.containsKey(player)));
}
});
}, 0, 1);
@LinkedTimer(delay = 0, period = 1)
private void tickParticles() {
movingPlayers.replaceAll((player, integer) -> integer - 1);
movingPlayers.entrySet().removeIf(entry -> entry.getValue() <= 0);
deg += 0.1;
if (deg > 360) deg = 0;
Bukkit.getOnlinePlayers().forEach(player -> {
if (disabled(player)) return;
if (JumpAndRun.isPlayerInJumpAndRun(player)) return;
LobbyPlayer lobbyPlayer = LobbyPlayer.getLobbyPlayer(player.getUniqueId());
ParticleEnum particle = lobbyPlayer.getParticle();
if (particle == null) return;
ParticleData particleData = particle.getParticle();
ParticleElement particleElement = particleData.getParticleElement();
if (particleElement.tickType() == ParticleTickType.ALWAYS) {
particleElement.tick(new ParticleTickData(player.getWorld(), player, deg, movingPlayers.containsKey(player)));
}
});
}
@EventHandler(priority = EventPriority.NORMAL)
@@ -20,6 +20,7 @@
package de.steamwar.lobby.team;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedTimer;
import de.steamwar.lobby.LobbySystem;
import de.steamwar.lobby.display.NPC;
import de.steamwar.sql.SteamwarUser;
@@ -76,55 +77,58 @@ public class TeamPlayer implements Listener {
entities.put(name, npc);
}
private final AtomicInteger count = new AtomicInteger();
{
SteamwarUser.getServerTeam().forEach(user -> {
spawnTeamPlayer(world, user);
});
AtomicInteger count = new AtomicInteger();
LobbySystem.getInstance().getLogger().log(Level.INFO, "Loaded " + entities.size() + " team players");
Bukkit.getScheduler().runTaskTimer(LobbySystem.getInstance(), () -> {
Collection<Villager> active = world.getEntitiesByClass(Villager.class);
if (active.size() > entities.size()) {
Set<String> duplicates = new HashSet<>();
active.stream()
.filter(villager -> !duplicates.add(villager.getCustomName()))
.forEach(Entity::remove);
}
}
count.incrementAndGet();
if (count.get() % (20 * 60 * 60) == 0) {
count.set(0);
List<SteamwarUser> steamwarUsers = SteamwarUser.getServerTeam();
AtomicInteger added = new AtomicInteger();
steamwarUsers.forEach(user -> {
if (!entities.containsKey(user.getUserName())) {
spawnTeamPlayer(world, user);
added.incrementAndGet();
}
});
AtomicInteger removed = new AtomicInteger();
List<String> names = steamwarUsers.stream().map(SteamwarUser::getUserName).collect(Collectors.toList());
new HashSet<>(entities.keySet()).stream().filter(name -> !names.contains(name)).forEach(name -> {
villagers.remove(name).remove();
entities.remove(name).delete();
removed.incrementAndGet();
});
if (added.get() > 0 || removed.get() > 0) {
LobbySystem.getInstance().getLogger().log(Level.INFO, "Loaded " + added.get() + " team players, removed " + removed.get() + " team players");
}
}
world.getEntitiesByClasses(Villager.class).forEach(entity -> {
NPC npc = entities.get(entity.getName());
if (npc != null) {
if (illegalLocation(entity.getLocation())) {
entity.teleport(npc.getLocation());
return;
}
npc.setLocation(entity.getLocation());
@LinkedTimer(delay = 1, period = 1)
private void updateTeamPlayers() {
Collection<Villager> active = world.getEntitiesByClass(Villager.class);
if (active.size() > entities.size()) {
Set<String> duplicates = new HashSet<>();
active.stream()
.filter(villager -> !duplicates.add(villager.getCustomName()))
.forEach(Entity::remove);
}
count.incrementAndGet();
if (count.get() % (20 * 60 * 60) == 0) {
count.set(0);
List<SteamwarUser> steamwarUsers = SteamwarUser.getServerTeam();
AtomicInteger added = new AtomicInteger();
steamwarUsers.forEach(user -> {
if (!entities.containsKey(user.getUserName())) {
spawnTeamPlayer(world, user);
added.incrementAndGet();
}
});
}, 1L, 1L);
AtomicInteger removed = new AtomicInteger();
List<String> names = steamwarUsers.stream().map(SteamwarUser::getUserName).collect(Collectors.toList());
new HashSet<>(entities.keySet()).stream().filter(name -> !names.contains(name)).forEach(name -> {
villagers.remove(name).remove();
entities.remove(name).delete();
removed.incrementAndGet();
});
if (added.get() > 0 || removed.get() > 0) {
LobbySystem.getInstance().getLogger().log(Level.INFO, "Loaded " + added.get() + " team players, removed " + removed.get() + " team players");
}
}
world.getEntitiesByClasses(Villager.class).forEach(entity -> {
NPC npc = entities.get(entity.getName());
if (npc != null) {
if (illegalLocation(entity.getLocation())) {
entity.teleport(npc.getLocation());
return;
}
npc.setLocation(entity.getLocation());
}
});
}
private boolean illegalLocation(Location location) {