Fernzünder #93
@ -23,10 +23,7 @@ import de.steamwar.bausystem.commands.*;
|
|||||||
import de.steamwar.bausystem.tracer.TraceListener;
|
import de.steamwar.bausystem.tracer.TraceListener;
|
||||||
import de.steamwar.bausystem.tracer.TNTTracer;
|
import de.steamwar.bausystem.tracer.TNTTracer;
|
||||||
import de.steamwar.bausystem.tracer.ShowManager;
|
import de.steamwar.bausystem.tracer.ShowManager;
|
||||||
import de.steamwar.bausystem.world.AFKStopper;
|
import de.steamwar.bausystem.world.*;
|
||||||
import de.steamwar.bausystem.world.ArenaSection;
|
|
||||||
import de.steamwar.bausystem.world.BauScoreboard;
|
|
||||||
import de.steamwar.bausystem.world.RegionListener;
|
|
||||||
import de.steamwar.core.CommandRemover;
|
import de.steamwar.core.CommandRemover;
|
||||||
import de.steamwar.core.Core;
|
import de.steamwar.core.Core;
|
||||||
import de.steamwar.scoreboard.SWScoreboard;
|
import de.steamwar.scoreboard.SWScoreboard;
|
||||||
@ -117,11 +114,14 @@ public class BauSystem extends JavaPlugin implements Listener {
|
|||||||
getCommand("lockschem").setExecutor(new CommandLockschem());
|
getCommand("lockschem").setExecutor(new CommandLockschem());
|
||||||
getCommand("debugstick").setExecutor(new CommandDebugStick());
|
getCommand("debugstick").setExecutor(new CommandDebugStick());
|
||||||
getCommand("watervision").setExecutor(new CommandGills());
|
getCommand("watervision").setExecutor(new CommandGills());
|
||||||
|
getCommand("detonator").setExecutor(new CommandDetonator());
|
||||||
|
getCommand("detonator").setTabCompleter(new CommandDetonatorTabCompleter());
|
||||||
|
|
||||||
Bukkit.getPluginManager().registerEvents(this, this);
|
Bukkit.getPluginManager().registerEvents(this, this);
|
||||||
Bukkit.getPluginManager().registerEvents(new RegionListener(), this);
|
Bukkit.getPluginManager().registerEvents(new RegionListener(), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new BauScoreboard(), this);
|
Bukkit.getPluginManager().registerEvents(new BauScoreboard(), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new TraceListener(), this);
|
Bukkit.getPluginManager().registerEvents(new TraceListener(), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new Detonator(), this);
|
||||||
new AFKStopper();
|
new AFKStopper();
|
||||||
TNTTracer.init();
|
TNTTracer.init();
|
||||||
|
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
package de.steamwar.bausystem.commands;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
|
import de.steamwar.bausystem.world.Detonator;
|
||||||
|
import de.steamwar.bausystem.world.Welt;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class CommandDetonator implements CommandExecutor {
|
||||||
|
|
||||||
|
private void help(Player player) {
|
||||||
|
player.sendMessage("§8/§edetonator wand §8- §7Legt den Fernzünder ins Inventar");
|
||||||
|
player.sendMessage("§8/§edetonator detonate §8- §7Benutzt den Fernzünder");
|
||||||
|
player.sendMessage("§8/§edetonator reset §8- §7Löscht alle markierten Positionen");
|
||||||
|
player.sendMessage("§8/§edetonator add [Z] [Y] [Z] §8- §7Fügt den Block an der Coordinate hinzu");
|
||||||
|
player.sendMessage("§7Optionale Parameter mit §8<>§7, Benötigte Parameter mit §8[]");
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean permissionCheck(Player player) {
|
||||||
|
if(Welt.noPermission(player, Permission.world)){
|
||||||
|
player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht den Detonator nutzen");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
|
||||||
|
if(!(sender instanceof Player))
|
||||||
|
return false;
|
||||||
|
Player player = (Player) sender;
|
||||||
|
|
||||||
|
if(args.length == 0){
|
||||||
|
help(player);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!permissionCheck(player)) return false;
|
||||||
|
|
||||||
|
switch (args[0].toLowerCase()) {
|
||||||
|
case "wand":
|
||||||
|
case "detonator":
|
||||||
|
player.getInventory().setItemInMainHand(Detonator.WAND);
|
||||||
|
player.updateInventory();
|
||||||
|
break;
|
||||||
|
case "delete":
|
||||||
|
case "reset":
|
||||||
|
case "remove":
|
||||||
|
Detonator.INSTANCE.deleteLocations(player);
|
||||||
|
break;
|
||||||
|
case "detonate":
|
||||||
|
case "click":
|
||||||
|
case "use":
|
||||||
|
Detonator.INSTANCE.execute(player);
|
||||||
|
break;
|
||||||
|
case "add":
|
||||||
|
case "location":
|
||||||
|
case "loc":
|
||||||
|
if (args.length >= 4) {
|
||||||
|
try {
|
||||||
|
int x = Integer.parseInt(args[1]);
|
||||||
|
int y = Integer.parseInt(args[2]);
|
||||||
|
int z = Integer.parseInt(args[3]);
|
||||||
|
Detonator.INSTANCE.addLocation(player, new Location(player.getWorld(), x, y, z), true);
|
||||||
|
}catch (NumberFormatException e){
|
||||||
|
player.sendMessage(BauSystem.PREFIX + "§cBitte gebe eine Valide Coordinate an!");
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
player.sendMessage(BauSystem.PREFIX + "§cBitte gebe eine Valide Coordinate an!");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
help(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
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 CommandDetonatorTabCompleter implements TabCompleter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
if(!(sender instanceof Player)) return new ArrayList<>();
|
||||||
|
return detonaterTabComplete((Player) sender, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> detonaterTabComplete(Player player, String[] args) {
|
||||||
|
List<String> tabComplete = new ArrayList<>();
|
||||||
|
tabComplete.add("wand");
|
||||||
|
tabComplete.add("detonate");
|
||||||
|
tabComplete.add("delete");
|
||||||
|
tabComplete.add("add");
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
254
BauSystem_Main/src/de/steamwar/bausystem/world/Detonator.java
Normale Datei
254
BauSystem_Main/src/de/steamwar/bausystem/world/Detonator.java
Normale Datei
@ -0,0 +1,254 @@
|
|||||||
|
package de.steamwar.bausystem.world;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.commands.CommandDetonator;
|
||||||
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.Openable;
|
||||||
|
import org.bukkit.block.data.Powerable;
|
||||||
|
import org.bukkit.block.data.type.*;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.inventory.ItemFlag;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class Detonator implements Listener {
|
||||||
|
|
||||||
|
private final Map<Player, Set<Loc>> locs;
|
||||||
|
|
||||||
|
public static Detonator INSTANCE;
|
||||||
|
public static ItemStack WAND;
|
||||||
|
|
||||||
|
public Detonator() {
|
||||||
|
locs = new HashMap<>();
|
||||||
|
WAND = new ItemStack(Material.TRIPWIRE_HOOK, 1);
|
||||||
|
ItemMeta im = WAND.getItemMeta();
|
||||||
|
|
||||||
|
im.setDisplayName("§6Fernzünder");
|
||||||
|
im.addItemFlags(ItemFlag.HIDE_ENCHANTS);
|
||||||
|
|
||||||
|
List<String> lorelist = Arrays.asList("§eLinks Klick §8- §7Setzte einen Punkt zum Aktivieren",
|
||||||
|
"§eLinks Klick + Shift §8- §7Füge einen Punkt hinzu", "§eRechts Klick §8- §7Löse alle Punkte aus");
|
||||||
|
im.setLore(lorelist);
|
||||||
|
|
||||||
|
WAND.setItemMeta(im);
|
||||||
|
INSTANCE = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addLocation(Player player, Location location, boolean shift) {
|
||||||
|
if(!shift) locs.get(player).clear();
|
||||||
|
locs.get(player).add(new Loc(location.getBlockX(),
|
||||||
|
location.getBlockY(),
|
||||||
|
location.getBlockZ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteLocations(Player player) {
|
||||||
|
if(locs.containsKey(player)) locs.remove(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteLocation(Player player, Location location) {
|
||||||
|
if(locs.get(player).stream().filter(loc -> loc.equals(Loc.getFromLocation(location))).count() >= 1)
|
||||||
|
locs.get(player).remove(locs.get(player).stream().filter(loc -> Loc.getFromLocation(location)
|
||||||
|
.equals(loc)).limit(1).collect(Collectors.toList()).get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
for (Loc loc: locs.get(player)) {
|
||||||
|
handleSwitch(loc.getLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleSwitch(Location location) {
|
||||||
|
Block block = location.getBlock();
|
||||||
|
switch (block.getType()) {
|
||||||
|
case OAK_BUTTON:
|
||||||
|
case BIRCH_BUTTON:
|
||||||
|
case ACACIA_BUTTON:
|
||||||
|
case DARK_OAK_BUTTON:
|
||||||
|
case JUNGLE_BUTTON:
|
||||||
|
case SPRUCE_BUTTON:
|
||||||
|
case LEGACY_WOOD_BUTTON:
|
||||||
|
Switch btn = (Switch) block.getBlockData();
|
||||||
|
Powerable btnpow = (Powerable) block.getBlockData();
|
||||||
|
btnpow.setPowered(true);
|
||||||
|
block.setBlockData(btnpow);
|
||||||
|
updateBlockface(block);
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), () -> {
|
||||||
|
btnpow.setPowered(false);
|
||||||
|
block.setBlockData(btnpow);
|
||||||
|
updateBlockface(block);
|
||||||
|
}, 30);
|
||||||
|
break;
|
||||||
|
case STONE_BUTTON:
|
||||||
|
case LEGACY_STONE_BUTTON:
|
||||||
|
Switch sbtn = (Switch) block.getBlockData();
|
||||||
|
Powerable sbtnpow = (Powerable) block.getBlockData();
|
||||||
|
sbtnpow.setPowered(true);
|
||||||
|
block.setBlockData(sbtnpow);
|
||||||
|
updateBlockface(block);
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), () -> {
|
||||||
|
sbtnpow.setPowered(false);
|
||||||
|
block.setBlockData(sbtnpow);
|
||||||
|
updateBlockface(block);
|
||||||
|
}, 20);
|
||||||
|
break;
|
||||||
|
case NOTE_BLOCK:
|
||||||
|
case LEGACY_NOTE_BLOCK:
|
||||||
|
NoteBlock noteBlock = (NoteBlock) block.getBlockData();
|
||||||
|
if(noteBlock.getNote().isSharped()) noteBlock.setNote(noteBlock.getNote().flattened());
|
||||||
|
else noteBlock.setNote(noteBlock.getNote().sharped());
|
||||||
|
block.setBlockData(noteBlock);
|
||||||
|
break;
|
||||||
|
case TRIPWIRE:
|
||||||
|
Tripwire tripwire = (Tripwire) block.getBlockData();
|
||||||
|
if(tripwire.isAttached()) {
|
||||||
|
tripwire.setPowered(!tripwire.isPowered());
|
||||||
|
block.setBlockData(tripwire);
|
||||||
|
updateBlock(block);
|
||||||
|
} else {
|
||||||
|
tripwire.setPowered(!tripwire.isPowered());
|
||||||
|
block.setBlockData(tripwire);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ACACIA_PRESSURE_PLATE:
|
||||||
|
case BIRCH_PRESSURE_PLATE:
|
||||||
|
case DARK_OAK_PRESSURE_PLATE:
|
||||||
|
case HEAVY_WEIGHTED_PRESSURE_PLATE:
|
||||||
|
case JUNGLE_PRESSURE_PLATE:
|
||||||
|
case LIGHT_WEIGHTED_PRESSURE_PLATE:
|
||||||
|
case OAK_PRESSURE_PLATE:
|
||||||
|
case SPRUCE_PRESSURE_PLATE:
|
||||||
|
case STONE_PRESSURE_PLATE:
|
||||||
|
Powerable pressureSensor = (Powerable) block.getBlockData();
|
||||||
|
pressureSensor.setPowered(true);
|
||||||
|
block.setBlockData(pressureSensor);
|
||||||
|
updateBlock(block.getRelative(BlockFace.DOWN));
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), () -> {
|
||||||
|
pressureSensor.setPowered(false);
|
||||||
|
block.setBlockData(pressureSensor);
|
||||||
|
updateBlock(block.getRelative(BlockFace.DOWN));
|
||||||
|
}, 20);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if(block.getBlockData() instanceof Openable) {
|
||||||
|
Openable openable = (Openable) block.getBlockData();
|
||||||
|
openable.setOpen(!openable.isOpen());
|
||||||
|
block.setBlockData(openable);
|
||||||
|
} else if(block.getBlockData() instanceof Powerable) {
|
||||||
|
Powerable powerable = (Powerable) block.getBlockData();
|
||||||
|
powerable.setPowered(!powerable.isPowered());
|
||||||
|
block.setBlockData(powerable);
|
||||||
|
updateBlockface(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void updateBlock(Block block) {
|
||||||
|
BlockData data = block.getBlockData();
|
||||||
|
block.setType(Material.BARRIER, true);
|
||||||
|
block.setBlockData(data, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void updateBlockface(Block block) {
|
||||||
|
Block relativebtn;
|
||||||
|
if(!(block.getBlockData() instanceof Switch)) return;
|
||||||
|
switch(((Switch)block.getBlockData()).getFace()){
|
||||||
|
case FLOOR:
|
||||||
|
relativebtn = block.getRelative(BlockFace.DOWN);
|
||||||
|
break;
|
||||||
|
case CEILING:
|
||||||
|
relativebtn = block.getRelative(BlockFace.UP);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
relativebtn = block.getRelative(((Switch)block.getBlockData()).getFacing());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
updateBlock(relativebtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Loc {
|
||||||
|
|
||||||
|
private final int x;
|
||||||
|
private final int y;
|
||||||
|
private final int z;
|
||||||
|
|
||||||
|
public Loc(int x, int y, int z) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] getCords() {
|
||||||
|
return new int[] {x, y, z};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return new Location(Bukkit.getWorlds().get(0), x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Loc getFromLocation(Location location) {
|
||||||
|
return new Loc(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if(!(o instanceof Loc)) return false;
|
||||||
|
Loc loc = (Loc) o;
|
||||||
|
return loc.getCords()[0] == x && loc.getCords()[1] == y && loc.getCords()[2] == z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
if (event.getItem() == null) return;
|
||||||
|
if (event.getItem().isSimilar(WAND)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
if(!locs.containsKey(event.getPlayer())) locs.put(event.getPlayer(), new HashSet<>());
|
||||||
|
switch (event.getAction()) {
|
||||||
|
case LEFT_CLICK_BLOCK:
|
||||||
|
Location location = event.getClickedBlock().getLocation();
|
||||||
|
if (event.getPlayer().isSneaking()){
|
||||||
|
if(locs.get(event.getPlayer()).stream().filter(loc -> loc.equals(Loc.getFromLocation(location)))
|
||||||
|
.count() >= 1) {
|
||||||
|
deleteLocation(event.getPlayer(), location);
|
||||||
|
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent
|
||||||
|
.fromLegacyText("§cPunkt entfernt!"));
|
||||||
|
}else {
|
||||||
|
addLocation(event.getPlayer(), location, true);
|
||||||
|
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent
|
||||||
|
.fromLegacyText("§aPunkt hinzugefügt!"));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addLocation(event.getPlayer(), location, false);
|
||||||
|
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent
|
||||||
|
.fromLegacyText("§aPunkt gesetzt!"));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RIGHT_CLICK_AIR:
|
||||||
|
case RIGHT_CLICK_BLOCK:
|
||||||
|
execute(event.getPlayer());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(ignoreCancelled = true)
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
if(locs.containsKey(event.getPlayer())) {
|
||||||
|
locs.remove(event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -30,3 +30,4 @@ commands:
|
|||||||
watervision:
|
watervision:
|
||||||
aliases: wv
|
aliases: wv
|
||||||
lockschem:
|
lockschem:
|
||||||
|
detonator:
|
In neuem Issue referenzieren
Einen Benutzer sperren