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();
}