diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java index 3b30892..3d30f71 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTrace.java @@ -26,8 +26,7 @@ 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.tracer.show.mode.EntityShowMode; import de.steamwar.bausystem.world.Welt; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -90,23 +89,14 @@ public class CommandTrace implements CommandExecutor { break; case "show": if (args.length < 2) { - TraceShowManager.show(player, new Basic(player, new ShowModeParameter())); + TraceShowManager.show(player, new EntityShowMode(player, new ShowModeParameter())); } else { if (args[1].equalsIgnoreCase("gui")) { GuiTraceShow.openGui(player); return false; } - 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; - } + ShowModeParameter showModeParameter = ShowModeParameter.parseArguments(args, 1); + TraceShowManager.show(player, new EntityShowMode(player, showModeParameter)); } player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen angezeigt"); break; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java index e2930a2..47e9912 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTraceTabCompleter.java @@ -39,9 +39,8 @@ public class CommandTraceTabCompleter implements TabCompleter { 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", "gui")); - 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")); + tabCompletes.add(new TabComplete((player, args) -> args.length == 2 && args[0].equalsIgnoreCase("show"), "gui", "-interpolate-xz", "-interpolate-y", "-water", "-advanced", "advanced")); + tabCompletes.add(new TabComplete((player, args) -> args.length > 2 && args[0].equalsIgnoreCase("show") && !args[1].equalsIgnoreCase("gui"), "-interpolate-xz", "-interpolate-y", "-water", "-advanced")); } @Override diff --git a/BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java b/BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java index 6fd07be..78e7a8a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java @@ -22,11 +22,9 @@ package de.steamwar.bausystem.gui; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.tracer.show.ShowMode; import de.steamwar.bausystem.tracer.show.ShowModeParameter; 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.tracer.show.mode.EntityShowMode; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import org.bukkit.Material; @@ -122,14 +120,7 @@ public class GuiTraceShow { } private static void show(Player player) { - ShowModeParameter showModeParameter = ShowModeParameterMap.get(player); - ShowMode showMode; - if (showModeParameter.isAdvanced()) { - showMode = new Advanced(player, showModeParameter); - } else { - showMode = new Basic(player, showModeParameter); - } - TraceShowManager.show(player, showMode); + TraceShowManager.show(player, new EntityShowMode(player, ShowModeParameterMap.get(player))); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java index 153e580..7c4722d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/ShowModeParameter.java @@ -24,9 +24,8 @@ 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; + private boolean interpolate_Y = false; + private boolean interpolate_XZ = false; public ShowModeParameter() { @@ -71,12 +70,7 @@ public class ShowModeParameter { 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; - } + showModeParameter.interpolate_Y = true; break; case "-interpolatex": case "-interpolate-x": @@ -90,12 +84,15 @@ public class ShowModeParameter { 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; - } + showModeParameter.interpolate_XZ = true; + break; + case "advanced": + case "-advanced": + case "-a": + showModeParameter.interpolate_Y = true; + showModeParameter.interpolate_XZ = true; + break; + default: break; } } 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 deleted file mode 100644 index 49b5704..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Advanced.java +++ /dev/null @@ -1,85 +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.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.Consumer; -import org.bukkit.util.Vector; - -import java.util.HashMap; -import java.util.Map; - -public class Advanced extends Basic { - - private final Map updateEntityMap = new HashMap<>(); - - public Advanced(Player player, ShowModeParameter showModeParameter) { - super(player, showModeParameter); - } - - @Override - public void show(TNTPosition position) { - super.show(position); - - if (!showModeParameter.isWater() && position.isExploded() && checkWater(position.getLocation())) { - for(TNTPosition pos : position.getRecord().getPositions()){ - applyOnPosition(pos, updatePointPosition -> - updateEntityMap.computeIfPresent(new RoundedTNTPosition(updatePointPosition), (p, point) -> point.hide(player, false) ? null : point)); - } - return; - } - - applyOnPosition(position, updatePointPosition -> - updateEntityMap.computeIfAbsent(new RoundedTNTPosition(updatePointPosition), pos -> createEntity(updatePointPosition, false)) - .display(player, position.isExploded())); - } - - @Override - public void hide() { - super.hide(); - updateEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true)); - updateEntityMap.clear(); - } - - private void applyOnPosition(TNTPosition position, Consumer function){ - if (position.getPreviousLocation() == null) return; - - if (showModeParameter.isInterpolate_Y()) { - Vector updatePointY = position.getPreviousLocation().clone().setY(position.getLocation().getY()); - if(!position.getLocation().equals(updatePointY)) - function.accept(updatePointY); - } - - if (showModeParameter.isInterpolate_XZ()){ - Vector movement = position.getLocation().clone().subtract(position.getPreviousLocation()); - Vector updatePointXZ = Math.abs(movement.getX()) > Math.abs(movement.getZ()) - ? position.getLocation().clone().setZ(position.getPreviousLocation().getZ()) - : position.getLocation().clone().setX(position.getPreviousLocation().getX()); - if(!position.getLocation().equals(updatePointXZ)) - function.accept(updatePointXZ); - } - } -} 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 deleted file mode 100644 index 475445e..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/Basic.java +++ /dev/null @@ -1,54 +0,0 @@ -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 final 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() && position.isExploded() && checkWater(position.getLocation())) { - for(TNTPosition pos : position.getRecord().getPositions()){ - RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(pos); - tntEntityMap.computeIfPresent(roundedTNTPosition, (p, tnt) -> tnt.hide(player, false) ? null : tnt); - } - return; - } - RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(position); - AbstractTraceEntity entity = tntEntityMap.computeIfAbsent(roundedTNTPosition, pos -> createEntity(position.getLocation(), true)); - entity.display(player, position.isExploded()); - } - - 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 tnt) { - return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.create(player.getWorld(), position, tnt), 8), - new VersionedCallable<>(() -> TNTTracer_15.create(player.getWorld(), position, tnt), 14)); - } - - @Override - public void hide() { - tntEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true)); - tntEntityMap.clear(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/EntityShowMode.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/EntityShowMode.java new file mode 100644 index 0000000..bd7e8d7 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/show/mode/EntityShowMode.java @@ -0,0 +1,119 @@ +/* + * + * 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.*; +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.Consumer; +import org.bukkit.util.Vector; + +import java.util.HashMap; +import java.util.Map; + +public class EntityShowMode implements ShowMode { + + protected final Player player; + protected final ShowModeParameter showModeParameter; + + private final Map tntEntityMap = new HashMap<>(); + private final Map updateEntityMap = new HashMap<>(); + + public EntityShowMode(Player player, ShowModeParameter showModeParameter) { + this.player = player; + this.showModeParameter = showModeParameter; + } + + @Override + public void show(TNTPosition position) { + if (!showModeParameter.isWater() && position.isExploded() && checkWater(position.getLocation())) { + // Basic + for (TNTPosition pos : position.getRecord().getPositions()) { + RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(pos); + tntEntityMap.computeIfPresent(roundedTNTPosition, (p, tnt) -> { + return tnt.hide(player, false) ? null : tnt; + }); + } + // Advanced + for (TNTPosition pos : position.getRecord().getPositions()) { + applyOnPosition(pos, updatePointPosition -> { + updateEntityMap.computeIfPresent(new RoundedTNTPosition(updatePointPosition), (p, point) -> { + return point.hide(player, false) ? null : point; + }); + }); + } + return; + } + + RoundedTNTPosition roundedTNTPosition = new RoundedTNTPosition(position); + AbstractTraceEntity entity = tntEntityMap.computeIfAbsent(roundedTNTPosition, pos -> createEntity(position.getLocation(), true)); + entity.display(player, position.isExploded()); + + applyOnPosition(position, updatePointPosition -> { + updateEntityMap.computeIfAbsent(new RoundedTNTPosition(updatePointPosition), pos -> { + return createEntity(updatePointPosition, false); + }).display(player, position.isExploded()); + }); + } + + private 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)); + } + + private AbstractTraceEntity createEntity(Vector position, boolean tnt) { + return VersionedCallable.call(new VersionedCallable<>(() -> TNTTracer_12.create(player.getWorld(), position, tnt), 8), + new VersionedCallable<>(() -> TNTTracer_15.create(player.getWorld(), position, tnt), 14)); + } + + private void applyOnPosition(TNTPosition position, Consumer function) { + if (position.getPreviousLocation() == null) return; + + if (showModeParameter.isInterpolate_Y()) { + Vector updatePointY = position.getPreviousLocation().clone().setY(position.getLocation().getY()); + if (!position.getLocation().equals(updatePointY)) { + function.accept(updatePointY); + } + } + + if (showModeParameter.isInterpolate_XZ()) { + Vector movement = position.getLocation().clone().subtract(position.getPreviousLocation()); + Vector updatePointXZ = Math.abs(movement.getX()) > Math.abs(movement.getZ()) + ? position.getLocation().clone().setZ(position.getPreviousLocation().getZ()) + : position.getLocation().clone().setX(position.getPreviousLocation().getX()); + if (!position.getLocation().equals(updatePointXZ)) { + function.accept(updatePointXZ); + } + } + } + + @Override + public void hide() { + tntEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true)); + tntEntityMap.clear(); + updateEntityMap.forEach((roundedTNTPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true)); + updateEntityMap.clear(); + } + +}