ObserverControl.java v1.0
通过命令开关控制全服务器所有侦测器(observer)的红石触发功能,兼容paper/leaves 1.21.4
命令列表
- observer管理全服observer侦测器红石信号开/关
package cn.leaves.observercontrol;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
/**
* @pluginName ObserverControl
* @author ScriptIrc Engine
* @version 1.0
* @description 通过命令开关控制全服务器所有侦测器(observer)的红石触发功能,兼容paper/leaves 1.21.4
* [command]observer|管理全服observer侦测器红石信号开/关[/command]
* [Permission]observercontrol.admin|允许切换observer侦测器红石[/Permission]
*/
public class ObserverControlPlugin extends JavaPlugin implements Listener {
// 配置文件名
private static final String CONFIG_FILE = "observer_control.yml";
// observer 开关状态
private boolean observerEnabled = true;
@Override
public void onEnable() {
// 注册事件监听
getServer().getPluginManager().registerEvents(this, this);
// 加载配置
loadConfig();
getLogger().info("ObserverControl 已启用,当前observer状态: " + (observerEnabled ? "开启" : "关闭"));
}
@Override
public void onDisable() {
// 插件关闭保存配置
saveConfigFile();
getLogger().info("ObserverControl 已关闭。");
}
// 命令处理:/observer <true|false>
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equalsIgnoreCase("observer")) {
if (!sender.hasPermission("observercontrol.admin")) {
sender.sendMessage("§c无权限!");
return true;
}
if (args.length != 1) {
sender.sendMessage("§e用法: /observer <true|false>");
return true;
}
if ("true".equalsIgnoreCase(args[0])) {
observerEnabled = true;
saveConfigFile();
Bukkit.broadcastMessage("§a[ObserverControl] 所有observer侦测器已开启!");
} else if ("false".equalsIgnoreCase(args[0])) {
observerEnabled = false;
saveConfigFile();
Bukkit.broadcastMessage("§c[ObserverControl] 所有observer侦测器已关闭!");
} else {
sender.sendMessage("§e用法: /observer <true|false>");
}
return true;
}
return false;
}
// 拦截红石输出事件:observer开关关闭时阻止信号
@EventHandler
public void onRedstone(BlockRedstoneEvent event) {
Block block = event.getBlock();
if (block.getType() == Material.OBSERVER && !observerEnabled) {
// 阻止红石信号输出
event.setNewCurrent(0);
}
}
// 拦截observer方块物理更新(触发检测)
@EventHandler
public void onPhysics(BlockPhysicsEvent event) {
if (event.getBlock().getType() == Material.OBSERVER && !observerEnabled) {
// 阻止物理事件,以不响应环境变化
event.setCancelled(true);
}
}
// 加载配置(observer开关状态)
private void loadConfig() {
File file = new File(getDataFolder(), CONFIG_FILE);
if (!file.exists()) {
// 如无配置则生成默认
observerEnabled = true;
saveConfigFile();
return;
}
FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
observerEnabled = cfg.getBoolean("observer-enabled", true);
}
// 保存配置(observer开关状态)
private void saveConfigFile() {
File file = new File(getDataFolder(), CONFIG_FILE);
FileConfiguration cfg = new YamlConfiguration();
cfg.set("observer-enabled", observerEnabled);
try {
cfg.save(file);
} catch (IOException ex) {
getLogger().warning("保存observer控制配置失败:" + ex.getMessage());
}
}
}