Skip to content

Commit

Permalink
version 1.4, resolve #2
Browse files Browse the repository at this point in the history
- id -> 玩家名
减少注释
  • Loading branch information
wling-art committed Jan 20, 2025
1 parent 5b14cc6 commit 2075ffe
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 66 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.example.playeridcounter</groupId>
<artifactId>player-id-counter</artifactId>
<version>1.3</version>
<version>1.4</version>
<packaging>jar</packaging>

<name>player-id-counter</name>
Expand Down
115 changes: 51 additions & 64 deletions src/main/java/com/example/playeridcounter/PlayerIDCounter.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,136 +14,111 @@

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

public class PlayerIDCounter extends JavaPlugin implements Listener {

// 单例实例,方便外部访问插件方法
private static PlayerIDCounter instance;

// 玩家数据文件和语言文件配置对象
private File playersFile;
private FileConfiguration playersConfig;
private FileConfiguration langConfig;

// 映射表
private HashMap<UUID, Integer> playerIds;
private ConcurrentHashMap<UUID, Integer> playerIds;

// 可分配ID
private int nextId;

// 根据UUID获取玩家ID
public static int getPlayerId(UUID uuid) {
return instance.playerIds.getOrDefault(uuid, -1); // 如果未找到返回-1
return instance.playerIds.getOrDefault(uuid, -1); // 获取玩家ID
}

// 从语言配置文件中获取翻译文本
public static String getLang(String key) {
return ChatColor.translateAlternateColorCodes('&', instance.langConfig.getString(key, key));
return ChatColor.translateAlternateColorCodes('&', instance.langConfig.getString(key, key)); // 获取语言配置
}

@Override
public void onEnable() {
// 设置单例实例
instance = this;

initFiles();
initFiles(); // 初始化文件

// 初始化玩家ID映射表和下一个ID
this.playerIds = new HashMap<>();
this.nextId = playersConfig.getInt("next-id", 1); // 从配置文件读取下一个ID,默认值为1
this.playerIds = new ConcurrentHashMap<>();
this.nextId = playersConfig.getInt("next-id", 1);

// 加载已有玩家的ID数据
for (String key : playersConfig.getKeys(false)) {
if (key.equals("next-id")) continue; // 跳过 "next-id" 配置项
UUID uuid = UUID.fromString(key);
int id = playersConfig.getInt(key);
playerIds.put(uuid, id);
}
playersConfig.getKeys(false).forEach(key -> {
if (!key.equals("next-id")) {
UUID uuid = UUID.fromString(key);
int id = playersConfig.getInt(key);
playerIds.put(uuid, id); // 加载玩家ID
}
});

// 注册
Bukkit.getPluginManager().registerEvents(this, this);
// PlaceholderAPI
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
new IDPlaceholderExpansion(this).register();
new IDPlaceholderExpansion(this).register(); // 注册PlaceholderAPI
} else {
getLogger().warning(getLang("papi_not_found")); // 提示 PlaceholderAPI 未找到
getLogger().warning(getLang("papi_not_found"));
}

// 插件启动完成提示
getLogger().info(getLang("plugin_enabled"));
getLogger().info(getLang("plugin_enabled")); // 插件启用
}

@Override
public void onDisable() {
// 插件关闭时保存玩家数据
savePlayerData();
getLogger().info(getLang("plugin_disabled"));
savePlayerData(); // 保存玩家数据
getLogger().info(getLang("plugin_disabled")); // 插件禁用
}

// 玩家加入服务器事件处理
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
UUID playerUuid = player.getUniqueId();

// 异步处理玩家ID分配
Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
// 如果玩家没有ID,则分配一个新ID
if (!playerIds.containsKey(playerUuid)) {
synchronized (this) { // 加锁防止并发问题
if (!playerIds.containsKey(playerUuid)) {
playerIds.put(playerUuid, nextId);
playersConfig.set(playerUuid.toString(), nextId);
nextId++;
playersConfig.set("next-id", nextId);
savePlayerData();
}
}
playerIds.put(playerUuid, nextId);
playersConfig.set(playerUuid.toString(), nextId);
nextId++;
playersConfig.set("next-id", nextId); // 分配新ID
savePlayerData();
}

