From 50c18084b40d6f915737566c5d4236e331aaaf54 Mon Sep 17 00:00:00 2001 From: jojo Date: Sun, 15 Nov 2020 13:42:19 +0100 Subject: [PATCH] Fix BauScoreboard Fix TPSLimiter --- .../bausystem/commands/CommandTPSLimiter.java | 99 ++++++++++++++----- .../CommandTPSLimiterTabComplete.java | 19 ++++ .../bausystem/world/BauScoreboard.java | 2 +- 3 files changed, 94 insertions(+), 26 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java index c5daea6..af5d181 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java @@ -1,49 +1,65 @@ +/* + 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.commands; import de.steamwar.bausystem.BauSystem; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; +import net.minecraft.server.v1_15_R1.PacketPlayOutEntityVelocity; +import net.minecraft.server.v1_15_R1.PlayerConnection; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.World; +import org.bukkit.block.data.type.TNT; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; +import org.bukkit.scheduler.BukkitTask; public class CommandTPSLimiter implements CommandExecutor { private static int currentTPSLimit = 20; private static World world = Bukkit.getWorlds().get(0); - private long lastTime = System.currentTimeMillis(); - private long currentTime = System.currentTimeMillis(); + private long lastTime = System.nanoTime(); + private long currentTime = System.nanoTime(); + + private BukkitTask tpsLimiter = null; public CommandTPSLimiter() { - Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> { - lastTime = currentTime; - currentTime = System.currentTimeMillis(); - - long timeDelta = currentTime - lastTime; - long neededDelta = 1000 / currentTPSLimit; - - if (neededDelta - timeDelta < 1) { - return; - } - - try { - Thread.sleep(neededDelta - timeDelta); - currentTime = System.currentTimeMillis(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }, 0, 1); Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> { if (currentTPSLimit == 20) { return; } + /*PacketPlayOutEntityVelocity packet = new PacketPlayOutEntityVelocity(entity); + for(Player player : Bukkit.getOnlinePlayers()){ + PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; + connection.sendPacket(packet); + } + world.getEntities().stream().filter(entity -> entity instanceof TNT).forEach(entity -> entity.setVelocity(0, 0, 0));*/ + world.getEntities().stream().filter(entity -> entity instanceof TNTPrimed).forEach(entity -> { Location location = entity.getLocation(); world.spawnParticle(Particle.BARRIER, location.getX(), location.getY() + 0.49, location.getZ(), 1); @@ -65,7 +81,8 @@ public class CommandTPSLimiter implements CommandExecutor { String tpsLimit = args[0]; if (tpsLimit.equals("default")) { currentTPSLimit = 20; - sendNewTPSLimitMessage(player); + sendNewTPSLimitMessage(); + tpsLimiter(); return false; } @@ -76,7 +93,8 @@ public class CommandTPSLimiter implements CommandExecutor { return false; } currentTPSLimit = tpsLimitInt; - sendNewTPSLimitMessage(player); + sendNewTPSLimitMessage(); + tpsLimiter(); } catch (NumberFormatException e) { sendInvalidArgumentMessage(player); } @@ -84,17 +102,48 @@ public class CommandTPSLimiter implements CommandExecutor { return false; } - private void sendNewTPSLimitMessage(Player player) { - player.sendMessage(BauSystem.PREFIX + "TPS limit auf " + currentTPSLimit + " gesetzt."); + private void sendNewTPSLimitMessage() { Bukkit.getOnlinePlayers().forEach(p -> p.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText("§eTPS limit auf " + currentTPSLimit + " gesetzt."))); } private void sendInvalidArgumentMessage(Player player) { - player.sendMessage(BauSystem.PREFIX + "Nur Zahlen zwischen 1 und 20, und 'default' erlaubt."); + player.sendMessage(BauSystem.PREFIX + "§cNur Zahlen zwischen 1 und 20, und 'default' erlaubt."); + } + + private void tpsLimiter() { + if (currentTPSLimit == 20) { + if (tpsLimiter == null) return; + tpsLimiter.cancel(); + tpsLimiter = null; + } else { + if (tpsLimiter != null) return; + tpsLimiter = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> { + lastTime = currentTime; + currentTime = System.nanoTime(); + + long timeDelta = (currentTime - lastTime) / 1000000; + long neededDelta = 1000 / currentTPSLimit; + + if (neededDelta - timeDelta < 1) { + return; + } + + try { + Thread.sleep(neededDelta - timeDelta); + currentTime = System.nanoTime(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }, 0, 1); + } } public static int getCurrentTPSLimit() { return currentTPSLimit; } + private void setMotion(Entity entity) { + + } + } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiterTabComplete.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiterTabComplete.java index a250019..9b401ee 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiterTabComplete.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiterTabComplete.java @@ -1,3 +1,22 @@ +/* + 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.commands; import org.bukkit.command.Command; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java index e1fb722..3c05bdd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java @@ -76,7 +76,7 @@ public class BauScoreboard implements Listener { if (CommandTPSLimiter.getCurrentTPSLimit() == 20) { strings.add("§eTPS§8: §7" + TPSWatcher.getTPS()); } else { - strings.add("§eTPS§8: §7" + TPSWatcher.getTPS() + " §eLimit§8: §7" + CommandTPSLimiter.getCurrentTPSLimit()); + strings.add("§eTPS§8: §7" + TPSWatcher.getTPS() + "§8/§7" + CommandTPSLimiter.getCurrentTPSLimit()); } int i = strings.size();