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