CannonSimulator #164
34
BauSystem_12/src/de/steamwar/bausystem/world/TNTSimulator_12.java
Normale Datei
@ -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
|
35
BauSystem_15/src/de/steamwar/bausystem/world/TNTSimulator_15.java
Normale Datei
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -97,6 +97,8 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
getCommand("detonator").setExecutor(new CommandDetonator());
|
||||
getCommand("detonator").setTabCompleter(new CommandDetonatorTabCompleter());
|
||||
getCommand("script").setExecutor(new CommandScript());
|
||||
getCommand("simulator").setExecutor(new CommandSimulator());
|
||||
getCommand("simulator").setTabCompleter(new CommandSimulatorTabCompleter());
|
||||
getCommand("gui").setExecutor(new CommandGUI());
|
||||
|
||||
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 BauScoreboard(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new ClipboardListener(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new TNTSimulatorListener(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new CommandGUI(), this);
|
||||
new AFKStopper();
|
||||
|
||||
|
@ -55,8 +55,6 @@ public class CommandGUI implements CommandExecutor, Listener {
|
||||
|
||||
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(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");
|
||||
});
|
||||
|
||||
ItemStack dtWand = Detonator.WAND.clone();
|
||||
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);
|
||||
ItemStack dtWand = wand(player, Detonator.WAND, "§8/§7dt wand", Permission.world, "§cDu hast keine Worldrechte");
|
||||
inv.setItem(39, dtWand, clickType -> {
|
||||
if (Welt.noPermission(player, Permission.world))
|
||||
return;
|
||||
@ -79,6 +70,14 @@ public class CommandGUI implements CommandExecutor, Listener {
|
||||
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 -> {
|
||||
if (Welt.noPermission(player, Permission.world))
|
||||
return;
|
||||
@ -567,6 +566,18 @@ public class CommandGUI implements CommandExecutor, Listener {
|
||||
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
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
|
||||
if (!(commandSender instanceof Player))
|
||||
|
@ -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
Chaoscaot
hat
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
Lixfel
hat
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
Chaoscaot
hat
Das GUI Das GUI
Chaoscaot
hat
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
Chaoscaot
hat
Der Simulator ist ein System, evt. den Simulatorstab oder etwas ähnliches Der Simulator ist ein System, evt. den Simulatorstab oder etwas ähnliches
Chaoscaot
hat
Der Satz macht keinen Sinn:
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
Chaoscaot
hat
Löcht Löcht
|
||||
}
|
||||
|
||||
private boolean permissionCheck(Player player) {
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
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
Lixfel
hat
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.
YoyoNow
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
Kannst du bitte
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
Chaoscaot
hat
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;
|
||||
}
|
||||
|
||||
}
|
@ -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
Chaoscaot
hat
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
Chaoscaot
hat
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;
|
||||
}
|
||||
|
||||
}
|
441
BauSystem_Main/src/de/steamwar/bausystem/world/TNTSimulator.java
Normale Datei
@ -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
Chaoscaot
hat
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
Chaoscaot
hat
Collections.emptyList()? Collections.emptyList()?
YoyoNow
hat
Wegen dem Wegen dem `Collections.shuffle()` intern
|
||||
private static final List<String> LORE = Collections.singletonList("§eZum ändern klicken");
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
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
Chaoscaot
hat
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
Lixfel
hat
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
Lixfel
hat
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
Lixfel
hat
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
Chaoscaot
hat
Zum Item Namen: mach doch noch so ein Kleines int i welches hoch zählt 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
Lixfel
hat
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.
Chaoscaot
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
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
Lixfel
hat
getBlockXYZ() (siehe Chaoscaot) getBlockXYZ() (siehe Chaoscaot)
YoyoNow
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
§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
Chaoscaot
hat
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.
YoyoNow
hat
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
Chaoscaot
hat
§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
Chaoscaot
hat
§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
Chaoscaot
hat
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.
Chaoscaot
hat
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.Ä.
YoyoNow
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
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.
Chaoscaot
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
§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
Chaoscaot
hat
§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
Chaoscaot
hat
§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
Lixfel
hat
getOrDefault? getOrDefault?
|
||||
private static String active(boolean b) {
|
||||
return b ? "§aan" : "§caus";
|
||||
}
|
||||
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
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
Lixfel
hat
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
Chaoscaot
hat
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.
YoyoNow
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
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
Lixfel
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
Warum muss die Liste noch mal gemischt werden? Warum muss die Liste noch mal gemischt werden?
YoyoNow
hat
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
Chaoscaot
hat
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
Lixfel
hat
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
Lixfel
hat
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
Chaoscaot
hat
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
Lixfel
hat
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.
YoyoNow
hat
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
Lixfel
hat
Die Position wird nie verändert. Daher setPosition entfernen & position final machen. Die Position wird nie verändert. Daher setPosition entfernen & position final machen.
YoyoNow
hat
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. 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -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
Chaoscaot
hat
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
Lixfel
hat
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
Chaoscaot
hat
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
Chaoscaot
hat
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?
YoyoNow
hat
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 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
Chaoscaot
hat
Überkompliziert? Dafuq? Es Gabe das Ü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());
|
||||
}
|
||||
|
||||
}
|
@ -36,4 +36,6 @@ commands:
|
||||
detonator:
|
||||
aliases: dt
|
||||
script:
|
||||
simulator:
|
||||
aliases: sim
|
||||
gui:
|
Repeater und Comparator können über SWItem.getMaterial() erhalten werden, bitte hier entfernen.