RedstoneTester #202
@ -99,6 +99,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
getCommand("script").setExecutor(new CommandScript());
|
||||
getCommand("simulator").setExecutor(new CommandSimulator());
|
||||
getCommand("simulator").setTabCompleter(new CommandSimulatorTabCompleter());
|
||||
getCommand("redstonetester").setExecutor(new CommandRedstoneTester());
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
||||
getCommand("gui").setExecutor(new CommandGUI());
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(this, this);
|
||||
@ -109,6 +110,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
Bukkit.getPluginManager().registerEvents(new TNTSimulatorListener(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new CommandGUI(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new DetonatorListener(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new RedstoneListener(), this);
|
||||
new AFKStopper();
|
||||
|
||||
autoShutdown = Bukkit.getScheduler().runTaskLater(this, Bukkit::shutdown, 1200);
|
||||
|
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.commands;
|
||||
|
||||
import de.steamwar.bausystem.PlayerUtils;
|
||||
import de.steamwar.bausystem.world.RedstoneListener;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class CommandRedstoneTester implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
|
||||
if (!(commandSender instanceof Player))
|
||||
return false;
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
Könnte man bitte mal versuchen diese Command Syntaxen Konsistent halten? Könnte man bitte mal versuchen diese Command Syntaxen Konsistent halten?
YoyoNow
hat
Die erste Zeile ist die help nachricht um das feature zu verstehen. Die erste Zeile ist die help nachricht um das feature zu verstehen.
Chaoscaot
hat
Ich hab die andere Zeile makiert Ich hab die andere Zeile makiert
|
||||
Player player = (Player) commandSender;
|
||||
PlayerUtils.giveItemToPlayer(player, RedstoneListener.WAND);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
165
BauSystem_Main/src/de/steamwar/bausystem/world/RedstoneListener.java
Normale Datei
@ -0,0 +1,165 @@
|
||||
/*
|
||||
* 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.inventory.SWItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Chaoscaot
hat
Mit BlockData wird es in der 1.12 etwas eng, aka. Nicht existent Mit BlockData wird es in der 1.12 etwas eng, aka. Nicht existent
YoyoNow
hat
Wie soll man es alternativ lösen? Wie soll man es alternativ lösen?
|
||||
import org.bukkit.block.data.Powerable;
|
||||
import org.bukkit.block.data.type.Piston;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.*;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class RedstoneListener implements Listener {
|
||||
|
||||
private static long currentTick = 0;
|
||||
|
||||
static {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> {
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
Innere Klassen kommen nach unten Innere Klassen kommen nach unten
|
||||
currentTick++;
|
||||
}, 1, 1);
|
||||
}
|
||||
|
||||
private static class RedstoneTester {
|
||||
|
||||
private final Player player;
|
||||
private Location loc1 = null;
|
||||
private Location loc2 = null;
|
||||
|
||||
private Location activated = null;
|
||||
private long tick = 0;
|
||||
|
||||
public RedstoneTester(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
private void activate(Location location) {
|
||||
if (loc1 != null && loc1.equals(location)) {
|
||||
if (activated != null && !activated.equals(location)) {
|
||||
player.sendMessage("§7Aktivierungsdifferenz§8: §e" + (currentTick - tick) + " §8(§7" + locationToString(activated) + " §8->§7 " + locationToString(location) + "§8)");
|
||||
activated = null;
|
||||
return;
|
||||
}
|
||||
activated = loc1;
|
||||
tick = currentTick;
|
||||
} else if (loc2 != null && loc2.equals(location)) {
|
||||
if (activated != null && !activated.equals(location)) {
|
||||
player.sendMessage("§7Aktivierungsdifferenz§8: §e" + (currentTick - tick) + " §8(§7" + locationToString(activated) + " §8->§7 " + locationToString(location) + "§8)");
|
||||
activated = null;
|
||||
return;
|
||||
}
|
||||
activated = loc2;
|
||||
tick = currentTick;
|
||||
}
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Chaoscaot
hat
Warum ist das nicht Static? Warum ist das nicht Static?
|
||||
}
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
Static nach ganz oben Static nach ganz oben
|
||||
|
||||
}
|
||||
|
||||
private Map<Player, RedstoneTester> playerMap = new HashMap<>();
|
||||
public static final ItemStack WAND = new SWItem(Material.BLAZE_ROD, "§eRedstonetester", Arrays.asList("§eRechtsklick Block §8- §7Setzt die 1. Position", "§eShift-Rechtsklick Luft §8- §7Zurücksetzten", "§eLinksklick Block §8- §7Setzt die 2. Position"), false, null).getItemStack();
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (!WAND.isSimilar(event.getItem())) return;
|
||||
Player player = event.getPlayer();
|
||||
Block block = event.getClickedBlock();
|
||||
event.setCancelled(true);
|
||||
|
||||
switch (event.getAction()) {
|
||||
case RIGHT_CLICK_AIR:
|
||||
if (player.isSneaking()) {
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Chaoscaot
hat
Der sollte schon irgendeine Permission haben e.g. Build Der sollte schon irgendeine Permission haben e.g. Build
YoyoNow
hat
Warum sollte man hierfür irgendeine Berechtigung haben brauchen? Warum sollte man hierfür irgendeine Berechtigung haben brauchen?
|
||||
playerMap.remove(event.getPlayer());
|
||||
player.sendMessage("§7Positionen gelöscht§8.");
|
||||
}
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
§c §c
|
||||
break;
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
Warum hat der Punkt eine andere Farbe? Warum hat der Punkt eine andere Farbe?
YoyoNow
hat
Weil Sonderzeichen bei uns immer dunkel grau sind. Weil Sonderzeichen bei uns immer dunkel grau sind.
|
||||
if (!validBlock(event.getPlayer(), block.getBlockData())) return;
|
||||
playerMap.computeIfAbsent(event.getPlayer(), RedstoneTester::new).loc1 = block.getLocation();
|
||||
sendLocation(event.getPlayer(), "§7POS1", block.getLocation());
|
||||
break;
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
Der Punkt braucht keine andere Farbe Der Punkt braucht keine andere Farbe
|
||||
case LEFT_CLICK_BLOCK:
|
||||
if (!validBlock(event.getPlayer(), block.getBlockData())) return;
|
||||
playerMap.computeIfAbsent(event.getPlayer(), RedstoneTester::new).loc2 = block.getLocation();
|
||||
sendLocation(event.getPlayer(), "§7POS2", block.getLocation());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void sendLocation(Player player, String prefix, Location location) {
|
||||
player.sendMessage(prefix + "§8: §e" + locationToString(location));
|
||||
}
|
||||
|
||||
private static String locationToString(Location location) {
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Chaoscaot
hat
Wie wäre es, wenn man auf die Nachricht klickt, und dann zu diesem Punkt TPt wird? Wie wäre es, wenn man auf die Nachricht klickt, und dann zu diesem Punkt TPt wird?
YoyoNow
hat
Ich weiß nicht wie sinnvoll das ist, weil du ja explizit auf den block clickst. Ich weiß nicht wie sinnvoll das ist, weil du ja explizit auf den block clickst.
|
||||
return location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ();
|
||||
}
|
||||
|
||||
private boolean validBlock(Player player, BlockData block) {
|
||||
if (block instanceof Powerable) return true;
|
||||
if (block instanceof Piston) return true;
|
||||
player.sendMessage("§7Unbekannte Position");
|
||||
return false;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
playerMap.remove(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPistonExtend(BlockPistonExtendEvent e) {
|
||||
playerMap.forEach((player, redstoneTester) -> {
|
||||
redstoneTester.activate(e.getBlock().getLocation());
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPistonRetract(BlockPistonRetractEvent e) {
|
||||
playerMap.forEach((player, redstoneTester) -> {
|
||||
redstoneTester.activate(e.getBlock().getLocation());
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onRedstoneEvent(BlockRedstoneEvent e) {
|
||||
playerMap.forEach((player, redstoneTester) -> {
|
||||
redstoneTester.activate(e.getBlock().getLocation());
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockDispense(BlockDispenseEvent e) {
|
||||
playerMap.forEach((player, redstoneTester) -> {
|
||||
redstoneTester.activate(e.getBlock().getLocation());
|
||||
});
|
||||
}
|
||||
}
|
@ -39,3 +39,4 @@ commands:
|
||||
simulator:
|
||||
aliases: sim
|
||||
gui:
|
||||
redstonetester:
|
Das kann man auch mit der VersionedRunnable machen.
btw: Anstat es nur 1.15 zu machen, könnte man es auch machen, dass man sich den Byte des Aktuellen Blockstates speichert und wenn dieser sich ändert dann wird das der Tester getriggert.
Ich glaube trotzdem, dass diese Sache nur für die 1.15 unsere main bau version gebraucht wird. Und ich finde dies so schöner, weil man dann nicht noch die doppelte verschaltelung der VersionedRunnable hat, welche nur einen Wert hat. Sind 2 Objekte weniger für die VM.
Aber trotzdem sollte man es einheitlich halten, und da auch wenn dann eine VersionedRunnable nutzen.
Sonst wäre das jetzt der einzigste ort, wo das so gemacht werden würde.