Add TraceGUI #161
@ -21,6 +21,7 @@ package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.gui.GuiTraceShow;
|
||||
import de.steamwar.bausystem.tracer.record.RecordStateMachine;
|
||||
import de.steamwar.bausystem.tracer.show.ShowModeParameter;
|
||||
import de.steamwar.bausystem.tracer.show.StoredRecords;
|
||||
@ -39,6 +40,7 @@ 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 gui §8- §7Zeigt die Trace show gui");
|
||||
|
||||
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");
|
||||
@ -90,6 +92,10 @@ public class CommandTrace implements CommandExecutor {
|
||||
if (args.length < 2) {
|
||||
TraceShowManager.show(player, new Basic(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":
|
||||
|
@ -39,7 +39,7 @@ 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"));
|
||||
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"));
|
||||
}
|
||||
|
135
BauSystem_Main/src/de/steamwar/bausystem/gui/GuiTraceShow.java
Normale Datei
@ -0,0 +1,135 @@
|
||||
/*
|
||||
*
|
||||
* 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 <https://www.gnu.org/licenses/>.
|
||||
* /
|
||||
*/
|
||||
|
||||
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.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class GuiTraceShow {
|
||||
|
||||
private static final Map<Player, ShowModeParameter> ShowModeParameterMap = new HashMap<>();
|
||||
|
||||
private GuiTraceShow() {
|
||||
|
||||
}
|
||||
|
||||
public static void openGui(Player player) {
|
||||
ShowModeParameter playerShowMode = new ShowModeParameter();
|
||||
playerShowMode.setInterpolate_Y(false);
|
||||
Lixfel
hat
Trace GUI heißt das Teil. Und nicht so komisch. Das ist der TITEL der GUI. Trace GUI heißt das Teil. Und nicht so komisch. Das ist der TITEL der GUI.
YoyoNow
hat
Ich würde es Ich würde es `Trace Show GUI` nehmen, da das besser zu dem passt, wofür dies gemacht ist
Lixfel
hat
Jagut. Aber dann einfach Trace Show GUI nennen, und nicht §eBau§8System» §7ShowGUI Jagut. Aber dann einfach Trace Show GUI nennen, und nicht §eBau§8System» §7ShowGUI
YoyoNow
hat
Dies ist passiert. Dies ist passiert.
|
||||
playerShowMode.setInterpolate_XZ(false);
|
||||
ShowModeParameterMap.put(player, playerShowMode);
|
||||
|
||||
SWInventory swInventory = new SWInventory(player, 9, "Trace Show GUI");
|
||||
swInventory.addCloseCallback(clickType -> ShowModeParameterMap.remove(player));
|
||||
setActiveShow(player, swInventory);
|
||||
|
||||
Lixfel
hat
Deutsch. Wasserpositionen Nach ist ein . Deutsch. Wasserpositionen
Nach ist ein .
|
||||
SWItem water = new SWItem(Material.TNT, "§eWasser §7Positionen", Arrays.asList("§7Zeigt alles TNT, welches", "§7im Wasser explodiert ist."), false, clickType -> {});
|
||||
Lixfel
hat
angezeigt & ausgeblendet jeweils kleinschreiben angezeigt & ausgeblendet jeweils kleinschreiben
|
||||
swInventory.setItem(5, water);
|
||||
swInventory.setCallback(5, clickType -> toggleHideTNTinWaterExploded(player, swInventory, water));
|
||||
|
||||
Lixfel
hat
Nach einem ganzen Satz ein ganzer Punkt. Nach einem ganzen Satz ein ganzer Punkt.
Lixfel
hat
Wasserpositionen §7Zeigt auch TNT, welches Wasserpositionen
§7Zeigt auch TNT, welches
§7im Wasser explodiert ist.
|
||||
SWItem interpolateY = new SWItem(Material.QUARTZ_STAIRS, "§eInterpolation §7Y-Achse", Arrays.asList("§7Zeigt die Interpolation", "§7auf der Y-Achse."), false, clickType -> {});
|
||||
swInventory.setItem(6, interpolateY);
|
||||
Lixfel
hat
Ich glaube, das mit den Callbacks sollte auch gehen direkt bei der SWItemerstellung mit -> {this}? (Weiß ich nicht sicher, sollte ma n aber mal ausprobieren) Ich glaube, das mit den Callbacks sollte auch gehen direkt bei der SWItemerstellung mit -> {this}? (Weiß ich nicht sicher, sollte ma n aber mal ausprobieren)
YoyoNow
hat
mit 'this' referenciere ich dann die Klasse also GuiTraceShow, nicht die Instanz SWItem und wenn ich das referenziere beim erstellen geht dies auch nicht. mit 'this' referenciere ich dann die Klasse also GuiTraceShow, nicht die Instanz SWItem und wenn ich das referenziere beim erstellen geht dies auch nicht.
|
||||
swInventory.setCallback(6, clickType -> toggleInterpolateYPosition(player, swInventory, interpolateY));
|
||||
|
||||
Lixfel
hat
Funktionieren die Materials auch in der 1.12? Und der Punkt. Funktionieren die Materials auch in der 1.12? Und der Punkt.
YoyoNow
hat
Guck ich gleich mal nach, aber soweit ich weiß sollte dies schon immer so genannt worden sein. Guck ich gleich mal nach, aber soweit ich weiß sollte dies schon immer so genannt worden sein.
|
||||
SWItem interpolateXZ = new SWItem(Material.QUARTZ_SLAB, "§eInterpolation §7XZ-Achse", Arrays.asList("§7Zeigt die Interpolation", "§7auf der XZ-Achse."), false, clickType -> {});
|
||||
swInventory.setItem(7, interpolateXZ);
|
||||
swInventory.setCallback(7, clickType -> toggleInterpolateXZPosition(player, swInventory, interpolateXZ));
|
||||
// Water Bucket (-water)
|
||||
// TNT (-water-exploded)
|
||||
// Quartz_Stair (-interpolate-y)
|
||||
// Quartz_Slab (-interpolate-xz)
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private static void setActiveShow(Player player, SWInventory swInventory) {
|
||||
if (TraceShowManager.hasActiveShow(player)) {
|
||||
SWItem shown = new SWItem(Material.LIME_CONCRETE, "§aTraces angezeigt", new ArrayList<>(), false, clickType -> {
|
||||
TraceShowManager.hide(player);
|
||||
Lixfel
hat
shown & hidden müssen nicht oben extra erzeugt werden, man kann die items auch hier in der Helferfunktion erst erstellen (übersichtlicherer Programmfluss & es müssen nicht immer beide erstellt werden) shown & hidden müssen nicht oben extra erzeugt werden, man kann die items auch hier in der Helferfunktion erst erstellen (übersichtlicherer Programmfluss & es müssen nicht immer beide erstellt werden)
|
||||
player.sendMessage(BauSystem.PREFIX + "§cAlle TNT-Positionen ausgeblendet");
|
||||
setActiveShow(player, swInventory);
|
||||
});
|
||||
swInventory.setItem(1, shown);
|
||||
} else {
|
||||
SWItem hidden = new SWItem(Material.RED_CONCRETE, "§cTraces ausgeblendet", new ArrayList<>(), false, clickType -> {
|
||||
show(player);
|
||||
player.sendMessage(BauSystem.PREFIX + "§aAlle TNT-Positionen angezeigt");
|
||||
setActiveShow(player, swInventory);
|
||||
});
|
||||
swInventory.setItem(1, hidden);
|
||||
}
|
||||
}
|
||||
|
||||
private static void toggleHideTNTinWaterExploded(Player player, SWInventory swInventory, SWItem swItem) {
|
||||
Lixfel
hat
Die meisten dürften das nicht verstehen, dass die Änderungen erst beim klicken auf Show auch umgesetzt werden. Daher wäre es weitaus besser, wenn beim Anklicken von InWater oder anderem sofort die Änderungen umgesetzt werden. Dann brauchst du auch deine SHOW_MODE_PARAMETER_HASH_MAP nicht mehr (PS: Die ist keine Konstante). Die meisten dürften das nicht verstehen, dass die Änderungen erst beim klicken auf Show auch umgesetzt werden. Daher wäre es weitaus besser, wenn beim Anklicken von InWater oder anderem sofort die Änderungen umgesetzt werden. Dann brauchst du auch deine SHOW_MODE_PARAMETER_HASH_MAP nicht mehr (PS: Die ist keine Konstante).
YoyoNow
hat
Warum sollte ich diese nicht mehr brauchen. Ich muss mir wohl irgendwo merken, was du alles aktiv hast! Warum sollte ich diese nicht mehr brauchen. Ich muss mir wohl irgendwo merken, was du alles aktiv hast!
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
showModeParameter.setWater(!showModeParameter.isWater());
|
||||
show(player);
|
||||
|
||||
swItem.setEnchanted(showModeParameter.isWater());
|
||||
swInventory.setItem(5, swItem);
|
||||
swInventory.setCallback(5, clickType -> toggleHideTNTinWaterExploded(player, swInventory, swItem));
|
||||
}
|
||||
|
||||
Lixfel
hat
Hast du das mal so ausprobiert? Ich weiß nicht, ob die GUI so "live"-updatebar ist. Hast du das mal so ausprobiert? Ich weiß nicht, ob die GUI so "live"-updatebar ist.
YoyoNow
hat
Ja dies tut. Ja dies tut.
|
||||
private static void toggleInterpolateYPosition(Player player, SWInventory swInventory, SWItem swItem) {
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
showModeParameter.setInterpolate_Y(!showModeParameter.isInterpolate_Y());
|
||||
show(player);
|
||||
|
||||
swItem.setEnchanted(showModeParameter.isInterpolate_Y());
|
||||
swInventory.setItem(6, swItem);
|
||||
swInventory.setCallback(6, clickType -> toggleInterpolateYPosition(player, swInventory, swItem));
|
||||
}
|
||||
|
||||
private static void toggleInterpolateXZPosition(Player player, SWInventory swInventory, SWItem swItem) {
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
showModeParameter.setInterpolate_XZ(!showModeParameter.isInterpolate_XZ());
|
||||
show(player);
|
||||
|
||||
swItem.setEnchanted(showModeParameter.isInterpolate_XZ());
|
||||
swInventory.setItem(7, swItem);
|
||||
swInventory.setCallback(7, clickType -> toggleInterpolateXZPosition(player, swInventory, swItem));
|
||||
}
|
||||
|
||||
Lixfel
hat
Wie stellst du dir die Erweiterbarkeit vor, wenn z.B. ein Block-Show-Modus dazu kommt oder ein Particle-Show-Modus? Wie stellst du dir die Erweiterbarkeit vor, wenn z.B. ein Block-Show-Modus dazu kommt oder ein Particle-Show-Modus?
YoyoNow
hat
Vllt neben show/hide als block dann 3 blöcke nehmen, für Block/Entity/Particle? Irgendwie ein Spawn Ei für entity, ein nether star für particle und ein brick für block? Vllt sollten wir da aber das Menü eh dann nochmal ändern, womit wir doch dann auch darüber nachdenken können oder? Vllt neben show/hide als block dann 3 blöcke nehmen, für Block/Entity/Particle? Irgendwie ein Spawn Ei für entity, ein nether star für particle und ein brick für block? Vllt sollten wir da aber das Menü eh dann nochmal ändern, womit wir doch dann auch darüber nachdenken können oder?
|
||||
private static void show(Player player) {
|
||||
ShowModeParameter showModeParameter = ShowModeParameterMap.get(player);
|
||||
ShowMode showMode;
|
||||
Lixfel
hat
Hier beists sich langsam, dass du zwischen basic und advanced für den gleichen EntityTracer unterscheidest. Hier beists sich langsam, dass du zwischen basic und advanced für den gleichen EntityTracer unterscheidest.
YoyoNow
hat
Würdest du also die beiden Tracer mergen? Sodass wir kein Basic/Advanced sondern Entity haben? Jedoch würde ich das hier nicht in diesen PR machen, weil das das Thema des PR's etwas verfehlt. Würdest du also die beiden Tracer mergen? Sodass wir kein Basic/Advanced sondern Entity haben? Jedoch würde ich das hier nicht in diesen PR machen, weil das das Thema des PR's etwas verfehlt.
Lixfel
hat
Ja, das fände ich strukturell sinnvoller. Ja, das fände ich strukturell sinnvoller.
YoyoNow
hat
Ja dann mache ich das, jedoch erst wenn dieser PR durch ist, sonst muss ich wieder irgendwie in 2 branches das ganze machen. Ja dann mache ich das, jedoch erst wenn dieser PR durch ist, sonst muss ich wieder irgendwie in 2 branches das ganze machen.
|
||||
if (showModeParameter.isAdvanced()) {
|
||||
showMode = new Advanced(player, showModeParameter);
|
||||
} else {
|
||||
showMode = new Basic(player, showModeParameter);
|
||||
}
|
||||
TraceShowManager.show(player, showMode);
|
||||
}
|
||||
|
||||
}
|
@ -44,6 +44,22 @@ public class ShowModeParameter {
|
||||
return interpolate_XZ;
|
||||
}
|
||||
|
||||
public void setWater(boolean water) {
|
||||
this.water = water;
|
||||
}
|
||||
|
||||
public void setInterpolate_Y(boolean interpolate_Y) {
|
||||
this.interpolate_Y = interpolate_Y;
|
||||
}
|
||||
|
||||
public void setInterpolate_XZ(boolean interpolate_XZ) {
|
||||
this.interpolate_XZ = interpolate_XZ;
|
||||
}
|
||||
|
||||
public boolean isAdvanced() {
|
||||
return interpolate_Y || interpolate_XZ;
|
||||
}
|
||||
|
||||
public static ShowModeParameter parseArguments(String[] args, int index) {
|
||||
ShowModeParameter showModeParameter = new ShowModeParameter();
|
||||
for (int i = index; i < args.length; i++) {
|
||||
|
@ -51,4 +51,9 @@ public class TraceShowManager implements Listener {
|
||||
public void onLeave(PlayerQuitEvent event) {
|
||||
showModes.remove(event.getPlayer());
|
||||
}
|
||||
|
||||
public static boolean hasActiveShow(Player player) {
|
||||
return showModes.containsKey(player);
|
||||
}
|
||||
|
||||
}
|
||||
|
Warum nicht trace gui? Es ist kein Showmodus und wird die meisten nur verwirren.
Weil die Trace GUI, für die Auswahl einzelner TNT sein soll. Also einen ganz anderen Zweck hat. Und ja dies ist kein Show Mode, weshalb ich diese auch einzeln in der Help Nachricht aufgeführt habe.
Und ich wollte dir auch keinen 300 Zeilen PR wieder hier geben. Sondern nur eine GUI nach der anderen implementieren. Und da fange ich mit dieser ganz bewusst an, um die '/trace show' Sache zu vereinfachen.