diff --git a/pom.xml b/pom.xml index 26e75d4..5964254 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.smallaswater.tips Tips - 2.2.3-SNAPSHOT + 2.2.4-SNAPSHOT diff --git a/src/main/java/tip/tasks/BossBarAllPlayerTask.java b/src/main/java/tip/tasks/BossBarAllPlayerTask.java index 3d084d7..bc7731b 100644 --- a/src/main/java/tip/tasks/BossBarAllPlayerTask.java +++ b/src/main/java/tip/tasks/BossBarAllPlayerTask.java @@ -18,10 +18,13 @@ public BossBarAllPlayerTask(Player player) { } public void onRun() { - if (player == null || !player.isOnline()) { + if (player == null || !player.isOnline() || !player.spawned) { return; } - BossBarApi.createBossBar(player); + // 检查是否需要重新创建BossBar(跨服后apis中可能没有当前player) + if (!Main.getInstance().apis.containsKey(player)) { + BossBarApi.createBossBar(player); + } BossBarTask task = Main.getInstance().tasks.getIfPresent(player); if (task == null) { task = new BossBarTask(); diff --git a/src/main/java/tip/tasks/BroadCastPlayerTask.java b/src/main/java/tip/tasks/BroadCastPlayerTask.java index 0d80977..9f36fa5 100644 --- a/src/main/java/tip/tasks/BroadCastPlayerTask.java +++ b/src/main/java/tip/tasks/BroadCastPlayerTask.java @@ -21,7 +21,7 @@ public BroadCastPlayerTask(Player owner) { } public void onRun() { - if (player == null || !player.isOnline()) { + if (player == null || !player.isOnline() || !player.spawned) { return; } BroadcastMessage message = (BroadcastMessage) Api.getSendPlayerMessage(player.getName(), player.level.getFolderName(), BaseMessage.BaseTypes.BROADCAST); diff --git a/src/main/java/tip/tasks/NameTagTask.java b/src/main/java/tip/tasks/NameTagTask.java index c566256..fc7c1cd 100644 --- a/src/main/java/tip/tasks/NameTagTask.java +++ b/src/main/java/tip/tasks/NameTagTask.java @@ -18,7 +18,7 @@ public NameTagTask(Player player) { } public void onRun() { - if (player == null || !player.isOnline()) { + if (player == null || !player.isOnline() || !player.spawned) { return; } NameTagMessage nameTagMessage = (NameTagMessage) Api.getSendPlayerMessage(player.getName(), player.level.getFolderName(), BaseMessage.BaseTypes.NAME_TAG); diff --git a/src/main/java/tip/tasks/ScoreBoardTask.java b/src/main/java/tip/tasks/ScoreBoardTask.java index f64151f..2b63336 100644 --- a/src/main/java/tip/tasks/ScoreBoardTask.java +++ b/src/main/java/tip/tasks/ScoreBoardTask.java @@ -45,7 +45,6 @@ public void onRun() { if (this.scoreboard == null) { return; } -// for (Player player : Server.getInstance().getOnlinePlayers().values()) { if (player == null || !player.isOnline()) { return; } @@ -58,19 +57,20 @@ public void onRun() { return; } - if (player.isOnline()) { + if (player.isOnline() && player.spawned) { try { String title = Api.strReplace(message.getTitle(), player); ArrayList list = new ArrayList<>(); for (String ms : message.getMessages()) { list.add(Api.strReplace(ms, player)); } + // 每次都先关闭再显示,强制GameCore重新发送数据包 + this.scoreboard.closeScoreboard(player); this.scoreboard.showScoreboard(player, title, list); Main.getInstance().scoreboards.add(player); } catch (Exception ignored) { } } -// } } } diff --git a/src/main/java/tip/tasks/TipTask.java b/src/main/java/tip/tasks/TipTask.java index be9b15a..e88f93d 100644 --- a/src/main/java/tip/tasks/TipTask.java +++ b/src/main/java/tip/tasks/TipTask.java @@ -34,6 +34,9 @@ public void run() { if ((sendPlayerClass = sendPlayerClassCache.getIfPresent(player)) == null) { sendPlayerClass = new SendPlayerClass(player, getOwner()); sendPlayerClassCache.put(player, sendPlayerClass); + } else { + // 更新player引用,解决跨服后旧player对象失效的问题 + sendPlayerClass.updatePlayer(player); } sendPlayerClass.init(); } catch (Exception e) { diff --git a/src/main/java/tip/utils/SendPlayerClass.java b/src/main/java/tip/utils/SendPlayerClass.java index 7095901..a423fb9 100644 --- a/src/main/java/tip/utils/SendPlayerClass.java +++ b/src/main/java/tip/utils/SendPlayerClass.java @@ -32,6 +32,10 @@ public SendPlayerClass(Player player,Main main){ } + public void updatePlayer(Player player) { + this.player = player; + } + private Main getOwner() { return main; } @@ -40,6 +44,12 @@ public void init(){ if(player == null || !player.isOnline()){ return; } + + // 等待玩家完全生成后再发送显示数据 + if(!player.spawned){ + return; + } + TipMessage tipMessage; tipMessage = (TipMessage) Api.getSendPlayerMessage(player.getName(),player.level.getFolderName(), BaseMessage.BaseTypes.TIP); @@ -48,21 +58,14 @@ public void init(){ sendTip(player, Api.strReplace(tipMessage.getMessage(), player), tipMessage.getShowType()); } } - if(bossTask == null){ - bossTask = new BossBarAllPlayerTask(player); - } + // 每次都重新创建子Task,确保使用最新的player引用 + bossTask = new BossBarAllPlayerTask(player); bossTask.onRun(); - if(broadtask == null){ - broadtask = new BroadCastTask(player); - } + broadtask = new BroadCastTask(player); broadtask.onRun(); - if(nametask == null){ - nametask = new NameTagTask(player); - } + nametask = new NameTagTask(player); nametask.onRun(); - if(scoreTask == null){ - scoreTask = new ScoreBoardTask(player,getOwner()); - } + scoreTask = new ScoreBoardTask(player,getOwner()); scoreTask.onRun(); }