将uuids的List <string>转换为玩家名称spigot java

时间:2017-06-11 09:51:29

标签: java minecraft

我的主类中有一个List,它从config中的某个部分获取数据。这是代码,

private List<String> datalist;

public List<String> getDataList() {
    if (datalist == null) {
        datalist = new ArrayList<>();
    }
    datalist = datalist.stream().distinct().collect(Collectors.toList());
    return datalist;
}
void loadConfig() {
    final FileConfiguration config = this.getConfig();
    config.options().copyDefaults(true);
    saveConfig();

    ConfigurationSection section = this.getConfig().getConfigurationSection("data");
    if (section != null) {
        Set<String> datas = section.getKeys(false);
        if (datas != null && !datas.isEmpty()) {
            for (String data : datas) {
                getDataList().add(data);
            }
        }
    }
}

在onEnable方法中调用loadConfig()。目前,如果我将其发送到播放器或控制台,它将被格式化为arraylist。 ([UUID,UUID,UUID,等等等等])。我的配置格式如下,

data:
  e81a48c8-6e82-304a-b435-832a362b4cbf:
    name: PiggyPiglet
    stat1: 0
    stat2: 0
    stat3: 0
    hasjoined: true

其中一个为PlayerJoinEvent上的玩家生成。我的命令类中有一个命令/ lb show,这里是代码。

if (type.equalsIgnoreCase("show")) {
                    if (sender.hasPermission("leaderboard.show")) {
                        sender.sendMessage(cc("&7LeaderBoard:"));

                        String lb = String.valueOf(plugin.getDataList()).replace("[",
                                "").replace("]",
                                "").replace(",",
                                "\n");
                        TextComponent leaderboard = new TextComponent(lb);
                        leaderboard.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("test").create() ) );
                        sender.spigot().sendMessage(leaderboard);
                    }
                }

该代码在聊天中发送这样的配置中的uuids。

uuid
uuid
uuid

当你将鼠标悬停在其中一个uuids上时,它会说“测试”。我的问题是如何将这些uuids更改为玩家名称,而不是说“test”,说

"EGCW | EGCL | KWC\n" + String.valueOf(cfg.getInt("data." + uuid + ".EGCW")) + " | " + String.valueOf(cfg.getInt("data." + uuid + ".EGCL")) + " | " + String.valueOf(cfg.getInt("data." + uuid + ".KWC"))"

用当前行上的uuid替换uuid。

2 个答案:

答案 0 :(得分:3)

您的UUID是org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task. java.lang.SecurityException: No security context bound to the current thread 的另一个<task:scheduled-tasks scheduler="scheduler"> <task:scheduled ref="app_OlapService" method="initialize" fixed-rate="9223372036854775807"/> </task:scheduled-tasks> ,因此您需要更深层次。

这种方法可能不是最好的,但它确实有效。

ConfigSection

使用略有改动的data输出(最好有多个用户):
ConfigurationSection section = config.getConfigurationSection("data"); if (section != null) { Set<String> datas = section.getKeys(false); if (datas != null && !datas.isEmpty()) { for (String uuid : datas) { ConfigurationSection section2 = config.getConfigurationSection("data." + uuid); if (section2 != null) { getDataList().add(section2.getString("name")); } } } } System.out.println(datalist);

config.yml应按预期工作。只需将“test”替换为您想要显示的String。

答案 1 :(得分:0)

您需要某种PlayerService,为您提供方法findByUuid(String uuid)并返回Player

获得后,您可以将String列表转换为这样的名称列表:

datalist.stream().map(uuid -> playerService.findByUuid(uuid))
    .filter(player -> player != null)
    .map(player -> player.getName()) 
    .collect(Collectors.toList())

但在你的情况下,你最好从配置中检索Map<String,Player>,而不仅仅是键。然后,不需要服务,您只需在地图上执行get(uuid)