int playerId = playerIds.get(playerUuid);

// 在主线程中发送欢迎消息
Bukkit.getScheduler().runTask(this, () -> {
String welcomeMessage = getLang("welcome_message").replace("{id}", String.valueOf(playerId));
player.sendMessage(ChatColor.GREEN + welcomeMessage);
player.sendMessage(ChatColor.GREEN + welcomeMessage); // 发送欢迎消息
});
});
}

// 初始化所有配置文件
private void initFiles() {
// 初始化 config.yml
saveDefaultConfig();

// 初始化 players.yml
playersFile = new File(getDataFolder(), "players.yml");
if (!playersFile.exists()) {
saveResource("players.yml", false); // 如果文件不存在,从插件JAR中复制默认文件
saveResource("players.yml", false); // 初始化players.yml
}
playersConfig = YamlConfiguration.loadConfiguration(playersFile);

// 初始化 lang.yml
File langFile = new File(getDataFolder(), "lang.yml");
if (!langFile.exists()) {
saveResource("lang.yml", false); // 如果文件不存在,从插件JAR中复制默认文件
saveResource("lang.yml", false); // 初始化lang.yml
}
langConfig = YamlConfiguration.loadConfiguration(langFile);
}

// 保存玩家数据到 players.yml 文件
private void savePlayerData() {
try {
playersConfig.save(playersFile); // 保存配置文件
playersConfig.save(playersFile); // 保存玩家数据
} catch (IOException e) {
getLogger().severe("无法保存玩家数据到 players.yml!");
getLogger().severe("Error saving player data: " + e.getMessage());
}
}

// PlaceholderAPI 扩展类,用于提供玩家ID占位符
public static class IDPlaceholderExpansion extends PlaceholderExpansion {

private final PlayerIDCounter plugin;
Expand All @@ -154,42 +129,54 @@ public IDPlaceholderExpansion(PlayerIDCounter plugin) {

@Override
public boolean persist() {
return true; // 占位符扩展在重载后继续存在
return true;
}

@Override
public boolean canRegister() {
return true; // 允许注册
return true;
}

@Override
public @NotNull String getIdentifier() {
return "playerid"; // 占位符标识符
return "playerid"; // Placeholder标识
}

@Override
public @NotNull String getAuthor() {
return plugin.getDescription().getAuthors().toString(); // 插件作者
return plugin.getDescription().getAuthors().toString();
}

@Override
public @NotNull String getVersion() {
return plugin.getDescription().getVersion(); // 插件版本
return plugin.getDescription().getVersion();
}

// 占位符请求
@Override
public String onPlaceholderRequest(Player player, @NotNull String params) {
if (player == null) {
return "";
return "None";
}

// 如果占位符参数是 "id",返回玩家的ID
if (params.equalsIgnoreCase("id")) {
return String.valueOf(PlayerIDCounter.getPlayerId(player.getUniqueId()));
return String.valueOf(PlayerIDCounter.getPlayerId(player.getUniqueId())); // 返回玩家ID
}

if (params.matches("\\d")) {
int id = Integer.parseInt(params);
UUID uuid = plugin.playerIds.entrySet().stream()
.filter(entry -> entry.getValue() == id)
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
if (uuid != null) {
return Bukkit.getOfflinePlayer(uuid).getName(); // 返回玩家名
} else {
return "None"; // 玩家不存在
}
}

return null; // 都他妈不是就返回 null
return null;
}
}
}
2 changes: 1 addition & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: PlayerIDCounter
version: '1.3'
version: ${project.version}
main: com.example.playeridcounter.PlayerIDCounter
api-version: '1.13'
load: STARTUP
Expand Down

0 comments on commit 2075ffe

Please sign in to comment.