From d657f9871d2b6d91399f181e681096158cde390d Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Tue, 8 Jul 2025 22:16:52 +0200 Subject: [PATCH] Update and integrate legacy system --- .../bausystem/utils/TickManager15.java | 140 ++++++++++++++ .../bausystem/utils/tps}/PacketCache.java | 26 +-- .../bausystem/utils/tps}/TPSFreezeUtils.java | 26 +-- .../bausystem/utils/tps}/TPSLimitUtils.java | 2 +- .../bausystem/utils/TickListener19.java | 3 +- ...eTickManager21.java => TickManager21.java} | 54 +++++- .../src/de/steamwar/bausystem/BauSystem.java | 8 +- .../features/script/lua/libs/TpsLib.java | 3 +- .../features/tpslimit/TPSCommand.java | 24 +-- .../features/tpslimit/TPSSystem.java | 183 ++++++++---------- .../modern/ModernTPSLimitCommand.java | 68 ------- .../tpslimit/modern/ModernTickCommand.java | 99 ---------- ...ativeTickManager.java => TickManager.java} | 20 +- 13 files changed, 333 insertions(+), 323 deletions(-) create mode 100644 BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java rename BauSystem/{BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit => BauSystem_15/src/de/steamwar/bausystem/utils/tps}/PacketCache.java (83%) rename BauSystem/{BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit => BauSystem_15/src/de/steamwar/bausystem/utils/tps}/TPSFreezeUtils.java (65%) rename BauSystem/{BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit => BauSystem_15/src/de/steamwar/bausystem/utils/tps}/TPSLimitUtils.java (98%) rename BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/{NativeTickManager21.java => TickManager21.java} (67%) delete mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTPSLimitCommand.java delete mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTickCommand.java rename BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/{NativeTickManager.java => TickManager.java} (74%) diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java new file mode 100644 index 00000000..a888e4de --- /dev/null +++ b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java @@ -0,0 +1,140 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.utils; + +import de.steamwar.bausystem.region.GlobalRegion; +import de.steamwar.bausystem.utils.bossbar.BossBarService; +import de.steamwar.bausystem.utils.tps.TPSFreezeUtils; +import de.steamwar.bausystem.utils.tps.TPSLimitUtils; +import de.steamwar.core.TPSWarpUtils; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class TickManager15 implements TickManager, Listener { + + private static float currentTPSLimit = 20; + private boolean currentlyStepping = false; + private float currentLimit; + private int stepsTotal; + private int stepsLeft; + + @Override + public boolean canFreeze() { + return TPSFreezeUtils.isCanFreeze(); + } + + @Override + public void setTickRate(float tickRate) { + if (currentlyStepping) { + currentlyStepping = false; + Bukkit.getOnlinePlayers().forEach(player -> { + BossBarService.instance.remove(player, GlobalRegion.getInstance(), "TickStep"); + }); + } + TPSWarpUtils.warp(tickRate); + if (currentTPSLimit == 0 && tickRate != 0) { + TPSFreezeUtils.unfreeze(); + } + currentTPSLimit = tickRate; + if (tickRate == 0) { + TPSLimitUtils.unlimit(); + TPSFreezeUtils.freeze(); + } else if (tickRate < 20.0) { + TPSLimitUtils.limit(tickRate); + } else if (tickRate >= 20) { + TPSLimitUtils.unlimit(); + } + } + + @Override + public boolean isFrozen() { + return TPSFreezeUtils.frozen(); + } + + @Override + public void setFreeze(boolean freeze) { + if (freeze) { + setTickRate(0); + } + } + + @Override + public void stepTicks(int ticks) { + currentLimit = 0; + setTickRate(20); + stepsLeft = ticks; + stepsTotal = ticks; + currentlyStepping = true; + } + + @Override + public void sprintTicks(int ticks) { + currentLimit = currentTPSLimit; + setTickRate(4000); + stepsLeft = ticks; + stepsTotal = ticks; + currentlyStepping = true; + } + + @Override + public boolean isSprinting() { + return currentlyStepping && currentTPSLimit > 20; + } + + @Override + public boolean isStepping() { + return currentlyStepping && currentTPSLimit <= 20; + } + + @Override + public float getTickRate() { + return currentTPSLimit; + } + + @Override + public void blockTpsPacket(boolean block) { + + } + + @Override + public long getTotalTicks() { + return stepsTotal; + } + + @Override + public long getDoneTicks() { + return stepsTotal - stepsLeft; + } + + @Override + public long getRemainingTicks() { + return stepsLeft; + } + + @EventHandler + public void onTickEnd(TickEndEvent event) { + if (!currentlyStepping) return; + stepsLeft--; + if (stepsLeft <= 0) { + setTickRate(currentLimit); + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/PacketCache.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/PacketCache.java similarity index 83% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/PacketCache.java rename to BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/PacketCache.java index a53bd819..63308284 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/PacketCache.java +++ b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/PacketCache.java @@ -1,23 +1,23 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ -package de.steamwar.bausystem.features.tpslimit; +package de.steamwar.bausystem.utils.tps; import de.steamwar.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSFreezeUtils.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSFreezeUtils.java similarity index 65% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSFreezeUtils.java rename to BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSFreezeUtils.java index cb79f6fb..bed7f7e6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSFreezeUtils.java +++ b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSFreezeUtils.java @@ -1,23 +1,23 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ -package de.steamwar.bausystem.features.tpslimit; +package de.steamwar.bausystem.utils.tps; import de.steamwar.Reflection; import lombok.Getter; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitUtils.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSLimitUtils.java similarity index 98% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitUtils.java rename to BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSLimitUtils.java index 29068ace..8b58b00a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitUtils.java +++ b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSLimitUtils.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.tpslimit; +package de.steamwar.bausystem.utils.tps; import de.steamwar.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; diff --git a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java b/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java index 5191b38b..211c004b 100644 --- a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java +++ b/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java @@ -22,7 +22,6 @@ package de.steamwar.bausystem.utils; import com.destroystokyo.paper.event.server.ServerTickEndEvent; import com.destroystokyo.paper.event.server.ServerTickStartEvent; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -37,7 +36,7 @@ public class TickListener19 implements TickListener, Listener { @EventHandler public void onServerTickStart(ServerTickStartEvent event) { - if (TPSFreezeUtils.isFrozen()) return; + if (TickManager.impl.isFrozen()) return; Bukkit.getPluginManager().callEvent(new TickStartEvent()); tickStartRan = true; } diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NativeTickManager21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java similarity index 67% rename from BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NativeTickManager21.java rename to BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java index 728870a9..fe60c8c4 100644 --- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NativeTickManager21.java +++ b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java @@ -20,18 +20,23 @@ package de.steamwar.bausystem.utils; import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.Reflection; import net.minecraft.network.protocol.game.ClientboundTickingStatePacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerTickRateManager; +import net.minecraft.world.TickRateManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -public class NativeTickManager21 implements NativeTickManager { +public class TickManager21 implements TickManager { private static final ServerTickRateManager manager = MinecraftServer.getServer().tickRateManager(); + private static final Reflection.Field frozenTicksToRun = Reflection.getField(TickRateManager.class, int.class, 0); + private static final Reflection.Field remainingSprintTicks = Reflection.getField(ServerTickRateManager.class, long.class, 0); private boolean blockTpsPacket = true; + private int totalSteps; - public NativeTickManager21() { + public TickManager21() { TinyProtocol.instance.addFilter(ClientboundTickingStatePacket.class, this::blockPacket); } @@ -43,6 +48,11 @@ public class NativeTickManager21 implements NativeTickManager { } } + @Override + public boolean canFreeze() { + return true; + } + @Override public void blockTpsPacket(boolean block) { blockTpsPacket = block; @@ -57,14 +67,14 @@ public class NativeTickManager21 implements NativeTickManager { @Override public void setTickRate(float tickRate) { - if (getFreezeState()) { + if (isFrozen()) { setFreeze(false); } manager.setTickRate(tickRate); } @Override - public boolean getFreezeState() { + public boolean isFrozen() { return manager.isFrozen(); } @@ -74,12 +84,20 @@ public class NativeTickManager21 implements NativeTickManager { } @Override - public void stepTick(int ticks) { + public void stepTicks(int ticks) { + if (manager.isSprinting()) { + manager.stopSprinting(); + } + this.totalSteps = ticks; manager.stepGameIfPaused(ticks); } @Override public void sprintTicks(int ticks) { + if (manager.isSteppingForward()) { + manager.stopStepping(); + } + this.totalSteps = ticks; manager.requestGameToSprint(ticks, true); } @@ -89,7 +107,31 @@ public class NativeTickManager21 implements NativeTickManager { } @Override - public float tickrate() { + public boolean isStepping() { + return manager.isSteppingForward(); + } + + @Override + public float getTickRate() { return manager.tickrate(); } + + @Override + public long getRemainingTicks() { + if (isSprinting()) { + return remainingSprintTicks.get(manager); + } else { + return frozenTicksToRun.get(manager); + } + } + + @Override + public long getDoneTicks() { + return totalSteps - getRemainingTicks(); + } + + @Override + public long getTotalTicks() { + return totalSteps; + } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 8376f0f1..1d47beb8 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -19,7 +19,6 @@ package de.steamwar.bausystem; -import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.ConfigConverter; @@ -29,7 +28,6 @@ import de.steamwar.bausystem.features.script.lua.libs.LuaLib; import de.steamwar.bausystem.features.slaves.laufbau.BoundingBoxLoader; import de.steamwar.bausystem.features.slaves.panzern.Panzern; import de.steamwar.bausystem.features.slaves.panzern.PanzernAlgorithm; -import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils; import de.steamwar.bausystem.features.tracer.TraceManager; import de.steamwar.bausystem.features.tracer.TraceRecorder; import de.steamwar.bausystem.features.world.BauScoreboard; @@ -39,11 +37,13 @@ import de.steamwar.bausystem.region.loader.RegionLoader; import de.steamwar.bausystem.region.loader.Updater; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.TickListener; +import de.steamwar.bausystem.utils.TickManager; import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.command.AbstractValidator; import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommandUtils; import de.steamwar.core.Core; +import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.linkage.LinkedInstance; import de.steamwar.linkage.MaxVersion; import de.steamwar.linkage.MinVersion; @@ -266,7 +266,7 @@ public class BauSystem extends JavaPlugin { @Override public void run() { - if (TPSFreezeUtils.isFrozen()) return; + if (TickManager.impl.isFrozen()) return; if (counter >= delay) { runnable.run(); cancel(); @@ -284,7 +284,7 @@ public class BauSystem extends JavaPlugin { @Override public void run() { - if (TPSFreezeUtils.isFrozen()) return; + if (TickManager.impl.isFrozen()) return; if (counter >= (first ? delay : period)) { first = false; runnable.run(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TpsLib.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TpsLib.java index 6b9435e1..44d9a378 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TpsLib.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TpsLib.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.script.lua.libs; import de.steamwar.bausystem.features.tpslimit.TPSSystem; +import de.steamwar.bausystem.utils.TickManager; import de.steamwar.core.TPSWatcher; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; @@ -51,7 +52,7 @@ public class TpsLib implements LuaLib { tpsLib.set("fiveMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES))); tpsLib.set("tenMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES))); tpsLib.set("current", getter(TPSWatcher::getTPS)); - tpsLib.set("limit", getter(TPSSystem::getCurrentTPSLimit)); + tpsLib.set("limit", getter(() -> (double) TickManager.impl.getTickRate())); return tpsLib; } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSCommand.java index c1d09c63..f3f4cc62 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSCommand.java @@ -1,20 +1,20 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.features.tpslimit; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java index 46dc7257..f87c21b3 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java @@ -25,23 +25,19 @@ import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.utils.NativeTickManager; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.TickEndEvent; +import de.steamwar.bausystem.utils.TickManager; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; import de.steamwar.bausystem.utils.bossbar.BossBarService; import de.steamwar.command.AbstractSWCommand; import de.steamwar.command.SWCommand; import de.steamwar.core.Core; -import de.steamwar.core.TPSWarpUtils; import de.steamwar.core.TPSWatcher; import de.steamwar.inventory.SWAnvilInv; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; -import de.steamwar.linkage.MaxVersion; -import lombok.Getter; -import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.boss.BarColor; @@ -54,90 +50,61 @@ import org.bukkit.inventory.ItemStack; import java.util.Arrays; @Linked -@MaxVersion(20) public class TPSSystem implements Listener { - private static double currentTPSLimit = 20; - public TPSSystem() { - if (TPSFreezeUtils.isCanFreeze()) { + if (TickManager.impl.canFreeze()) { new TPSFreezeCommand(); new TickFreezeCommand(); new TickStepCommand(); } new TPSLimitCommand(); new TickLimitCommand(); - if (Core.getVersion() >= 15 && Core.getVersion() <= 20) { + if (Core.getVersion() >= 15) { new TPSWarpCommand(); new TickWarpCommand(); - if (TPSFreezeUtils.isCanFreeze()) { + if (TickManager.impl.canFreeze()) { new TickWarpingCommand(); } } + if (Core.getVersion() >= 21) { + new Tick21Command(); + } new TPSDefaultCommand(); new TickDefaultCommand(); new TPSBaseCommand(); new TickBaseCommand(); - } - - private void setTPS(double tps) { - if (currentlyStepping) { - currentlyStepping = false; - Bukkit.getOnlinePlayers().forEach(player -> { - BossBarService.instance.remove(player, GlobalRegion.getInstance(), "TickStep"); - }); - } - TPSWarpUtils.warp(tps); - if (currentTPSLimit == 0 && tps != 0) { - TPSFreezeUtils.unfreeze(); - } - currentTPSLimit = tps; - if (tps == 0) { - TPSLimitUtils.unlimit(); - TPSFreezeUtils.freeze(); - } else if (tps < 20.0) { - TPSLimitUtils.limit(tps); - } else if (tps >= 20) { - TPSLimitUtils.unlimit(); - } - - Bukkit.getOnlinePlayers().forEach(player -> { - if (currentTPSLimit == 0) { - SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("TPSLIMIT_FROZEN", player)); - } else { - SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("TPSLIMIT_SET", player, currentTPSLimit)); - } - }); - } - - private boolean currentlyStepping = false; - private double currentLimit; - private int stepsTotal; - private int stepsLeft; - - private void setSkip(int steps, double tpsLimitToUse) { - currentLimit = tpsLimitToUse == 20 ? 0 : currentTPSLimit; - setTPS(tpsLimitToUse); - stepsLeft = steps; - stepsTotal = steps; - currentlyStepping = true; + Bukkit.getPluginManager().registerEvents(TickManager.impl, BauSystem.getInstance()); } @EventHandler public void onTickEnd(TickEndEvent event) { - if (!currentlyStepping) return; - if (stepsTotal > 1) { + bossbar(); + } + + private void bossbar() { + if ((TickManager.impl.isStepping() || TickManager.impl.isSprinting()) && TickManager.impl.getRemainingTicks() > 0) { Bukkit.getOnlinePlayers().forEach(player -> { BauSystemBossbar bossbar = BossBarService.instance.get(player, GlobalRegion.getInstance(), "TickStep"); bossbar.setColor(BarColor.YELLOW); - bossbar.setTitle(BauSystem.MESSAGE.parse("TICK_BOSSBAR", player, (stepsTotal - stepsLeft), stepsTotal)); - bossbar.setProgress((stepsTotal - stepsLeft) / (double) stepsTotal); + bossbar.setTitle(BauSystem.MESSAGE.parse("TICK_BOSSBAR", player, TickManager.impl.getDoneTicks(), TickManager.impl.getTotalTicks())); + bossbar.setProgress(TickManager.impl.getDoneTicks() / (double) TickManager.impl.getTotalTicks()); + }); + } else { + Bukkit.getOnlinePlayers().forEach(player -> { + BossBarService.instance.remove(player, GlobalRegion.getInstance(), "TickStep"); }); } - stepsLeft--; - if (stepsLeft <= 0) { - setTPS(currentLimit); - } + } + + public static void sendTickRateChange() { + Bukkit.getOnlinePlayers().forEach(player -> { + if (TickManager.impl.isFrozen()) { + SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("TPSLIMIT_FROZEN", player)); + } else { + SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("TPSLIMIT_SET", player, TickManager.impl.getTickRate())); + } + }); } private class TPSBaseCommand extends SWCommand { @@ -158,7 +125,8 @@ public class TPSSystem implements Listener { @Register(value = "0", description = "TPSLIMIT_FREEZE_HELP") public void freeze(@Validator Player player) { - setTPS(0); + TickManager.impl.setFreeze(true); + sendTickRateChange(); } } @@ -170,8 +138,9 @@ public class TPSSystem implements Listener { } @Register(description = "TPSLIMIT_LIMIT_HELP") - public void limit(@Validator Player player, @Min(doubleValue = 0.5) @Max(doubleValue = 20.0) double tpsLimit) { - setTPS(tpsLimit); + public void limit(@Validator Player player, @Min(doubleValue = 0.5) @Max(doubleValue = 20.0) float tpsLimit) { + TickManager.impl.setTickRate(tpsLimit); + sendTickRateChange(); } } @@ -183,8 +152,9 @@ public class TPSSystem implements Listener { } @Register(description = "TPSLIMIT_WARP_HELP") - public void warp(@Validator Player player, @Min(doubleValue = 20.0, inclusive = false) double tpsLimit) { - setTPS(tpsLimit); + public void warp(@Validator Player player, @Min(doubleValue = 20.0, inclusive = false) float tpsLimit) { + TickManager.impl.setTickRate(tpsLimit); + sendTickRateChange(); } } @@ -197,12 +167,13 @@ public class TPSSystem implements Listener { @Register(description = "TPSLIMIT_HELP") public void currentLimit(Player player) { - BauSystem.MESSAGE.send("TPSLIMIT_CURRENT", player, currentTPSLimit); + BauSystem.MESSAGE.send("TPSLIMIT_CURRENT", player, TickManager.impl.getTickRate()); } @Register(value = "default", description = "TPSLIMIT_DEFAULT_HELP") public void reset(@Validator Player player) { - setTPS(20); + TickManager.impl.setTickRate(20.0F); + sendTickRateChange(); } } @@ -224,12 +195,14 @@ public class TPSSystem implements Listener { @Register(value = {"rate", "0"}, description = "TICK_FREEZE_HELP") @Register(value = "freeze", description = "TICK_FREEZE_HELP_2") public void freeze(@Validator Player player) { - setTPS(0); + TickManager.impl.setFreeze(true); + sendTickRateChange(); } @Register(value = "unfreeze", description = "TICK_UNFREEZE_HELP") public void unfreeze(@Validator Player player) { - setTPS(20); + TickManager.impl.setTickRate(20.0F); + sendTickRateChange(); } } @@ -242,7 +215,9 @@ public class TPSSystem implements Listener { @Register(value = "step", description = "TICK_STEPPING_HELP") public void step(@Validator Player player, @Min(intValue = 1) @OptionalValue("1") int steps) { - setSkip(steps, 20); + TickManager.impl.stepTicks(steps); + sendTickRateChange(); + bossbar(); } } @@ -254,8 +229,9 @@ public class TPSSystem implements Listener { } @Register(value = "warp", description = "TICK_WARPING_HELP") - public void warp(@Validator Player player, @Min(intValue = 1) @OptionalValue("1") int steps, @Min(doubleValue = 20) @OptionalValue("4000") double tps) { - setSkip(steps, tps); + public void warp(@Validator Player player, @Min(intValue = 1) @OptionalValue("1") int steps) { + TickManager.impl.sprintTicks(steps); + sendTickRateChange(); } } @@ -267,8 +243,9 @@ public class TPSSystem implements Listener { } @Register(value = "rate", description = "TICK_LIMIT_HELP") - public void limit(@Validator Player player, @Min(doubleValue = 0.5, inclusive = false) @Max(doubleValue = 20.0) double tpsLimit) { - setTPS(tpsLimit); + public void limit(@Validator Player player, @Min(doubleValue = 0.5, inclusive = false) @Max(doubleValue = 20.0) float tpsLimit) { + TickManager.impl.setTickRate(tpsLimit); + sendTickRateChange(); } } @@ -280,8 +257,9 @@ public class TPSSystem implements Listener { } @Register(value = "rate", description = "TICK_WARP_HELP") - public void warp(@Validator Player player, @Min(doubleValue = 20.0, inclusive = false) double tpsLimit) { - setTPS(tpsLimit); + public void warp(@Validator Player player, @Min(doubleValue = 20.0, inclusive = false) float tpsLimit) { + TickManager.impl.setTickRate(tpsLimit); + sendTickRateChange(); } } @@ -294,12 +272,31 @@ public class TPSSystem implements Listener { @Register(value = "rate", description = "TICK_HELP") public void currentLimit(Player player) { - BauSystem.MESSAGE.send("TPSLIMIT_CURRENT", player, currentTPSLimit); + BauSystem.MESSAGE.send("TPSLIMIT_CURRENT", player, TickManager.impl.getTickRate()); } @Register(value = {"rate", "default"}, description = "TICK_DEFAULT_HELP") public void reset(@Validator Player player) { - setTPS(20); + TickManager.impl.setTickRate(20.0F); + sendTickRateChange(); + } + } + + @AbstractSWCommand.PartOf(TickBaseCommand.class) + private class Tick21Command extends SWCommand { + + private Tick21Command() { + super(""); + } + + @Register(value = "normalclient") + public void smooth(@Validator Player player) { + TickManager.impl.blockTpsPacket(true); + } + + @Register(value = "slowclient") + public void unsmooth(@Validator Player player) { + TickManager.impl.blockTpsPacket(false); } } @@ -321,12 +318,8 @@ public class TPSSystem implements Listener { @Override public String get(Region region, Player p) { - boolean isWarping = tpsSystem.currentlyStepping; - boolean isFrozen = TPSFreezeUtils.frozen(); - if (Core.getVersion() >= 21) { - isWarping = NativeTickManager.impl.isSprinting(); - isFrozen = NativeTickManager.impl.getFreezeState(); - } + boolean isWarping = TickManager.impl.isSprinting(); + boolean isFrozen = TickManager.impl.isFrozen(); if (tpsSystem != null && isWarping) { long time = System.currentTimeMillis() % 1000; @@ -348,28 +341,20 @@ public class TPSSystem implements Listener { private String tpsColor() { double tps = TPSWatcher.getTPSUnlimited(TPSWatcher.TPSType.ONE_SECOND); - if (tps > TPSSystem.getCurrentTPSLimit() * 0.9) { + if (tps > TickManager.impl.getTickRate() * 0.9) { return "§a"; } - if (tps > TPSSystem.getCurrentTPSLimit() * 0.5) { + if (tps > TickManager.impl.getTickRate() * 0.5) { return "§e"; } return "§c"; } private String tpsLimit() { - if (TPSSystem.getCurrentTPSLimit() == 20) { + if (TickManager.impl.getTickRate() == 20) { return ""; } - return "§8/§7" + TPSSystem.getCurrentTPSLimit(); - } - } - - public static double getCurrentTPSLimit() { - if (Core.getVersion() >= 21) { - return NativeTickManager.impl.tickrate(); - } else { - return currentTPSLimit; + return "§8/§7" + TickManager.impl.getTickRate(); } } @@ -385,7 +370,7 @@ public class TPSSystem implements Listener { @Override public ItemStack getItem(Player player) { - return new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("TPSLIMIT_GUI_ITEM_NAME", player), Arrays.asList(BauSystem.MESSAGE.parse("TPSLIMIT_GUI_ITEM_LORE", player, tpsSystem.currentTPSLimit)), false, clickType -> { + return new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("TPSLIMIT_GUI_ITEM_NAME", player), Arrays.asList(BauSystem.MESSAGE.parse("TPSLIMIT_GUI_ITEM_LORE", player, TickManager.impl.getTickRate())), false, clickType -> { }).getItemStack(); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTPSLimitCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTPSLimitCommand.java deleted file mode 100644 index 4d2295c0..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTPSLimitCommand.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2025 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.features.tpslimit.modern; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.utils.NativeTickManager; -import de.steamwar.command.SWCommand; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; -import org.bukkit.entity.Player; - -import static de.steamwar.bausystem.features.tpslimit.modern.ModernTickCommand.sendTickRateChange; - -@Linked -@MinVersion(21) -public class ModernTPSLimitCommand extends SWCommand { - public ModernTPSLimitCommand() { - super("tpslimit"); - setMessage(BauSystem.MESSAGE); - addDefaultHelpMessage("TPSLIMIT_HELP"); - } - - @Register(value = "0", description = "TPSLIMIT_FREEZE_HELP") - public void freeze(@Validator Player player) { - NativeTickManager.impl.setFreeze(true); - sendTickRateChange(); - } - - @Register(description = "TPSLIMIT_LIMIT_HELP") - public void limit(@Validator Player player, @Min(doubleValue = 0.5) @Max(doubleValue = 20.0) float tpsLimit) { - NativeTickManager.impl.setTickRate(tpsLimit); - sendTickRateChange(); - } - - @Register(description = "TPSLIMIT_WARP_HELP") - public void warp(@Validator Player player, @Min(doubleValue = 20.0, inclusive = false) float tpsLimit) { - NativeTickManager.impl.setTickRate(tpsLimit); - sendTickRateChange(); - } - - @Register(description = "TPSLIMIT_HELP") - public void currentLimit(Player player) { - BauSystem.MESSAGE.send("TPSLIMIT_CURRENT", player, NativeTickManager.impl.tickrate()); - } - - @Register(value = "default", description = "TPSLIMIT_DEFAULT_HELP") - public void reset(@Validator Player player) { - NativeTickManager.impl.setTickRate(20); - sendTickRateChange(); - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTickCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTickCommand.java deleted file mode 100644 index 057658b5..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/modern/ModernTickCommand.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2025 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.features.tpslimit.modern; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.utils.NativeTickManager; -import de.steamwar.command.SWCommand; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; - -@Linked -@MinVersion(21) -public class ModernTickCommand extends SWCommand implements Listener { - public ModernTickCommand() { - super("tick"); - setMessage(BauSystem.MESSAGE); - } - - public static void sendTickRateChange() { - Bukkit.getOnlinePlayers().forEach(player -> { - if (NativeTickManager.impl.getFreezeState()) { - SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("TPSLIMIT_FROZEN", player)); - } else { - SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("TPSLIMIT_SET", player, NativeTickManager.impl.tickrate())); - } - }); - } - - @Register(value = {"rate", "0"}, description = "TICK_FREEZE_HELP") - @Register(value = "freeze", description = "TICK_FREEZE_HELP_2") - public void freeze(@Validator Player player) { - NativeTickManager.impl.setFreeze(true); - sendTickRateChange(); - } - - @Register(value = "unfreeze", description = "TICK_UNFREEZE_HELP") - public void unfreeze(@Validator Player player) { - NativeTickManager.impl.setFreeze(false); - sendTickRateChange(); - } - - @Register(value = "step", description = "TICK_STEPPING_HELP") - public void step(@Validator Player player, @Min(intValue = 1) @OptionalValue("1") int steps) { - NativeTickManager.impl.stepTick(steps); - } - - @Register(value = "warp", description = "TICK_WARP_HELP") - public void warp(@Validator Player player, @Min(intValue = 1) @OptionalValue("1") int steps) { - NativeTickManager.impl.sprintTicks(steps); - } - - @Register(value = "rate", description = "TICK_LIMIT_HELP") - public void limit(@Validator Player player, @Min(doubleValue = 0.5, inclusive = false) float tpsLimit) { - NativeTickManager.impl.setTickRate(tpsLimit); - sendTickRateChange(); - } - - @Register(value = "rate", description = "TICK_HELP") - public void currentLimit(Player player) { - BauSystem.MESSAGE.send("TPSLIMIT_CURRENT", player, NativeTickManager.impl.tickrate()); - } - - @Register(value = {"rate", "default"}, description = "TICK_DEFAULT_HELP") - public void reset(@Validator Player player) { - NativeTickManager.impl.setTickRate(20); - sendTickRateChange(); - } - - @Register(value = "normalclient") - public void smooth(@Validator Player player) { - NativeTickManager.impl.blockTpsPacket(true); - } - - @Register(value = "slowclient") - public void unsmooth(@Validator Player player) { - NativeTickManager.impl.blockTpsPacket(false); - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NativeTickManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java similarity index 74% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NativeTickManager.java rename to BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java index 7dadf98f..7777c52a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NativeTickManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java @@ -21,16 +21,26 @@ package de.steamwar.bausystem.utils; import de.steamwar.bausystem.BauSystem; import de.steamwar.core.VersionDependent; +import org.bukkit.event.Listener; -public interface NativeTickManager { - NativeTickManager impl = VersionDependent.getVersionImpl(BauSystem.getInstance()); +public interface TickManager extends Listener { + TickManager impl = VersionDependent.getVersionImpl(BauSystem.getInstance()); void setTickRate(float tickRate); - boolean getFreezeState(); + float getTickRate(); + + boolean canFreeze(); void setFreeze(boolean freeze); - void stepTick(int ticks); + boolean isFrozen(); + + void stepTicks(int ticks); + boolean isStepping(); + void sprintTicks(int ticks); boolean isSprinting(); - float tickrate(); + void blockTpsPacket(boolean block); + long getRemainingTicks(); + long getDoneTicks(); + long getTotalTicks(); }