* You can access instances of other modules by depending on Core in your pom.xml, and then executing Core.get */ -@PluginInfo(name = "Core", version = "2.8.3", depend = {"ProtocolLib"}, softdepend = {"ViaVersion"}) +@PluginInfo(name = "Core", version = "2.8.4", depend = {"ProtocolLib"}, softdepend = {"ViaVersion"}) public class Core extends JavaPlugin { @Getter private URLClassLoader coreClassLoader; @Getter private static Core instance; @@ -201,6 +202,8 @@ public void onPacketSending(PacketEvent event) { registerDisabledCommands(); // Log logMessage("Core", ChatColor.DARK_GREEN + "Enabled"); + // Command Listener + new CommandListener(this); runTask(this, () -> mongoHandler.setServerOnline(getInstanceName(), getServerType(), playground, true)); @@ -244,6 +247,7 @@ private void registerCommands() { registerCommand(new FlyCommand()); registerCommand(new HelpopCommand()); registerCommand(new HonorCommand()); + registerCommand(new KillCommand()); registerCommand(new ListCommand()); registerCommand(new LockArmorStandCommand()); registerCommand(new MsgCommand()); diff --git a/src/main/java/network/palace/core/commands/HelpopCommand.java b/src/main/java/network/palace/core/commands/HelpopCommand.java index 9f08711..35a33bf 100644 --- a/src/main/java/network/palace/core/commands/HelpopCommand.java +++ b/src/main/java/network/palace/core/commands/HelpopCommand.java @@ -66,7 +66,7 @@ protected void handleCommand(CPlayer player, String[] args) throws CommandExcept } private void message(String sender, String message) { - String msg = ChatColor.DARK_RED + "[CM CHAT] " + ChatColor.GRAY + sender + ": " + ChatColor.WHITE + + String msg = ChatColor.DARK_PURPLE + "[CM CHAT] " + ChatColor.GRAY + sender + ": " + ChatColor.WHITE + ChatColor.translateAlternateColorCodes('&', message); for (CPlayer tp : Core.getPlayerManager().getOnlinePlayers()) { if (tp.getRank().getRankId() >= Rank.TRAINEE.getRankId()) { diff --git a/src/main/java/network/palace/core/commands/KillCommand.java b/src/main/java/network/palace/core/commands/KillCommand.java new file mode 100644 index 0000000..d1cc07e --- /dev/null +++ b/src/main/java/network/palace/core/commands/KillCommand.java @@ -0,0 +1,37 @@ +package network.palace.core.commands; + +import network.palace.core.command.CommandException; +import network.palace.core.command.CommandMeta; +import network.palace.core.command.CoreCommand; +import network.palace.core.player.CPlayer; +import network.palace.core.player.Rank; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.ChatColor; + +/** + * @author Tourist457 + * @since 4/25/2021 + */ + +@CommandMeta(description = "Kill entities safely", rank = Rank.CM) +public class KillCommand extends CoreCommand { + + public KillCommand() { + super("kill"); + } + + @Override + protected void handleCommand(ConsoleCommandSender sender, String[] args) throws CommandException { + sender.sendMessage(ChatColor.RED + "You cannot kill entities in console!"); + } + + @Override + protected void handleCommand(CPlayer sender, String[] args) throws CommandException { + String command = String.join(" ", args); + if (!command.matches(".*r=[1-9].*")) { + sender.sendMessage(ChatColor.RED + "You cannot kill entities without a radius!"); + return; + } + sender.performCommand("minecraft:kill " + command); + } +} \ No newline at end of file diff --git a/src/main/java/network/palace/core/events/CommandListener.java b/src/main/java/network/palace/core/events/CommandListener.java new file mode 100644 index 0000000..ce61cf8 --- /dev/null +++ b/src/main/java/network/palace/core/events/CommandListener.java @@ -0,0 +1,61 @@ +package network.palace.core.events; + +import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.block.Block; +import org.bukkit.block.CommandBlock; +import org.bukkit.Bukkit; + + +public class CommandListener implements Listener { + JavaPlugin plugin; + + public CommandListener(JavaPlugin plugin) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + this.plugin = plugin; + } + + @EventHandler + public void preProcessCommand(PlayerCommandPreprocessEvent event) { + if (event.getMessage().toLowerCase().startsWith("/minecraft:kill")) { + if (!event.getMessage().matches(".*r=[1-9].*")) { + event.setCancelled(true); + event.getPlayer().sendMessage("§cYou cannot kill entities without a radius!"); + } + } + } + + @EventHandler + public void redstoneChanges(BlockRedstoneEvent e){ + Block block = e.getBlock(); + if(e.getOldCurrent() > 0 || e.getNewCurrent() == 0) return; + if (!(block.getState() instanceof CommandBlock)) return; + + CommandBlock cb = (CommandBlock)block.getState(); + try { + String[] args = cb.getCommand().split(" "); + if (args[0].toLowerCase().equals("minecraft:kill") && !cb.getCommand().matches(".*r=[1-9].*")) { + setCommandBlock(cb, "", String.join(" ", args)); + return; + } + + if (!args[0].toLowerCase().equals("kill")) return; + + String cmd = cb.getCommand().matches(".*r=[1-9].*") ? "minecraft:" + cb.getCommand() : ""; + setCommandBlock(cb, cmd, String.join(" ", args)); + } catch (Exception ignored) { } + } + + public void setCommandBlock(CommandBlock cb, String command, String oldCommand) { + cb.setCommand(command); + cb.update(); + + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + cb.setCommand(String.join(" ", oldCommand)); + cb.update(); + }, 5L); + }} +