WorldSystem/src/main/java/de/butzlabben/world/listener/WorldEditListener.java

72 lines
2.9 KiB
Java

package de.butzlabben.world.listener;
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<String> 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<String, Command> 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];
if (!isWorldEditCommand(command)) {
return;
}
Player p = event.getPlayer();
String worldname = p.getWorld().getName();
WorldPlayer wp = new WorldPlayer(p, worldname);
if (wp.isOnSystemWorld() &&
!wp.isOwnerofWorld() && !p.hasPermission(WorldPerm.WORLDEDIT.getOpPerm())) {
WorldConfig wc = WorldConfig.getWorldConfig(p.getWorld().getName());
if (!wc.hasPermission(p.getUniqueId(), WorldPerm.WORLDEDIT)) {
p.sendMessage(MessageConfig.getNoPermission());
event.setCancelled(true);
}
}
}
private boolean isWorldEditCommand(String command) {
System.out.println(command);
return worldEditCommands.contains(command)
|| worldEditCommands.contains(command.replaceFirst("/", ""))
|| worldEditCommands.contains(command.replaceFirst("/worldedit:", ""));
}
}