SteamWar/BauSystem
Archiviert
13
0

CannonSimulator #164

Manuell gemergt
YoyoNow hat 37 Commits von CanonSimulator nach master 2021-03-07 10:47:37 +01:00 zusammengeführt
9 geänderte Dateien mit 759 neuen und 10 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,34 @@
/*
* 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.world;
import org.bukkit.Material;
public class TNTSimulator_12 {
public static Material active() {
return Material.CONCRETE;
}
public static Material notActive() {
return Material.CONCRETE;
}
}
YoyoNow markierte diese Unterhaltung als gelöst
Review

Repeater und Comparator können über SWItem.getMaterial() erhalten werden, bitte hier entfernen.

Repeater und Comparator können über SWItem.getMaterial() erhalten werden, bitte hier entfernen.

Datei anzeigen

@ -0,0 +1,35 @@
/*
*
* 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.world;
import org.bukkit.Material;
public class TNTSimulator_15 {
public static Material active() {
return Material.LIME_CONCRETE;
}
public static Material notActive() {
return Material.RED_CONCRETE;
}
}

Datei anzeigen

@ -97,6 +97,8 @@ public class BauSystem extends JavaPlugin implements Listener {
getCommand("detonator").setExecutor(new CommandDetonator()); getCommand("detonator").setExecutor(new CommandDetonator());
getCommand("detonator").setTabCompleter(new CommandDetonatorTabCompleter()); getCommand("detonator").setTabCompleter(new CommandDetonatorTabCompleter());
getCommand("script").setExecutor(new CommandScript()); getCommand("script").setExecutor(new CommandScript());
getCommand("simulator").setExecutor(new CommandSimulator());
getCommand("simulator").setTabCompleter(new CommandSimulatorTabCompleter());
getCommand("gui").setExecutor(new CommandGUI()); getCommand("gui").setExecutor(new CommandGUI());
Bukkit.getPluginManager().registerEvents(this, this); Bukkit.getPluginManager().registerEvents(this, this);
@ -104,6 +106,7 @@ public class BauSystem extends JavaPlugin implements Listener {
Bukkit.getPluginManager().registerEvents(new ScriptListener(), this); Bukkit.getPluginManager().registerEvents(new ScriptListener(), this);
Bukkit.getPluginManager().registerEvents(new BauScoreboard(), this); Bukkit.getPluginManager().registerEvents(new BauScoreboard(), this);
Bukkit.getPluginManager().registerEvents(new ClipboardListener(), this); Bukkit.getPluginManager().registerEvents(new ClipboardListener(), this);
Bukkit.getPluginManager().registerEvents(new TNTSimulatorListener(), this);
Bukkit.getPluginManager().registerEvents(new CommandGUI(), this); Bukkit.getPluginManager().registerEvents(new CommandGUI(), this);
new AFKStopper(); new AFKStopper();

Datei anzeigen

@ -55,8 +55,6 @@ public class CommandGUI implements CommandExecutor, Listener {
inv.setItem(37, getMaterial("GLASS_PANE", "THIN_GLASS"), "§7Platzhalter", clickType -> { inv.setItem(37, getMaterial("GLASS_PANE", "THIN_GLASS"), "§7Platzhalter", clickType -> {
}); });
inv.setItem(38, getMaterial("GLASS_PANE", "THIN_GLASS"), "§7Platzhalter", clickType -> {
});
inv.setItem(43, getMaterial("GLASS_PANE", "THIN_GLASS"), "§7Platzhalter", clickType -> { inv.setItem(43, getMaterial("GLASS_PANE", "THIN_GLASS"), "§7Platzhalter", clickType -> {
}); });
inv.setItem(42, Material.NETHER_STAR, "§7Bau GUI Item", Arrays.asList("§7Du kannst dieses Item zum Öffnen der BauGUI nutzen", "§7oder Doppel F (Swap hands) drücken."), false, clickType -> { inv.setItem(42, Material.NETHER_STAR, "§7Bau GUI Item", Arrays.asList("§7Du kannst dieses Item zum Öffnen der BauGUI nutzen", "§7oder Doppel F (Swap hands) drücken."), false, clickType -> {
@ -64,14 +62,7 @@ public class CommandGUI implements CommandExecutor, Listener {
player.performCommand("gui item"); player.performCommand("gui item");
}); });
ItemStack dtWand = Detonator.WAND.clone(); ItemStack dtWand = wand(player, Detonator.WAND, "§8/§7dt wand", Permission.world, "§cDu hast keine Worldrechte");
ItemMeta meta = dtWand.getItemMeta();
List<String> lore = meta.getLore();
lore.add("§8/§7dt wand");
if (Welt.noPermission(player, Permission.world))
lore.add("§cDu hast keine Worldrechte");
meta.setLore(lore);
dtWand.setItemMeta(meta);
inv.setItem(39, dtWand, clickType -> { inv.setItem(39, dtWand, clickType -> {
if (Welt.noPermission(player, Permission.world)) if (Welt.noPermission(player, Permission.world))
return; return;
@ -79,6 +70,14 @@ public class CommandGUI implements CommandExecutor, Listener {
player.performCommand("dt wand"); player.performCommand("dt wand");
}); });
ItemStack simWand = wand(player, TNTSimulator.WAND, "§8/§7sim wand", Permission.world, "§cDu hast keine Worldrechte");
inv.setItem(38, simWand, clickType -> {
if (Welt.noPermission(player, Permission.world))
return;
player.closeInventory();
player.performCommand("sim wand");
});
inv.setItem(40, getMaterial("WOODEN_AXE", "WOOD_AXE"), "§eWorldedit Axt", getNoPermsLore(Arrays.asList("§8//§7wand"), player, "§cDu hast keine Worldeditrechte", Permission.worldedit), false, clickType -> { inv.setItem(40, getMaterial("WOODEN_AXE", "WOOD_AXE"), "§eWorldedit Axt", getNoPermsLore(Arrays.asList("§8//§7wand"), player, "§cDu hast keine Worldeditrechte", Permission.worldedit), false, clickType -> {
if (Welt.noPermission(player, Permission.world)) if (Welt.noPermission(player, Permission.world))
return; return;
@ -567,6 +566,18 @@ public class CommandGUI implements CommandExecutor, Listener {
return null; return null;
} }
private static ItemStack wand(Player player, ItemStack base, String command, Permission permission, String noPermissionMessage) {
base = base.clone();
ItemMeta meta = base.getItemMeta();
List<String> lore = meta.getLore();
lore.add(command);
if (Welt.noPermission(player, permission))
lore.add(noPermissionMessage);
meta.setLore(lore);
base.setItemMeta(meta);
return base;
}
@Override @Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
if (!(commandSender instanceof Player)) if (!(commandSender instanceof Player))

Datei anzeigen

@ -0,0 +1,79 @@
/*
*
* 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/>.
*/
YoyoNow markierte diese Unterhaltung als gelöst
Review

