diff --git a/BauSystem_12/src/de/steamwar/bausystem/tracer/TNTTracer_12.java b/BauSystem_12/src/de/steamwar/bausystem/tracer/TNTTracer_12.java index 7f7ad45..89b8080 100644 --- a/BauSystem_12/src/de/steamwar/bausystem/tracer/TNTTracer_12.java +++ b/BauSystem_12/src/de/steamwar/bausystem/tracer/TNTTracer_12.java @@ -1,6 +1,6 @@ -/* +/* 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 @@ -20,11 +20,20 @@ package de.steamwar.bausystem.tracer; import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; -class TNTTracer_12 { - private TNTTracer_12(){} +public class TNTTracer_12 { - static Material getMaterial(){ - return Material.STAINED_GLASS; + public static AbstractTraceEntity create(World world, Vector tntPosition, Player player, boolean exploded, boolean tnt) { + return new TraceEntity_12(world, tntPosition, player, exploded, tnt); } + + public static boolean inWater(World world, Vector tntPosition) { + Material material = world.getBlockAt(tntPosition.getBlockX(), tntPosition.getBlockY(), tntPosition.getBlockZ()).getType(); + return material == Material.WATER || material == Material.STATIONARY_WATER; + } + } diff --git a/BauSystem_12/src/de/steamwar/bausystem/tracer/TraceEntity_12.java b/BauSystem_12/src/de/steamwar/bausystem/tracer/TraceEntity_12.java new file mode 100644 index 0000000..331bac5 --- /dev/null +++ b/BauSystem_12/src/de/steamwar/bausystem/tracer/TraceEntity_12.java @@ -0,0 +1,69 @@ +/* + 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.tracer; + +import net.minecraft.server.v1_12_R1.*; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +class TraceEntity_12 extends EntityFallingBlock implements AbstractTraceEntity { + + private boolean tnt; + + public TraceEntity_12(World world, Vector position, Player player, boolean exploded, boolean tnt) { + super(((CraftWorld) world).getHandle(), position.getX(), position.getY(), position.getZ(), tnt ? Blocks.TNT.getBlockData() : Blocks.STAINED_GLASS.getBlockData()); + this.tnt = tnt; + + this.setNoGravity(true); + this.ticksLived = -12000; + if (exploded) { + this.setCustomNameVisible(true); + this.setCustomName("Bumm"); + } + + display(player); + } + + @Override + public AbstractTraceEntity display(Player player) { + PacketPlayOutSpawnEntity packetPlayOutSpawnEntity = new PacketPlayOutSpawnEntity(this, 0, 0); + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; + playerConnection.sendPacket(packetPlayOutSpawnEntity); + + if (tnt) { + PacketPlayOutEntityMetadata packetPlayOutEntityMetadata = new PacketPlayOutEntityMetadata(getId(), datawatcher, true); + playerConnection.sendPacket(packetPlayOutEntityMetadata); + } + + return this; + } + + @Override + public AbstractTraceEntity hide(Player player) { + PacketPlayOutEntityDestroy packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(new int[]{getId()}); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packetPlayOutEntityDestroy); + + return this; + } + +} diff --git a/BauSystem_15/src/de/steamwar/bausystem/tracer/TNTTracer_15.java b/BauSystem_15/src/de/steamwar/bausystem/tracer/TNTTracer_15.java index f88d841..bd0b25e 100644 --- a/BauSystem_15/src/de/steamwar/bausystem/tracer/TNTTracer_15.java +++ b/BauSystem_15/src/de/steamwar/bausystem/tracer/TNTTracer_15.java @@ -1,6 +1,6 @@ -/* +/* 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 @@ -20,11 +20,29 @@ package de.steamwar.bausystem.tracer; import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; -class TNTTracer_15 { - private TNTTracer_15(){} +public class TNTTracer_15 { - static Material getMaterial(boolean updatePoint){ - return updatePoint ? Material.LIME_STAINED_GLASS : Material.RED_STAINED_GLASS; + public static AbstractTraceEntity create(World world, Vector tntPosition, Player player, boolean exploded, boolean tnt) { + return new TraceEntity_15(world, tntPosition, player, exploded, tnt); } + + public static boolean inWater(World world, Vector tntPosition) { + Block block = world.getBlockAt(tntPosition.getBlockX(), tntPosition.getBlockY(), tntPosition.getBlockZ()); + if(block.getType() == Material.WATER) + return true; + + BlockData data = block.getBlockData(); + if(!(data instanceof Waterlogged)) + return false; + + return ((Waterlogged) data).isWaterlogged(); + } + } diff --git a/BauSystem_15/src/de/steamwar/bausystem/tracer/TraceEntity_15.java b/BauSystem_15/src/de/steamwar/bausystem/tracer/TraceEntity_15.java new file mode 100644 index 0000000..e0aab38 --- /dev/null +++ b/BauSystem_15/src/de/steamwar/bausystem/tracer/TraceEntity_15.java @@ -0,0 +1,72 @@ +/* + 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.tracer; + +import net.minecraft.server.v1_15_R1.*; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +class TraceEntity_15 extends EntityFallingBlock implements AbstractTraceEntity { + + private static final Vec3D ZERO = new Vec3D(0, 0, 0); + private Vector position; + private boolean tnt; + + public TraceEntity_15(World world, Vector position, Player player, boolean exploded, boolean tnt) { + super(((CraftWorld) world).getHandle(), position.getX(), position.getY(), position.getZ(), tnt ? Blocks.TNT.getBlockData() : Blocks.WHITE_STAINED_GLASS.getBlockData()); + this.position = position; + this.tnt = tnt; + + this.setNoGravity(true); + this.ticksLived = -12000; + if (exploded) { + this.setCustomNameVisible(true); + this.setCustomName(new ChatComponentText("Bumm")); + } + + display(player); + } + + @Override + public AbstractTraceEntity display(Player player) { + PacketPlayOutSpawnEntity packetPlayOutSpawnEntity = new PacketPlayOutSpawnEntity(getId(), getUniqueID(), position.getX(), position.getY(), position.getZ(), 0, 0, EntityTypes.FALLING_BLOCK, tnt ? Block.getCombinedId(Blocks.TNT.getBlockData()) : Block.getCombinedId(Blocks.WHITE_STAINED_GLASS.getBlockData()), ZERO); + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; + playerConnection.sendPacket(packetPlayOutSpawnEntity); + + if (tnt) { + PacketPlayOutEntityMetadata packetPlayOutEntityMetadata = new PacketPlayOutEntityMetadata(getId(), datawatcher, true); + playerConnection.sendPacket(packetPlayOutEntityMetadata); + } + + return this; + } + + @Override + public AbstractTraceEntity hide(Player player) { + PacketPlayOutEntityDestroy packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(new int[]{getId()}); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packetPlayOutEntityDestroy); + + return this; + } + +} diff --git a/BauSystem_API/src/de/steamwar/bausystem/tracer/AbstractTraceEntity.java b/BauSystem_API/src/de/steamwar/bausystem/tracer/AbstractTraceEntity.java new file mode 100644 index 0000000..b2825e5 --- /dev/null +++ b/BauSystem_API/src/de/steamwar/bausystem/tracer/AbstractTraceEntity.java @@ -0,0 +1,32 @@ +/* + 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.tracer; + +import org.bukkit.entity.Player; + +public interface AbstractTraceEntity { + + AbstractTraceEntity display(Player player); + + AbstractTraceEntity hide(Player player); + + void killEntity(); + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 56309f2..50bf488 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -20,9 +20,6 @@ package de.steamwar.bausystem; import de.steamwar.bausystem.commands.*; -import de.steamwar.bausystem.tracer.ShowManager; -import de.steamwar.bausystem.tracer.TNTTracer; -import de.steamwar.bausystem.tracer.TraceListener; import de.steamwar.bausystem.world.*; import de.steamwar.core.CommandRemover; import de.steamwar.core.Core; @@ -122,10 +119,8 @@ public class BauSystem extends JavaPlugin implements Listener { Bukkit.getPluginManager().registerEvents(new RegionListener(), this); Bukkit.getPluginManager().registerEvents(new ScriptListener(), this); Bukkit.getPluginManager().registerEvents(new BauScoreboard(), this); - Bukkit.getPluginManager().registerEvents(new TraceListener(), this); Bukkit.getPluginManager().registerEvents(new ClipboardListener(), this); new AFKStopper(); - TNTTracer.init(); autoShutdown = Bukkit.getScheduler().runTaskLater(this, Bukkit::shutdown, 1200); } @@ -170,8 +165,6 @@ public class BauSystem extends JavaPlugin implements Listener { Player p = e.getPlayer(); p.setOp(true); - ShowManager.add(p); - if (Core.getVersion() == 15) Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, false); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java index 430c3ab..a4594cd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java @@ -21,9 +21,12 @@ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.tracer.ShowManager; -import de.steamwar.bausystem.tracer.TraceManager; -import de.steamwar.bausystem.tracer.recorder.RecordManager; +import de.steamwar.bausystem.tracer.record.RecordStateMachine; +import de.steamwar.bausystem.tracer.show.ShowModeParameter; +import de.steamwar.bausystem.tracer.show.StoredRecords; +import de.steamwar.bausystem.tracer.show.TraceShowManager; +import de.steamwar.bausystem.tracer.show.mode.Advanced; +import de.steamwar.bausystem.tracer.show.mode.Basic; import de.steamwar.bausystem.world.Welt; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -36,15 +39,12 @@ public class CommandTrace implements CommandExecutor { player.sendMessage("§8/§etrace start §8- §7Startet die Aufnahme aller TNT-Positionen"); player.sendMessage("§8/§etrace stop §8- §7Stoppt den TNT-Tracer"); player.sendMessage("§8/§etrace toggleauto §8- §7Automatischer Aufnahmenstart"); - player.sendMessage("§8/§etrace show §8<§eblock§8|§eparticle§8|§7TNT-ID§8> §8- §7Zeigt alle TNT-Positionen"); - player.sendMessage("§8/§etrace hide §8<§7TNT-ID§8> §8- §7Versteckt alle TNT-Positionen"); - player.sendMessage("§8/§etrace toggleshow §8<§7TNT-ID§8> §8- §7Zeigt/Versteckt ein TNT"); - player.sendMessage("§8/§etrace delete §8<§7TNT-ID§8> §8- §7Löscht alle TNT-Positionen"); - player.sendMessage("§8/§etrace interpolate §8[§eall§8|§eyaxis§8|§enone§8] §8- §7Interpolationsoptionen"); - player.sendMessage("§8/§etrace distance §8[§7distanz§8] §8- §7Distanzoptionen"); + player.sendMessage("§8/§etrace show §8<§edefault§8|§eadvanced§8> §8<§e-water§8|§e-interpolate-xz§8|§e-interpolate-y§8> §8- §7Zeigt alle TNT-Positionen"); + player.sendMessage("§8/§etrace hide §8- §7Versteckt alle TNT-Positionen"); + player.sendMessage("§8/§etrace delete §8- §7Löscht alle TNT-Positionen"); // player.sendMessage("§8/§etrace list §8<§7FRAME-ID§8> §8- §7Listet alle TNT auf"); // player.sendMessage("§8/§etrace gui §8- §7Zeigt die Trace Oberfläche an"); - player.sendMessage("§7Optionale Parameter mit §8<>§7, Benötigte Parameter mit §8[]"); + // player.sendMessage("§7Optionale Parameter mit §8<>§7, Benötigte Parameter mit §8[]"); } private boolean permissionCheck(Player player) { @@ -69,176 +69,51 @@ public class CommandTrace implements CommandExecutor { switch (args[0].toLowerCase()) { case "start": + RecordStateMachine.commandStart(); + player.sendMessage(BauSystem.PREFIX + "§aTNT-Tracer gestartet"); + break; case "stop": + RecordStateMachine.commandStop(); + player.sendMessage(BauSystem.PREFIX + "§cTNT-Tracer gestoppt"); + break; case "toggleauto": case "auto": - RecordManager.tracer(player, args); + RecordStateMachine.commandAuto(); + player.sendMessage(BauSystem.PREFIX + RecordStateMachine.getRecordStatus().getAutoMessage()); + break; + case "clear": + case "delete": + StoredRecords.clear(); + player.sendMessage(BauSystem.PREFIX + "§cAlle TNT-Positionen gelöscht"); break; case "show": - case "hide": - case "toggleshow": - case "interpolate": - case "distance": - if (tracer(player, args)) { - help(player); + if (args.length < 2) { + TraceShowManager.show(player, new Basic(player, new ShowModeParameter())); + } else { + ShowModeParameter showModeParameter = ShowModeParameter.parseArguments(args, 2); + switch (args[1].toLowerCase()) { + case "advanced": + TraceShowManager.show(player, new Advanced(player, showModeParameter)); + break; + case "basic": + case "default": + default: + TraceShowManager.show(player, new Basic(player, showModeParameter)); + break; + } } + player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen angezeigt"); + break; + case "hide": + TraceShowManager.hide(player); + player.sendMessage(BauSystem.PREFIX + "§cAlle TNT-Positionen ausgeblendet"); break; case "list": case "gui": - // player.sendMessage(BauSystem.PREFIX + "§cNoch in Bau"); - break; - case "delete": - if (delete(player, args)) { - help(player); - } break; default: help(player); } return false; } - - private boolean delete(Player player, String[] args) { - if (args.length == 2) { - try { - TraceManager.delete(Integer.parseInt(args[1])); - player.sendMessage(BauSystem.PREFIX + "§cTNT-Positionen mit ID " + args[1] + " gelöscht"); - ShowManager.globalDirty(); - return false; - } catch (NumberFormatException e) { - return true; - } - } - TraceManager.deleteAll(); - player.sendMessage(BauSystem.PREFIX + "§cAlle TNT-Positionen gelöscht"); - ShowManager.globalDirty(); - return false; - } - - - public boolean tracer(Player player, String[] args) { - ShowManager.ShowStatus showStatus = ShowManager.showMap.get(player.getUniqueId().toString()); - showStatus.dirty = true; - switch (args[0].toLowerCase()) { - case "show": - showStatus.show(); - if (args.length == 2) { - return tracerShow(player, showStatus, args); - } - player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen angezeigt"); - break; - case "distance": - if (args.length != 2) { - return true; - } - if (args[1].equalsIgnoreCase("default")) { - ShowManager.get(player).setSlope(7.0); - player.sendMessage(BauSystem.PREFIX + "§aAnzeige Distanz auf " + ShowManager.get(player).slopeHeight + " gesetzt"); - return false; - } - try { - double radius = Double.parseDouble(args[1]); - radius = (double)(int)(radius * 10) / 10; - ShowManager.get(player).setSlope(radius); - player.sendMessage(BauSystem.PREFIX + "§aAnzeige Distanz auf " + ShowManager.get(player).slopeHeight + " gesetzt"); - return false; - } catch (NumberFormatException e) { - return true; - } - case "hide": - showStatus.hide(); - if (args.length == 2) { - return traceID(player, args[1], showStatus::removeSelection, new String[]{BauSystem.PREFIX + "§aTNT-Positionen des TNT mit ID {} versteckt"}); - } - player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen versteckt"); - break; - case "toggleshow": - if (args.length == 2) { - return traceID(player, args[1], showStatus::toggleSelection, new String[]{BauSystem.PREFIX + "§aTNT-Positionen des TNT mit ID {} angezeigt"}, new String[]{BauSystem.PREFIX + "§aTNT-Positionen des TNT mit ID {} versteckt"}); - } - return true; - case "interpolate": - if (args.length == 2) { - return tracerInterpolate(player, showStatus, args); - } - return true; - default: - break; - } - return false; - } - - private boolean tracerShow(Player player, ShowManager.ShowStatus showStatus, String[] args) { - switch (args[1].toLowerCase()) { - case "block": - case "blocks": - showStatus.displayType = ShowManager.DisplayType.Block; - player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen, als Blöcke, angezeigt"); - break; - case "particle": - case "particles": - case "default": - showStatus.displayType = ShowManager.DisplayType.Particle; - player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen, als Partikel, angezeigt"); - break; - default: - return traceID(player, args[1], showStatus::addSelection, new String[]{BauSystem.PREFIX + "§aTNT-Positionen des TNT mit ID {} angezeigt"}); - } - return false; - } - - private boolean tracerInterpolate(Player player, ShowManager.ShowStatus showStatus, String[] args) { - switch (args[1].toLowerCase()) { - case "none": - showStatus.displayMode = ShowManager.DisplayMode.NONE; - player.sendMessage(BauSystem.PREFIX + "§aInterpolation auf §enone §agesetzt"); - break; - case "yaxis": - case "y": - showStatus.displayMode = ShowManager.DisplayMode.Y_AXIS; - player.sendMessage(BauSystem.PREFIX + "§aInterpolation auf §eyaxis §agesetzt"); - break; - case "all": - case "allaxis": - case "xyz": - case "default": - showStatus.displayMode = ShowManager.DisplayMode.ALL; - player.sendMessage(BauSystem.PREFIX + "§aInterpolation auf §eall §agesetzt"); - break; - default: - return true; - } - return false; - } - - - private boolean traceID(Player player, String number, ShowManager.Mode mode, String[] messages) { - try { - mode.run(Integer.parseInt(number)); - for (String s : messages) { - player.sendMessage(s.replace("{}", number)); - } - } catch (NumberFormatException e) { - return true; - } - return false; - } - - private boolean traceID(Player player, String number, ShowManager.ModeChoose mode, String[] messagesTrue, String[] messagesFalse) { - try { - boolean result = mode.run(Integer.parseInt(number)); - if (result) { - for (String s : messagesTrue) { - player.sendMessage(s.replace("{}", number)); - } - } else { - for (String s : messagesFalse) { - player.sendMessage(s.replace("{}", number)); - } - } - } catch (NumberFormatException e) { - return true; - } - return false; - } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java index b97fa39..5efe116 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java @@ -19,7 +19,8 @@ package de.steamwar.bausystem.commands; -import de.steamwar.bausystem.tracer.recorder.RecordManager; +import de.steamwar.bausystem.tracer.record.RecordStateMachine; +import de.steamwar.bausystem.tracer.record.RecordStatus; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; @@ -28,9 +29,21 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.BiPredicate; public class CommandTraceTabCompleter implements TabCompleter { + private static List tabCompletes = new ArrayList<>(); + + static { + tabCompletes.add(new TabComplete((player, args) -> args.length == 1 && (RecordStateMachine.getRecordStatus() == RecordStatus.IDLE || RecordStateMachine.getRecordStatus() == RecordStatus.IDLE_AUTO), "start")); + tabCompletes.add(new TabComplete((player, args) -> args.length == 1 && (RecordStateMachine.getRecordStatus() != RecordStatus.IDLE && RecordStateMachine.getRecordStatus() != RecordStatus.IDLE_AUTO), "stop")); + tabCompletes.add(new TabComplete((player, args) -> args.length == 1, "toggleauto", "auto", "show", "hide", "delete", "clear")); + tabCompletes.add(new TabComplete((player, args) -> args.length == 2 && args[0].equalsIgnoreCase("show"), "basic", "advanced")); + tabCompletes.add(new TabComplete((player, args) -> args.length > 2 && args[0].equalsIgnoreCase("show") && (args[1].equalsIgnoreCase("basic") || args[1].equalsIgnoreCase("advanced")), "-water")); + tabCompletes.add(new TabComplete((player, args) -> args.length > 2 && args[0].equalsIgnoreCase("show") && args[1].equalsIgnoreCase("advanced"), "-interpolate-xz", "-interpolate-y")); + } + @Override public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { if(!(sender instanceof Player)) return new ArrayList<>(); @@ -39,44 +52,37 @@ public class CommandTraceTabCompleter implements TabCompleter { private List tracerTabComplete(Player player, String[] args) { List tabComplete = new ArrayList<>(); - if (RecordManager.getStatus() == RecordManager.Status.IDLE || RecordManager.getStatus() == RecordManager.Status.IDLE_AUTO) { - tabComplete.add("start"); - } else { - tabComplete.add("stop"); + for (TabComplete tab : tabCompletes) { + if (tab.test(player, args)) tabComplete.addAll(Arrays.asList(tab.getTabCompletes())); } - tabComplete.add("toggleauto"); - tabComplete.add("auto"); - tabComplete.add("toggleshow"); - tabComplete.add("show"); - if (args[0].equalsIgnoreCase("show") && args.length == 2) { - return manageList(new ArrayList<>(Arrays.asList("block", "particle")), args, 1); - } - tabComplete.add("hide"); - tabComplete.add("delete"); - tabComplete.add("interpolate"); - if (args[0].equalsIgnoreCase("interpolate") && args.length == 2) { - return manageList(new ArrayList<>(Arrays.asList("all", "yaxis", "none")), args, 1); - } - tabComplete.add("distance"); - if (args[0].equalsIgnoreCase("distance") && args.length == 2) { - return manageList(new ArrayList<>(Arrays.asList("3", "4", "5", "6", "7", "8", "9", "10", "11", "default")), args, 1); - } - //tabComplete.add("gui"); - //tabComplete.add("list"); - - if (args.length >= 2) { - return new ArrayList<>(); - } - return manageList(tabComplete, args, 0); + return manageList(tabComplete, args); } - private List manageList(List strings, String[] args, int index) { + private List manageList(List strings, String[] args) { for (int i = strings.size() - 1; i >= 0; i--) { - if (!strings.get(i).startsWith(args[index])) { - strings.remove(i); - } + if (!strings.get(i).startsWith(args[args.length - 1])) strings.remove(i); } return strings; } + private static class TabComplete { + + private BiPredicate function; + private String[] tabCompletes; + + private TabComplete(BiPredicate function, String... tabCompletes) { + this.function = function; + this.tabCompletes = tabCompletes; + } + + public boolean test(Player player, String[] args) { + return function.test(player, args); + } + + public String[] getTabCompletes() { + return tabCompletes; + } + + } + } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/RoundedTNTPosition.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/RoundedTNTPosition.java new file mode 100644 index 0000000..a38459b --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/RoundedTNTPosition.java @@ -0,0 +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.tracer; + +import org.bukkit.util.Vector; + +import java.util.Objects; + +public class RoundedTNTPosition { + + private static final int factor = 10; + + private int x; + private int y; + private int z; + + public RoundedTNTPosition(TNTPosition tntPosition) { + this(tntPosition.getLocation().getX(), tntPosition.getLocation().getY(), tntPosition.getLocation().getZ()); + } + + public RoundedTNTPosition(Vector vector) { + this(vector.getX(), vector.getY(), vector.getZ()); + } + + public RoundedTNTPosition(double x, double y, double z) { + this.x = (int)(x * factor); + this.y = (int)(y * factor); + this.z = (int)(z * factor); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RoundedTNTPosition)) return false; + RoundedTNTPosition that = (RoundedTNTPosition) o; + return x == that.x && + y == that.y && + z == that.z; + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/ShowManager.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/ShowManager.java deleted file mode 100644 index 9514990..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/ShowManager.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - 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.tracer; - -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.*; - -public class ShowManager { - - public enum DisplayMode { - NONE, - Y_AXIS, - ALL - } - - public enum DisplayType { - Particle, - Block - } - - public enum ShowSelection { - NONE, - SELECTIVE, - ALL - } - - - public interface Mode { - void run(int tntID); - } - - public interface ModeChoose { - boolean run(int tntID); - } - - - public static class ShowStatus { - - private ShowSelection showSelection = ShowSelection.NONE; - public DisplayType displayType = DisplayType.Particle; - public DisplayMode displayMode = DisplayMode.ALL; - - public boolean dirty = true; - private int count = 0; - - private Set selected = new HashSet<>(); - - private void clear() { - if (showSelection == ShowSelection.NONE) return; - selected.clear(); - } - - public void show() { - showSelection = ShowSelection.ALL; - } - - public void hide() { - clear(); - showSelection = ShowSelection.NONE; - } - - public void addSelection(int id) { - if (showSelection == ShowSelection.ALL) return; - if (showSelection == ShowSelection.NONE) showSelection = ShowSelection.SELECTIVE; - TraceManager.getFrame(id).forEach(i -> selected.add(i)); - if (selected.size() == TraceManager.getAllTraces().size()) { - showSelection = ShowSelection.ALL; - clear(); - } - } - - public void removeSelection(int id) { - if (showSelection == ShowSelection.NONE) return; - if (showSelection == ShowSelection.ALL) selected = TraceManager.getAllTraces(); - TraceManager.getFrame(id).forEach(i -> selected.remove(i)); - showSelection = ShowSelection.SELECTIVE; - if (selected.isEmpty()) showSelection = ShowSelection.NONE; - } - - public boolean toggleSelection(int id) { - if (showSelection == ShowSelection.NONE) { - addSelection(id); - return true; - } - if (showSelection == ShowSelection.ALL) { - removeSelection(id); - return false; - } - if (selected.contains(id)) { - removeSelection(id); - return false; - } else { - addSelection(id); - return true; - } - } - - public DisplayType getDisplayType() { - return displayType; - } - - public DisplayMode getDisplayMode() { - return displayMode; - } - - public LinkedList getTraces() { - if (showSelection == ShowSelection.NONE) return new LinkedList<>(); - Set tntIDs; - if (showSelection == ShowSelection.ALL) { - tntIDs = TraceManager.getAllTraces(); - } else { - tntIDs = selected; - } - - LinkedList traces = new LinkedList<>(); - for (int traceId : tntIDs) { - TNTTrace trace = TraceManager.getTrace(traceId); - if (trace == null) continue; - traces.add(trace); - } - return traces; - } - - public boolean isDirty() { - if (displayType == DisplayType.Block) { - count++; - } - if (count >= 10) { - count = 0; - return true; - } - if (dirty) { - dirty = false; - return true; - } - return false; - } - - public double slopeHeight = 7.0; - - private int size = 0; - - private TraceCache.Loc loc = null; - - public double getShowRadius() { - double maxRadius = 80.0; - if (showSelection == ShowSelection.NONE) return maxRadius; - if (showSelection == ShowSelection.ALL) size = TraceManager.getAllTraces().size(); - if (showSelection == ShowSelection.SELECTIVE) size = selected.size(); - if (size == 0) return maxRadius; - double minRadius = 20.0; - if (size >= 950) return minRadius; - - double slope = -(size / slopeHeight) + 85; - return Math.min(Math.max(slope, minRadius), maxRadius); - } - - public void setSlope(double slope) { - double minSlope = 3.0; - double maxSlope = 11.0; - slopeHeight = Math.min(Math.max(slope, minSlope), maxSlope); - } - - public void move(Player player) { - if (loc != null && !loc.remove(player, 4)) { - return; - } - Location location = player.getLocation(); - loc = new TraceCache.Loc((float) location.getX(), (float) location.getY(), (float) location.getZ()); - dirty = true; - } - - } - - public static Map showMap = new HashMap<>(); - - public static void add(Player p) { - showMap.put(p.getUniqueId().toString(), new ShowStatus()); - } - - public static ShowStatus get(Player p) { - if (!showMap.containsKey(p.getUniqueId().toString())) add(p); - return showMap.get(p.getUniqueId().toString()); - } - - public static void traceAdd() { - for (Map.Entry entry : showMap.entrySet()) { - if (entry.getValue().showSelection == ShowSelection.ALL) { - entry.getValue().dirty = true; - } - } - } - - public static void traceRemove(int id) { - for (Map.Entry entry : showMap.entrySet()) { - entry.getValue().removeSelection(id); - } - } - - public static void globalDirty() { - for (Map.Entry entry : showMap.entrySet()) { - entry.getValue().dirty = true; - } - } - -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTPosition.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTPosition.java new file mode 100644 index 0000000..d877ae5 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTPosition.java @@ -0,0 +1,61 @@ +/* + 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.tracer; + +import org.bukkit.entity.Entity; +import org.bukkit.util.Vector; + +public class TNTPosition { + + private Vector location; + private Vector previousLocation = null; + private boolean exploded; + + public TNTPosition(Entity entity, Vector previousLocation, boolean exploded) { + location = entity.getLocation().toVector(); + this.previousLocation = previousLocation; + this.exploded = exploded; + } + + public TNTPosition(Vector vector) { + location = vector; + this.exploded = false; + } + + public Vector getLocation() { + return location; + } + + public Vector getPreviousLocation() { + return previousLocation; + } + + public boolean isExploded() { + return exploded; + } + + @Override + public String toString() { + return "Position{" + + "location=" + location + + '}'; + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTrace.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTrace.java deleted file mode 100644 index 6c7b770..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTrace.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - 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.tracer; - -import org.bukkit.Location; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -public class TNTTrace { - - private final int frameID; - - private int index = 0; - private float[] positions = new float[240]; - - private Set posSet = new HashSet<>(); - private Set posYSet = new HashSet<>(); - private Set posXYZSet = new HashSet<>(); - - TNTTrace(int frameID) { - this.frameID = frameID; - } - - void addLocation(Location location) { - if (index >= positions.length) { - positions = Arrays.copyOf(positions, positions.length + 3); - } - positions[index] = (float)location.getX(); - positions[index + 1] = (float)location.getY(); - positions[index + 2] = (float)location.getZ(); - index += 3; - } - - private int size() { - return index / 3; - } - - public int length() { - return size(); - } - - private int realLength() { - return positions.length; - } - - int getFrameID() { - return frameID; - } - - void cleanUp() { - positions = Arrays.copyOf(positions, index); - ShowManager.traceAdd(); - - for (int i = 0; i < length(); i++) { - posSet.add(new TraceCache.Loc(positions[i * 3], positions[i * 3 + 1], positions[i * 3 + 2])); - } - - for (int i = 0; i < realLength() - 3; i += 3) { - float x1 = positions[i]; - float y1 = positions[i + 1]; - float z1 = positions[i + 2]; - - float x2 = positions[i + 3]; - float y2 = positions[i + 4]; - float z2 = positions[i + 5]; - - if (isDifferent(y2, y1)) { - TraceCache.Loc loc = new TraceCache.Loc(x1, y2, z1); - posYSet.add(loc); - posXYZSet.add(loc); - } - if (Math.abs(x2 - x1) > Math.abs(z2 - z1)) { - if (isDifferent(x2, x1)) posXYZSet.add(new TraceCache.Loc(x2, y2, z1)); - } else { - if (isDifferent(z2, z1)) posXYZSet.add(new TraceCache.Loc(x1, y2, z2)); - } - } - } - - Set locs() { - return posSet; - } - - Set locsUpdate(ShowManager.DisplayMode displayMode) { - if (displayMode == ShowManager.DisplayMode.NONE) return new HashSet<>(); - if (displayMode == ShowManager.DisplayMode.Y_AXIS) return posYSet; - return posXYZSet; - } - - private static boolean isDifferent(float d1, float d2) { - return (d2 - d1) * (d2 - d1) >= 0.01; - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer.java deleted file mode 100644 index a7ea71b..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracer.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - 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.tracer; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.core.Core; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.entity.Player; - -import java.util.Set; - -public class TNTTracer { - private TNTTracer(){} - - static final boolean DEBUG = false; - - private static final Object synchronizer = new Object(); - private static final TraceCache traceCache = new TraceCache(); - - public static void init(){ - Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), TNTTracer::run, 0, 20); - } - - private static void run() { - for (Player p : Bukkit.getOnlinePlayers()) { - if (DEBUG) { - String actionBar = "§e" + TraceManager.getAllTraces().size() + " §cTraces §e" + ShowManager.get(p).getShowRadius() + " §cRadius"; - p.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(actionBar)); - } - - boolean dirty = ShowManager.get(p).isDirty(); - if (ShowManager.get(p).getDisplayType() == ShowManager.DisplayType.Block && !dirty) { - continue; - } - Set toHide = traceCache.update(p, dirty); - Set toShow = traceCache.get(p); - - hideBlockTraces(toHide, p); - showTraces(toShow, ShowManager.get(p).getDisplayType(), p); - } - } - - private static void hideBlockTraces(Set locs, Player player) { - if (locs.isEmpty()) return; - - for (TraceCache.Loc l : locs) { - hideBlock(player, l.x, l.y - 0.49F, l.z); - } - } - - private static void showTraces(Set locs, ShowManager.DisplayType displayMode, Player player) { - if (locs.isEmpty()) return; - - for (TraceCache.Loc l : locs) { - if (displayMode == ShowManager.DisplayType.Block) { - showBlock(player, l.x, l.y - 0.49F, l.z, getMaterial(l), (l.updatePoint ? (byte) 5 : (byte) 14)); - } else { - showCorner(player, l.x - 0.49F, l.y, l.z - 0.49F, (l.updatePoint ? Particle.FLAME : Particle.VILLAGER_HAPPY)); - } - } - } - - private static Material getMaterial(TraceCache.Loc l){ - switch(Core.getVersion()){ - case 15: - return TNTTracer_15.getMaterial(l.updatePoint); - default: - return TNTTracer_12.getMaterial(); - } - } - - private static void showCorner(Player player, float x, float y, float z, Particle particle) { - player.spawnParticle(particle, makeLocation(x + 0.00F, y + 0.00F, z + 0.00F), 1, 0F, 0F, 0F, 0.001); - player.spawnParticle(particle, makeLocation(x + 0.98F, y + 0.00F, z + 0.00F), 1, 0F, 0F, 0F, 0.001); - player.spawnParticle(particle, makeLocation(x + 0.00F, y + 0.00F, z + 0.98F), 1, 0F, 0F, 0F, 0.001); - player.spawnParticle(particle, makeLocation(x + 0.98F, y + 0.00F, z + 0.98F), 1, 0F, 0F, 0F, 0.001); - - player.spawnParticle(particle, makeLocation(x + 0.00F, y + 0.98F, z + 0.00F), 1, 0F, 0F, 0F, 0.001); - player.spawnParticle(particle, makeLocation(x + 0.98F, y + 0.98F, z + 0.00F), 1, 0F, 0F, 0F, 0.001); - player.spawnParticle(particle, makeLocation(x + 0.00F, y + 0.98F, z + 0.98F), 1, 0F, 0F, 0F, 0.001); - player.spawnParticle(particle, makeLocation(x + 0.98F, y + 0.98F, z + 0.98F), 1, 0F, 0F, 0F, 0.001); - } - - private static void showBlock(Player p, float x, float y, float z, Material block, byte b) { - if (makeLocation(x, y, z).getBlock().getType() == Material.AIR) { - p.sendBlockChange(makeLocation(x, y, z), block, b); - } - } - - private static void hideBlock(Player p, float x, float y, float z) { - if (makeLocation(x, y, z).getBlock().getType() == Material.AIR) { - p.sendBlockChange(makeLocation(x, y, z), Material.AIR, (byte) 0); - } - } - - private static final Location location = new Location(Bukkit.getWorlds().get(0), 0, 0, 0); - private static Location makeLocation(float x, float y, float z) { - location.setX(x); - location.setY(y); - location.setZ(z); - return location; - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracerGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracerGUI.java deleted file mode 100644 index e011e48..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TNTTracerGUI.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - 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.tracer; - -public class TNTTracerGUI { - - /*private static GuiCallbackTNTFrame guiCallbackTNTFrame; - private static GuiCallbackTNTTrace guiCallbackTNTTrace; - private static GuiCallbackRecording guiCallbackRecording; - - private static Inventory getEmpty(String title) { - Inventory inventory = Bukkit.createInventory(null, 54, title); - ItemStack i1 = createItem(Material.LIGHT_GRAY_STAINED_GLASS_PANE, false, ""); - for (int i = 0; i < 9; i++) { - inventory.setItem(i, i1); - } - ItemStack i2 = createItem(Material.RED_STAINED_GLASS, false, ""); - for (int i = 9; i < 54; i++) { - inventory.setItem(i, i2); - } - return inventory; - } - - public static ItemStack createItem(Material material, boolean selected, String name, String... lore) { - ItemStack item = new ItemStack(material, 1); - ItemMeta im = item.getItemMeta(); - - if (im == null) return item; - if (name == null) name = "§f"; - if (name.isEmpty()) name = "§f"; - im.setDisplayName(name); - if (selected) { - im.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1, true); - } - im.addItemFlags(ItemFlag.HIDE_ENCHANTS); - - if (lore != null) { - List lorelist = Arrays.asList(lore); - im.setLore(lorelist); - } - - item.setItemMeta(im); - return item; - } - - private static void frameControls(Inventory inventory, int page, int allPages) { - inventory.setItem(1, createItem(Material.HONEYCOMB, false, "§eShow§8/§eHide")); - inventory.setItem(4, createItem(Material.BARRIER, false, "§eClear ausgewählte Positionen")); - inventory.setItem(5, createItem(Material.OBSERVER, false, "§eToggle AUTO-Trace")); - inventory.setItem(6, guiCallbackRecording.run()); - inventory.setItem(8, createItem(Material.PAPER, false, "§7PAGE §e§l" + page + "§8/§e§l" + allPages)); - } - - private static Inventory getFrameInventory(Player p, int page) { - ItemStack[] items = guiCallbackTNTFrame.run(p); - - Inventory inventory = getEmpty("§7§lTRACE §8- §e§lAufnahmen"); - if (items.length == 0) { - frameControls(inventory, page + 1, 1); - } else { - frameControls(inventory, page + 1, items.length / 45 + (items.length % 45 == 0 ? 0 : 1)); - } - return inventory; - } - - public static void init(GuiCallbackTNTFrame guiCallbackTNTFrame, GuiCallbackTNTTrace guiCallbackTNTTrace, GuiCallbackRecording guiCallbackRecording) { - TNTTracerGUI_15.guiCallbackTNTFrame = guiCallbackTNTFrame; - TNTTracerGUI_15.guiCallbackTNTTrace = guiCallbackTNTTrace; - TNTTracerGUI_15.guiCallbackRecording = guiCallbackRecording; - } - - public enum Menu { - FRAME, - TRACE, - BLOCK - } - - public static void show(Player p, int page, Menu menu) { - - }*/ - -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceCache.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceCache.java deleted file mode 100644 index 1f094cb..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceCache.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - 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.tracer; - -import org.bukkit.entity.Player; - -import java.util.*; - -public class TraceCache { - - private static final Set empty = new HashSet<>(); - private Map> playerMap = new HashMap<>(); - private Map playerDisplayMap = new HashMap<>(); - - public Set get(Player player) { - return playerMap.getOrDefault(player.getUniqueId().toString(), empty); - } - - Set update(Player player, boolean dirty) { - if (!dirty) return empty; - String key = player.getUniqueId().toString(); - Set locOld; - ShowManager.DisplayType displayMode; - if (!playerMap.containsKey(key)) { - locOld = new HashSet<>(); - displayMode = getDisplayType(player); - } else { - locOld = playerMap.get(key); - displayMode = playerDisplayMap.get(key); - } - - Set locSet = new HashSet<>(); - updatePoints(player).forEach(loc -> { - loc.updatePoint = true; - locSet.add(loc); - }); - updateLocations(player).forEach(loc -> { - loc.updatePoint = false; - locSet.add(loc); - }); - - playerMap.put(key, locSet); - ShowManager.DisplayType currentMode = getDisplayType(player); - playerDisplayMap.put(key, currentMode); - - if (currentMode == ShowManager.DisplayType.Particle && displayMode == ShowManager.DisplayType.Block) return locOld; - if (currentMode == ShowManager.DisplayType.Block) return diff(locOld, locSet); - return empty; - } - - public static class Loc { - final float x; - final float y; - final float z; - - private final float dx; - private final float dy; - private final float dz; - - boolean updatePoint = false; - - public Loc(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - this.dx = round(x); - this.dy = round(y); - this.dz = round(z); - } - - private static float round(float toRound) { - final int roundNumber = 10; - float r = (toRound * roundNumber); - float t = r - (int) r; - if (t >= 0.5) { - return (((float)(int)r) + 1) / roundNumber; - } else { - return (((float)(int)r) + 0) / roundNumber; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Loc)) return false; - Loc loc = (Loc) o; - return Float.compare(loc.dx, dx) == 0 && - Float.compare(loc.dy, dy) == 0 && - Float.compare(loc.dz, dz) == 0; - } - - @Override - public int hashCode() { - return Objects.hash(dx, dy, dz); - } - - @Override - public String toString() { - return "Loc{" + - "x=" + x + - ", y=" + y + - ", z=" + z + - '}'; - } - - public boolean remove(Player player, double radius) { - double x = player.getLocation().getX(); - double y = player.getLocation().getY(); - double z = player.getLocation().getZ(); - - double dx = (this.x - x) * (this.x - x); - double dy = (this.y - y) * (this.y - y); - double dz = (this.z - z) * (this.z - z); - - return (dx + dy + dz) > radius * radius; - } - } - - private Set diff(Set locOld, Set locNew) { - if (locOld.isEmpty()) return empty; - if (locNew.isEmpty()) return locOld; - for (Loc l : locNew) { - locOld.remove(l); - } - return locOld; - } - - private Set updateLocations(Player player) { - Iterator traces = ShowManager.get(player).getTraces().descendingIterator(); - Set locSet = new HashSet<>(); - while (traces.hasNext()) { - locSet.addAll(traces.next().locs()); - } - double radius = ShowManager.get(player).getShowRadius(); - locSet.removeIf(loc -> loc.remove(player, radius)); - return locSet; - } - - private Set updatePoints(Player player) { - Iterator traces = ShowManager.get(player).getTraces().descendingIterator(); - Set locSet = new HashSet<>(); - while (traces.hasNext()) { - locSet.addAll(traces.next().locsUpdate(ShowManager.get(player).getDisplayMode())); - } - double radius = ShowManager.get(player).getShowRadius(); - locSet.removeIf(loc -> loc.remove(player, radius)); - return locSet; - } - - private ShowManager.DisplayType getDisplayType(Player player) { - return ShowManager.get(player).getDisplayType(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceListener.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceListener.java deleted file mode 100644 index be87341..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceListener.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - 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.tracer; - -import de.steamwar.bausystem.tracer.recorder.RecordManager; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.player.PlayerMoveEvent; - -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Stream; - -public class TraceListener implements Listener { - - private static final Map tntMap = new HashMap<>(); - - public static void onTick(Stream tntPrimedStream) { - tntPrimedStream.forEach(tnt -> { - TNTTrace trace; - if (!tntMap.containsKey(tnt)) { - trace = TraceManager.createTrace(); - if (trace == null) return; - tntMap.put(tnt, trace); - } else { - trace = tntMap.get(tnt); - } - trace.addLocation(tnt.getLocation()); - }); - } - - @EventHandler - public void onEntityExplode(EntityExplodeEvent event) { - if (!(event.getEntity() instanceof TNTPrimed)) - return; - - if (RecordManager.getStatus() == RecordManager.Status.IDLE_AUTO) - RecordManager.startAuto(); - if (RecordManager.getStatus() == RecordManager.Status.RECORD_AUTO) - RecordManager.updateAuto(); - - TNTTrace trace = tntMap.remove((TNTPrimed) event.getEntity()); - if (trace != null) - trace.cleanUp(); - } - - - @EventHandler - public void playerMove(PlayerMoveEvent event) { - Player p = event.getPlayer(); - ShowManager.get(p).move(p); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceManager.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceManager.java deleted file mode 100644 index 1491610..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/TraceManager.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - 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.tracer; - -import java.util.*; - -public class TraceManager { - private TraceManager(){} - - private static Map> frameMap = new HashMap<>(); - private static Map traceMap = new HashMap<>(); - - private static int currentFrame; - - private static int currentID = 0; - private static synchronized int generateID() { - return currentID++; - } - - public static void startFrame() { - currentFrame = generateID(); - frameMap.put(currentFrame, new ArrayList<>()); - } - - public static TNTTrace createTrace() { - if (!frameMap.containsKey(currentFrame)) return null; - TNTTrace trace = new TNTTrace(currentFrame); - int id = generateID(); - traceMap.put(id, trace); - frameMap.get(currentFrame).add(id); - return trace; - } - - public static TNTTrace getTrace(int id) { - return traceMap.get(id); - } - - public static Set getAllTraces() { - return traceMap.keySet(); - } - - public static List getFrame(int frameID) { - return new ArrayList<>(frameMap.getOrDefault(frameID, new ArrayList<>())); - } - - public static int currentFrameSize() { - if (!frameMap.containsKey(currentFrame)) return 0; - return frameMap.get(currentFrame).size(); - } - - public static void stopFrame() { - testRemoveFrame(currentFrame); - } - - private static void testRemoveFrame(int frame){ - if (!frameMap.containsKey(frame) || !frameMap.get(frame).isEmpty()) - return; - frameMap.remove(frame); - } - - public static void deleteAll() { - for (Integer integer : new HashSet<>(traceMap.keySet())) { - delete(integer); - } - } - - public static void delete(int id) { - TNTTrace trace = traceMap.remove(id); - if(trace == null){ - List frame = frameMap.get(id); - if(frame == null) - return; - - for(int t : new HashSet<>(frame)){ - delete(t); - } - return; - } - int frameID = trace.getFrameID(); - ShowManager.traceRemove(id); - if (frameMap.containsKey(frameID)) frameMap.get(frameID).remove((Integer) id); - testRemoveFrame(frameID); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStateMachine.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStateMachine.java new file mode 100644 index 0000000..7a1e25e --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStateMachine.java @@ -0,0 +1,89 @@ +/* + 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.tracer.record; + +public class RecordStateMachine { + private RecordStateMachine() { + } + + private static final TraceAutoHandler autoHandler = new TraceAutoHandler(); + + private static RecordStatus recordStatus = RecordStatus.IDLE; + private static Recorder recorder = null; + + public static void commandStart() { + autoHandler.disable(); + recordStart(); + recordStatus = RecordStatus.RECORD; + } + + public static void commandStop() { + autoHandler.disable(); + recordStop(); + recordStatus = RecordStatus.IDLE; + } + + public static void commandAuto() { + if (recordStatus.isTracing()) + return; + + if (recordStatus == RecordStatus.IDLE_AUTO) { + recordStatus = RecordStatus.IDLE; + autoHandler.disable(); + } else { + recordStatus = RecordStatus.IDLE_AUTO; + autoHandler.enable(); + } + } + + static void autoRecord() { + recordStart(); + recordStatus = RecordStatus.RECORD_AUTO; + } + + static void autoIdle() { + recordStop(); + recordStatus = RecordStatus.IDLE_AUTO; + } + + private static void recordStart() { + if (recordStatus.isTracing()) return; + recorder = new Recorder(); + } + + private static void recordStop() { + if (!recordStatus.isTracing()) return; + recorder.stopRecording(); + } + + public static RecordStatus getRecordStatus() { + return recordStatus; + } + + public static int size() { + if (recorder == null) return 0; + return recorder.size(); + } + + public static long getStartTime() { + if (recorder == null) return 0; + return recorder.getStartTime(); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java new file mode 100644 index 0000000..e9f69e7 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java @@ -0,0 +1,51 @@ +/* + 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.tracer.record; + +public enum RecordStatus { + + RECORD("§aan", true,"§cTNT-Tracer muss gestoppt werden"), + RECORD_AUTO("§aan", true, "§cTNT-Tracer darf nicht aufnehmen"), + IDLE("§caus", false, "§cAuto-Tracer gestoppt"), + IDLE_AUTO("§eauto", false, "§aAuto-Tracer gestartet"); + + String name; + boolean tracing; + String autoMessage; + + RecordStatus(String value, boolean tracing, String autoMessage) { + this.name = value; + this.tracing = tracing; + this.autoMessage = autoMessage; + } + + public String getName() { + return name; + } + + public boolean isTracing() { + return tracing; + } + + public String getAutoMessage() { + return autoMessage; + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/Recorder.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/Recorder.java new file mode 100644 index 0000000..f330d81 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/Recorder.java @@ -0,0 +1,89 @@ +/* + 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.tracer.record; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.tracer.show.Record; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.scheduler.BukkitTask; + +import java.util.HashMap; +import java.util.Map; + +public class Recorder implements Listener { + + private static final World world = Bukkit.getWorlds().get(0); + + private final Map recordMap = new HashMap<>(); + private final BukkitTask task; + private final Record record; + + Recorder() { + Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin()); + task = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), this::run, 1, 1); + record = new Record(); + + // To trace TNT initial positions with AutoTracer + run(); + } + + void stopRecording() { + HandlerList.unregisterAll(this); + task.cancel(); + } + + int size() { + return record.size(); + } + + long getStartTime() { + return record.getStartTime(); + } + + private void run() { + world.getEntitiesByClass(TNTPrimed.class).forEach(tntPrimed -> get(tntPrimed).add(tntPrimed)); + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + if (!(event.getEntity() instanceof TNTPrimed)) + return; + TNTPrimed tntPrimed = (TNTPrimed) event.getEntity(); + + get(tntPrimed).explode(tntPrimed); + recordMap.remove(tntPrimed); + } + + private Record.TNTRecord get(TNTPrimed tntPrimed) { + Record.TNTRecord tntRecord = recordMap.get(tntPrimed); + if (tntRecord != null) + return tntRecord; + + tntRecord = this.record.spawn(); + recordMap.put(tntPrimed, tntRecord); + return tntRecord; + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/TraceAutoHandler.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/TraceAutoHandler.java new file mode 100644 index 0000000..ed93e28 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/TraceAutoHandler.java @@ -0,0 +1,70 @@ +/* + 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.tracer.record; + +import de.steamwar.bausystem.BauSystem; +import org.bukkit.Bukkit; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.scheduler.BukkitTask; + +public class TraceAutoHandler implements Listener { + /* This listener handles the en- and disabling of the Tracer in AUTO mode */ + + private BukkitTask task; + private int lastExplosion = 0; // Time since the last explosion in ticks + + public void enable(){ + Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin()); + } + + public void disable(){ + HandlerList.unregisterAll(this); + if(task != null){ + task.cancel(); + task = null; + } + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + if (!(event.getEntity() instanceof TNTPrimed)) + return; + + lastExplosion = 0; + if(task == null){ + RecordStateMachine.autoRecord(); + task = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), this::run, 1, 1); + } + } + + private void run(){ + lastExplosion++; + + if (lastExplosion > 80) { + RecordStateMachine.autoIdle(); + task.cancel(); + task = null; + } + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/recorder/RecordManager.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/recorder/RecordManager.java deleted file mode 100644 index 0e7d55b..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/recorder/RecordManager.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - 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.tracer.recorder; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.tracer.TraceManager; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import static de.steamwar.bausystem.tracer.recorder.TNTRecorder.*; - -public class RecordManager { - - static Status status = Status.IDLE; - - static final World world = Bukkit.getWorlds().get(0); - - public static void tracer(Player player, String[] args) { - switch (args[0].toLowerCase()) { - case "start": - start(); - player.sendMessage(BauSystem.PREFIX + "§aAufnahme gestartet"); - break; - case "stop": - stop(); - player.sendMessage(BauSystem.PREFIX + "§cTNT-Tracer gestoppt"); - break; - case "auto": - case "toggleauto": - toggleAuto(); - if (status == Status.IDLE || status == Status.RECORD) { - player.sendMessage(BauSystem.PREFIX + "§cAutomatischer TNT-Tracer deaktiviert"); - } else { - player.sendMessage(BauSystem.PREFIX + "§aAutomatischer TNT-Tracer aktiviert"); - } - break; - } - } - - private static void toggleAuto() { - switch (status) { - case IDLE: - status = Status.IDLE_AUTO; - break; - case RECORD: - status = Status.RECORD_AUTO; - break; - case IDLE_AUTO: - status = Status.IDLE; - break; - case RECORD_AUTO: - status = Status.RECORD; - break; - default: - break; - } - } - - public static Status getStatus() { - return status; - } - - private static void start() { - status = Status.RECORD; - TraceManager.startFrame(); - startRecording(); - } - - public static void startAuto() { - status = Status.RECORD_AUTO; - Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText("§7Automatischer TNT-Tracer §8- §aAufnahme gestartet"))); - TraceManager.startFrame(); - startRecording(); - } - - public static void updateAuto() { - update(); - } - - private static void stop() { - status = Status.IDLE; - stopRecording(); - TraceManager.stopFrame(); - } - - static void stopAuto() { - status = Status.IDLE_AUTO; - Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText("§7Automatischer TNT-Tracer §8- §aAufnahme gestoppt"))); - stopRecording(); - TraceManager.stopFrame(); - } - - public enum Status { - RECORD("§aan", true), - RECORD_AUTO("§aan", true), - IDLE("§caus", false), - IDLE_AUTO("§eauto", false); - - String value; - boolean tracing; - - Status(String value, boolean tracing) { - this.value = value; - this.tracing = tracing; - } - - public String getValue() { - return value; - } - - public boolean isTracing() { - return tracing; - } - } - -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/recorder/TNTRecorder.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/recorder/TNTRecorder.java deleted file mode 100644 index e51b936..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/recorder/TNTRecorder.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - 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.tracer.recorder; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.tracer.TraceListener; -import org.bukkit.Bukkit; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.scheduler.BukkitTask; - -import java.util.stream.Stream; - -import static de.steamwar.bausystem.tracer.recorder.RecordManager.stopAuto; - -public class TNTRecorder { - - private static BukkitTask task = null; - public static long recordStart = System.currentTimeMillis(); - public static long lastExplosion = System.currentTimeMillis(); - - static void update() { - if (task == null) return; - if (RecordManager.status != RecordManager.Status.RECORD_AUTO) return; - lastExplosion = System.currentTimeMillis(); - } - - static void startRecording() { - if (task != null) return; - recordStart = System.currentTimeMillis(); - lastExplosion = System.currentTimeMillis(); - task = Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), TNTRecorder::run, 1, 1); - run(); - } - - static void stopRecording() { - if (task == null) return; - task.cancel(); - task = null; - } - - private static void run() { - Stream tntPrimedStream = RecordManager.world.getEntities() - .stream() - .filter(e -> e instanceof TNTPrimed) - .map(e -> (TNTPrimed)e); - TraceListener.onTick(tntPrimedStream); - - if (RecordManager.status == RecordManager.Status.RECORD_AUTO && System.currentTimeMillis() - lastExplosion > 4500) { - stopAuto(); - } - } - -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/Record.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/Record.java new file mode 100644 index 0000000..8f97814 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/Record.java @@ -0,0 +1,86 @@ +/* + 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.tracer.show; + +import de.steamwar.bausystem.tracer.TNTPosition; +import org.bukkit.entity.TNTPrimed; + +import java.util.ArrayList; +import java.util.List; + +public class Record { + + private final long startTime; + private final List tnt = new ArrayList<>(); + + public int size() { + return tnt.size(); + } + + public long getStartTime() { + return startTime; + } + + public void showAll(ShowMode mode) { + for (TNTRecord record : tnt) + record.showAll(mode); + } + + /* The following methods should only be called by a recorder */ + public Record() { + startTime = System.currentTimeMillis(); + StoredRecords.add(this); + } + + public TNTRecord spawn() { + TNTRecord record = new TNTRecord(); + tnt.add(record); + return record; + } + + public static class TNTRecord { + private final List positions = new ArrayList<>(41); + + public void showAll(ShowMode mode) { + for (TNTPosition position : positions) + mode.show(position); + } + + /* The following methods should only be called by a recorder */ + public void add(TNTPrimed tntPrimed) { + add(tntPrimed, false); + } + + private void add(TNTPrimed tntPrimed, boolean exploded) { + TNTPosition position; + if (positions.isEmpty()) { + position = new TNTPosition(tntPrimed, null, exploded); + } else { + position = new TNTPosition(tntPrimed, positions.get(positions.size() - 1).getLocation(), exploded); + } + positions.add(position); + TraceShowManager.show(position); + } + + public void explode(TNTPrimed tntPrimed) { + add(tntPrimed, true); + } + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowMode.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowMode.java new file mode 100644 index 0000000..5a96232 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowMode.java @@ -0,0 +1,27 @@ +/* + 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.tracer.show; + +import de.steamwar.bausystem.tracer.TNTPosition; + +public interface ShowMode { + void show(TNTPosition position); + void hide(); +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java new file mode 100644 index 0000000..e3ee044 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java @@ -0,0 +1,89 @@ +/* + * + * 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.tracer.show; + +public class ShowModeParameter { + + private boolean water = false; + private boolean interpolate_SET = false; + private boolean interpolate_Y = true; + private boolean interpolate_XZ = true; + + public ShowModeParameter() { + + } + + public boolean isWater() { + return water; + } + + public boolean isInterpolate_Y() { + return interpolate_Y; + } + + public boolean isInterpolate_XZ() { + return interpolate_XZ; + } + + public static ShowModeParameter parseArguments(String[] args, int index) { + ShowModeParameter showModeParameter = new ShowModeParameter(); + for (int i = index; i < args.length; i++) { + switch (args[i].toLowerCase()) { + case "-water": + showModeParameter.water = true; + break; + case "-interpolatey": + case "-interpolate-y": + case "-interpolate_y": + case "-y": + if (showModeParameter.interpolate_SET) { + showModeParameter.interpolate_Y = true; + } else { + showModeParameter.interpolate_XZ = false; + showModeParameter.interpolate_SET = true; + } + break; + case "-interpolatex": + case "-interpolate-x": + case "-interpolate_x": + case "-x": + case "-interpolatez": + case "-interpolate-z": + case "-interpolate_z": + case "-z": + case "-interpolatexz": + case "-interpolate-xz": + case "-interpolate_xz": + case "-xz": + if (showModeParameter.interpolate_SET) { + showModeParameter.interpolate_XZ = true; + } else { + showModeParameter.interpolate_Y = false; + showModeParameter.interpolate_SET = true; + } + break; + } + } + return showModeParameter; + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/StoredRecords.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/StoredRecords.java new file mode 100644 index 0000000..a7ce3c5 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/StoredRecords.java @@ -0,0 +1,42 @@ +/* + 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.tracer.show; + +import java.util.ArrayList; +import java.util.List; + +public class StoredRecords { + + private static final List records = new ArrayList<>(); + + public static void add(Record record) { + records.add(record); + } + + public static void showAll(ShowMode mode) { + for (Record record : records) record.showAll(mode); + } + + public static void clear() { + records.clear(); + TraceShowManager.clear(); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/TraceShowManager.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/TraceShowManager.java new file mode 100644 index 0000000..70e8afd --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/TraceShowManager.java @@ -0,0 +1,54 @@ +package de.steamwar.bausystem.tracer.show; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.tracer.TNTPosition; +import de.steamwar.bausystem.tracer.show.mode.*; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashMap; +import java.util.Map; + +public class TraceShowManager implements Listener { + private TraceShowManager() {} + + private static final Map showModes = new HashMap<>(); + + public static void show(Player player, ShowMode showMode) { + hide(player); + showModes.put(player, showMode); + StoredRecords.showAll(showMode); + } + + public static void hide(Player player) { + ShowMode showMode = showModes.remove(player); + if (showMode == null) + return; + showMode.hide(); + } + + /* Only to be called by record */ + static void show(TNTPosition tnt) { + for (ShowMode mode : showModes.values()) + mode.show(tnt); + } + + /* Only to be called by StoredRecords */ + static void clear() { + for (ShowMode mode : showModes.values()) + mode.hide(); + } + + /* Internal if player leaves*/ + static { + Bukkit.getPluginManager().registerEvents(new TraceShowManager(), BauSystem.getPlugin()); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + showModes.remove(event.getPlayer()); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Advanced.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Advanced.java new file mode 100644 index 0000000..c9bf35a --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Advanced.java @@ -0,0 +1,82 @@ +/* + * + * 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.tracer.show.mode; + +import de.steamwar.bausystem.tracer.AbstractTraceEntity; +import de.steamwar.bausystem.tracer.RoundedTNTPosition; +import de.steamwar.bausystem.tracer.TNTPosition; +import de.steamwar.bausystem.tracer.show.ShowModeParameter; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.HashMap; +import java.util.Map; + +public class Advanced extends Basic { + + private Map updateEntityMap = new HashMap<>(); + + public Advanced(Player player, ShowModeParameter showModeParameter) { + super(player, showModeParameter); + } + + @Override + public void show(TNTPosition position) { + super.show(position); + + if (position.getPreviousLocation() == null) return; + Vector vector = position.getLocation().clone().subtract(position.getPreviousLocation()); + + Vector updatePointY = position.getPreviousLocation().clone().setY(position.getLocation().getY()); + Vector updatePointXZ; + if (Math.abs(vector.getX()) > Math.abs(vector.getZ())) { + updatePointXZ = updatePointY.clone().setX(position.getLocation().getX()); + } else { + updatePointXZ = updatePointY.clone().setZ(position.getLocation().getZ()); + } + + if (showModeParameter.isInterpolate_Y() && !position.getLocation().equals(updatePointY)) { + RoundedTNTPosition updatePointPosition = new RoundedTNTPosition(updatePointY); + if (!updateEntityMap.containsKey(updatePointPosition)) { + updateEntityMap.put(updatePointPosition, createEntity(updatePointY, false, false)); + } + } + if (showModeParameter.isInterpolate_XZ() && !position.getLocation().equals(updatePointXZ)) { + RoundedTNTPosition updatePointPosition = new RoundedTNTPosition(updatePointXZ); + if (!updateEntityMap.containsKey(updatePointPosition)) { + updateEntityMap.put(updatePointPosition, createEntity(updatePointXZ, false, false)); + } + } + } + + @Override + public void hide() { + super.hide(); + + updateEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> { + abstractTraceEntity.hide(player); + abstractTraceEntity.killEntity(); + }); + updateEntityMap.clear(); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Basic.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Basic.java new file mode 100644 index 0000000..6ff527f --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Basic.java @@ -0,0 +1,56 @@ +package de.steamwar.bausystem.tracer.show.mode; + +import de.steamwar.bausystem.tracer.*; +import de.steamwar.bausystem.tracer.show.ShowMode; +import de.steamwar.bausystem.tracer.show.ShowModeParameter; +import de.steamwar.core.VersionedCallable; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.HashMap; +import java.util.Map; + +public class Basic implements ShowMode { + + protected final Player player; + protected final ShowModeParameter showModeParameter; + + private Map tntEntityMap = new HashMap<>(); + + public Basic(Player player, ShowModeParameter showModeParameter) { + this.player = player; + this.showModeParameter = showModeParameter; + } + + @Override + public void show(TNTPosition position) { + if (showModeParameter.isWater() && checkWater(position.getLocation())) { + return; + } + RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(position); + if (tntEntityMap.containsKey(roundedTNTPosition)) { + return; + } + tntEntityMap.put(roundedTNTPosition, createEntity(position.getLocation(), position.isExploded(), true)); + } + + protected boolean checkWater(Vector position) { + return (VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.inWater(player.getWorld(), position), 8), + new VersionedCallable<>(() -> TNTTracer_15.inWater(player.getWorld(), position), 14))); + } + + protected AbstractTraceEntity createEntity(Vector position, boolean exploded, boolean tnt) { + return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.create(player.getWorld(), position, player, exploded, tnt), 8), + new VersionedCallable<>(() -> TNTTracer_15.create(player.getWorld(), position, player, exploded, tnt), 14)); + } + + @Override + public void hide() { + tntEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> { + abstractTraceEntity.hide(player); + abstractTraceEntity.killEntity(); + }); + tntEntityMap.clear(); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java index 117a4ee..c15abc1 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java @@ -22,9 +22,7 @@ package de.steamwar.bausystem.world; import de.steamwar.bausystem.commands.CommandFreeze; import de.steamwar.bausystem.commands.CommandTNT; import de.steamwar.bausystem.commands.CommandTPSLimiter; -import de.steamwar.bausystem.tracer.TraceManager; -import de.steamwar.bausystem.tracer.recorder.RecordManager; -import de.steamwar.bausystem.tracer.recorder.TNTRecorder; +import de.steamwar.bausystem.tracer.record.RecordStateMachine; import de.steamwar.core.TPSWatcher; import de.steamwar.scoreboard.SWScoreboard; import de.steamwar.scoreboard.ScoreboardCallback; @@ -34,7 +32,10 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; public class BauScoreboard implements Listener { @@ -62,14 +63,13 @@ public class BauScoreboard implements Listener { strings.add("§2"); strings.add("§eTNT§8: " + (!CommandTNT.getInstance().isOn() ? "§aan" : "§caus")); strings.add("§eFreeze§8: " + (CommandFreeze.getInstance().isOn() ? "§aan" : "§caus")); - strings.add("§eTrace§8: " + RecordManager.getStatus().getValue()); + strings.add("§eTrace§8: " + RecordStateMachine.getRecordStatus().getName()); strings.add("§eLoader§8: " + (AutoLoader.hasLoader(p) ? "§aan" : "§caus")); - if (RecordManager.getStatus().isTracing()) { + if (RecordStateMachine.getRecordStatus().isTracing()) { strings.add("§3"); - strings.add("§eTrace-Start§8: §7" + new SimpleDateFormat("HH:mm:ss").format(new Date(TNTRecorder.recordStart))); strings.add("§eTicks§8: §7" + traceTicks()); - strings.add("§eAnzahl TNT§8: §7" + TraceManager.currentFrameSize()); + strings.add("§eAnzahl TNT§8: §7" + RecordStateMachine.size()); } strings.add("§4"); @@ -83,7 +83,7 @@ public class BauScoreboard implements Listener { } private long traceTicks() { - return (System.currentTimeMillis() - TNTRecorder.recordStart) / 50; + return (System.currentTimeMillis() - RecordStateMachine.getStartTime()) / 50; } private String tpsColor() { @@ -103,4 +103,5 @@ public class BauScoreboard implements Listener { } return "§8/§7" + CommandTPSLimiter.getCurrentTPSLimit(); } + }