CustomCommandListener on steroids
Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
649a25166f
Commit
78ad3cf7a3
@ -19,9 +19,12 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.script;
|
package de.steamwar.bausystem.features.script;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.script.variables.Value;
|
||||||
import de.steamwar.bausystem.linkage.LinkageType;
|
import de.steamwar.bausystem.linkage.LinkageType;
|
||||||
import de.steamwar.bausystem.linkage.Linked;
|
import de.steamwar.bausystem.linkage.Linked;
|
||||||
import de.steamwar.core.VersionedCallable;
|
import de.steamwar.core.VersionedCallable;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@ -32,13 +35,44 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Linked(LinkageType.LISTENER)
|
@Linked(LinkageType.LISTENER)
|
||||||
public class CustomCommandListener implements Listener {
|
public class CustomCommandListener implements Listener {
|
||||||
|
|
||||||
private Map<Player, Map<String, BookMeta>> playerMap = new HashMap<>();
|
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
private static class CustomCommand {
|
||||||
|
private final BookMeta bookMeta;
|
||||||
|
private final String[] args;
|
||||||
|
|
||||||
|
public boolean execute(PlayerCommandPreprocessEvent e) {
|
||||||
|
String[] command = e.getMessage().split(" ");
|
||||||
|
if (args.length != command.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!args[0].equals(command[0])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Value> arguments = new HashMap<>();
|
||||||
|
for (int i = 1; i < args.length; i++) {
|
||||||
|
String current = args[i];
|
||||||
|
if (current.startsWith("<") && current.endsWith(">")) {
|
||||||
|
arguments.put(current.substring(1, current.length() - 1), new Value.StringValue(command[i]));
|
||||||
|
} else {
|
||||||
|
if (!current.equals(command[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.setCancelled(true);
|
||||||
|
new ScriptExecutor(bookMeta, e.getPlayer(), arguments);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Player, List<CustomCommand>> playerMap = new HashMap<>();
|
||||||
|
|
||||||
private void updateInventory(Player p) {
|
private void updateInventory(Player p) {
|
||||||
playerMap.remove(p);
|
playerMap.remove(p);
|
||||||
@ -55,10 +89,10 @@ public class CustomCommandListener implements Listener {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String s = bookMeta.getPage(1).split("\n")[0];
|
String s = bookMeta.getPage(1).split("\n")[0];
|
||||||
if (!s.startsWith("#!CMD ")) {
|
if (!s.startsWith("#!CMD /")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
playerMap.computeIfAbsent(p, player -> new HashMap<>()).put(s.substring(6), bookMeta);
|
playerMap.computeIfAbsent(p, player -> new ArrayList<>()).add(new CustomCommand(bookMeta, s.substring(6).split(" ")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,10 +120,16 @@ public class CustomCommandListener implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, BookMeta> bookMetaMap = playerMap.get(e.getPlayer());
|
List<CustomCommand> customCommands = playerMap.get(e.getPlayer());
|
||||||
if (bookMetaMap == null) {
|
if (customCommands == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
customCommands.stream().map(customCommand -> customCommand.execute(e)).filter(b -> !b).findFirst();
|
||||||
|
|
||||||
|
|
||||||
|
/*String[] command = e.getMessage().split(" ");
|
||||||
|
|
||||||
BookMeta bookMeta = bookMetaMap.get(e.getMessage());
|
BookMeta bookMeta = bookMetaMap.get(e.getMessage());
|
||||||
if (bookMeta == null) {
|
if (bookMeta == null) {
|
||||||
return;
|
return;
|
||||||
@ -99,7 +139,7 @@ public class CustomCommandListener implements Listener {
|
|||||||
new ScriptExecutor(bookMeta, e.getPlayer());
|
new ScriptExecutor(bookMeta, e.getPlayer());
|
||||||
} catch (StackOverflowError exception) {
|
} catch (StackOverflowError exception) {
|
||||||
// Ignored
|
// Ignored
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isNoBook(ItemStack item) {
|
private boolean isNoBook(ItemStack item) {
|
||||||
|
@ -39,6 +39,10 @@ public final class ScriptExecutor {
|
|||||||
private int index = 0;
|
private int index = 0;
|
||||||
|
|
||||||
public ScriptExecutor(BookMeta bookMeta, Player player) {
|
public ScriptExecutor(BookMeta bookMeta, Player player) {
|
||||||
|
this(bookMeta, player, new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScriptExecutor(BookMeta bookMeta, Player player, Map<String, Value> localVariables) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
globalVariables = ScriptListener.getGlobalContext(player);
|
globalVariables = ScriptListener.getGlobalContext(player);
|
||||||
|
|
||||||
@ -62,6 +66,7 @@ public final class ScriptExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (commands.isEmpty()) return;
|
if (commands.isEmpty()) return;
|
||||||
|
localVariables.forEach(this.localVariables::putValue);
|
||||||
resume();
|
resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ import org.bukkit.event.player.PlayerInteractEvent;
|
|||||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.util.BoundingBox;
|
import org.bukkit.util.BoundingBox;
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren