• 周年纪念勋章活动已圆满结束,如有已购买但仍未申请的用户,可以通过对应勋章的下载链接申请~
资源图标

原创 开源 前置/API [TianGenderApi][1.16+]开源的性别相关前置 1.0

版权类型
原创
插件中文名称
[天系列]性别前置
插件英文名称
TianGenderApi
原帖地址
#
支持的核心(服务端)
  1. Spigot
  2. Paper
语言支持
中文(简体)
前置组件
本插件为前置插件,具有实际功能但实际功能较为简陋。
适配版本(Java)
  1. 1.21
  2. 1.20
  3. 1.19
  4. 1.18
  5. 1.17
  6. 1.16
作为即将发布的结婚插件和恋爱插件的前置,开发者也可以使用作为依赖。
预计开源于Gitee,暂时直接在这里显示主类代码,已经启用Bstats,请使用作为前置的开发者尽量保留。
下面的代码具有注释,可读性较强。部分代码逻辑参考已有插件开源代码,但不涉及抄袭,借鉴,仅仅作为思路的延伸,完全原创。
Java:
package com.tianhai.plugins;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
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.util.HashMap;
import java.util.UUID;

/**
 * TianGenderPlugin 是一个用于管理玩家性别的Spigot插件。
 * 允许玩家设置和更改性别,并提供了相应的命令和事件处理功能。
 */
public class TianGenderApi extends JavaPlugin implements Listener {

    private FileConfiguration config;
    private File playerDataFile;
    private HashMap<UUID, GenderData> playerGenderData = new HashMap<>();

    @Override
    public void onEnable() {
        int pluginId = 22452; // <-- Replace with the id of your plugin!
        Metrics metrics = new Metrics(this, pluginId);

        // Optional: Add custom charts
        metrics.addCustomChart(new Metrics.SimplePie("chart_id", () -> "My value"));
        // 注册事件和命令
        getServer().getPluginManager().registerEvents(this, this);
        getCommand("tiangender").setExecutor(this);

        // 加载配置文件
        config = getConfig();
        config.options().copyDefaults(true);
        saveConfig();

        // 加载玩家性别数据文件
        playerDataFile = new File(getDataFolder(), "players.yml");
        if (!playerDataFile.exists()) {
            saveResource("players.yml", false);
        }

        // 加载玩家性别数据
        loadPlayerData();
        System.out.println("§a>>>>>>>>>>>>>>>>>>§bTianGenderApi§a<<<<<<<<<<<<<<<<<");
        System.out.println("§bTianGenderApi §e" + this.getDescription().getVersion() + " §6 enabled!");
        System.out.println("§c作者:TianHai! qq:2908928374");
        System.out.println("§e QQ插件交流群:937099832");
        System.out.println("§a>>>>>>>>>>>>>>>>>>§bTianGenderApi§a<<<<<<<<<<<<<<<<<");
    }

    @Override
    public void onDisable() {
        // 保存玩家性别数据
        savePlayerData();
        System.out.println("§a>>>>>>>>>>>>>>>>>>§bTianGenderApi§a<<<<<<<<<<<<<<<<<");
        System.out.println("§bTianGenderApi §e" + this.getDescription().getVersion() + " §6 disabled!");
        System.out.println("§c作者:TianHai! qq:2908928374");
        System.out.println("§e QQ插件交流群:937099832");
        System.out.println("§a>>>>>>>>>>>>>>>>>>§bTianGenderApi§a<<<<<<<<<<<<<<<<<");
        // Clean up if needed
    }

