ObserverControl

ObserverControl.java v1.0
通过命令开关控制全服务器所有侦测器(observer)的红石触发功能,兼容paper/leaves 1.21.4
作者: ScriptIrc Engine

命令列表

  • observer管理全服observer侦测器红石信号开/关

权限列表

  • observercontrol.admin允许切换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());
        }
    }
}
上一篇: ShulkerBoxDuplicate下一篇: FishingGun

举报内容

意见反馈