Wo kommt das Slash her?

Wo kommt das Slash her?
package de.steamwar.bausystem.commands;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.PlayerUtils;
import de.steamwar.bausystem.world.TNTSimulator;
import de.steamwar.bausystem.world.Welt;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class CommandSimulator implements CommandExecutor {
private void help(Player player) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Diese Überprüfung findet nur beim Command statt, nicht wenn ein Spieler versucht, einen Simulatoritem zu verwenden....

Diese Überprüfung findet nur beim Command statt, nicht wenn ein Spieler versucht, einen Simulatoritem zu verwenden....
player.sendMessage("§8/§esimulator §8- §7Öffnet die Simulations GUI");
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Das GUI

Das GUI
Veraltet
Review

Es ist die Simulation und das GUI aber das Simulation passt net, Am besten noch einen Bindestrich dazwischen machen.

Es ist die Simulation und das GUI aber das Simulation passt net, Am besten noch einen Bindestrich dazwischen machen.
player.sendMessage("§8/§esimulator start §8- §7Startet die Simulation");
player.sendMessage("§8/§esimulator wand §8- §7Legt dir den Simulatorstab ins Inventar");
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Der Simulator ist ein System, evt. den Simulatorstab oder etwas ähnliches

Der Simulator ist ein System, evt. den Simulatorstab oder etwas ähnliches
Veraltet
Review

Der Satz macht keinen Sinn:

Legt dir den Simulatorstab ins Inventar

Der Satz macht keinen Sinn: > Legt dir den Simulatorstab ins Inventar
player.sendMessage("§8/§esimulator delete §8- §7Löscht alle TNT");
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Löcht

Löcht
}
private boolean permissionCheck(Player player) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Der Simulator ist ja eher eine Regional beschränkte sache, ich würde ihn eher unter WE oder ggf sogar unter build nehmen.

Der Simulator ist ja eher eine Regional beschränkte sache, ich würde ihn eher unter WE oder ggf sogar unter build nehmen.
if (Welt.noPermission(player, Permission.world)) {
player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht den Simulator nutzen");
return false;
}
return true;
}
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) {
if (!(commandSender instanceof Player))
return false;
Player player = (Player) commandSender;
if (!permissionCheck(player)) {
return false;
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Da das auch mti dem wand geht und es echt keine Info dazu gibt, wie man den Wand erhält, würde ich einfach den Befehl nur zum Erschaffen des Wands nutzen.

Da das auch mti dem wand geht und es echt keine Info dazu gibt, wie man den Wand erhält, würde ich einfach den Befehl nur zum Erschaffen des Wands nutzen.
Veraltet
Review

Also erstes gibt es dafür direkt ein TabComplete und zweitens wird der /sim command mehr verwendet um die UI zu öffnen als der Wand. Womit ich glaube das diese Sachen wichtig ist.

Also erstes gibt es dafür direkt ein TabComplete und zweitens wird der /sim command mehr verwendet um die UI zu öffnen als der Wand. Womit ich glaube das diese Sachen wichtig ist.
if (args.length == 1) {
switch (args[0].toLowerCase()) {
YoyoNow markierte diese Unterhaltung als gelöst
Review

vllt. noch ein Default Case mit einer kleinen Help message

vllt. noch ein Default Case mit einer kleinen Help message
case "wand":
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kannst du bitte

  1. if (player.getInventory().getItemInMainHand().getType() == Material.AIR) {
  2. player.getInventory().setItemInMainHand(TNTSimulator.WAND);
    
  3. } else {
  4. player.getInventory().addItem(TNTSimulator.WAND);
    
  5. }
  • nutzen?
Kannst du bitte 1. if (player.getInventory().getItemInMainHand().getType() == Material.AIR) { 2. player.getInventory().setItemInMainHand(TNTSimulator.WAND); 3. } else { 4. player.getInventory().addItem(TNTSimulator.WAND); 5. } * nutzen?
PlayerUtils.giveItemToPlayer(player, TNTSimulator.WAND);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Noch der alte ItemGiver

Noch der alte ItemGiver
break;
case "start":
TNTSimulator.get(player).start();
break;
case "delete":
TNTSimulator.get(player).delete();
default:
help(player);
break;
}
return false;
}
TNTSimulator.openSimulator(player);
return false;
}
}