    /**
     * 玩家加入游戏事件处理,检查是否需要发送性别确认提醒。
     * @param event 玩家加入事件
     */
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        if (!playerGenderData.containsKey(player.getUniqueId())) {
            if (config.getBoolean("settings.send-gender-reminder")) {
                player.sendMessage(config.getString("messages.gender-reminder"));
            }
        }
    }

    /**
     * 插件主命令处理器,处理tiangender命令及其子命令。
     * @param sender 命令发送者
     * @param command 命令对象
     * @param label 命令标签
     * @param args 命令参数
     * @return 命令是否执行成功
     */
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("tiangender")) {
            if (args.length < 1) {
                // 显示帮助
                sender.sendMessage(config.getStringList("messages.help").toArray(new String[0]));
                return true;
            }

            // 处理各个子命令
            if (args[0].equalsIgnoreCase("set")) {
                // tiangender set <player> <boy/girl/secret>
                if (args.length != 3) {
                    sender.sendMessage("用法: /tiangender set <player> <boy/girl/secret>");
                    return true;
                }
                String playerName = args[1];
                String gender = args[2];
                setPlayerGender(sender, playerName, gender);
                return true;
            } else if (args[0].equalsIgnoreCase("change")) {
                // tiangender change <boy/girl/secret>
                if (!(sender instanceof Player)) {
                    sender.sendMessage("只有玩家可以执行此命令.");
                    return true;
                }
                Player player = (Player) sender;
                String gender = args[1];
                changePlayerGender(player, gender);
                return true;
            } else if (args[0].equalsIgnoreCase("reload")) {
                // tiangender reload
                if (!sender.hasPermission("tiangender.reload")) {
                    sender.sendMessage("您没有权限执行此命令.");
                    return true;
                }
                reloadConfig();
                config = getConfig();
                sender.sendMessage("配置文件已重新加载.");
                return true;
            } else {
                // 未知命令
                sender.sendMessage("未知的命令. 使用 /tiangender 帮助 查看帮助.");
                return true;
            }
        }
        return false;
    }

    /**
     * 设置玩家的性别。
     * @param sender 命令发送者
     * @param playerName 玩家名
     * @param gender 性别
     */
    private void setPlayerGender(CommandSender sender, String playerName, String gender) {
        Player targetPlayer = getServer().getPlayer(playerName);
        if (targetPlayer == null) {
            sender.sendMessage("玩家 " + playerName + " 不在线或不存在.");
            return;
        }

        // 检查性别是否有效
        if (!isValidGender(gender)) {
            sender.sendMessage("无效的性别设置,请输入 boy/girl/secret.");
            return;
        }

        // 更新玩家性别数据
        UUID playerId = targetPlayer.getUniqueId();
        playerGenderData.put(playerId, new GenderData(gender, System.currentTimeMillis()));

        // 更新配置文件
        config.set("players." + playerId + ".gender", gender);
        config.set("players." + playerId + ".lastModified", System.currentTimeMillis());
        saveConfig();

        // 发送成功消息
        sender.sendMessage(config.getString("messages.set-success")
                .replace("%player%", playerName)
                .replace("%gender%", gender));
    }

    /**
     * 更改玩家自身的性别。
     * @param player 执行更改性别的玩家
     * @param gender 新性别
     */
    private void changePlayerGender(Player player, String gender) {
        UUID playerId = player.getUniqueId();

        // 检查是否在冷却中
        long cooldownMinutes = config.getInt("settings.cooldown-minutes");
        long lastModified = playerGenderData.getOrDefault(playerId, new GenderData("", 0)).getLastModified();
        long cooldownMillis = cooldownMinutes * 60 * 1000; // 转换为毫秒
        long currentTime = System.currentTimeMillis();
        if (currentTime - lastModified < cooldownMillis) {
            long remainingTime = (lastModified + cooldownMillis - currentTime) / 1000;
            player.sendMessage(config.getString("messages.cooldown-message")
                    .replace("%cooldown%", String.valueOf(remainingTime)));
            return;
        }

        // 检查性别是否有效
        if (!isValidGender(gender)) {
            player.sendMessage("无效的性别设置,请输入 boy/girl/secret.");
            return;
        }

        // 更新玩家性别数据
        playerGenderData.put(playerId, new GenderData(gender, System.currentTimeMillis()));

        // 更新配置文件
        config.set("players." + playerId + ".gender", gender);
        config.set("players." + playerId + ".lastModified", System.currentTimeMillis());
        saveConfig();

        // 发送成功消息
        player.sendMessage(config.getString("messages.change-success").replace("%gender%", gender));
    }

    /**
     * 加载玩家的性别数据到内存中。
     */
    private void loadPlayerData() {
        if (config.contains("players")) {
            for (String playerIdStr : config.getConfigurationSection("players").getKeys(false)) {
                try {
                    UUID playerId = UUID.fromString(playerIdStr);
                    String gender = config.getString("players." + playerId + ".gender");
                    long lastModified = config.getLong("players." + playerId + ".lastModified");
                    playerGenderData.put(playerId, new GenderData(gender, lastModified));
                } catch (IllegalArgumentException e) {
                    getLogger().warning("无效的玩家UUID:" + playerIdStr);
                }
            }
        }
    }

    /**
     * 保存玩家性别数据到配置文件。
     */
    private void savePlayerData() {
        for (UUID playerId : playerGenderData.keySet()) {
            config.set("players." + playerId + ".gender", playerGenderData.get(playerId).getGender());
            config.set("players." + playerId + ".lastModified", playerGenderData.get(playerId).getLastModified());
        }
        saveConfig();
    }

    /**
     * 检查性别是否有效。
     * @param gender 要检查的性别字符串
     * @return 是否有效
     */
    private boolean isValidGender(String gender) {
        return gender.equalsIgnoreCase("boy") || gender.equalsIgnoreCase("girl") || gender.equalsIgnoreCase("secret");
    }

    /**
     * 内部类,用于存储玩家性别信息。
     */
    private static class GenderData {
        private String gender;
        private long lastModified;

        /**
         * 构造一个新的 GenderData 对象。
         * @param gender 性别
         * @param lastModified 最后修改时间
         */
        GenderData(String gender, long lastModified) {
            this.gender = gender;
            this.lastModified = lastModified;
        }

        /**
         * 获取性别。
         * @return 性别
         */
        String getGender() {
            return gender;
        }

        /**
         * 获取最后修改时间。
         * @return 最后修改时间
         */
        long getLastModified() {
            return lastModified;
        }
    }
}
作者
TianHai天海
下载
305
查看
420
首次发布
最后更新

评分

0.00 星 0 次评分
后退
顶部 底部