FirstJoinCommand

FirstJoinCommand.java v1.0
首次进服执行配置指令,管理员可用/testfirstjoincmd测试,指令可配置。
作者: Scriptirc

命令列表

  • testfirstjoincmd管理员测试首次进服指令

权限列表

  • firstjoincmd.admin允许手动测试首次进服指令
package site.scriptirc.firstjoincmd;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
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.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @pluginName FirstJoinCommand
 * @author Scriptirc
 * @version 1.0
 * @description 首次进服执行配置指令,管理员可用/testfirstjoincmd测试,指令可配置。
 * [command]testfirstjoincmd|管理员测试首次进服指令[/command]
 * [Permission]firstjoincmd.admin|允许手动测试首次进服指令[/Permission]
 */
public class FirstJoinCommandPlugin extends JavaPlugin implements Listener {
    private File configFile;
    private YamlConfiguration config;
    private static final String COMMANDS_KEY = "first-join-commands";

    @Override
    public void onEnable() {
        // 注册事件监听器
        Bukkit.getPluginManager().registerEvents(this, this);
        // 加载或创建配置文件
        loadConfig();
        getLogger().info("FirstJoinCommand 插件已启用。");
    }

    @Override
    public void onDisable() {
        getLogger().info("FirstJoinCommand 插件已关闭。");
    }

    // 监听玩家加入事件,判断是否首次进服
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        if (!player.hasPlayedBefore()) {
            // 首次进服,执行配置指令
            executeConfiguredCommands(player);
        }
    }

    // 管理员测试命令
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("testfirstjoincmd")) {
            if (!sender.hasPermission("firstjoincmd.admin")) {
                sender.sendMessage("§c你没有权限执行此命令。");
                return true;
            }
            if (args.length == 0) {
                if (sender instanceof Player) {
                    executeConfiguredCommands((Player) sender);
                    sender.sendMessage("§a已为你执行首次进服配置指令(测试模式)。");
                } else {
                    sender.sendMessage("§c控制台请指定玩家名:/testfirstjoincmd <玩家名>");
                }
                return true;
            } else {
                Player target = Bukkit.getPlayerExact(args[0]);
                if (target != null && target.isOnline()) {
                    executeConfiguredCommands(target);
                    sender.sendMessage("§a已为玩家 " + target.getName() + " 执行首次进服配置指令(测试模式)。");
                } else {
                    sender.sendMessage("§c未找到该玩家。");
                }
                return true;
            }
        }
        return false;
    }

    // 执行配置文件中的指令(以控制台身份)
    private void executeConfiguredCommands(Player player) {
        List<String> commands = config.getStringList(COMMANDS_KEY);
        for (String cmd : commands) {
            // 支持变量替换:{player}为玩家名
            String parsed = cmd.replace("{player}", player.getName());
            Bukkit.dispatchCommand(Bukkit.getConsoleSender(), parsed);
        }
    }

    // 加载或创建配置文件
    private void loadConfig() {
        configFile = new File(getDataFolder(), "commands.yml");
        if (!configFile.exists()) {
            // 首次生成配置文件,写入默认内容
            configFile.getParentFile().mkdirs();
            config = new YamlConfiguration();
            config.set(COMMANDS_KEY, java.util.Arrays.asList(
                    "say 欢迎 {player} 加入服务器!",
                    "give {player} minecraft:bread 5"
            ));
            try {
                config.save(configFile);
            } catch (IOException e) {
                getLogger().warning("无法保存默认配置文件:" + e.getMessage());
            }
        } else {
            config = YamlConfiguration.loadConfiguration(configFile);
        }
    }
}

上一篇: IgnoreChat下一篇: WordFireworkShow

举报内容

意见反馈