SteamWar/BauSystem
Archiviert
13
0

Add TraceGUI #161

Manuell gemergt
YoyoNow hat 6 Commits von TraceGui nach master 2021-01-27 10:06:31 +01:00 zusammengeführt
5 geänderte Dateien mit 163 neuen und 1 gelöschten Zeilen

Datei anzeigen

@ -21,6 +21,7 @@ package de.steamwar.bausystem.commands;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.gui.GuiTraceShow;
import de.steamwar.bausystem.tracer.record.RecordStateMachine; import de.steamwar.bausystem.tracer.record.RecordStateMachine;
import de.steamwar.bausystem.tracer.show.ShowModeParameter; import de.steamwar.bausystem.tracer.show.ShowModeParameter;
import de.steamwar.bausystem.tracer.show.StoredRecords; 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 start §8- §7Startet die Aufnahme aller TNT-Positionen");
player.sendMessage("§8/§etrace stop §8- §7Stoppt den TNT-Tracer"); player.sendMessage("§8/§etrace stop §8- §7Stoppt den TNT-Tracer");
player.sendMessage("§8/§etrace toggleauto §8- §7Automatischer Aufnahmenstart"); player.sendMessage("§8/§etrace toggleauto §8- §7Automatischer Aufnahmenstart");
player.sendMessage("§8/§etrace show gui §8- §7Zeigt die Trace show gui");
Review

Warum nicht trace gui? Es ist kein Showmodus und wird die meisten nur verwirren.

Warum nicht trace gui? Es ist kein Showmodus und wird die meisten nur verwirren.
Review

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.

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.
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 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 hide §8- §7Versteckt alle TNT-Positionen");
player.sendMessage("§8/§etrace delete §8- §7Löscht 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) { if (args.length < 2) {
TraceShowManager.show(player, new Basic(player, new ShowModeParameter())); TraceShowManager.show(player, new Basic(player, new ShowModeParameter()));
} else { } else {
if (args[1].equalsIgnoreCase("gui")) {
GuiTraceShow.openGui(player);
return false;
}
ShowModeParameter showModeParameter = ShowModeParameter.parseArguments(args, 2); ShowModeParameter showModeParameter = ShowModeParameter.parseArguments(args, 2);
switch (args[1].toLowerCase()) { switch (args[1].toLowerCase()) {
case "advanced": case "advanced":

Datei anzeigen

@ -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), "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 && (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 == 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("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") && args[1].equalsIgnoreCase("advanced"), "-interpolate-xz", "-interpolate-y"));
} }

Datei anzeigen

@ -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);
Review

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.
Review

Ich würde es Trace Show GUI nehmen, da das besser zu dem passt, wofür dies gemacht ist

Ich würde es `Trace Show GUI` nehmen, da das besser zu dem passt, wofür dies gemacht ist
Review

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
Review

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);
Veraltet
Review

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 -> {});
Veraltet
Review

angezeigt & ausgeblendet jeweils kleinschreiben

angezeigt & ausgeblendet jeweils kleinschreiben
swInventory.setItem(5, water);
swInventory.setCallback(5, clickType -> toggleHideTNTinWaterExploded(player, swInventory, water));
Veraltet
Review

Nach einem ganzen Satz ein ganzer Punkt.

Nach einem ganzen Satz ein ganzer Punkt.
Veraltet
Review

Wasserpositionen

§7Zeigt auch TNT, welches
§7im Wasser explodiert ist.

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);
Review

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)
Review

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));
Veraltet
Review

Funktionieren die Materials auch in der 1.12? Und der Punkt.

Funktionieren die Materials auch in der 1.12? Und der Punkt.
Veraltet
Review

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);
Review

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) {
Review

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).
Review

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));
}
Review

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.
Review

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));
}
Review

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?
Review

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;
Review

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.
Review

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.
Review

Ja, das fände ich strukturell sinnvoller.

Ja, das fände ich strukturell sinnvoller.
Review

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);
}
}

Datei anzeigen

@ -44,6 +44,22 @@ public class ShowModeParameter {
return interpolate_XZ; 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) { public static ShowModeParameter parseArguments(String[] args, int index) {
ShowModeParameter showModeParameter = new ShowModeParameter(); ShowModeParameter showModeParameter = new ShowModeParameter();
for (int i = index; i < args.length; i++) { for (int i = index; i < args.length; i++) {

Datei anzeigen

@ -51,4 +51,9 @@ public class TraceShowManager implements Listener {
public void onLeave(PlayerQuitEvent event) { public void onLeave(PlayerQuitEvent event) {
showModes.remove(event.getPlayer()); showModes.remove(event.getPlayer());
} }
public static boolean hasActiveShow(Player player) {
return showModes.containsKey(player);
}
} }