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
5 geänderte Dateien mit 423 neuen und 1 gelöschten Zeilen
Nur Änderungen aus Commit a23608b171 werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -96,6 +96,7 @@ 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());
Bukkit.getPluginManager().registerEvents(this, this); Bukkit.getPluginManager().registerEvents(this, this);
Bukkit.getPluginManager().registerEvents(new RegionListener(), this); Bukkit.getPluginManager().registerEvents(new RegionListener(), this);

Datei anzeigen

@ -0,0 +1,251 @@
/*
*
* 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.canonsimulator;
import de.steamwar.bausystem.BauSystem;
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.entity.Player;
import org.bukkit.util.Consumer;
import org.bukkit.util.Vector;
import java.util.*;
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

Diese Vektoren brauchst du an genau einer Stelle im Code, du musst sie nicht static final ständig vorhalten, es würde glaube auch ein .add(x, y, z) gehen.

Diese Vektoren brauchst du an genau einer Stelle im Code, du musst sie nicht static final ständig vorhalten, es würde glaube auch ein .add(x, y, z) gehen.
Veraltet
Review

Dies geht nicht.

Dies geht nicht.
Veraltet
Review

Das ganze gibt es nur mit Vektor, sonst hätte ich das schon gemacht.

Das ganze gibt es nur mit Vektor, sonst hätte ich das schon gemacht.
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Der Text ist nicht wirklich schön. Zum Ändern klicken wäre schon mal eine bessere Formulierung.

Der Text ist nicht wirklich schön. Zum Ändern klicken wäre schon mal eine bessere Formulierung.
private static Map<Player, TNTSimulator> tntSimulatorMap = new HashMap<>();
public static void openSimulator(Player player) {
if (!tntSimulatorMap.containsKey(player)) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kanonensimulator (§6 ist keine Farbe unseres Farbschemas, bitte zwischen 78e wählen)

Rechtsklick

Linksklick

Kanonensimulator (§6 ist keine Farbe unseres Farbschemas, bitte zwischen 78e wählen) Rechtsklick Linksklick
tntSimulatorMap.put(player, new TNTSimulator());
}
TNTSimulator tntSimulator = tntSimulatorMap.get(player);
List<SWListInv.SWListEntry<TNTSpawn>> swListEntryList = new ArrayList<>();
tntSimulator.tntSpawns.forEach(tntSpawn -> {
List<String> lore = new ArrayList<>();
lore.add("§eTNT-Anzahl§8: §7" + tntSpawn.getCount());
lore.add("§eTick§8: §7" + tntSpawn.getTickOffset());
lore.add("");
lore.add("§eX§8: §7" + tntSpawn.getPosition().getX());
lore.add("§eY§8: §7" + tntSpawn.getPosition().getY());
lore.add("§eZ§8: §7" + tntSpawn.getPosition().getZ());
swListEntryList.add(new SWListInv.SWListEntry<>(new SWItem(Material.TNT, "§eTNT", lore, false, null), tntSpawn));
});
SWListInv<TNTSpawn> swListInv = new SWListInv<>(player, "Kanonen Simulator", false, swListEntryList, (clickType, tntSpawn) -> {
editTNT(player, tntSpawn);
});
swListInv.setItem(48, new SWItem(Material.BARRIER, "§cLösche alle TNT", clickType -> {
tntSimulator.tntSpawns.clear();
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

6

6
openSimulator(player);
}));
swListInv.setItem(49, new SWItem(Material.TNT, "§aNeues TNT", clickType -> {
Vector vector = player.getLocation().toVector().multiply(16);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kanonensimulator

Kanonensimulator
vector.setX((int) vector.getX());
vector.setY((int) vector.getY());
vector.setZ((int) vector.getZ());
vector.multiply(0.0625);
TNTSpawn tntSpawn = new TNTSpawn(vector);
if (tntSimulator.tntSpawns.contains(tntSpawn)) {
return;
}
tntSimulator.tntSpawns.add(tntSpawn);
editTNT(player, tntSpawn);
}));
swListInv.setItem(50, new SWItem(Material.FLINT_AND_STEEL, "§eSimulation Starten", clickType -> {
tntSimulator.start();
player.closeInventory();
}));
swListInv.open();
}
private static void editTNT(Player player, TNTSpawn tntSpawn) {
SWInventory swInventory = new SWInventory(player, 45, "TNT");
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

starten

starten
swInventory.setItem(44, new SWItem(Material.REDSTONE_BLOCK, "§cZurück", clickType -> {
openSimulator(player);
}));
// Change Count of spawned TNT
swInventory.setItem(10, new SWItem(SWItem.getDye(10), "§a+1", clickType -> {
tntSpawn.setCount(tntSpawn.getCount() + 1);
editTNT(player, tntSpawn);
}));
swInventory.setItem(19, new SWItem(Material.TNT, "§eAnzahl §8- §7" + tntSpawn.getCount(), clickType -> {
changeCount(player, count -> {
if (count < 1) count = 1;
tntSpawn.setCount(count);
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(28, new SWItem(SWItem.getDye(1), "§c-1", clickType -> {
tntSpawn.setCount(tntSpawn.getCount() - 1);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

icon? Oder doch eher tnt

icon? Oder doch eher tnt
if (tntSpawn.getCount() < 1) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Entfernen oder Löschen

Entfernen oder Löschen
tntSpawn.setCount(1);
}
editTNT(player, tntSpawn);
}));
// Change TickOffset
swInventory.setItem(11, new SWItem(SWItem.getDye(10), "§a+1", clickType -> {
tntSpawn.setTickOffset(tntSpawn.getTickOffset() + 1);
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

1000 TNT an einem Ort? Wenn du bei 100 schluss sagst (ggf. 200) und dem Nutzer dabei eine Fehlermeldung ausgibst, sollte das vollkommen fine sein.

1000 TNT an einem Ort? Wenn du bei 100 schluss sagst (ggf. 200) und dem Nutzer dabei eine Fehlermeldung ausgibst, sollte das vollkommen fine sein.
Veraltet
Review

Ich habe Lupf Kanonen mit 312 TNT, Kann ich das limit auf 400 setzten?

Ich habe Lupf Kanonen mit 312 TNT, Kann ich das limit auf 400 setzten?
editTNT(player, tntSpawn);
}));
swInventory.setItem(20, new SWItem(Material.CLOCK, "§eTick §8- §7" + tntSpawn.getTickOffset(), clickType -> {
changeCount(player, tick -> {
if (tick < 0) tick = 0;
tntSpawn.setTickOffset(tick);
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(29, new SWItem(SWItem.getDye(1), "§c-1", clickType -> {
tntSpawn.setTickOffset(tntSpawn.getTickOffset() - 1);
if (tntSpawn.getTickOffset() < 0) {
tntSpawn.setTickOffset(0);
}
editTNT(player, tntSpawn);
}));
// Delete icon
swInventory.setItem(21, new SWItem(Material.BARRIER, "§cDelete", clickType -> {
tntSimulatorMap.get(player).tntSpawns.remove(tntSpawn);
openSimulator(player);
}));
// Velocity Settings
swInventory.setItem(13, new SWItem(tntSpawn.isxVelocity() ? Material.LIME_WOOL : Material.RED_WOOL, "§eVelocity-X §8- §7" + active(tntSpawn.isxVelocity()), clickType -> {
tntSpawn.setxVelocity(!tntSpawn.isxVelocity());
editTNT(player, tntSpawn);
}));
swInventory.setItem(22, new SWItem(tntSpawn.isyVelocity() ? Material.LIME_WOOL : Material.RED_WOOL, "§eVelocity-Y §8- §7" + active(tntSpawn.isyVelocity()), clickType -> {
tntSpawn.setyVelocity(!tntSpawn.isyVelocity());
editTNT(player, tntSpawn);
}));
swInventory.setItem(31, new SWItem(tntSpawn.iszVelocity() ? Material.LIME_WOOL : Material.RED_WOOL, "§eVelocity-Z §8- §7" + active(tntSpawn.iszVelocity()), clickType -> {
tntSpawn.setzVelocity(!tntSpawn.iszVelocity());
editTNT(player, tntSpawn);
}));
// X Position
swInventory.setItem(14, new SWItem(SWItem.getDye(10), "§a+0,0625", clickType -> {
tntSpawn.getPosition().add(X_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.setItem(23, new SWItem(Material.PAPER, "§ePosition-X §8- §7" + tntSpawn.getPosition().getX(), clickType -> {
changePosition(player, x -> {
tntSpawn.getPosition().setX(clamp(x));
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(32, new SWItem(SWItem.getDye(1), "§c-0,0625", clickType -> {
tntSpawn.getPosition().add(NX_VECTOR);
editTNT(player, tntSpawn);
}));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Was soll der Spieler mit Fuseticks anfangen? Ich glaube, die Einstellbarkeit der Fuseticks ist nicht wirklich nötig, da das alles auch durch den Spawnoffset geregelt werden kann und die Nutzer beim Bauen der echten Kanone auch keine Fuseticks haben. Dürfte mehr Leute verwirren als nützen.

Was soll der Spieler mit Fuseticks anfangen? Ich glaube, die Einstellbarkeit der Fuseticks ist nicht wirklich nötig, da das alles auch durch den Spawnoffset geregelt werden kann und die Nutzer beim Bauen der echten Kanone auch keine Fuseticks haben. Dürfte mehr Leute verwirren als nützen.
Veraltet
Review

Ich glaube das die FuseTick besonders beim SFA bauen ein Vorteil sein werden. In sofern finde ich sollte man dies behalten.

Ich glaube das die FuseTick besonders beim SFA bauen ein Vorteil sein werden. In sofern finde ich sollte man dies behalten.
// Y Position
swInventory.setItem(15, new SWItem(SWItem.getDye(10), "§a+0,0625", clickType -> {
tntSpawn.getPosition().add(Y_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.setItem(24, new SWItem(Material.PAPER, "§ePosition-Y §8- §7" + tntSpawn.getPosition().getY(), clickType -> {
changePosition(player, y -> {
tntSpawn.getPosition().setY(clamp(y));
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(33, new SWItem(SWItem.getDye(1), "§c-0,0625", clickType -> {
tntSpawn.getPosition().add(NY_VECTOR);
editTNT(player, tntSpawn);
}));
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Weiß nicht, ob das nicht die User auch zu sehr verwirrt bzw. zu selten benötigt wird.

Weiß nicht, ob das nicht die User auch zu sehr verwirrt bzw. zu selten benötigt wird.
Veraltet
Review

Das wird ziemlich oft verwendet. Alleine allen, denen ich das schon gezeigt haben fanden das wichtig und sinnvoll.

Das wird ziemlich oft verwendet. Alleine allen, denen ich das schon gezeigt haben fanden das wichtig und sinnvoll.
// Z Position
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

LIME_WOOL und RED_WOOL wird dir in der 1.12 um die Ohren fliegen.

LIME_WOOL und RED_WOOL wird dir in der 1.12 um die Ohren fliegen.
swInventory.setItem(16, new SWItem(SWItem.getDye(10), "§a+0,0625", clickType -> {
tntSpawn.getPosition().add(Z_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.setItem(25, new SWItem(Material.PAPER, "§ePosition-Z §8- §7" + tntSpawn.getPosition().getZ(), clickType -> {
changePosition(player, z -> {
tntSpawn.getPosition().setZ(clamp(z));
editTNT(player, tntSpawn);
}, () -> editTNT(player, tntSpawn));
}));
swInventory.setItem(34, new SWItem(SWItem.getDye(1), "§c-0,0625", clickType -> {
tntSpawn.getPosition().add(NZ_VECTOR);
editTNT(player, tntSpawn);
}));
swInventory.open();
}
private static String active(boolean b) {
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

x-Position

x-Position
return b ? "§aan" : "§caus";
}
private static void changeCount(Player player, Consumer<Integer> result, Runnable failure) {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, "Zahl");
swAnvilInv.setItem(Material.PAPER);
swAnvilInv.setCallback(s -> {
try {
result.accept(Integer.parseInt(s));
} catch (NumberFormatException e) {
failure.run();
}
});
swAnvilInv.open();
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

y-Position

y-Position
private static void changePosition(Player player, Consumer<Double> result, Runnable failure) {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, "Position");
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 * 100) * 0.01;
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

z-Position

z-Position
private Set<TNTSpawn> tntSpawns = new TreeSet<>();
public void start() {
tntSpawns.forEach(tntSpawn -> {
Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), tntSpawn::spawn, tntSpawn.getTickOffset() + 1L);
});
}
}

Datei anzeigen

@ -0,0 +1,127 @@
/*
*
* 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.canonsimulator;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.util.Vector;
import java.util.Objects;
public class TNTSpawn implements Comparable<TNTSpawn> {
private static final World WORLD = Bukkit.getWorlds().get(0);
private Vector position;
private int count = 1;
private int tickOffset = 0;
private boolean xVelocity = true;
private boolean yVelocity = true;
private boolean zVelocity = true;
public TNTSpawn(Vector position) {
this.position = position;
}
public void spawn() {
for (int i = 0; i < count; i++) {
WORLD.spawn(position.toLocation(WORLD), TNTPrimed.class, tntPrimed -> {
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 void setPosition(Vector position) {
this.position = position;
}
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;
}
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;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof TNTSpawn)) return false;
TNTSpawn tntSpawn = (TNTSpawn) o;
return count == tntSpawn.count &&
tickOffset == tntSpawn.tickOffset &&
xVelocity == tntSpawn.xVelocity &&
yVelocity == tntSpawn.yVelocity &&
zVelocity == tntSpawn.zVelocity &&
position.equals(tntSpawn.position);
}
@Override
public int hashCode() {
return Objects.hash(position, count, tickOffset, xVelocity, yVelocity, zVelocity);
}
@Override
public int compareTo(TNTSpawn tntSpawn) {
return -Integer.compare(tickOffset, tntSpawn.tickOffset);
}
}

Datei anzeigen

@ -0,0 +1,41 @@
/*
*
* 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.canonsimulator.TNTSimulator;
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 {
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) {
if(!(commandSender instanceof Player))
return false;
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 p = (Player) commandSender;
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.
TNTSimulator.openSimulator(p);
return false;
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
}
YoyoNow markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Löcht

Löcht
}

Datei anzeigen

@ -34,3 +34,5 @@ commands:
detonator: detonator:
aliases: dt aliases: dt
script: script:
simulator:
aliases: sim