Datei anzeigen

@ -0,0 +1,60 @@
/*
*
* 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/>.
*/
YoyoNow markierte diese Unterhaltung als gelöst
Review

Selbes Slash

Selbes Slash
package de.steamwar.bausystem.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class CommandSimulatorTabCompleter implements TabCompleter {
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) return new ArrayList<>();
return simulatorTabComplete((Player) sender, args);
}
private List<String> simulatorTabComplete(Player player, String[] args) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Das ist nicht der Detonator

Das ist nicht der Detonator
List<String> tabComplete = new ArrayList<>();
tabComplete.add("wand");
tabComplete.add("start");
tabComplete.add("delete");
if (args.length >= 2) {
return new ArrayList<>();
}
return manageList(tabComplete, args, 0);
}
private List<String> manageList(List<String> strings, String[] args, int index) {
for (int i = strings.size() - 1; i >= 0; i--) {
if (!strings.get(i).startsWith(args[index])) {
strings.remove(i);
}
}
return strings;
}
}

Datei anzeigen

@ -0,0 +1,441 @@
/*
*
* 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/>.
* /
YoyoNow markierte diese Unterhaltung als gelöst
Review

Auch hier

Auch hier
*/
package de.steamwar.bausystem.world;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.core.VersionedCallable;
import de.steamwar.inventory.SWAnvilInv;
import de.steamwar.inventory.SWInventory;
import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Consumer;
import org.bukkit.util.Vector;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
public class TNTSimulator {
private static final Vector X_VECTOR = new Vector(0.0625, 0, 0);
private static final Vector NX_VECTOR = new Vector(-0.0625, 0, 0);
private static final Vector Y_VECTOR = new Vector(0, 0.0625, 0);
private static final Vector NY_VECTOR = new Vector(0, -0.0625, 0);
private static final Vector Z_VECTOR = new Vector(0, 0, 0.0625);
private static final Vector NZ_VECTOR = new Vector(0, 0, -0.0625);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Collections.emptyList()?

Collections.emptyList()?
Veraltet
Review

Wegen dem Collections.shuffle() intern

Wegen dem `Collections.shuffle()` intern
private static final List<String> LORE = Collections.singletonList("§eZum ändern klicken");
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier sollte man, dass man es ändern kann betonen. Ambesten alles mit §e

Hier sollte man, dass man es ändern kann betonen. Ambesten alles mit §e
private static final List<TNTSpawn> EMPTY = new ArrayList<>();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kein static final, also Bitte camelCase

Kein static final, also Bitte camelCase
static final Map<Player, TNTSimulator> TNT_SIMULATOR_MAP = new HashMap<>();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kanonensimulator

Kanonensimulator
private final Set<TNTSpawn> TNT_SPAWNS = new HashSet<>();
public static final ItemStack WAND = new SWItem(Material.BLAZE_ROD, "§eKanonensimulator", Arrays.asList("§eRechtsklick Block §8- §7Füge einen TNT hinzu", "§eRechtsklick Luft §8- §7Öffne den Simulator", "§eLinksklick §8- §7Starte die Simulation"), false, null).getItemStack();
public static TNTSimulator get(Player player) {
return TNT_SIMULATOR_MAP.computeIfAbsent(player, p -> new TNTSimulator());
}
public static void openSimulator(Player player) {
TNTSimulator tntSimulator = get(player);
List<SWListInv.SWListEntry<TNTSpawn>> swListEntryList = new ArrayList<>();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Einstellen groß (nach zum), und evtl. wäre konfigurieren das bessere Wort.

Einstellen groß (nach zum), und evtl. wäre konfigurieren das bessere Wort.
tntSimulator.TNT_SPAWNS.forEach(tntSpawn -> {
List<String> lore = new ArrayList<>();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Finde das Coloring genau falsch: Den User interessiert nicht TNT-Anzahl, sondern die TNT-Anzahl (also §7TNT-Anzahl§8: §e53)

Auch untendrunter fixen.

Finde das Coloring genau falsch: Den User interessiert nicht TNT-Anzahl, sondern die TNT-Anzahl (also §7TNT-Anzahl§8: §e53) Auch untendrunter fixen.
lore.add("§7Klicken zum Konfigurieren");
lore.add("");
lore.add("§7TNT-Anzahl§8: §e" + tntSpawn.getCount());
lore.add("§7Tick§8: §e" + tntSpawn.getTickOffset());
lore.add("§7Fuse-Tick§8: §e" + tntSpawn.getFuseTicks());
lore.add("");
lore.add("§7X§8: §e" + tntSpawn.getPosition().getX());
lore.add("§7Y§8: §e" + tntSpawn.getPosition().getY());
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Zum Item Namen: mach doch noch so ein Kleines int i welches hoch zählt
, damit da net nur TNT steht.

Zum Item Namen: mach doch noch so ein Kleines int i welches hoch zählt , damit da net nur TNT steht.
lore.add("§7Z§8: §e" + tntSpawn.getPosition().getZ());
swListEntryList.add(new SWListInv.SWListEntry<>(new SWItem(Material.TNT, "§eTNT", lore, false, null), tntSpawn));
});
swListEntryList.sort(Comparator.comparing(SWListInv.SWListEntry::getObject));
SWListInv<TNTSpawn> swListInv = new SWListInv<>(player, "Kanonensimulator", false, swListEntryList, (clickType, tntSpawn) -> {
editTNT(player, tntSpawn);
});
swListInv.setItem(51, new SWItem(Material.BARRIER, "§cTNT löschen", clickType -> {
tntSimulator.TNT_SPAWNS.clear();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ich würde die Methode gar nicht in der GUI anbieten, sondern nur über den Wand. Diese Option mit der eigenen Position dürfte User nur verwirren.

Ich würde die Methode gar nicht in der GUI anbieten, sondern nur über den Wand. Diese Option mit der eigenen Position dürfte User nur verwirren.
Veraltet
Review

Kann man dafür noch einen Command machen?

Kann man dafür noch einen Command machen?
openSimulator(player);
}));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

vector.getBlockX()? auch bitte unten benutzen.

vector.getBlockX()? auch bitte unten benutzen.
swListInv.setItem(47, new SWItem(Material.FLINT_AND_STEEL, "§eStarten", clickType -> {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Erst das Inventar schließen, weil so verleitet es mehr zum draufspammen, wenn startSimulation einen Fehler wirft.

Erst das Inventar schließen, weil so verleitet es mehr zum draufspammen, wenn startSimulation einen Fehler wirft.
player.closeInventory();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

getBlockXYZ() (siehe Chaoscaot)

getBlockXYZ() (siehe Chaoscaot)
Veraltet
Review

Ist nicht ganz das gleiche aber da das eh rausfliegt ist es nicht mehr benötigt

Ist nicht ganz das gleiche aber da das eh rausfliegt ist es nicht mehr benötigt
startSimulation(player);
}));
swListInv.open();
}
static void editTNT(Player player, TNTSpawn tntSpawn) {
TNTSimulator tntSimulator = get(player);
SWInventory swInventory = new SWInventory(player, 54, "TNT");
swInventory.setItem(49, new SWItem(Material.REDSTONE_BLOCK, "§cZurück", clickType -> {
openSimulator(player);
}));
// Delete tnt
swInventory.setItem(53, new SWItem(Material.BARRIER, "§cEntfernen", clickType -> {
tntSimulator.TNT_SPAWNS.remove(tntSpawn);
openSimulator(player);
}));
// Change Count of spawned TNT
swInventory.setItem(10, new SWItem(SWItem.getDye(10), "§7+1", clickType -> {
tntSpawn.setCount(tntSpawn.getCount() + 1);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Wird schon im AnvilInv gemacht -> muss nicht gemacht werden

Wird schon im AnvilInv gemacht -> muss nicht gemacht werden
if (tntSpawn.getCount() > 400) {
tntSpawn.setCount(400);
}
editTNT(player, tntSpawn);
}));
swInventory.setItem(19, new SWItem(Material.TNT, "§7Anzahl §8- §e" + tntSpawn.getCount(), LORE, false, clickType -> {
changeCount(player, "Anzahl TNT", tntSpawn.getCount(), count -> {
if (count < 1) count = 1;
if (count > 400) count = 400;
tntSpawn.setCount(count);
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(28, new SWItem(SWItem.getDye(1), "§7-1", clickType -> {
tntSpawn.setCount(tntSpawn.getCount() - 1);
if (tntSpawn.getCount() < 1) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

§e und §7 tauschen

§e und §7 tauschen
tntSpawn.setCount(1);
}
editTNT(player, tntSpawn);
}));
// Change TickOffset
swInventory.setItem(11, new SWItem(SWItem.getDye(10), "§7+1", clickType -> {
tntSpawn.setTickOffset(tntSpawn.getTickOffset() + 1);
if (tntSpawn.getTickOffset() > 8000) {
tntSpawn.setTickOffset(8000);
}
editTNT(player, tntSpawn);
}));
swInventory.setItem(20, new SWItem(Material.CLOCK, "§7Tick §8- §e" + tntSpawn.getTickOffset(), LORE, false, clickType -> {
changeCount(player, "Tick Offset", tntSpawn.getTickOffset(), tick -> {
if (tick < 0) tick = 0;
if (tick > 8000) tick = 8000;
tntSpawn.setTickOffset(tick);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Man könnte noch etwas mehr Feedback an den Spieler geben. z.B. das diese Zahl nicht zu einer Zahl gemacht werden kann etc.

Man könnte noch etwas mehr Feedback an den Spieler geben. z.B. das diese Zahl nicht zu einer Zahl gemacht werden kann etc.
Veraltet
Review

Was für ein Feedback würdest du dem Spieler hier denn geben wollen?

Was für ein Feedback würdest du dem Spieler hier denn geben wollen?
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(29, new SWItem(SWItem.getDye(1), "§7-1", clickType -> {
tntSpawn.setTickOffset(tntSpawn.getTickOffset() - 1);
if (tntSpawn.getTickOffset() < 0) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

§e und §7 tauschen

§e und §7 tauschen
tntSpawn.setTickOffset(0);
}
editTNT(player, tntSpawn);
}));
// Change FuseTicks
swInventory.setItem(12, new SWItem(SWItem.getDye(10), "§7+1", clickType -> {
tntSpawn.setFuseTicks(tntSpawn.getFuseTicks() + 1);
if (tntSpawn.getFuseTicks() > 80) {
tntSpawn.setFuseTicks(80);
}
editTNT(player, tntSpawn);
}));
swInventory.setItem(21, new SWItem(Material.CLOCK, "§7Fuse-Ticks §8- §e" + tntSpawn.getFuseTicks(), LORE, false, clickType -> {
changeCount(player, "Fuse-Ticks", tntSpawn.getFuseTicks(), tick -> {
if (tick < 0) tick = 0;
if (tick > 80) tick = 80;
tntSpawn.setFuseTicks(tick);
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(30, new SWItem(SWItem.getDye(1), "§7-1", clickType -> {
tntSpawn.setFuseTicks(tntSpawn.getFuseTicks() - 1);
if (tntSpawn.getFuseTicks() < 1) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

§e und §7 tauschen

§e und §7 tauschen
tntSpawn.setFuseTicks(1);
}
editTNT(player, tntSpawn);
}));
// Repeater before Comparator
swInventory.setItem(4, new SWItem(comparatorOrNot(tntSpawn.isComparator()), "§7Gezündet durch §8- §e" + (tntSpawn.isComparator() ? "Comparator" : "Repeater"), clickType -> {
tntSpawn.setComparator(!tntSpawn.isComparator());
editTNT(player, tntSpawn);
}));
// Velocity Settings
swInventory.setItem(13, new SWItem(activeOrNot(tntSpawn.isxVelocity()), "§7TNT §eSprung X §8- " + active(tntSpawn.isxVelocity()), clickType -> {
tntSpawn.setxVelocity(!tntSpawn.isxVelocity());
editTNT(player, tntSpawn);
}));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ich weiß nicht, was ich von diesem Konzept mit den Comparator oder Repeater Zündung halt soll, weil besonders für neue Spieler wird dies verwirrend sein, da es dort oft noch nicht das Verständnis von Update order gibt.

Ich weiß nicht, was ich von diesem Konzept mit den Comparator oder Repeater Zündung halt soll, weil besonders für neue Spieler wird dies verwirrend sein, da es dort oft noch nicht das Verständnis von Update order gibt.
Veraltet
Review

Vor allem, gibt es aber viel mehr als nur zwei zünd quellen: Redstone, Observer oder Piston mit einem Block o.Ä.

Vor allem, gibt es aber viel mehr als nur zwei zünd quellen: Redstone, Observer oder Piston mit einem Block o.Ä.
Veraltet
Review

Und in welcher Reihenfolge werden die gezündet? und meinst du nicht das zwei UpdateOrder reichen?

Und in welcher Reihenfolge werden die gezündet? und meinst du nicht das zwei UpdateOrder reichen?
swInventory.setItem(22, new SWItem(activeOrNot(tntSpawn.isyVelocity()), "§7TNT §eSprung Y §8- " + active(tntSpawn.isyVelocity()), clickType -> {
tntSpawn.setyVelocity(!tntSpawn.isyVelocity());
editTNT(player, tntSpawn);
}));
swInventory.setItem(31, new SWItem(activeOrNot(tntSpawn.iszVelocity()), "§7TNT §eSprung Z §8- " + active(tntSpawn.iszVelocity()), clickType -> {
tntSpawn.setzVelocity(!tntSpawn.iszVelocity());
editTNT(player, tntSpawn);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Start Velocity? Wie bitte? Würde eher irgendwas um Tnt Sprung x/y/z empfehlen

Start Velocity? Wie bitte? Würde eher irgendwas um Tnt Sprung x/y/z empfehlen
Veraltet
Review

Das §7 am Ende ist unnütz, da active seine eigenen Farben mit bringt.

Das §7 am Ende ist unnütz, da active seine eigenen Farben mit bringt.
Veraltet
Review

Wie schaut es mit dem Ding auf der 1.12 aus? Den RED_CONCRETE gibt es dort nicht.

Wie schaut es mit dem Ding auf der 1.12 aus? Den RED_CONCRETE gibt es dort nicht.
}));
// X Position
swInventory.setItem(14, new SWItem(SWItem.getDye(10), "§7+0,0625", clickType -> {
tntSpawn.getPosition().add(X_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.setItem(23, new SWItem(Material.PAPER, "§7x-Position §8- §e" + tntSpawn.getPosition().getX(), LORE, false, clickType -> {
changePosition(player, tntSpawn.getPosition().getX(), x -> {
tntSpawn.getPosition().setX(clamp(x));
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
YoyoNow markierte diese Unterhaltung als gelöst
Review

Bei diesen Items sollte man sich auch an das Farbschema halten

Bei diesen Items sollte man sich auch an das Farbschema halten
swInventory.setItem(32, new SWItem(SWItem.getDye(1), "§7-0,0625", clickType -> {
tntSpawn.getPosition().add(NX_VECTOR);
editTNT(player, tntSpawn);
}));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

§e und §7 tauschen

§e und §7 tauschen
// Y Position
swInventory.setItem(15, new SWItem(SWItem.getDye(10), "§7+0,0625", clickType -> {
tntSpawn.getPosition().add(Y_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.setItem(24, new SWItem(Material.PAPER, "§7y-Position §8- §e" + tntSpawn.getPosition().getY(), LORE, false, clickType -> {
changePosition(player, tntSpawn.getPosition().getY(), y -> {
tntSpawn.getPosition().setY(clamp(y));
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(33, new SWItem(SWItem.getDye(1), "§7-0,0625", clickType -> {
tntSpawn.getPosition().add(NY_VECTOR);
editTNT(player, tntSpawn);
}));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

§e und §7 tauschen

§e und §7 tauschen
// Z Position
swInventory.setItem(16, new SWItem(SWItem.getDye(10), "§7+0,0625", clickType -> {
tntSpawn.getPosition().add(Z_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.setItem(25, new SWItem(Material.PAPER, "§7z-Position §8- §e" + tntSpawn.getPosition().getZ(), LORE, false, clickType -> {
changePosition(player, tntSpawn.getPosition().getZ(), z -> {
tntSpawn.getPosition().setZ(clamp(z));
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(34, new SWItem(SWItem.getDye(1), "§7-0,0625", clickType -> {
tntSpawn.getPosition().add(NZ_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.open();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

§e und §7 tauschen

§e und §7 tauschen
}
static void startSimulation(Player player) {
TNT_SIMULATOR_MAP.getOrDefault(player, new TNTSimulator()).start();
}
static void addTNT(Player player, TNTSpawn tntSpawn) {
TNTSimulator tntSimulator = TNT_SIMULATOR_MAP.computeIfAbsent(player, player1 -> new TNTSimulator());
tntSimulator.TNT_SPAWNS.add(tntSpawn);
}
private static Material comparatorOrNot(boolean b) {
if (b) {
return SWItem.getMaterial("REDSTONE_COMPARATOR");
} else {
return SWItem.getMaterial("DIODE");
}
}
private static Material activeOrNot(boolean b) {
if (b) {
return VersionedCallable.call(new VersionedCallable<>(TNTSimulator_12::active, 8), new VersionedCallable<>(TNTSimulator_15::active, 14));
} else {
return VersionedCallable.call(new VersionedCallable<>(TNTSimulator_12::notActive, 8), new VersionedCallable<>(TNTSimulator_15::notActive, 14));
}
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

getOrDefault?

getOrDefault?
private static String active(boolean b) {
return b ? "§aan" : "§caus";
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kann addTNT nicht einfach einen Vektor nehmen und einen TNTSpawn returnen?

Kann addTNT nicht einfach einen Vektor nehmen und einen TNTSpawn returnen?
private static void changeCount(Player player, String name, int defaultValue, Consumer<Integer> result, Runnable failure) {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, name, defaultValue + "");
swAnvilInv.setItem(Material.PAPER);
swAnvilInv.setCallback(s -> {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ich glaube, mit compute (oder vergleichbarer Funktion, musst mal schauen, gibt aber garantiert eine passende), wäre diese Funktion ein Einzeiler.

Ich glaube, mit compute (oder vergleichbarer Funktion, musst mal schauen, gibt aber garantiert eine passende), wäre diese Funktion ein Einzeiler.
try {
result.accept(Integer.parseInt(s));
} catch (NumberFormatException e) {
failure.run();
}
});
swAnvilInv.open();
}
private static void changePosition(Player player, double defaultValue, Consumer<Double> result, Runnable failure) {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, "Position", defaultValue + "");
swAnvilInv.setItem(Material.PAPER);
swAnvilInv.setCallback(s -> {
try {
result.accept(Double.parseDouble(s.replace(',', '.')));
} catch (NumberFormatException e) {
failure.run();
}
});
swAnvilInv.open();
}
private static double clamp(double d) {
return (int)(d * 10000) * 0.0001;
}
public void delete() {
TNT_SPAWNS.clear();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Mann kann auch eine Normal foreach loop nehmen, dann muss man keinen AtomicInteger nutzen.

Mann kann auch eine Normal foreach loop nehmen, dann muss man keinen AtomicInteger nutzen.
Veraltet
Review

Doch weil ich sonst noch die Variable einmal kopieren muss, damit diese effectively final ist für den BukkitTask.

Doch weil ich sonst noch die Variable einmal kopieren muss, damit diese effectively final ist für den BukkitTask.
}
public void start() {
Map<Integer, List<TNTSpawn>> first = new HashMap<>();
Map<Integer, List<TNTSpawn>> second = new HashMap<>();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Wie wäre es, wenn man nicht für jeden Tick einen einzelnen Task macht, sondern einen Timer Task, welcher jeden Tick die Spawnt, die für diesen Tick geplant sind?

Wie wäre es, wenn man nicht für jeden Tick einen einzelnen Task macht, sondern einen Timer Task, welcher jeden Tick die Spawnt, die für diesen Tick geplant sind?
int lastTick = 0;
for (TNTSpawn tntSpawn : TNT_SPAWNS) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Der Task muss auch gestoppt werden...

Der Task muss auch gestoppt werden...
Map<Integer, List<TNTSpawn>> list = tntSpawn.isComparator() ? second : first;
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bitte ohne (siehe Kommentar zu .start())

Bitte ohne (siehe Kommentar zu .start())
for (int i = 0; i < tntSpawn.getCount(); i++) {
list.computeIfAbsent(tntSpawn.getTickOffset(), integer -> new ArrayList<>()).add(tntSpawn);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Die runTaskTimer kann eine Consumable von einem BukkitTask nehmen, die könnte man nutzen

Die runTaskTimer kann eine Consumable von einem BukkitTask nehmen, die könnte man nutzen
}
if (lastTick < tntSpawn.getTickOffset()) {
lastTick = tntSpawn.getTickOffset();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Warum muss die Liste noch mal gemischt werden?

Warum muss die Liste noch mal gemischt werden?
Veraltet
Review

Damit wenn ich rechts und links in der Reihenfolge das spawne nicht immer das ganze nach links wegschießt im trace. Ist also wichtig. weil sonst viele Kanonen einen gewissen Drall haben.

Damit wenn ich rechts und links in der Reihenfolge das spawne nicht immer das ganze nach links wegschießt im trace. Ist also wichtig. weil sonst viele Kanonen einen gewissen Drall haben.
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Anstat deinen Komischen AtomicInteger zu nutzen, könnte man auch eine normal foreach Schleife machen

Anstat deinen Komischen AtomicInteger zu nutzen, könnte man auch eine normal foreach Schleife machen
}
int finalLastTick = lastTick;
AtomicInteger currentTick = new AtomicInteger(0);
Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), bukkitTask -> {
int tick = currentTick.get();
spawnRandomList(first.getOrDefault(tick, EMPTY));
spawnRandomList(second.getOrDefault(tick, EMPTY));
if (tick > finalLastTick) bukkitTask.cancel();
currentTick.incrementAndGet();
}, 1, 1);
}
private void spawnRandomList(List<TNTSpawn> tntSpawns) {
if (tntSpawns.isEmpty()) return;
Collections.shuffle(tntSpawns);
for (TNTSpawn tntSpawn : tntSpawns) {
tntSpawn.spawn();
}
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ok, deine Datenmodelle sind mal wieder ein komplettes Chaos. Du brauchst 3 Werte: Delay, wie viel TNT, TNTSpawn, oder? Und warum brauchst du dann dafür eine ominöse List[]?!? Vereinfache doch den code mal. tntSpawn weiß doch selbst, wie häufig er spawnen soll, warum musst du das nochmal woanders speichern? Warum tut TNTSpawn nicht einfach in der Anzahl spawnen, wie benötigt wird? Warum brauchst du die Funktion spawnRandomList, die irgendwie einfach nur in einer komplexen Art und weise alles in den TNTSpawnPairs spawnt? Das ist viel komplexer als nötig. Und wenn du das alles nur wegen der Berechnungsreihenfolge machst: Streamlinen (Eine Liste, in der jeder TNTSpawn so häufig wie sein .count() vorkommt, und dann einfach .shuffle()!

Ok, deine Datenmodelle sind mal wieder ein komplettes Chaos. Du brauchst 3 Werte: Delay, wie viel TNT, TNTSpawn, oder? Und warum brauchst du dann dafür eine ominöse List<TNTSpawnPair>[]?!? Vereinfache doch den code mal. tntSpawn weiß doch selbst, wie häufig er spawnen soll, warum musst du das nochmal woanders speichern? Warum tut TNTSpawn nicht einfach in der Anzahl spawnen, wie benötigt wird? Warum brauchst du die Funktion spawnRandomList, die irgendwie einfach nur in einer komplexen Art und weise alles in den TNTSpawnPairs spawnt? Das ist viel komplexer als nötig. Und wenn du das alles nur wegen der Berechnungsreihenfolge machst: Streamlinen (Eine Liste<TNTSpawn>, in der jeder TNTSpawn so häufig wie sein .count() vorkommt, und dann einfach .shuffle()!
public static class TNTSpawn implements Comparable<TNTSpawn> {
private static final World WORLD = Bukkit.getWorlds().get(0);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Sollte ohne gehen (siehe .start())

Sollte ohne gehen (siehe .start())
private final Vector position;
private int fuseTicks = 80;
private int count = 1;
private int tickOffset = 0;
private boolean xVelocity = true;
private boolean yVelocity = true;
private boolean zVelocity = true;
private boolean comparator = false;
public TNTSpawn(Vector position) {
this.position = position;
}
Chaoscaot markierte diese Unterhaltung als gelöst
Review

Der Name ist immer noch komplett unnütz. Für ein solches Tool, welches zum schnellen testen von Winklen o.Ä., bring der Name einfach keinen Richtigen nutzen. Ein Name wird nicht benötigt, da wenn man eine Kanone Simuliert sind die TNT eh nach den Zündphasen Sortiert. Dazu kann man sich die Simulationen nicht abspeichern, und ich glaube, wenn man so ein Feature nutz, dann hat man nicht ein Kurzzeitgedechniss wie ein Metal Gear Solid Bot.

Der Name ist immer noch komplett unnütz. Für ein solches Tool, welches zum schnellen testen von Winklen o.Ä., bring der Name einfach keinen Richtigen nutzen. Ein Name wird nicht benötigt, da wenn man eine Kanone Simuliert sind die TNT eh nach den Zündphasen Sortiert. Dazu kann man sich die Simulationen nicht abspeichern, und ich glaube, wenn man so ein Feature nutz, dann hat man nicht ein Kurzzeitgedechniss wie ein Metal Gear Solid Bot.
public void spawn() {
WORLD.spawn(position.toLocation(WORLD), TNTPrimed.class, tntPrimed -> {
YoyoNow markierte diese Unterhaltung als gelöst
Review

Das Tool ist ein Tool, um mal schnell eine Kanone skizzieren zu können. TNT extra Namen zu geben, scheint mir dabei relativ überflüssig/unnötig.

Das Tool ist ein Tool, um mal schnell eine Kanone skizzieren zu können. TNT extra Namen zu geben, scheint mir dabei relativ überflüssig/unnötig.
Review

Das soll es dem Benutzer einfacher machen, wenn er komplexe Kanonen skizzieren möchte die einzelnen TNT auseinander zu halten.

Das soll es dem Benutzer einfacher machen, wenn er komplexe Kanonen skizzieren möchte die einzelnen TNT auseinander zu halten.
tntPrimed.setFuseTicks(fuseTicks);
if (!xVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setX(0));
if (!yVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setY(0));
if (!zVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setZ(0));
});
}
public Vector getPosition() {
return position;
}
public int getFuseTicks() {
return fuseTicks;
}
public void setFuseTicks(int fuseTicks) {
this.fuseTicks = fuseTicks;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getTickOffset() {
return tickOffset;
}
public void setTickOffset(int tickOffset) {
this.tickOffset = tickOffset;
}
YoyoNow markierte diese Unterhaltung als gelöst
Review

Die Position wird nie verändert. Daher setPosition entfernen & position final machen.

Die Position wird nie verändert. Daher setPosition entfernen & position final machen.
Review

Die Funktion wird nie verwendet, also ja ich kann diese Ausbauen, da sie ein Relikt der früher nicht innen class ist. Jedoch wird die Position als Vector definitiv verändert. Gut anscheinend setzte ich es nicht neu sondern verändere nur also ja kann final sein.

image

Die Funktion wird nie verwendet, also ja ich kann diese Ausbauen, da sie ein Relikt der früher nicht innen class ist. Jedoch wird die Position als Vector definitiv verändert. Gut anscheinend setzte ich es nicht neu sondern verändere nur also ja kann final sein. ![image](/devlabs/attachments/651f69be-8343-461a-830d-339accd30bda)
public boolean isxVelocity() {
return xVelocity;
}
public void setxVelocity(boolean xVelocity) {
this.xVelocity = xVelocity;
}
public boolean isyVelocity() {
return yVelocity;
}
public void setyVelocity(boolean yVelocity) {
this.yVelocity = yVelocity;
}
public boolean iszVelocity() {
return zVelocity;
}
public void setzVelocity(boolean zVelocity) {
this.zVelocity = zVelocity;
}
public boolean isComparator() {
return comparator;
}
public void setComparator(boolean comparator) {
this.comparator = comparator;
}
@Override
public int compareTo(TNTSpawn tntSpawn) {
return -Integer.compare(tickOffset, tntSpawn.tickOffset);
}
}
}

Datei anzeigen

@ -0,0 +1,84 @@
/*
*
* 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.world;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
YoyoNow markierte diese Unterhaltung als gelöst
Review

Unused Import

Unused Import
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.util.Vector;
import static de.steamwar.bausystem.world.TNTSimulator.*;
public class TNTSimulatorListener implements Listener {
private static final Vector HALF = new Vector(0.5, 0, 0.5);
private boolean permissionCheck(Player player) {
if (Welt.noPermission(player, Permission.world)) {
YoyoNow markierte diese Unterhaltung als gelöst
Review

Auch hier so etwas die Frage.

Auch hier so etwas die Frage.
player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht den Simulator nutzen");
return false;
}
return true;
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getItem() == null) {
return;
}
if (!event.getItem().isSimilar(WAND)) {
return;
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

In einer Methode Zwei unterschiuedliche If Style. ARRRRRRRRRRRRGGGGGGGHHHHHHHH

In einer Methode Zwei unterschiuedliche If Style. ARRRRRRRRRRRRGGGGGGGHHHHHHHH
}
event.setCancelled(true);
if (!permissionCheck(event.getPlayer())) {
return;
}
switch (event.getAction()) {
case LEFT_CLICK_BLOCK:
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Könnte man hier nicht für die Lesbarkeit ein Switch-Case Statement nutzen?

Könnte man hier nicht für die Lesbarkeit ein Switch-Case Statement nutzen?
Veraltet
Review

Glaube nicht, weil es an sich nicht viele Sachen in dem switch gäbe es gebe ein über komplizierten default und ansonsten nur zwei case mit LEFT_CLICK_BLOCK und LEFT_CLICK_AIR, welche das gleiche machen würden. Also nein

Glaube nicht, weil es an sich nicht viele Sachen in dem switch gäbe es gebe ein über komplizierten default und ansonsten nur zwei case mit `LEFT_CLICK_BLOCK` und `LEFT_CLICK_AIR`, welche das gleiche machen würden. Also nein
Veraltet
Review

Überkompliziert? Dafuq? Es Gabe das LEFT_CLICK_BLOCK und das LEFT_CLICK_AIR, das RIGHT_CLICK_AIR zum Inventar und noch das RIGHT_CLICK_BLOCK zum Hinzufügen. Also überkompliziert ist was anderes und es wäre deutlich einfacher zu Lesen.

Überkompliziert? Dafuq? Es Gabe das `LEFT_CLICK_BLOCK` und das `LEFT_CLICK_AIR`, das `RIGHT_CLICK_AIR` zum Inventar und noch das `RIGHT_CLICK_BLOCK` zum Hinzufügen. Also überkompliziert ist was anderes und es wäre deutlich einfacher zu Lesen.
case LEFT_CLICK_AIR:
startSimulation(event.getPlayer());
break;
case RIGHT_CLICK_BLOCK:
Vector location = event.getClickedBlock().getLocation().toVector().add(event.getBlockFace().getDirection()).add(HALF);
TNTSpawn tntSpawn = new TNTSpawn(location);
addTNT(event.getPlayer(), tntSpawn);
editTNT(event.getPlayer(), tntSpawn);
break;
case RIGHT_CLICK_AIR:
openSimulator(event.getPlayer());
break;
default:
break;
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
TNT_SIMULATOR_MAP.remove(event.getPlayer());
}
}

Datei anzeigen

@ -36,4 +36,6 @@ commands:
detonator: detonator:
aliases: dt aliases: dt
script: script:
simulator:
aliases: sim
gui: gui: