Script System Lua #178
@ -251,6 +251,18 @@ SCRIPT_MENU_GUI_ITEM_ADD_LORE = §7Click with a book to insert
|
||||
SCRIPT_MENU_GUI_ENTER_NAME = §eEnter a name
|
||||
|
||||
# Shield Printing
|
||||
SHIELD_PRINTING_HELP_START = §8/§eshieldprinting start §8- §7Starts the shield printing
|
||||
SHIELD_PRINTING_HELP_COPY = §8/§eshieldprinting copy §8- §7Copies the shield configuration
|
||||
SHIELD_PRINTING_HELP_APPLY = §8/§eshieldprinting apply §8- §7Applies the shield configuration
|
||||
SHIELD_PRINTING_HELP_STOP = §8/§eshieldprinting stop §8- §7Stops the shield printing
|
||||
SHIELD_PRINTING_HELP_STEP_1 = §81. §7Paste the schematic you want to use
|
||||
SHIELD_PRINTING_HELP_STEP_2 = §82. §7Start the shield printing with §8/§eshieldprinting start
|
||||
SHIELD_PRINTING_HELP_STEP_3 = §83. §7Wait until the shield printing is finished
|
||||
SHIELD_PRINTING_HELP_STEP_4 = §84. §7Edit the shields if necessary
|
||||
SHIELD_PRINTING_HELP_STEP_5 = §85. §7Copy the shields printing with §8/§eshieldprinting copy
|
||||
SHIELD_PRINTING_HELP_STEP_6 = §86. §7Paste the original schematic
|
||||
SHIELD_PRINTING_HELP_STEP_7 = §87. §7Apply the shield printing with §8/§eshieldprinting apply
|
||||
|
||||
SHIELD_PRINTING_NO_REGION = §cYou are not in a region.
|
||||
SHIELD_PRINTING_NOT_RUNNING = §cThe shield printing is not running.
|
||||
SHIELD_PRINTING_DISALLOWED = §cYou are not allowed to use shield printing here.
|
||||
@ -416,26 +428,16 @@ KILLCHECKER_BOSSBAR = §e§l{0} §7(§e{1}%§7) §e§l{2}§7 cannons
|
||||
BLOCK_COUNTER_HELP_TOGGLE = §8/§eblockcounter §8- §7Toggle on/off
|
||||
BLOCK_COUNTER_HELP_ENABLE = §8/§eblockcounter enable §8- §7Toggles BlockCounter on
|
||||
BLOCK_COUNTER_HELP_DISABLE = §8/§eblockcounter disable §8- §7Toggles BlockCounter off
|
||||
BLOCK_COUNTER_MESSAGE = §7Counter §8> §e{0} §7Blocks §e{1} §7TNT §e{2} §7Blocks/TNT §e{3} §7Blocks/tick
|
||||
BLOCK_COUNTER_MESSAGE_SECOND = §7Counter §8> §e{0} §7Blocks §e{1} §7TNT §e{2} §7Blocks/TNT §e{3} §7Blocks/s
|
||||
BLOCK_COUNTER_MESSAGE = §7Damage §8> §e{0} §7Blocks §e{1} §7TNT §e{2} §7Blocks/TNT §e{3} §7Blocks/tick
|
||||
BLOCK_COUNTER_MESSAGE_SECOND = §7Damage §8> §e{0} §7Blocks §e{1} §7TNT §e{2} §7Blocks/TNT §e{3} §7Blocks/s
|
||||
BLOCK_COUNTER_ENABLE = §7BlockCounter activated
|
||||
BLOCK_COUNTER_DISABLE = §7BlockCounter deactivated
|
||||
|
||||
# DepthCounter
|
||||
DEPTH_COUNTER_COMMAND_ENABLE_HELP = §8/§edepthcounter enable §8- §7Activate the depth-counter
|
||||
DEPTH_COUNTER_COMMAND_DISABLE_HELP = §8/§edepthcounter disable §8- §7Deactivate the depth-counter
|
||||
DEPTH_COUNTER_COMMAND_INFO_HELP = §8/§edepthcounter info §8- §7Lists active counting modes
|
||||
DEPTH_COUNTER_COMMAND_TOGGLE_HELP = §8/§edepthcounter toggle §8<§7CountMode§8> §8- §7Toggle counting modes
|
||||
DEPTH_COUNTER_ENABLE_MESSAGE = §7You activated the depth-counter
|
||||
DEPTH_COUNTER_DISABLE_MESSAGE = §7You deactivated the depth-counter
|
||||
DEPTH_COUNTER_ACTIVE_MESSAGE = §7Active couting modes: §e{0}§8.
|
||||
DEPTH_COUNTER_MESSAGE = §7Damage §8> §7{0}
|
||||
DEPTH_COUNTER_HIGHLIGHT = §e
|
||||
DEPTH_COUNTER_SEPARATOR = §7 §7
|
||||
DEPTH_COUNTER_X = X: {0}
|
||||
DEPTH_COUNTER_Y = Y: {0}
|
||||
DEPTH_COUNTER_Z = Z: {0}
|
||||
DEPTH_COUNTER_TNT = §7TNT§8: §e{0}
|
||||
DEPTH_COUNTER_MESSAGE = §7Depth §8> §7
|
||||
DEPTH_COUNTER_COUNT = {0}{1}§8×{2}{3}§8×{4}{5}
|
||||
DEPTH_COUNTER_HOVER = §7X§8ק7Y§8ק7Z
|
||||
DEPTH_COUNTER_TNT = §7 TNT§8: §e{0}
|
||||
|
||||
# TPSLimit
|
||||
TICK_STEP_HELP = §8/§etick step §8<§7Ticks§8> §8- §7Step n ticks
|
||||
@ -478,7 +480,6 @@ TRACE_MESSAGE_ISOLATE = §aTNT-positions isolated
|
||||
TRACE_MESSAGE_UNISOLATE = §cTNT-positions hidden
|
||||
TRACE_MESSAGE_CLICK_ISOLATE = §eClick to §aisolate§8/§cunisolate
|
||||
TRACE_MESSAGE_DISALLOWED = §cYou are not allowed to use the TNT-Tracer here
|
||||
TRACE_MESSAGE_NO_REGION = §cYou are not in a region
|
||||
|
||||
TRACE_COMMAND_HELP_START = §8/§etrace start §8- §7Starts recording of all TNT-positions
|
||||
TRACE_COMMAND_HELP_SINGLE = §8/§etrace single §8- §7Starts a single recording of all TNT-positions
|
||||
|
@ -241,6 +241,18 @@ SCRIPT_MENU_GUI_ITEM_ADD_NAME = §eHinzufügen
|
||||
SCRIPT_MENU_GUI_ITEM_ADD_LORE = §7Klicke mit einem Buch zum hinzufügen
|
||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
|
||||
|
||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Ist noch die Überlegung, ob Skript oder Script. Ist noch die Überlegung, ob Skript oder Script.
|
||||
# Shield Printing
|
||||
SHIELD_PRINTING_HELP_START = §8/§eshieldprinting start §8- §7Starte das Schild drucken
|
||||
SHIELD_PRINTING_HELP_COPY = §8/§eshieldprinting copy §8- §7Kopiert die Schilder
|
||||
SHIELD_PRINTING_HELP_APPLY = §8/§eshieldprinting apply §8- §7Wendet die Schilder an
|
||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Skript? Skript?
|
||||
SHIELD_PRINTING_HELP_STOP = §8/§eshieldprinting stop §8- §7Stoppt das Schild drucken
|
||||
SHIELD_PRINTING_HELP_STEP_1 = §81. §7Füge die Schematic in die Welt ein
|
||||
SHIELD_PRINTING_HELP_STEP_2 = §82. §7Starte das Schild drucken mit §8/§eshieldprinting start
|
||||
SHIELD_PRINTING_HELP_STEP_3 = §83. §7Warte bis alle Schilde ausgefahren sind
|
||||
SHIELD_PRINTING_HELP_STEP_4 = §84. §7Editiere die Schilde wenn nötig
|
||||
SHIELD_PRINTING_HELP_STEP_5 = §85. §7Kopiere das gedruckte mit §8/§eshieldprinting copy
|
||||
SHIELD_PRINTING_HELP_STEP_6 = §86. §7Füge die originale Schematic wieder ein
|
||||
SHIELD_PRINTING_HELP_STEP_7 = §87. §7Wende das gedruckte mit §8/§eshieldprinting apply§7 an
|
||||
|
||||
SHIELD_PRINTING_NO_REGION = §cDu bist in keiner Region.
|
||||
SHIELD_PRINTING_NOT_RUNNING = §cShield printing ist nicht aktiv.
|
||||
SHIELD_PRINTING_DISALLOWED = §cDu darfst Shield printing nicht benutzen.
|
||||
@ -386,26 +398,13 @@ KILLCHECKER_BOSSBAR = §e§l{0} §7(§e{1}%§7) §e§l{2}§7 Kanonnen
|
||||
BLOCK_COUNTER_HELP_TOGGLE = §8/§eblockcounter §8- §7Wechsel zwischen an und aus
|
||||
BLOCK_COUNTER_HELP_ENABLE = §8/§eblockcounter enable §8- §7Schalte den BlockCounter an
|
||||
BLOCK_COUNTER_HELP_DISABLE = §8/§eblockcounter disable §8- §7Schalte den BlockCounter aus
|
||||
BLOCK_COUNTER_MESSAGE = §7Counter §8> §e{0} §7Blöcke §e{1} §7TNT §e{2} §7Blöcke/TNT §e{3} §7Blöcke/tick
|
||||
BLOCK_COUNTER_MESSAGE_SECOND = §7Counter §8> §e{0} §7Blöcke §e{1} §7TNT §e{2} §7Blöcke/TNT §e{3} §7Blöcke/s
|
||||
BLOCK_COUNTER_MESSAGE = §7Schaden §8> §e{0} §7Blöcke §e{1} §7TNT §e{2} §7Blöcke/TNT §e{3} §7Blöcke/tick
|
||||
BLOCK_COUNTER_MESSAGE_SECOND = §7Schaden §8> §e{0} §7Blöcke §e{1} §7TNT §e{2} §7Blöcke/TNT §e{3} §7Blöcke/s
|
||||
BLOCK_COUNTER_ENABLE = §7BlockCounter angemacht
|
||||
BLOCK_COUNTER_DISABLE = §7BlockCounter ausgemacht
|
||||
|
||||
# DepthCounter
|
||||
DEPTH_COUNTER_COMMAND_ENABLE_HELP = §8/§edepthcounter enable §8- §7Aktiviere den Tiefenzähler
|
||||
DEPTH_COUNTER_COMMAND_DISABLE_HELP = §8/§edepthcounter disable §8- §7Deaktiviere den Tiefenzähler
|
||||
DEPTH_COUNTER_COMMAND_INFO_HELP = §8/§edepthcounter info §8- §7Zähle aktive Zählmodi auf
|
||||
DEPTH_COUNTER_COMMAND_TOGGLE_HELP = §8/§edepthcounter toggle §8<§7CountMode§8> §8- §7Stelle einzelne Zählmodi ein
|
||||
DEPTH_COUNTER_ENABLE_MESSAGE = §7Du hast den Tiefenzähler aktiviert.
|
||||
DEPTH_COUNTER_DISABLE_MESSAGE = §7Du hast den Tiefenzähler deaktiviert.
|
||||
DEPTH_COUNTER_ACTIVE_MESSAGE = §7Aktive Zählmodi: §e{0}§8.
|
||||
DEPTH_COUNTER_MESSAGE = §7Schaden §8> §7{0}
|
||||
DEPTH_COUNTER_HIGHLIGHT = §e
|
||||
DEPTH_COUNTER_SEPARATOR = §7 §7
|
||||
DEPTH_COUNTER_X = X: {0}
|
||||
DEPTH_COUNTER_Y = Y: {0}
|
||||
DEPTH_COUNTER_Z = Z: {0}
|
||||
DEPTH_COUNTER_TNT = §7TNT§8: §e{0}
|
||||
DEPTH_COUNTER_MESSAGE = §7Tiefe §8> §7
|
||||
|
||||
# TPSLimit
|
||||
TICK_STEP_HELP = §8/§etick step §8<§7Ticks§8> §8- §7Spule n Ticks vor
|
||||
@ -448,7 +447,6 @@ TRACE_MESSAGE_ISOLATE = §aTNT-Positionen isoliert
|
||||
TRACE_MESSAGE_UNISOLATE = §cTNT-Positionen ausgeblendet
|
||||
TRACE_MESSAGE_CLICK_ISOLATE = §eKlicken zum §aisolieren§8/§causblenden
|
||||
TRACE_MESSAGE_DISALLOWED = §cDu darfst hier nicht den TNT-Tracer nutzen
|
||||
TRACE_MESSAGE_NO_REGION = §cDu bist in keiner Region
|
||||
|
||||
TRACE_COMMAND_HELP_START = §8/§etrace start §8- §7Startet die Aufnahme aller TNT-Positionen
|
||||
TRACE_COMMAND_HELP_SINGLE = §8/§etrace single §8- §7Startet eine einzelne Aufnahme aller TNT-Positionen
|
||||
@ -1017,7 +1015,7 @@ WARP_EXISTS=§7Ein Warp mit dem namen §e{0} §7existiert bereits
|
||||
WARP_NAME_RESERVED=§7Du kannst nicht §c{0} §7als name für einen Warp nutzen
|
||||
WARP_CREATED=§7Der Warp §e{0} §7wurde erstellt
|
||||
WARP_DELETE_HOVER=§e{0} §7löschen
|
||||
WARP_DELETED=§e{0} §7wurde gelöcht
|
||||
WARP_DELETED=§e{0} §7wurde gelöscht
|
||||
WARP_TELEPORT_HOVER=§7Zu §e{0} §7teleportieren
|
||||
WARP_MATERIAL_CHOOSE=Material auswählen
|
||||
WARP_GUI_NAME=Warps
|
||||
|
@ -21,6 +21,11 @@ package de.steamwar.bausystem;
|
||||
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.bausystem.features.tpslimit.FreezeUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSLimitUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSWarpUtils;
|
||||
import de.steamwar.bausystem.features.world.RamUsage;
|
||||
import de.steamwar.bausystem.region.loader.PrototypeLoader;
|
||||
import de.steamwar.bausystem.region.loader.RegionLoader;
|
||||
import de.steamwar.bausystem.region.loader.Updater;
|
||||
@ -31,11 +36,16 @@ import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class BauSystem extends JavaPlugin implements Listener {
|
||||
@ -73,6 +83,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
new Updater(RegionLoader.file, RegionLoader::load);
|
||||
|
||||
LinkageUtils.link();
|
||||
RamUsage.init();
|
||||
|
||||
// This could disable any watchdog stuff. We need to investigate if this is a problem.
|
||||
/*
|
||||
@ -121,4 +132,45 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
public static BukkitTask runTaskLater(Plugin plugin, Runnable runnable, long delay) {
|
||||
return new BukkitRunnable() {
|
||||
private int counter = 1;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (FreezeUtils.isFrozen()) return;
|
||||
if (counter >= delay) {
|
||||
runnable.run();
|
||||
cancel();
|
||||
return;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
}.runTaskTimer(plugin, 0, 1);
|
||||
}
|
||||
|
||||
public static BukkitTask runTaskTimer(Plugin plugin, Runnable runnable, long delay, long period) {
|
||||
return new BukkitRunnable() {
|
||||
private int counter = 1;
|
||||
private boolean first = true;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (FreezeUtils.isFrozen()) return;
|
||||
if (counter >= (first ? delay : period)) {
|
||||
first = false;
|
||||
runnable.run();
|
||||
counter = 1;
|
||||
return;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
}.runTaskTimer(plugin, 0, 1);
|
||||
}
|
||||
|
||||
public static void runTaskTimer(Plugin plugin, Consumer<BukkitTask> consumer, long delay, long period) {
|
||||
AtomicReference<BukkitTask> task = new AtomicReference<>();
|
||||
task.set(runTaskTimer(plugin, () -> consumer.accept(task.get()), delay, period));
|
||||
}
|
||||
}
|
@ -88,7 +88,7 @@ public class AutostartListener implements Listener {
|
||||
} else {
|
||||
BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_START", player);
|
||||
}
|
||||
regionStartTime.put(region, TPSUtils.currentTick.get());
|
||||
regionStartTime.put(region, TPSUtils.currentRealTick.get());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -101,7 +101,7 @@ public class AutostartListener implements Listener {
|
||||
if (!regionStartTime.containsKey(region)) return;
|
||||
if (!region.hasType(RegionType.TESTBLOCK)) return;
|
||||
if (!region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return;
|
||||
long tickDiff = TPSUtils.currentTick.get() - regionStartTime.remove(region);
|
||||
long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region);
|
||||
RegionUtils.message(region, player -> {
|
||||
return BauSystem.MESSAGE.parse("AUTOSTART_MESSAGE_RESULT1", player, new SimpleDateFormat(BauSystem.MESSAGE.parse("AUTOSTART_MESSAGE_DATE_PATTERN", player)).format(new Date(tickDiff * 50)));
|
||||
});
|
||||
|
@ -0,0 +1,99 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.cannon;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.cannon.depth.Depth;
|
||||
import de.steamwar.bausystem.features.cannon.depth.DepthManager;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class CannonDetector implements Listener {
|
||||
|
||||
private Map<TNTPrimed, Vector> velocities = new HashMap<>();
|
||||
|
||||
@EventHandler
|
||||
public void onEntityExplode(EntityExplodeEvent event) {
|
||||
if (!(event.getEntity() instanceof TNTPrimed)) {
|
||||
return;
|
||||
}
|
||||
|
||||
TNTPrimed tnt = (TNTPrimed) event.getEntity();
|
||||
DepthManager.update(tnt, event.blockList());
|
||||
|
||||
List<TNTPrimed> tnts = Bukkit.getWorlds().get(0).getEntitiesByClass(TNTPrimed.class)
|
||||
.stream()
|
||||
.filter(entity -> entity != tnt)
|
||||
.filter(entity -> entity.getFuseTicks() > 1)
|
||||
.filter(entity -> entity.getLocation().distance(event.getLocation()) <= 8)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (tnts.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean isEmpty = velocities.isEmpty();
|
||||
tnts.forEach(tntPrimed -> {
|
||||
velocities.put(tntPrimed, tntPrimed.getVelocity().clone());
|
||||
});
|
||||
|
||||
if (!isEmpty) {
|
||||
return;
|
||||
}
|
||||
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
Map<CannonKey, List<TNTPrimed>> grouped = new HashMap<>();
|
||||
velocities.forEach((tntPrimed, vector) -> {
|
||||
grouped.computeIfAbsent(new CannonKey(round(tntPrimed.getLocation().toVector()), round(vector)), ignored -> new ArrayList<>()).add(tntPrimed);
|
||||
});
|
||||
grouped.forEach((cannonKey, tntPrimeds) -> {
|
||||
if (tntPrimeds.size() <= 5) return;
|
||||
Region region = Region.getRegion(tntPrimeds.get(0).getLocation());
|
||||
if (region.isGlobal()) return;
|
||||
if (!region.hasType(RegionType.TESTBLOCK)) return;
|
||||
Depth depth = new Depth(region);
|
||||
DepthManager.init(tntPrimeds, depth);
|
||||
});
|
||||
velocities.clear();
|
||||
}, 1);
|
||||
}
|
||||
|
||||
private Vector round(Vector vector) {
|
||||
vector.multiply(10000);
|
||||
vector.setX(Math.round(vector.getX()));
|
||||
vector.setY(Math.round(vector.getY()));
|
||||
vector.setZ(Math.round(vector.getZ()));
|
||||
return vector;
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.cannon;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@AllArgsConstructor
|
||||
@EqualsAndHashCode
|
||||
@Getter
|
||||
public final class CannonKey {
|
||||
private Vector locationVector;
|
||||
private Vector velocityVector;
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.cannon.depth;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.RegionUtils;
|
||||
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Depth {
|
||||
|
||||
private Region region;
|
||||
private Vector minVector = null;
|
||||
private Vector maxVector = null;
|
||||
private int tntCount = 0;
|
||||
|
||||
public Depth(Region region) {
|
||||
this.region = region;
|
||||
}
|
||||
|
||||
public void update(List<Block> blocks) {
|
||||
List<Block> blocksList = blocks.stream()
|
||||
.filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION))
|
||||
.collect(Collectors.toList());
|
||||
if (blocksList.isEmpty()) return;
|
||||
tntCount++;
|
||||
for (Block block : blocksList) {
|
||||
internalUpdate(block);
|
||||
}
|
||||
}
|
||||
|
||||
public void finish() {
|
||||
if (maxVector == null || minVector == null) return;
|
||||
Vector dimensions = maxVector.subtract(minVector);
|
||||
dimensions.setX(Math.abs(dimensions.getX()));
|
||||
dimensions.setY(Math.abs(dimensions.getY()));
|
||||
dimensions.setZ(Math.abs(dimensions.getZ()));
|
||||
|
||||
RegionUtils.message(region, player -> {
|
||||
player.spigot().sendMessage(getMessage(player, dimensions.getBlockX() + 1, dimensions.getBlockY() + 1, dimensions.getBlockZ() + 1, tntCount));
|
||||
});
|
||||
}
|
||||
|
||||
private void internalUpdate(Block block) {
|
||||
if (minVector == null) {
|
||||
minVector = block.getLocation().toVector();
|
||||
}
|
||||
minVector.setX(Math.min(minVector.getX(), block.getX()));
|
||||
minVector.setY(Math.min(minVector.getY(), block.getY()));
|
||||
minVector.setZ(Math.min(minVector.getZ(), block.getZ()));
|
||||
|
||||
if (maxVector == null) {
|
||||
maxVector = block.getLocation().toVector();
|
||||
}
|
||||
maxVector.setX(Math.max(maxVector.getX(), block.getX()));
|
||||
maxVector.setY(Math.max(maxVector.getY(), block.getY()));
|
||||
maxVector.setZ(Math.max(maxVector.getZ(), block.getZ()));
|
||||
}
|
||||
|
||||
private static BaseComponent[] getMessage(Player player, int x, int y, int z, int tntCount) {
|
||||
final Set<Integer> dimensions = new HashSet<>();
|
||||
dimensions.add(x);
|
||||
dimensions.add(y);
|
||||
dimensions.add(z);
|
||||
|
||||
int max = getMax(dimensions);
|
||||
|
||||
TextComponent headerComponent = new TextComponent(BauSystem.MESSAGE.parse("DEPTH_COUNTER_MESSAGE", player));
|
||||
|
||||
TextComponent depthComponent = new TextComponent(BauSystem.MESSAGE.parse("DEPTH_COUNTER_COUNT", player, x == max ? "§e" : "§7", x, y == max ? "§e" : "§7", y, z == max ? "§e" : "§7", z));
|
||||
depthComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{new TextComponent(BauSystem.MESSAGE.parse("DEPTH_COUNTER_HOVER", player))}));
|
||||
|
||||
TextComponent tntComponent = new TextComponent(BauSystem.MESSAGE.parse("DEPTH_COUNTER_TNT", player, tntCount));
|
||||
|
||||
return new BaseComponent[]{headerComponent, depthComponent, tntComponent};
|
||||
}
|
||||
|
||||
private static int getMax(Set<Integer> values) {
|
||||
return values.stream().max(Integer::compare).orElse(0);
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.cannon.depth;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@UtilityClass
|
||||
public class DepthManager {
|
||||
|
||||
private Map<TNTPrimed, Depth> depths = new HashMap<>();
|
||||
|
||||
public void init(List<TNTPrimed> list, Depth depth) {
|
||||
for (TNTPrimed tnt : list) {
|
||||
depths.putIfAbsent(tnt, depth);
|
||||
}
|
||||
}
|
||||
|
||||
public void update(TNTPrimed tnt, List<Block> blocks) {
|
||||
Depth depth = depths.remove(tnt);
|
||||
if (depth == null) return;
|
||||
depth.update(blocks);
|
||||
if (depths.containsValue(depth)) return;
|
||||
depth.finish();
|
||||
}
|
||||
}
|
@ -293,7 +293,7 @@ public class KillcheckerVisualizer {
|
||||
private void updateBossBar(Player player) {
|
||||
BauSystemBossbar bossbar = bossBarService.get(player, region, "killchecker");
|
||||
bossbar.setTitle(BauSystem.MESSAGE.parse("KILLCHECKER_BOSSBAR", player, kills, ((int) (percent * 1000) / 10.0), cannonCount));
|
||||
bossbar.setProgress(percent);
|
||||
bossbar.setProgress(Math.min(Math.max(percent, 0), 1));
|
||||
|
||||
if (percent >= 0.35) {
|
||||
bossbar.setColor(BarColor.RED);
|
||||
|
@ -71,7 +71,7 @@ public class Loader implements Listener {
|
||||
if (currentElement >= elements.size()) {
|
||||
currentElement = 0;
|
||||
if (totalDelay == 0) {
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), this::next, 1);
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), this::next, 1);
|
||||
return;
|
||||
}
|
||||
totalDelay = 0;
|
||||
|
@ -46,7 +46,7 @@ public class LoaderRecorder implements Listener {
|
||||
|
||||
private Player player;
|
||||
private List<LoaderElement> loaderElementList;
|
||||
private long lastInteraction = TPSUtils.currentTick.get();
|
||||
private long lastInteraction = TPSUtils.currentRealTick.get();
|
||||
|
||||
public LoaderRecorder(Player player, List<LoaderElement> loaderElementList) {
|
||||
this.player = player;
|
||||
@ -63,15 +63,15 @@ public class LoaderRecorder implements Listener {
|
||||
|
||||
private void addWaitTime(boolean last) {
|
||||
if (loaderElementList.isEmpty()) {
|
||||
lastInteraction = TPSUtils.currentTick.get();
|
||||
lastInteraction = TPSUtils.currentRealTick.get();
|
||||
return;
|
||||
}
|
||||
if (loaderElementList.get(loaderElementList.size() - 1) instanceof LoaderWait) {
|
||||
return;
|
||||
}
|
||||
long diff = TPSUtils.currentTick.get() - lastInteraction;
|
||||
long diff = TPSUtils.currentRealTick.get() - lastInteraction;
|
||||
if (last && diff > 160) diff = 160;
|
||||
lastInteraction = TPSUtils.currentTick.get();
|
||||
lastInteraction = TPSUtils.currentRealTick.get();
|
||||
loaderElementList.add(new LoaderWait(diff));
|
||||
}
|
||||
|
||||
@ -165,10 +165,10 @@ public class LoaderRecorder implements Listener {
|
||||
Long startTime = blockSet.remove(fromBlock.getLocation());
|
||||
LoaderMovement loaderMovement = movementSet.remove(fromBlock.getLocation());
|
||||
if (loaderMovement != null && startTime != null) {
|
||||
loaderMovement.setInitialTicks(TPSUtils.currentTick.get() - startTime);
|
||||
loaderMovement.setInitialTicks(TPSUtils.currentRealTick.get() - startTime);
|
||||
}
|
||||
|
||||
blockSet.put(toBlock.getLocation(), TPSUtils.currentTick.get());
|
||||
blockSet.put(toBlock.getLocation(), TPSUtils.currentRealTick.get());
|
||||
|
||||
addWaitTime(false);
|
||||
loaderMovement = null;
|
||||
|
@ -52,11 +52,11 @@ public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSetti
|
||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean power) {
|
||||
SWItem swItem;
|
||||
if (noop) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_LEVER", "LOADER_INTERACTION_NOOP", player));
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (interact) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_LEVER", "LOADER_INTERACTION_INTERACT", player));
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player));
|
||||
} else {
|
||||
swItem = new SWItem(Material.LEVER, translateItemName("LOADER_LEVER", power ? "LOADER_INTERACTION_ACTIVE" : "LOADER_INTERACTION_INACTIVE", player));
|
||||
swItem = new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", power ? "LOADER_INTERACTION_ACTIVE" : "LOADER_INTERACTION_INACTIVE", player));
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
|
@ -112,7 +112,7 @@ public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.Move
|
||||
|
||||
if (ticks >= 0) {
|
||||
boolean finalWaitFor = waitFor;
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
if (blockData instanceof AnaloguePowerable) {
|
||||
AnaloguePowerable analoguePowerable = (AnaloguePowerable) blockData;
|
||||
analoguePowerable.setPower(0);
|
||||
|
@ -49,7 +49,7 @@ public class LoaderTNT implements LoaderElement {
|
||||
public void execute(Runnable nextAction) {
|
||||
Block block = location.getBlock();
|
||||
if (block.getType() != Material.AIR && block.getType() != Material.WATER) {
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> execute(nextAction), 1);
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> execute(nextAction), 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSetti
|
||||
update(powerable);
|
||||
|
||||
boolean finalWaitFor = waitFor;
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
powerable.setPowered(false);
|
||||
location.getBlock().setBlockData(powerable, true);
|
||||
update(powerable);
|
||||
|
@ -58,7 +58,7 @@ public class LoaderWait implements LoaderElement, Listener {
|
||||
nextAction.run();
|
||||
return;
|
||||
}
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), nextAction, delay);
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), nextAction, delay);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -65,9 +65,9 @@ public class Loadtimer implements Listener {
|
||||
this.region = region;
|
||||
this.stage = Stage.WAITING;
|
||||
Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
|
||||
task = Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
task = BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
if (stage == Stage.COUNTING) {
|
||||
long timeSinceStart = TPSUtils.currentTick.get() - start;
|
||||
long timeSinceStart = TPSUtils.currentRealTick.get() - start;
|
||||
long timeSinceHalf = timeSinceStart / 2;
|
||||
double timeSec = (timeSinceStart / 20d);
|
||||
String sec = new DecimalFormat("#.#").format(timeSec);
|
||||
@ -119,7 +119,7 @@ public class Loadtimer implements Listener {
|
||||
public void onTntPlace(BlockPlaceEvent event) {
|
||||
if (stage == Stage.WAITING) {
|
||||
this.stage = Stage.COUNTING;
|
||||
this.start = TPSUtils.currentTick.get();
|
||||
this.start = TPSUtils.currentRealTick.get();
|
||||
}
|
||||
|
||||
if (stage == Stage.COUNTING) {
|
||||
@ -146,9 +146,9 @@ public class Loadtimer implements Listener {
|
||||
public void onTntSpawn() {
|
||||
if ((stage == Stage.COUNTING || stage == Stage.ACTIVATED)) {
|
||||
stage = Stage.IGNITION;
|
||||
ignite = TPSUtils.currentTick.get();
|
||||
ignite = TPSUtils.currentRealTick.get();
|
||||
if (activate == -1)
|
||||
activate = TPSUtils.currentTick.get();
|
||||
activate = TPSUtils.currentRealTick.get();
|
||||
if (finishOnActive) {
|
||||
stage = Stage.END;
|
||||
print();
|
||||
@ -160,14 +160,14 @@ public class Loadtimer implements Listener {
|
||||
public void onTntExplode(EntityExplodeEvent event) {
|
||||
if (region.inRegion(event.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION) && stage == Stage.IGNITION) {
|
||||
stage = Stage.END;
|
||||
explode = TPSUtils.currentTick.get();
|
||||
explode = TPSUtils.currentRealTick.get();
|
||||
print();
|
||||
delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void setActivate() {
|
||||
activate = TPSUtils.currentTick.get();
|
||||
activate = TPSUtils.currentRealTick.get();
|
||||
stage = Stage.ACTIVATED;
|
||||
if (finishOnActive) {
|
||||
print();
|
||||
|
@ -89,18 +89,18 @@ public class RedstonetesterUtils {
|
||||
tick = null;
|
||||
return;
|
||||
}
|
||||
if (TPSUtils.currentTick.get() - lastTick > 100) {
|
||||
if (TPSUtils.currentRealTick.get() - lastTick > 100) {
|
||||
tick = null;
|
||||
}
|
||||
if (loc1.equals(location)) {
|
||||
lastTick = TPSUtils.currentTick.get();
|
||||
lastTick = TPSUtils.currentRealTick.get();
|
||||
if (tick == null) {
|
||||
tick = TPSUtils.currentTick.get();
|
||||
tick = TPSUtils.currentRealTick.get();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (tick != null && loc2.equals(location)) {
|
||||
BauSystem.MESSAGE.send("RT_RESULT", player, (TPSUtils.currentTick.get() - tick), ((TPSUtils.currentTick.get() - tick) / 2.0));
|
||||
BauSystem.MESSAGE.send("RT_RESULT", player, (TPSUtils.currentRealTick.get() - tick), ((TPSUtils.currentRealTick.get() - tick) / 2.0));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,9 @@ public class FreezeListener implements Listener, ScoreboardElement {
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryMoveEvent(InventoryMoveItemEvent e) {
|
||||
if (Region.getRegion(e.getDestination().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) {
|
||||
if (e.getDestination().getLocation() != null && Region.getRegion(e.getDestination().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) {
|
||||
e.setCancelled(true);
|
||||
} else if (e.getSource().getLocation() != null && Region.getRegion(e.getSource().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
@ -23,7 +23,6 @@ import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar;
|
||||
import de.steamwar.bausystem.utils.bossbar.BossBarService;
|
||||
import de.steamwar.bausystem.utils.bossbar.RegionedBossbar;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -38,13 +37,9 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockFormEvent;
|
||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||
import org.bukkit.event.block.EntityBlockFormEvent;
|
||||
import org.bukkit.event.entity.EntityAirChangeEvent;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
@ -57,7 +52,7 @@ public class ShieldPrinting implements Listener {
|
||||
private static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
|
||||
static {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
ShieldPrintingCommand.SHIELD_PRINTING_MAP.values().forEach(shieldPrinting -> {
|
||||
shieldPrinting.fallingBlocks.replaceAll((entity, location) -> {
|
||||
if (entity.isDead()) return null;
|
||||
|
@ -38,6 +38,17 @@ public class ShieldPrintingCommand extends SWCommand implements Listener {
|
||||
|
||||
public ShieldPrintingCommand() {
|
||||
super("shieldprinting");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_START");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_COPY");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_APPLY");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STOP");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_1");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_2");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_3");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_4");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_5");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_6");
|
||||
addDefaultHelpMessage("SHIELD_PRINTING_HELP_STEP_7");
|
||||
}
|
||||
|
||||
static final Map<Region, ShieldPrinting> SHIELD_PRINTING_MAP = new HashMap<>();
|
||||
|
@ -245,7 +245,7 @@ public class TNTSimulator {
|
||||
});
|
||||
|
||||
AtomicInteger currentTick = new AtomicInteger(0);
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), bukkitTask -> {
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), bukkitTask -> {
|
||||
int tick = currentTick.get();
|
||||
if (tick > maxTick.get()) bukkitTask.cancel();
|
||||
currentTick.incrementAndGet();
|
||||
|
@ -36,13 +36,13 @@ public interface LaufbauState {
|
||||
default String eta(Player p, long start, int done, int total) {
|
||||
if (total == 0) return "";
|
||||
long elapsed = System.currentTimeMillis() - start;
|
||||
long eta = (long) (elapsed / (done / (double) total) - elapsed);
|
||||
long eta = ((long) (elapsed / (done / (double) total) - elapsed)) * 1000000;
|
||||
if (eta > 86399999999999L) {
|
||||
return LocalTime.ofNanoOfDay(86399999999999L).format(DateTimeFormatter.ofPattern(BauSystem.MESSAGE.parse("TIME", p)));
|
||||
}
|
||||
if (eta < 0) {
|
||||
return LocalTime.ofNanoOfDay(0).format(DateTimeFormatter.ofPattern(BauSystem.MESSAGE.parse("TIME", p)));
|
||||
}
|
||||
return LocalTime.ofNanoOfDay(eta * 1000000).format(DateTimeFormatter.ofPattern(BauSystem.MESSAGE.parse("TIME", p)));
|
||||
return LocalTime.ofNanoOfDay(eta).format(DateTimeFormatter.ofPattern(BauSystem.MESSAGE.parse("TIME", p)));
|
||||
}
|
||||
}
|
||||
|
@ -40,24 +40,26 @@ public class BlockCount {
|
||||
private Region region;
|
||||
private int count = 0;
|
||||
private int tntCount = 0;
|
||||
private final long tick = TPSUtils.currentTick.get();
|
||||
private final long tick = TPSUtils.currentRealTick.get();
|
||||
|
||||
private long lastUpdate = TPSUtils.currentTick.get();
|
||||
private long lastUpdate = TPSUtils.currentRealTick.get();
|
||||
|
||||
public BlockCount(Region region) {
|
||||
this.region = region;
|
||||
|
||||
if (bukkitTask == null) {
|
||||
bukkitTask = Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
bukkitTask = BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
Set<Region> toRemove = new HashSet<>();
|
||||
for (BlockCount blockCount : BlockCounter.blockCountMap.values()) {
|
||||
if (TPSUtils.currentTick.get() - blockCount.lastUpdate < 60) {
|
||||
if (TPSUtils.currentRealTick.get() - blockCount.lastUpdate < 60) {
|
||||
continue;
|
||||
}
|
||||
toRemove.add(blockCount.region);
|
||||
|
||||
if (count > 10) {
|
||||
RegionUtils.message(blockCount.region, player -> BlockCounter.getMessage(player, blockCount.count, blockCount.tntCount, blockCount.tick, blockCount.lastUpdate));
|
||||
RegionUtils.message(blockCount.region, player -> {
|
||||
return BlockCounter.getMessage(player, blockCount.count, blockCount.tntCount, blockCount.tick, blockCount.lastUpdate);
|
||||
});
|
||||
}
|
||||
}
|
||||
toRemove.forEach(BlockCounter.blockCountMap::remove);
|
||||
@ -72,6 +74,6 @@ public class BlockCount {
|
||||
public void update(List<Block> blocks) {
|
||||
count += blocks.size();
|
||||
tntCount++;
|
||||
lastUpdate = TPSUtils.currentTick.get();
|
||||
lastUpdate = TPSUtils.currentRealTick.get();
|
||||
}
|
||||
}
|
||||
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.testblock.depthcounter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public enum CountMode {
|
||||
|
||||
X,
|
||||
Y,
|
||||
Z;
|
||||
|
||||
public static Set<CountMode> ALL() {
|
||||
return new HashSet<>(Arrays.asList(values()));
|
||||
}
|
||||
}
|
@ -1,131 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.testblock.depthcounter;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.RegionUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class Depth {
|
||||
|
||||
private static BukkitTask bukkitTask = null;
|
||||
|
||||
private Region region;
|
||||
private int tntCount = 1;
|
||||
private Vector minVector = null;
|
||||
private Vector maxVector = null;
|
||||
|
||||
private long lastUpdate = TPSUtils.currentTick.get();
|
||||
|
||||
public Depth(Region region, List<Block> blocks) {
|
||||
if (blocks.isEmpty()) {
|
||||
throw new SecurityException();
|
||||
}
|
||||
this.region = region;
|
||||
blocks.forEach(block -> {
|
||||
if (minVector == null) {
|
||||
minVector = DepthCounter.blockVector(block.getLocation().toVector());
|
||||
maxVector = DepthCounter.blockVector(block.getLocation().toVector());
|
||||
} else {
|
||||
internalUpdate(block);
|
||||
}
|
||||
});
|
||||
|
||||
if (bukkitTask == null) {
|
||||
bukkitTask = Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
Set<Depth> toRemove = new HashSet<>();
|
||||
for (Set<Depth> value : DepthCounter.depthMap.values()) {
|
||||
value.forEach(depth -> {
|
||||
if (TPSUtils.currentTick.get() - depth.lastUpdate < 10) {
|
||||
return;
|
||||
}
|
||||
|
||||
Vector dimensions = depth.maxVector.subtract(depth.minVector);
|
||||
dimensions.setX(Math.abs(dimensions.getX()));
|
||||
dimensions.setY(Math.abs(dimensions.getY()));
|
||||
dimensions.setZ(Math.abs(dimensions.getZ()));
|
||||
|
||||
if (depth.tntCount > 4 && dimensions.getX() != 0 && dimensions.getY() != 0 && dimensions.getZ() != 0) {
|
||||
RegionUtils.message(depth.region, player -> DepthCounter.getMessage(player, dimensions.getBlockX() + 1, dimensions.getBlockY() + 1, dimensions.getBlockZ() + 1, depth.tntCount));
|
||||
}
|
||||
|
||||
Set<Depth> depthSet = DepthCounter.depthMap.get(depth.region);
|
||||
if (depthSet == null) {
|
||||
return;
|
||||
}
|
||||
toRemove.add(depth);
|
||||
});
|
||||
}
|
||||
toRemove.forEach(depth -> {
|
||||
Set<Depth> depthSet = DepthCounter.depthMap.get(depth.region);
|
||||
depthSet.remove(depth);
|
||||
if (depthSet.isEmpty()) {
|
||||
DepthCounter.depthMap.remove(depth.region);
|
||||
}
|
||||
});
|
||||
|
||||
if (DepthCounter.depthMap.isEmpty()) {
|
||||
bukkitTask.cancel();
|
||||
bukkitTask = null;
|
||||
}
|
||||
}, 2, 2);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean update(List<Block> blocks) {
|
||||
double totalBlastResistanceBroken = blocks.stream().filter(block -> {
|
||||
Vector vector = DepthCounter.blockVector(block.getLocation().toVector());
|
||||
return vector.getX() >= minVector.getX()
|
||||
&& vector.getY() >= minVector.getY()
|
||||
&& vector.getZ() >= minVector.getZ()
|
||||
&& vector.getX() <= maxVector.getX()
|
||||
&& vector.getY() <= maxVector.getY()
|
||||
&& vector.getZ() <= maxVector.getZ();
|
||||
}).filter(block -> block.getType().isBlock())
|
||||
.mapToDouble(block -> block.getType().getBlastResistance())
|
||||
.sum();
|
||||
if (totalBlastResistanceBroken < 18) {
|
||||
return false;
|
||||
}
|
||||
lastUpdate = TPSUtils.currentTick.get();
|
||||
blocks.forEach(this::internalUpdate);
|
||||
tntCount++;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void internalUpdate(Block block) {
|
||||
minVector.setX(Math.min(minVector.getX(), block.getX()));
|
||||
minVector.setY(Math.min(minVector.getY(), block.getY()));
|
||||
minVector.setZ(Math.min(minVector.getZ(), block.getZ()));
|
||||
|
||||
maxVector.setX(Math.max(maxVector.getX(), block.getX()));
|
||||
maxVector.setY(Math.max(maxVector.getY(), block.getY()));
|
||||
maxVector.setZ(Math.max(maxVector.getZ(), block.getZ()));
|
||||
}
|
||||
}
|
@ -1,142 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.testblock.depthcounter;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@UtilityClass
|
||||
public class DepthCounter {
|
||||
|
||||
public final Map<Region, Set<Depth>> depthMap = new HashMap<>();
|
||||
|
||||
private static final YAPIONObject DEFAULT = new YAPIONObject().add("X", "").add("Y", "").add("Z", "");
|
||||
|
||||
public void toggleMode(final Player p, final CountMode countMode) {
|
||||
if (isActive(p, countMode)) {
|
||||
removeMode(p, countMode);
|
||||
} else {
|
||||
addMode(p, countMode);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isActive(final Player p, final CountMode countMode) {
|
||||
return Config.getInstance().get(p).getYAPIONObjectOrSetDefault("depth-counter", (YAPIONObject) DEFAULT.copy()).containsKey(countMode.name());
|
||||
}
|
||||
|
||||
public void addMode(final Player p, final CountMode countMode) {
|
||||
if (!isActive(p, countMode)) {
|
||||
Config.getInstance().get(p).getObject("depth-counter").add(countMode.name(), "");
|
||||
}
|
||||
}
|
||||
|
||||
public void removeMode(final Player p, final CountMode countMode) {
|
||||
if (isActive(p, countMode)) {
|
||||
Config.getInstance().get(p).getObject("depth-counter").remove(countMode.name());
|
||||
}
|
||||
}
|
||||
|
||||
public void setModes(final Player p, final Set<CountMode> countModes) {
|
||||
YAPIONObject yapionObject = new YAPIONObject();
|
||||
countModes.forEach(countMode -> yapionObject.put(countMode.name(), ""));
|
||||
Config.getInstance().get(p).put("depth-counter", yapionObject);
|
||||
}
|
||||
|
||||
public void removePlayer(final Player p) {
|
||||
Config.getInstance().get(p).put("depth-counter", new YAPIONObject());
|
||||
}
|
||||
|
||||
public Vector blockVector(Vector vector) {
|
||||
return new Vector(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
|
||||
}
|
||||
|
||||
public Set<CountMode> getModes(Player p) {
|
||||
Set<CountMode> countModes = new HashSet<>();
|
||||
Config.getInstance().get(p).getYAPIONObjectOrSetDefault("depth-counter", (YAPIONObject) DEFAULT.copy()).forEach((s, yapionAnyType) -> {
|
||||
countModes.add(CountMode.valueOf(s));
|
||||
});
|
||||
return countModes.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new));
|
||||
}
|
||||
|
||||
public boolean hasModes(Player p) {
|
||||
return !getModes(p).isEmpty();
|
||||
}
|
||||
|
||||
public int getMax(int... values) {
|
||||
return Arrays.stream(values).max().orElse(0);
|
||||
}
|
||||
|
||||
public int getMax(Set<Integer> values) {
|
||||
return values.stream().max(Integer::compare).orElse(0);
|
||||
}
|
||||
|
||||
public String getMessage(Player player, int x, int y, int z, int tntCount) {
|
||||
final boolean xActive = DepthCounter.isActive(player, CountMode.X);
|
||||
final boolean yActive = DepthCounter.isActive(player, CountMode.Y);
|
||||
final boolean zActive = DepthCounter.isActive(player, CountMode.Z);
|
||||
|
||||
if (!xActive && !yActive && !zActive) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Set<Integer> dimensions = new HashSet<>();
|
||||
if (xActive) {
|
||||
dimensions.add(x);
|
||||
}
|
||||
if (yActive) {
|
||||
dimensions.add(y);
|
||||
}
|
||||
if (zActive) {
|
||||
dimensions.add(z);
|
||||
}
|
||||
|
||||
int max = getMax(dimensions);
|
||||
|
||||
StringBuilder st = new StringBuilder();
|
||||
if (xActive) {
|
||||
st.append(x == max ? BauSystem.MESSAGE.parse("DEPTH_COUNTER_HIGHLIGHT", player) : "")
|
||||
.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_X", player, x))
|
||||
.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_SEPARATOR", player));
|
||||
}
|
||||
|
||||
if (yActive) {
|
||||
st.append(y == max ? BauSystem.MESSAGE.parse("DEPTH_COUNTER_HIGHLIGHT", player) : "")
|
||||
.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_Y", player, y))
|
||||
.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_SEPARATOR", player));
|
||||
}
|
||||
|
||||
if (zActive) {
|
||||
st.append(z == max ? BauSystem.MESSAGE.parse("DEPTH_COUNTER_HIGHLIGHT", player) : "")
|
||||
.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_Z", player, z))
|
||||
.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_SEPARATOR", player));
|
||||
}
|
||||
|
||||
st.append(BauSystem.MESSAGE.parse("DEPTH_COUNTER_TNT", player, tntCount));
|
||||
return BauSystem.MESSAGE.parse("DEPTH_COUNTER_MESSAGE", player, st.toString());
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.testblock.depthcounter;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@Linked
|
||||
public class DepthCounterCommand extends SWCommand {
|
||||
|
||||
public DepthCounterCommand() {
|
||||
super("depthcounter", "depthcount", "dcounter", "dcount");
|
||||
}
|
||||
|
||||
@Register(value = "toggle", description = "DEPTH_COUNTER_COMMAND_TOGGLE_HELP")
|
||||
public void toggleCommand(Player p, CountMode countMode) {
|
||||
DepthCounter.toggleMode(p, countMode);
|
||||
BauSystem.MESSAGE.send("DEPTH_COUNTER_ACTIVE_MESSAGE", p, DepthCounter.getModes(p).toString());
|
||||
}
|
||||
|
||||
@Register(value = "enable", description = "DEPTH_COUNTER_COMMAND_ENABLE_HELP")
|
||||
public void enableCommand(Player p) {
|
||||
DepthCounter.setModes(p, CountMode.ALL());
|
||||
BauSystem.MESSAGE.send("DEPTH_COUNTER_ENABLE_MESSAGE", p);
|
||||
BauSystem.MESSAGE.send("DEPTH_COUNTER_ACTIVE_MESSAGE", p, DepthCounter.getModes(p).toString());
|
||||
}
|
||||
|
||||
@Register(value = "disable", description = "DEPTH_COUNTER_COMMAND_DISABLE_HELP")
|
||||
public void disableCommand(Player p) {
|
||||
DepthCounter.removePlayer(p);
|
||||
BauSystem.MESSAGE.send("DEPTH_COUNTER_DISABLE_MESSAGE", p);
|
||||
}
|
||||
|
||||
@Register(value = "info", description = "DEPTH_COUNTER_COMMAND_INFO_HELP")
|
||||
public void infoCommand(Player p) {
|
||||
BauSystem.MESSAGE.send("DEPTH_COUNTER_ACTIVE_MESSAGE", p, DepthCounter.getModes(p).toString());
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.testblock.depthcounter;
|
||||
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class DepthCounterListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onEntityExplode(EntityExplodeEvent event) {
|
||||
Region region = Region.getRegion(event.getLocation());
|
||||
List<Block> blockList = event.blockList();
|
||||
blockList = blockList.stream().filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)).collect(Collectors.toList());
|
||||
if (blockList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
DepthCounter.depthMap.putIfAbsent(region, new HashSet<>());
|
||||
Set<Depth> depthSet = DepthCounter.depthMap.get(region);
|
||||
for (Depth depth : depthSet) {
|
||||
if (depth.update(blockList)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
depthSet.add(new Depth(region, blockList));
|
||||
}
|
||||
}
|
@ -31,20 +31,28 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Linked
|
||||
public class TPSLimitCommand extends SWCommand implements Enable {
|
||||
|
||||
private final List<String> tabCompletions = new ArrayList<>(Arrays.asList("0,5", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"));
|
||||
private final List<String> tabCompletions = new ArrayList<>();
|
||||
|
||||
static final int MAX_TPS = Integer.MAX_VALUE;
|
||||
|
||||
public TPSLimitCommand() {
|
||||
super("tpslimit");
|
||||
tabCompletions.add("0,5");
|
||||
for (int i = 0; i <= 20; i++) {
|
||||
tabCompletions.add(i + "");
|
||||
}
|
||||
if (TPSWarpUtils.isWarpAllowed()) {
|
||||
for (int i = 20; i <= 60; i += 5) {
|
||||
tabCompletions.add(i + "");
|
||||
}
|
||||
for (int i = 60; i <= 240; i += 10) {
|
||||
tabCompletions.add(i + "");
|
||||
}
|
||||
}
|
||||
if (FreezeUtils.freezeEnabled) {
|
||||
tabCompletions.add("0");
|
||||
@ -79,7 +87,7 @@ public class TPSLimitCommand extends SWCommand implements Enable {
|
||||
sendNewTPSLimitMessage(true);
|
||||
return;
|
||||
}
|
||||
if (tpsLimitDouble < 0.5 || tpsLimitDouble > (TPSWarpUtils.isWarpAllowed() ? 60 : 20)) {
|
||||
if (tpsLimitDouble < 0.5 || tpsLimitDouble > (TPSWarpUtils.isWarpAllowed() ? MAX_TPS : 20)) {
|
||||
sendInvalidArgumentMessage(p);
|
||||
return;
|
||||
}
|
||||
@ -121,6 +129,6 @@ public class TPSLimitCommand extends SWCommand implements Enable {
|
||||
}
|
||||
|
||||
private void sendInvalidArgumentMessage(Player player) {
|
||||
BauSystem.MESSAGE.send("TPSLIMIT_INVALID", player, TPSWarpUtils.isWarpAllowed() ? 60 : 20, FreezeUtils.freezeEnabled ? BauSystem.MESSAGE.parse("TPSLIMIT_INVALID_FROZEN", player) : "");
|
||||
BauSystem.MESSAGE.send("TPSLIMIT_INVALID", player, TPSWarpUtils.isWarpAllowed() ? MAX_TPS : 20, FreezeUtils.freezeEnabled ? BauSystem.MESSAGE.parse("TPSLIMIT_INVALID_FROZEN", player) : "");
|
||||
}
|
||||
}
|
@ -32,6 +32,8 @@ import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import static de.steamwar.bausystem.features.tpslimit.TPSLimitCommand.MAX_TPS;
|
||||
|
||||
@UtilityClass
|
||||
public class TPSLimitUtils {
|
||||
|
||||
@ -88,7 +90,7 @@ public class TPSLimitUtils {
|
||||
@SuppressWarnings("unused")
|
||||
public static void setTPS(double d) {
|
||||
if (d < 0.5) d = 0.5;
|
||||
if (d > (TPSWarpUtils.isWarpAllowed() ? 60 : 20)) d = (TPSWarpUtils.isWarpAllowed() ? 60 : 20);
|
||||
if (d > (TPSWarpUtils.isWarpAllowed() ? MAX_TPS : 20)) d = (TPSWarpUtils.isWarpAllowed() ? MAX_TPS : 20);
|
||||
currentTPSLimit = d;
|
||||
tpsLimiter();
|
||||
}
|
||||
|
@ -31,7 +31,11 @@ public class TPSUtils {
|
||||
private static long ticksSinceServerStart = 0;
|
||||
public static final Supplier<Long> currentTick = () -> ticksSinceServerStart; // This is intended as Supplier<Long>
|
||||
|
||||
private static long realTicksSinceServerStart = 0;
|
||||
public static final Supplier<Long> currentRealTick = () -> realTicksSinceServerStart; // This is intended as Supplier<Long>
|
||||
|
||||
static {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> ticksSinceServerStart++, 1, 1);
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> realTicksSinceServerStart++, 1, 1);
|
||||
}
|
||||
}
|
@ -40,7 +40,8 @@ public class TPSWarpUtils {
|
||||
|
||||
public static void setTPS(double tps) {
|
||||
double d = 50 - (50 / (tps / 20.0));
|
||||
nanoDOffset = Math.max(0, Math.min((long) (d * 1000000), 375000000));
|
||||
// nanoDOffset = Math.max(0, Math.min((long) (d * 1000000), 375000000));
|
||||
nanoDOffset = Math.max(0, (long) (d * 1000000));
|
||||
if (nanoDOffset == 0) {
|
||||
if (bukkitTask == null) return;
|
||||
bukkitTask.cancel();
|
||||
|
@ -25,7 +25,6 @@ import de.steamwar.bausystem.features.tracer.gui.TraceGui;
|
||||
import de.steamwar.bausystem.features.tracer.record.*;
|
||||
import de.steamwar.bausystem.features.tracer.show.Record;
|
||||
import de.steamwar.bausystem.features.tracer.show.*;
|
||||
import de.steamwar.bausystem.features.tracer.show.EntityShowMode;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.shared.ShowMode;
|
||||
import de.steamwar.command.PreviousArguments;
|
||||
@ -262,11 +261,6 @@ public class TraceCommand extends SWCommand {
|
||||
messageSender.send("TRACE_MESSAGE_DISALLOWED", player);
|
||||
return false;
|
||||
}
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region.isGlobal()) {
|
||||
messageSender.send("TRACE_MESSAGE_NO_REGION", player);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
@ -21,12 +21,15 @@ package de.steamwar.bausystem.features.tracer;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.tracer.record.Recorder;
|
||||
import de.steamwar.bausystem.features.tracer.show.Record;
|
||||
import de.steamwar.bausystem.features.tracer.show.StoredRecords;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Linked
|
||||
public class TraceScoreboardElement implements ScoreboardElement {
|
||||
|
||||
@ -45,9 +48,14 @@ public class TraceScoreboardElement implements ScoreboardElement {
|
||||
String traceScore = Recorder.INSTANCE.get(region).scoreboard(p);
|
||||
if (traceScore != null) {
|
||||
return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE", p) + "§8: " + traceScore;
|
||||
} else if (!(Recorder.INSTANCE.get(region) instanceof Recorder.NoopTraceRecorder) && !StoredRecords.getRecords(region).isEmpty()) {
|
||||
return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE", p) + "§8: " + BauSystem.MESSAGE.parse("TRACE_HAS_TRACES", p);
|
||||
}
|
||||
List<Record> records = StoredRecords.getRecords(region);
|
||||
if (records.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (records.stream().allMatch(record -> record.getTnt().isEmpty())) {
|
||||
return null;
|
||||
}
|
||||
return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE", p) + "§8: " + BauSystem.MESSAGE.parse("TRACE_HAS_TRACES", p);
|
||||
}
|
||||
}
|
||||
|
@ -46,10 +46,6 @@ public class TracerBauGuiItem extends BauGuiItem {
|
||||
@Override
|
||||
public ItemStack getItem(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region.isGlobal()) {
|
||||
return SWUtils.setCustomModelData(new SWItem(Material.OBSERVER, BauSystem.MESSAGE.parse("TRACE_GUI_ITEM_NAME", player), Collections.emptyList(), false, clickType -> {
|
||||
}), 1).getItemStack();
|
||||
}
|
||||
return SWUtils.setCustomModelData(new SWItem(Material.OBSERVER, BauSystem.MESSAGE.parse("TRACE_GUI_ITEM_NAME", player), Arrays.asList(BauSystem.MESSAGE.parse("TRACE_GUI_ITEM_LORE", player, Recorder.INSTANCE.get(region).scoreboard(player))), false, clickType -> {
|
||||
}), 1).getItemStack();
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ import java.util.function.Supplier;
|
||||
public abstract class AutoTraceRecorder implements TraceRecorder {
|
||||
|
||||
protected boolean recording = false;
|
||||
private long startTime = TPSUtils.currentTick.get();
|
||||
private long startTime = TPSUtils.currentRealTick.get();
|
||||
private long lastExplosion = 0;
|
||||
|
||||
private final Map<TNTPrimed, Record.TNTRecord> recordMap = new HashMap<>();
|
||||
@ -40,7 +40,7 @@ public abstract class AutoTraceRecorder implements TraceRecorder {
|
||||
private Supplier<Record> recordSupplier;
|
||||
|
||||
private Record.TNTRecord getRecord(TNTPrimed tntPrimed) {
|
||||
return recordMap.computeIfAbsent(tntPrimed, __ -> record.spawn(TPSUtils.currentTick.get() - startTime));
|
||||
return recordMap.computeIfAbsent(tntPrimed, __ -> record.spawn(TPSUtils.currentRealTick.get() - startTime));
|
||||
}
|
||||
|
||||
protected abstract String getInactivityMessage();
|
||||
@ -51,7 +51,7 @@ public abstract class AutoTraceRecorder implements TraceRecorder {
|
||||
@Override
|
||||
public final String scoreboard(Player player) {
|
||||
if (recording) {
|
||||
return BauSystem.MESSAGE.parse("TRACE_RECORD", player) + " §8| §e" + (TPSUtils.currentTick.get() - startTime) + " §7" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE_TICKS", player);
|
||||
return BauSystem.MESSAGE.parse("TRACE_RECORD", player) + " §8| §e" + (TPSUtils.currentRealTick.get() - startTime) + " §7" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE_TICKS", player);
|
||||
} else {
|
||||
return BauSystem.MESSAGE.parse(getInactivityMessage(), player);
|
||||
}
|
||||
@ -59,7 +59,7 @@ public abstract class AutoTraceRecorder implements TraceRecorder {
|
||||
|
||||
private void startRecording() {
|
||||
lastExplosion = 0;
|
||||
startTime = TPSUtils.currentTick.get();
|
||||
startTime = TPSUtils.currentRealTick.get();
|
||||
record = recordSupplier.get();
|
||||
recording = true;
|
||||
}
|
||||
@ -130,6 +130,6 @@ public abstract class AutoTraceRecorder implements TraceRecorder {
|
||||
|
||||
@Override
|
||||
public long scriptTime() {
|
||||
return TPSUtils.currentTick.get() - startTime;
|
||||
return TPSUtils.currentRealTick.get() - startTime;
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
@ -37,7 +36,9 @@ import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
@ -49,36 +50,6 @@ public class Recorder implements Listener {
|
||||
INSTANCE = this;
|
||||
}
|
||||
|
||||
public static class NoopTraceRecorder implements TraceRecorder {
|
||||
@Override
|
||||
public String scoreboard(Player player) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spawn(TNTPrimed tntPrimed) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick(TNTPrimed tntPrimed) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void explode(TNTPrimed tntPrimed, boolean b) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String scriptState() {
|
||||
return "OFF";
|
||||
}
|
||||
|
||||
@Override
|
||||
public long scriptTime() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
private static final NoopTraceRecorder NOOP = new NoopTraceRecorder();
|
||||
|
||||
private static class DisabledTracerRecorder implements TraceRecorder {
|
||||
@Override
|
||||
public String scoreboard(Player player) {
|
||||
@ -115,8 +86,6 @@ public class Recorder implements Listener {
|
||||
instance = this;
|
||||
}
|
||||
|
||||
private final World world = Bukkit.getWorlds().get(0);
|
||||
|
||||
private Map<Region, TraceRecorder> regionTraceRecorderMap = new HashMap<>();
|
||||
private Map<TNTPrimed, Region> tntTraceRecorderMap = new HashMap<>();
|
||||
|
||||
@ -125,7 +94,7 @@ public class Recorder implements Listener {
|
||||
}
|
||||
|
||||
public TraceRecorder get(Region region) {
|
||||
return regionTraceRecorderMap.getOrDefault(region, region.isGlobal() ? NOOP : DISABLED);
|
||||
return regionTraceRecorderMap.getOrDefault(region, DISABLED);
|
||||
}
|
||||
|
||||
public void set(Region region, TraceRecorder traceRecorder) {
|
||||
@ -160,7 +129,7 @@ public class Recorder implements Listener {
|
||||
}
|
||||
|
||||
{
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
tick();
|
||||
tntTraceRecorderMap.keySet()
|
||||
.stream()
|
||||
|
@ -31,13 +31,13 @@ import java.util.function.Supplier;
|
||||
|
||||
public class SimpleTraceRecorder implements TraceRecorder, ActiveTracer {
|
||||
|
||||
private final long startTime = TPSUtils.currentTick.get();
|
||||
private final long startTime = TPSUtils.currentRealTick.get();
|
||||
private final Map<TNTPrimed, Record.TNTRecord> recordMap = new HashMap<>();
|
||||
private Record record;
|
||||
|
||||
@Override
|
||||
public String scoreboard(Player player) {
|
||||
return BauSystem.MESSAGE.parse("TRACE_RECORD", player) + " §8| §e" + (TPSUtils.currentTick.get() - startTime) + " §7" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE_TICKS", player);
|
||||
return BauSystem.MESSAGE.parse("TRACE_RECORD", player) + " §8| §e" + (TPSUtils.currentRealTick.get() - startTime) + " §7" + BauSystem.MESSAGE.parse("SCOREBOARD_TRACE_TICKS", player);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -51,7 +51,7 @@ public class SimpleTraceRecorder implements TraceRecorder, ActiveTracer {
|
||||
}
|
||||
|
||||
private Record.TNTRecord getRecord(TNTPrimed tntPrimed) {
|
||||
return recordMap.computeIfAbsent(tntPrimed, __ -> record.spawn(TPSUtils.currentTick.get() - startTime));
|
||||
return recordMap.computeIfAbsent(tntPrimed, __ -> record.spawn(TPSUtils.currentRealTick.get() - startTime));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -79,6 +79,6 @@ public class SimpleTraceRecorder implements TraceRecorder, ActiveTracer {
|
||||
|
||||
@Override
|
||||
public long scriptTime() {
|
||||
return TPSUtils.currentTick.get() - startTime;
|
||||
return TPSUtils.currentRealTick.get() - startTime;
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,6 @@ import de.steamwar.entity.REntityServer;
|
||||
import de.steamwar.entity.RFallingBlockEntity;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@ -85,6 +84,10 @@ public class EntityShowMode implements ShowMode<TNTPosition> {
|
||||
return;
|
||||
}
|
||||
|
||||
if (showModeParameter.isMicroMotion() && !position.getRecord().isHasMicroMotion()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (showModeParameter.isExplodeOnly()) {
|
||||
if (position.isExploded()) {
|
||||
generatePositions(position, false, false);
|
||||
|
@ -48,7 +48,7 @@ public class Record {
|
||||
}
|
||||
|
||||
public TNTRecord spawn(long offset) {
|
||||
TNTRecord record = new TNTRecord(offset, region);
|
||||
TNTRecord record = new TNTRecord(this, offset, region);
|
||||
tnt.add(record);
|
||||
return record;
|
||||
}
|
||||
@ -57,11 +57,29 @@ public class Record {
|
||||
tnt.clear();
|
||||
}
|
||||
|
||||
private void checkMicroMotion() {
|
||||
for (TNTRecord tntRecord : tnt) {
|
||||
List<TNTPosition> positions = tntRecord.positions;
|
||||
if (positions.isEmpty()) continue;
|
||||
TNTPosition position = positions.get(positions.size() - 1);
|
||||
|
||||
Vector velocity = position.getVelocity();
|
||||
if (velocity.getY() == 0 && (velocity.getX() != 0 || velocity.getZ() != 0) && (Math.abs(velocity.getX()) < 0.001 || Math.abs(velocity.getZ()) < 0.001)) {
|
||||
if (!tntRecord.hasMicroMotion) {
|
||||
positions.forEach(tntPosition -> TraceShowManager.show(region, tntPosition));
|
||||
}
|
||||
tntRecord.hasMicroMotion = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class TNTRecord {
|
||||
|
||||
@Getter
|
||||
private final UUID id = UUID.randomUUID();
|
||||
|
||||
private Record record;
|
||||
|
||||
@Getter
|
||||
private final long offset;
|
||||
|
||||
@ -75,7 +93,11 @@ public class Record {
|
||||
@Setter
|
||||
private boolean inBuildArea = false;
|
||||
|
||||
public TNTRecord(long offset, Region region) {
|
||||
@Getter
|
||||
private boolean hasMicroMotion = false;
|
||||
|
||||
public TNTRecord(Record record, long offset, Region region) {
|
||||
this.record = record;
|
||||
this.offset = offset;
|
||||
this.region = region;
|
||||
}
|
||||
@ -90,6 +112,7 @@ public class Record {
|
||||
|
||||
public void explode(TNTPrimed tntPrimed) {
|
||||
add(tntPrimed, false, true);
|
||||
record.checkMicroMotion();
|
||||
}
|
||||
|
||||
private void add(TNTPrimed tntPrimed, boolean source, boolean exploded) {
|
||||
|
@ -32,6 +32,7 @@ public class ShowModeParameter {
|
||||
private boolean count = false;
|
||||
private boolean buildDestroyOnly = false;
|
||||
private boolean ticksSinceStart = false;
|
||||
private boolean microMotion = false;
|
||||
|
||||
public void enableWater() {
|
||||
this.water = true;
|
||||
@ -68,4 +69,8 @@ public class ShowModeParameter {
|
||||
public void enableTicksSinceStart() {
|
||||
this.ticksSinceStart = true;
|
||||
}
|
||||
|
||||
public void enableMicroMotion() {
|
||||
this.microMotion = true;
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,9 @@ public enum ShowModeParameterType {
|
||||
TICKS(ShowModeParameter::enableTicks, Arrays.asList("-ticks", "-t"), "EXPLODE", "SOURCE", "COUNT", "TICKS_SINCE_START"),
|
||||
COUNT(ShowModeParameter::enableCount, Arrays.asList("-count", "-c"), "TICKS", "TICKS_SINCE_START"),
|
||||
BUILD_DESTROY_ONLY(ShowModeParameter::enableBuildDestroyOnly, Arrays.asList("-builddestroy", "-builddestoryonly"), "WATER"),
|
||||
TICKS_SINCE_START(ShowModeParameter::enableTicksSinceStart, Arrays.asList("-tickssincestart", "-tss"), "TICKS", "COUNT");
|
||||
TICKS_SINCE_START(ShowModeParameter::enableTicksSinceStart, Arrays.asList("-tickssincestart", "-tss"), "TICKS", "COUNT"),
|
||||
MICROMOTION(ShowModeParameter::enableMicroMotion, Arrays.asList("-micromotion", "-micro", "-m")),
|
||||
;
|
||||
|
||||
@Getter
|
||||
private final Consumer<ShowModeParameter> showModeParameterConsumer;
|
||||
|
@ -42,7 +42,7 @@ public class StoredRecords {
|
||||
private static final Map<Region, List<Record>> records = new HashMap<>();
|
||||
|
||||
static {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
replayLoops.forEach((region, playerSupplierMap) -> {
|
||||
playerSupplierMap.forEach((player, integerSupplier) -> {
|
||||
int tick = integerSupplier.get();
|
||||
|
@ -47,9 +47,6 @@ public class TraceShowManager implements Listener {
|
||||
hide(player);
|
||||
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region.isGlobal()) {
|
||||
return;
|
||||
}
|
||||
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.computeIfAbsent(region, __ -> new HashMap<>());
|
||||
regionalShowModes.put(player, traceShowMode);
|
||||
StoredRecords.show(region, player, traceShowMode);
|
||||
@ -57,9 +54,6 @@ public class TraceShowManager implements Listener {
|
||||
|
||||
public static void hide(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region.isGlobal()) {
|
||||
return;
|
||||
}
|
||||
Map<Player, ShowMode<TNTPosition>> regionalShowModes = showModes.get(region);
|
||||
if (regionalShowModes == null) {
|
||||
return;
|
||||
|
@ -30,10 +30,18 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
||||
@Linked
|
||||
public class AFKStopperListener implements Listener {
|
||||
|
||||
// CPU > 50%
|
||||
// RAM > 60%
|
||||
|
||||
private int minutesAfk = 0;
|
||||
|
||||
public AFKStopperListener() {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
// System.out.println("CPU: " + load + " RAM: " + usage);
|
||||
if (RamUsage.getLoad() < 50.0 && RamUsage.getUsage() < 0.6) {
|
||||
minutesAfk = 0;
|
||||
return;
|
||||
}
|
||||
switch (minutesAfk) {
|
||||
case 5:
|
||||
if (Bukkit.getOnlinePlayers().isEmpty()) {
|
||||
@ -54,6 +62,12 @@ public class AFKStopperListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerMove(PlayerMoveEvent event) {
|
||||
if (event.getTo() == null) return;
|
||||
if (event.getFrom().getPitch() != event.getTo().getPitch()) {
|
||||
minutesAfk = 0;
|
||||
}
|
||||
if (event.getFrom().getYaw() != event.getTo().getYaw()) {
|
||||
minutesAfk = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,13 +22,48 @@ package de.steamwar.bausystem.features.world;
|
||||
import lombok.experimental.UtilityClass;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
|
||||
@UtilityClass
|
||||
public class RamUsage {
|
||||
|
||||
private File meminfo = new File("/proc/meminfo");
|
||||
private File stat = new File("/proc/stat");
|
||||
|
||||
private double usageSelf = 0D;
|
||||
private double usage = 0D;
|
||||
private double load = 0D;
|
||||
|
||||
public static void init() {
|
||||
}
|
||||
|
||||
static {
|
||||
Thread thread = new Thread(() -> {
|
||||
while (true) {
|
||||
long maxMemory = Runtime.getRuntime().maxMemory();
|
||||
long totalMemory = Runtime.getRuntime().totalMemory();
|
||||
long freeMemory = Runtime.getRuntime().freeMemory();
|
||||
long usedMemory = totalMemory - freeMemory;
|
||||
usageSelf = usedMemory / (double) totalMemory;
|
||||
double usageSelfByMax = usedMemory / (double) maxMemory;
|
||||
// System.out.println("Self: " + usageSelf + "/" + usageSelfByMax + /* " " + maxMemory + " " + totalMemory + " " + freeMemory + " " + usedMemory + */ " Ram: " + usage + " CPU: " + load);
|
||||
|
||||
usage = _getUsage();
|
||||
load = _getLoad();
|
||||
Thread.yield();
|
||||
LockSupport.parkNanos(1000000000L);
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.setName("RamUsage");
|
||||
thread.start();
|
||||
}
|
||||
|
||||
public static double getUsage() {
|
||||
return usage;
|
||||
}
|
||||
|
||||
private static double _getUsage() {
|
||||
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(meminfo)))) {
|
||||
String memTotal = bufferedReader.readLine().replaceAll(" +", " ");
|
||||
bufferedReader.readLine();
|
||||
@ -43,20 +78,43 @@ public class RamUsage {
|
||||
}
|
||||
|
||||
public static double getLoad() {
|
||||
try {
|
||||
Process process = new ProcessBuilder("bash", "-c", "cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS=\"\" '{printf \"%.2f\\n\", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'").start();
|
||||
process.waitFor();
|
||||
return Double.parseDouble(new BufferedReader(new InputStreamReader(process.getInputStream())).readLine());
|
||||
return load;
|
||||
}
|
||||
|
||||
private long lastCpuSecond = -1;
|
||||
private long lastCpuForth = -1;
|
||||
private long lastCpuFifth = -1;
|
||||
|
||||
private static double _getLoad() {
|
||||
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(stat)))) {
|
||||
String[] strings = bufferedReader.readLine().split(" ");
|
||||
|
||||
long cpuSecond = Long.parseLong(strings[2]);
|
||||
long cpuForth = Long.parseLong(strings[4]);
|
||||
long cpuFifth = Long.parseLong(strings[5]);
|
||||
|
||||
if (lastCpuSecond == -1) {
|
||||
lastCpuSecond = cpuSecond;
|
||||
lastCpuForth = cpuForth;
|
||||
lastCpuFifth = cpuFifth;
|
||||
return 0D;
|
||||
}
|
||||
|
||||
long cpuSecondDiff = cpuSecond - lastCpuSecond;
|
||||
long cpuForthDiff = cpuForth - lastCpuForth;
|
||||
long cpuSixthDiff = cpuFifth - lastCpuFifth;
|
||||
|
||||
lastCpuSecond = cpuSecond;
|
||||
lastCpuForth = cpuForth;
|
||||
lastCpuFifth = cpuFifth;
|
||||
|
||||
return (cpuSecondDiff + cpuForthDiff) / (double) (cpuSecondDiff + cpuForthDiff + cpuSixthDiff);
|
||||
} catch (IOException e) {
|
||||
return 1D;
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
return 1D;
|
||||
}
|
||||
}
|
||||
|
||||
private static long getNumber(String s) {
|
||||
return Long.parseLong(s.split(" ")[1]);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
|
||||
@ -70,6 +71,16 @@ public class RegionUtils {
|
||||
});
|
||||
}
|
||||
|
||||
public static void message(Region region, Consumer<Player> function) {
|
||||
Bukkit.getOnlinePlayers()
|
||||
.stream()
|
||||
.filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL))
|
||||
.filter(player -> !region.isGlobal() || Region.getRegion(player.getLocation()).isGlobal())
|
||||
.forEach(player -> {
|
||||
function.accept(player);
|
||||
});
|
||||
}
|
||||
|
||||
static EditSession paste(File file, Point pastePoint, PasteOptions pasteOptions) {
|
||||
return FlatteningWrapper.impl.paste(file, pastePoint, pasteOptions);
|
||||
}
|
||||
|
193
build.gradle
193
build.gradle
@ -16,10 +16,6 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
plugins {
|
||||
// Adding the base plugin fixes the following gradle warnings in IntelliJ:
|
||||
//
|
||||
@ -32,43 +28,12 @@ plugins {
|
||||
id 'application'
|
||||
|
||||
id 'com.github.johnrengelman.shadow' version '5.0.0'
|
||||
}
|
||||
|
||||
ext.swdep = { s ->
|
||||
if (file("${rootDir}/lib/${s}.jar").exists()) {
|
||||
return files("${rootDir}/lib/${s}.jar")
|
||||
} else {
|
||||
if (s.contains("-")) {
|
||||
return "de.steamwar:${s.toLowerCase().replace('-', ':')}"
|
||||
} else {
|
||||
return "de.steamwar:${s.toLowerCase()}:RELEASE"
|
||||
}
|
||||
}
|
||||
id 'de.steamwar.gradle' version 'RELEASE'
|
||||
}
|
||||
|
||||
group 'de.steamwar'
|
||||
version ''
|
||||
|
||||
Properties steamwarProperties = new Properties()
|
||||
if (file("steamwar.properties").exists()) {
|
||||
steamwarProperties.load(file("steamwar.properties").newDataInputStream())
|
||||
}
|
||||
|
||||
ext {
|
||||
buildName = 'BauSystem2.0'
|
||||
artifactName = 'bausystem2.0'
|
||||
|
||||
uberJarName = "${buildName}-all.jar"
|
||||
jarName = "${artifactName}.jar"
|
||||
libs = "${buildDir}/libs"
|
||||
|
||||
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||
operatingSystem = "windows"
|
||||
} else {
|
||||
operatingSystem = "unix"
|
||||
}
|
||||
}
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
compileJava.options.compilerArgs << '-parameter'
|
||||
|
||||
@ -96,14 +61,6 @@ allprojects {
|
||||
maven {
|
||||
url = uri('https://libraries.minecraft.net')
|
||||
}
|
||||
|
||||
maven {
|
||||
url = uri('https://steamwar.de/maven/')
|
||||
credentials {
|
||||
username = steamwarProperties.getProperty("maven.username")
|
||||
password = steamwarProperties.getProperty("maven.password")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -117,151 +74,3 @@ dependencies {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
task buildProject {
|
||||
description 'Build this project'
|
||||
group "Steamwar"
|
||||
|
||||
dependsOn build
|
||||
}
|
||||
|
||||
task finalizeProject {
|
||||
description 'Finalize this project'
|
||||
group "Steamwar"
|
||||
|
||||
doLast {
|
||||
if ("${buildDir}" == null) {
|
||||
return
|
||||
}
|
||||
delete fileTree("${libs}").matching {
|
||||
exclude("${uberJarName}")
|
||||
}
|
||||
file(libs + "/" + uberJarName).renameTo(file(libs + "/" + jarName))
|
||||
}
|
||||
}
|
||||
build.finalizedBy(finalizeProject)
|
||||
|
||||
if (steamwarProperties.containsKey("hostname")) {
|
||||
String hostname = steamwarProperties.get("hostname")
|
||||
|
||||
String type = steamwarProperties.getOrDefault("type", "Bau19")
|
||||
String world = steamwarProperties.getOrDefault("world", "")
|
||||
String pluginFolder = steamwarProperties.getOrDefault("pluginFolder", "")
|
||||
|
||||
task uploadProject {
|
||||
description 'Upload this project'
|
||||
group "Steamwar"
|
||||
|
||||
doLast {
|
||||
await(shell("scp ${libs}/${jarName} ${hostname}:${pluginFolder}"))
|
||||
if (steamwarProperties.getOrDefault("directStart", "false") == "false" && !answer("Start ${server} server?")) {
|
||||
return
|
||||
}
|
||||
serverStart(type, hostname, world, pluginFolder)
|
||||
}
|
||||
}
|
||||
uploadProject.dependsOn(buildProject)
|
||||
|
||||
task startDevServer {
|
||||
description 'Start the DevServer'
|
||||
group "Steamwar"
|
||||
|
||||
doLast {
|
||||
serverStart(server, "", hostname)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def await(Process proc) {
|
||||
def out = new StringBuilder()
|
||||
def err = new StringBuilder()
|
||||
proc.waitForProcessOutput(out, err)
|
||||
return [out, err, proc.exitValue()]
|
||||
}
|
||||
|
||||
private def shell(String command) {
|
||||
if (operatingSystem == "unix") {
|
||||
return ['bash', '-c', command].execute()
|
||||
} else {
|
||||
return ["cmd", "/c", command].execute()
|
||||
}
|
||||
}
|
||||
|
||||
private def serverStart(String type, String hostname, String worldName, String pluginFolder) {
|
||||
def proc = shell("ssh -t ${hostname} \"./binarys/dev.py ${type} -w ${worldName} -p ${pluginFolder}\"")
|
||||
|
||||
Set<String> strings = new HashSet<>()
|
||||
File file = new File("${projectDir}/ignoredlog");
|
||||
if (file.exists()) {
|
||||
new BufferedReader(new InputStreamReader(new FileInputStream(file))).readLines().forEach({ s ->
|
||||
strings.add(s)
|
||||
})
|
||||
}
|
||||
|
||||
Thread outputThread = new Thread({
|
||||
Reader reader = proc.getInputStream().newReader();
|
||||
Writer writer = System.out.newWriter();
|
||||
try {
|
||||
while (proc.alive) {
|
||||
String s = reader.readLine()
|
||||
if (s == null) {
|
||||
return
|
||||
}
|
||||
if (strings.stream().anyMatch({check -> s.contains(check)})) {
|
||||
continue
|
||||
}
|
||||
writer.write(s + "\n")
|
||||
writer.flush()
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Ignored
|
||||
}
|
||||
})
|
||||
outputThread.setName("${type} - OutputThread")
|
||||
outputThread.start()
|
||||
|
||||
Writer writer
|
||||
Thread inputThread = new Thread({
|
||||
Reader reader = System.in.newReader()
|
||||
writer = proc.getOutputStream().newWriter()
|
||||
try {
|
||||
while (proc.alive) {
|
||||
String s = reader.readLine()
|
||||
writer.write(s + "\n")
|
||||
writer.flush()
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Ignored
|
||||
}
|
||||
})
|
||||
inputThread.setName("${type} - InputThread")
|
||||
inputThread.start()
|
||||
|
||||
gradle.buildFinished { buildResult ->
|
||||
if (!proc.alive) {
|
||||
return
|
||||
}
|
||||
writer = proc.getOutputStream().newWriter()
|
||||
writer.write("stop\n")
|
||||
writer.flush()
|
||||
awaitClose(proc, outputThread, inputThread)
|
||||
}
|
||||
awaitClose(proc, outputThread, inputThread)
|
||||
};
|
||||
|
||||
private static def awaitClose(Process proc, Thread outputThread, Thread inputThread) {
|
||||
while (proc.alive) {
|
||||
Thread.sleep(10)
|
||||
}
|
||||
proc.closeStreams()
|
||||
outputThread.interrupt()
|
||||
inputThread.interrupt()
|
||||
}
|
||||
|
||||
private def answer(String question) {
|
||||
while (System.in.available() > 0) System.in.read()
|
||||
println(question)
|
||||
boolean valid = "Yy".contains(((char) System.in.read()).toString())
|
||||
while (System.in.available() > 0) System.in.read()
|
||||
return valid
|
||||
}
|
@ -17,6 +17,15 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
maven {
|
||||
url 'https://steamwar.de/maven/'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = 'BauSystem2.0'
|
||||
|
||||
file('.').listFiles().each {
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Uaah! Deutsch! Rechtsklick, Mittelklick, Shiftklick. Nach "zum" werden Verben großgeschrieben: Editieren, Anschauen, Kopieren, Rausnehmen. Rausnehmen => Entnehmen. Evtl. statt zum ein :. Also so in etwa: §7Linksklick§8: §8Entnahme ...