我的主类中有一个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。
答案 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)
。