From 767b743d78cd0e1e4d14d3803fbb5781076e8cdf Mon Sep 17 00:00:00 2001 From: Butzlabben Date: Tue, 4 Feb 2020 23:01:00 +0100 Subject: [PATCH] Fixed WorldEditListener issues --- pom.xml | 10 ++--- .../world/listener/WorldEditListener.java | 45 ++++++++++++++----- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 47c6f3c..9f8b8ed 100644 --- a/pom.xml +++ b/pom.xml @@ -144,12 +144,12 @@ AsyncWorld is not in the api so I have to use a local file Issue: https://github.com/boy0001/FastAsyncWorldedit/issues/1060 --> - - com.boydti - fawe-bukkit - - 19.11.13-5505943-1282-22.3.5 + com.sk98q.worldedit + FastAsnycWorldEdit + system + 1.0 + ${pom.basedir}/lib/FastAsyncWorldEdit.jar diff --git a/src/main/java/de/butzlabben/world/listener/WorldEditListener.java b/src/main/java/de/butzlabben/world/listener/WorldEditListener.java index 1b1c08f..10900ee 100644 --- a/src/main/java/de/butzlabben/world/listener/WorldEditListener.java +++ b/src/main/java/de/butzlabben/world/listener/WorldEditListener.java @@ -1,18 +1,48 @@ package de.butzlabben.world.listener; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; import de.butzlabben.world.config.MessageConfig; import de.butzlabben.world.config.WorldConfig; import de.butzlabben.world.config.WorldPerm; import de.butzlabben.world.wrapper.WorldPlayer; import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.SimpleCommandMap; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + public class WorldEditListener implements Listener { + private final List worldEditCommands= new ArrayList<>(); + + public WorldEditListener() { + try { + String packageName = Bukkit.getServer().getClass().getPackage().getName(); + String version = packageName.substring(packageName.lastIndexOf(".") + 1); + Class serverClass = Class.forName("org.bukkit.craftbukkit." + version + ".CraftServer"); + + Field f1 = serverClass.getDeclaredField("commandMap"); + f1.setAccessible(true); + SimpleCommandMap commandMap = (SimpleCommandMap) f1.get(Bukkit.getServer()); + + Field f2 = SimpleCommandMap.class.getDeclaredField("knownCommands"); + f2.setAccessible(true); + @SuppressWarnings({"unchecked", "rawtypes"}) + Map knownCommands = (Map) f2.get(commandMap); + worldEditCommands.addAll(knownCommands.entrySet().stream().filter(entry -> entry.getKey().contains("worldedit")) + .map(entry -> entry.getValue().getName()).collect(Collectors.toList())); + } catch (Exception e) { + e.printStackTrace(); + } + } + @EventHandler public void playerCommandHandler(PlayerCommandPreprocessEvent event) { String command = event.getMessage().split(" ")[0]; @@ -33,14 +63,9 @@ public class WorldEditListener implements Listener { } private boolean isWorldEditCommand(String command) { - WorldEditPlugin plugin = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); - // WorldEdit plugin not foung - if (plugin == null) - return false; - if (command.startsWith("/")) { - command = command.replaceFirst("/", ""); - } - - return plugin.getCommand(command) != null; + System.out.println(command); + return worldEditCommands.contains(command) + || worldEditCommands.contains(command.replaceFirst("/", "")) + || worldEditCommands.contains(command.replaceFirst("/worldedit:", "")); } }