QOL #203
@ -708,6 +708,12 @@ OTHER_TPS_HEAD = §7TPS: 1s 10s 1m 5m 10m
|
||||
OTHER_TPS_MESSAGE = §7 §e{0}§7 §e{1}§7 §e{2}§7 §e{3}§7 §e{4}
|
||||
OTHER_TPS_SINGLE = §8TPS: §e{0}
|
||||
OTHER_WORLDSPAWN_HELP=§8/§eworldspawn §8-§e Teleport to the spawn
|
||||
OTHER_BIND_HELP=§8/§ebind §8[§7Command§8] §8-§e Bind a command on item interaction
|
||||
OTHER_BIND_ERROR=§cInvalid or unknown command
|
||||
OTHER_BIND_UNBINDABLE=§cCould not bind command
|
||||
OTHER_BIND_LORE=§eCommand§8:§7 {0}
|
||||
OTHER_BIND_MESSAGE_BIND=§7Bound command §e{0} §7to item
|
||||
OTHER_BIND_MESSAGE_UNBIND=§7Unbound command
|
||||
# DebugStick
|
||||
DEBUG_STICK_COMMAND_HELP=§8/§edebugstick §8-§7 receive a debugstick
|
||||
DEBUG_STICK_NAME=§eDebugstick
|
||||
|
@ -674,6 +674,11 @@ OTHER_TIME_RESULT=§7§oWhooosh
|
||||
OTHER_TPS_HEAD = §7TPS: 1s 10s 1m 5m 10m
|
||||
OTHER_TPS_MESSAGE = §7 §e{0}§7 §e{1}§7 §e{2}§7 §e{3}§7 §e{4}
|
||||
OTHER_TPS_SINGLE = §8TPS: §e{0}
|
||||
OTHER_BIND_HELP=§8/§ebind §8[§7Command§8] §8-§e Binde ein Befehl auf Item Interaktion
|
||||
OTHER_BIND_ERROR=§cFalscher oder unbekannter Befehl
|
||||
OTHER_BIND_UNBINDABLE=§cBefehl konnte nicht gebunden werden
|
||||
OTHER_BIND_MESSAGE_BIND=§7Befehl §e{0} §7ans Item gebunden
|
||||
OTHER_BIND_MESSAGE_UNBIND=§7Befehl entbunden
|
||||
# DebugStick
|
||||
DEBUG_STICK_COMMAND_HELP=§8/§edebugstick §8-§7 Erhalte einen DebugStick
|
||||
DEBUG_STICK_NAME=§eDebugstick
|
||||
|
@ -48,6 +48,10 @@ public class ScriptRunner {
|
||||
private static final Map<Player, Map<Hotkey, List<LuaFunction>>> HOTKEY_MAP = new HashMap<>();
|
||||
private static final Map<Player, Map<String, CommandRegister>> COMMAND_MAP = new HashMap<>();
|
||||
|
||||
public Set<String> getCommandsOfPlayer(Player player) {
|
||||
return COMMAND_MAP.getOrDefault(player, new HashMap<>()).keySet();
|
||||
}
|
||||
|
||||
public static void runScript(String script, Player player) {
|
||||
Globals globals = SteamWarPlatform.createClickGlobals(player);
|
||||
catchScript("SCRIPT_ERROR_CLICK", player, () -> globals.load(script).call());
|
||||
|
147
BauSystem_Main/src/de/steamwar/bausystem/features/util/BindCommand.java
Normale Datei
147
BauSystem_Main/src/de/steamwar/bausystem/features/util/BindCommand.java
Normale Datei
@ -0,0 +1,147 @@
|
||||
package de.steamwar.bausystem.features.util;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.script.ScriptCommand;
|
||||
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||
import de.steamwar.command.PreviousArguments;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.command.TypeMapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class BindCommand extends SWCommand implements Listener {
|
||||
|
||||
@Linked
|
||||
public static class UnBindCommand extends SWCommand {
|
||||
|
||||
public UnBindCommand() {
|
||||
super("unbind");
|
||||
}
|
||||
|
||||
@Register
|
||||
public void generic(Player player) {
|
||||
bindInternal(player);
|
||||
}
|
||||
}
|
||||
|
||||
private static final CommandMap commandMap;
|
||||
|
||||
static {
|
||||
Field knownCommandsField;
|
||||
try {
|
||||
knownCommandsField = Bukkit.getServer().getClass().getDeclaredField("commandMap");
|
||||
knownCommandsField.setAccessible(true);
|
||||
commandMap = (CommandMap)knownCommandsField.get(Bukkit.getServer());
|
||||
} catch (IllegalAccessException | NoSuchFieldException var2) {
|
||||
Bukkit.shutdown();
|
||||
throw new SecurityException("Oh shit. Commands cannot be registered.", var2);
|
||||
}
|
||||
}
|
||||
|
||||
private static final NamespacedKey KEY = SWUtils.getNamespaceKey("command");
|
||||
|
||||
public BindCommand() {
|
||||
super("bind");
|
||||
}
|
||||
|
||||
@Register(description = "OTHER_BIND_HELP")
|
||||
public void bind(Player player, @Mapper("command") @ErrorMessage("OTHER_BIND_ERROR") String... command) {
|
||||
bindInternal(player, command);
|
||||
}
|
||||
|
||||
private static void bindInternal(Player player, String... command) {
|
||||
ItemStack item = player.getInventory().getItemInMainHand();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta == null) {
|
||||
BauSystem.MESSAGE.send("OTHER_BIND_UNBINDABLE", player);
|
||||
return;
|
||||
}
|
||||
|
||||
if (command.length != 0) {
|
||||
String commandText = String.join(" ", command);
|
||||
meta.getPersistentDataContainer().set(KEY, PersistentDataType.STRING, commandText);
|
||||
meta.setLore(Collections.singletonList(BauSystem.MESSAGE.parse("OTHER_BIND_LORE", player, commandText)));
|
||||
BauSystem.MESSAGE.send("OTHER_BIND_MESSAGE_BIND", player, commandText);
|
||||
} else {
|
||||
meta.getPersistentDataContainer().remove(KEY);
|
||||
meta.setLore(Collections.emptyList());
|
||||
BauSystem.MESSAGE.send("OTHER_BIND_MESSAGE_UNBIND", player);
|
||||
}
|
||||
item.setItemMeta(meta);
|
||||
player.getInventory().setItemInMainHand(item);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (!event.hasItem()) return;
|
||||
ItemStack itemStack = event.getItem();
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
if (meta == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
String command = meta.getPersistentDataContainer().get(KEY, PersistentDataType.STRING);
|
||||
if (command == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
PlayerCommandPreprocessEvent playerCommandPreprocessEvent = new PlayerCommandPreprocessEvent(event.getPlayer(), "/" + command);
|
||||
Bukkit.getPluginManager().callEvent(playerCommandPreprocessEvent);
|
||||
if (playerCommandPreprocessEvent.isCancelled()) return;
|
||||
Bukkit.getServer().dispatchCommand(event.getPlayer(), command);
|
||||
}, 1);
|
||||
}
|
||||
|
||||
@Mapper(value = "command", local = true)
|
||||
public TypeMapper<String> getCommandMapper() {
|
||||
return new TypeMapper<String>() {
|
||||
@Override
|
||||
public String map(CommandSender sender, PreviousArguments previousArguments, String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
||||
if (previousArguments.mappedArgs.length == 0) return null;
|
||||
Object[] args = (Object[]) previousArguments.mappedArgs[previousArguments.mappedArgs.length - 1];
|
||||
List<String> tabCompletes;
|
||||
if (args.length == 0) {
|
||||
tabCompletes = commandMap.tabComplete(sender, "");
|
||||
} else {
|
||||
tabCompletes = commandMap.tabComplete(sender, Arrays.stream(args).map(Objects::toString).collect(Collectors.joining(" ")) + " ");
|
||||
}
|
||||
if (tabCompletes == null) return null;
|
||||
if (args.length == 0) {
|
||||
tabCompletes = tabCompletes.stream()
|
||||
.map(t -> t.substring(1))
|
||||
.filter(t -> !t.equals("bind"))
|
||||
.collect(Collectors.toList());
|
||||
tabCompletes.addAll(ScriptRunner.getCommandsOfPlayer((Player) sender));
|
||||
return tabCompletes.stream()
|
||||
.filter(t -> !t.contains(":"))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return tabCompletes;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
package de.steamwar.bausystem.features.util;
|
||||
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.command.PreviousArguments;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.command.TypeMapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class ItemBindCommand extends SWCommand {
|
||||
|
||||
private static final CommandMap commandMap;
|
||||
|
||||
static {
|
||||
Field knownCommandsField;
|
||||
try {
|
||||
knownCommandsField = Bukkit.getServer().getClass().getDeclaredField("commandMap");
|
||||
knownCommandsField.setAccessible(true);
|
||||
commandMap = (CommandMap)knownCommandsField.get(Bukkit.getServer());
|
||||
} catch (IllegalAccessException | NoSuchFieldException var2) {
|
||||
Bukkit.shutdown();
|
||||
throw new SecurityException("Oh shit. Commands cannot be registered.", var2);
|
||||
}
|
||||
}
|
||||
|
||||
private static final NamespacedKey KEY = SWUtils.getNamespaceKey("command");
|
||||
|
||||
public ItemBindCommand() {
|
||||
super("bind");
|
||||
}
|
||||
|
||||
@Register // TODO: Description
|
||||
public void bind(Player player, @Mapper("command") /* TODO @ErrorMessage("...") */ String... command) {
|
||||
player.sendMessage(command);
|
||||
|
||||
ItemStack item = player.getInventory().getItemInMainHand();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
|
||||
meta.getPersistentDataContainer().set(KEY, PersistentDataType.STRING, "");
|
||||
}
|
||||
|
||||
@Mapper(value = "command", local = true)
|
||||
public TypeMapper<String> getCommandMapper() {
|
||||
return new TypeMapper<String>() {
|
||||
@Override
|
||||
public String map(CommandSender sender, PreviousArguments previousArguments, String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
||||
if (previousArguments.mappedArgs.length == 0) return null;
|
||||
Object[] args = (Object[]) previousArguments.mappedArgs[previousArguments.mappedArgs.length - 1];
|
||||
List<String> tabCompletes;
|
||||
if (args.length == 0) {
|
||||
tabCompletes = commandMap.tabComplete(sender, "");
|
||||
} else {
|
||||
tabCompletes = commandMap.tabComplete(sender, Arrays.stream(args).map(Objects::toString).collect(Collectors.joining(" ")) + " ");
|
||||
}
|
||||
if (tabCompletes == null) return null;
|
||||
if (args.length == 0) {
|
||||
return tabCompletes.stream()
|
||||
.map(t -> t.substring(1))
|
||||
.filter(t -> !t.contains(":"))
|
||||
.filter(t -> !t.equals("bind"))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
return tabCompletes;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
In neuem Issue referenzieren
Einen Benutzer sperren