From 45c5ef02cd1c42edf6c8c94cd7e1bd80d13aac46 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Fri, 9 Oct 2020 01:30:05 +0200 Subject: [PATCH] Various Scoreboard fixes (#1381) * Various Scoreboard fixes Fixes #1328 and a few other potential Scoreboard problems * Consistent whitespacing Co-authored-by: DoctorMacc --- .../connector/scoreboard/Objective.java | 12 ++----- .../geysermc/connector/scoreboard/Score.java | 1 - .../connector/scoreboard/Scoreboard.java | 31 ++++++++----------- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/Objective.java b/connector/src/main/java/org/geysermc/connector/scoreboard/Objective.java index b2f64861..3accbc12 100644 --- a/connector/src/main/java/org/geysermc/connector/scoreboard/Objective.java +++ b/connector/src/main/java/org/geysermc/connector/scoreboard/Objective.java @@ -76,7 +76,8 @@ public class Objective { if (!scores.containsKey(id)) { Score score1 = new Score(this, id) .setScore(score) - .setTeam(scoreboard.getTeamFor(id)); + .setTeam(scoreboard.getTeamFor(id)) + .setUpdateType(UpdateType.ADD); scores.put(id, score1); } } @@ -96,15 +97,6 @@ public class Objective { return 0; } - public Score getScore(int line) { - for (Score score : scores.values()) { - if (score.getScore() == line) { - return score; - } - } - return null; - } - public void removeScore(String id) { if (scores.containsKey(id)) { scores.get(id).setUpdateType(UpdateType.REMOVE); diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java b/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java index 635bafa3..3dfd6ed3 100644 --- a/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java +++ b/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java @@ -49,7 +49,6 @@ public class Score { this.id = objective.getScoreboard().getNextId().getAndIncrement(); this.objective = objective; this.name = name; - update(); } public String getDisplayName() { diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java b/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java index ae1b8275..732a056e 100644 --- a/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java +++ b/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java @@ -122,7 +122,7 @@ public class Scoreboard { for (Objective objective : objectives.values()) { if (!objective.isActive()) { - logger.debug("Ignoring non-active Scoreboard Objective '"+ objective.getObjectiveName() +'\''); + logger.debug("Ignoring non-active Scoreboard Objective '" + objective.getObjectiveName() + '\''); continue; } @@ -152,10 +152,6 @@ public class Scoreboard { boolean globalAdd = objective.getUpdateType() == ADD; boolean globalRemove = objective.getUpdateType() == REMOVE; - // Track if any scores changed - // Used to delete and resend scoreboard objectives; otherwise they won't update on Bedrock - boolean scoreChanged = false; - for (Score score : objective.getScores().values()) { Team team = score.getTeam(); @@ -171,16 +167,21 @@ public class Scoreboard { teamChanged |= team.getUpdateType() == UPDATE; add |= team.getUpdateType() == ADD || team.getUpdateType() == UPDATE; - remove |= team.getUpdateType() == REMOVE; + remove |= team.getUpdateType() != NOTHING; } add |= score.getUpdateType() == ADD || score.getUpdateType() == UPDATE; - remove |= score.getUpdateType() == REMOVE; - if (score.getUpdateType() == REMOVE) { + remove |= score.getUpdateType() == REMOVE || score.getUpdateType() == UPDATE; + + if (score.getUpdateType() == REMOVE || globalRemove) { add = false; } - if (score.getUpdateType() == UPDATE || teamChanged) { + if (score.getUpdateType() == ADD) { + remove = false; + } + + if (score.getUpdateType() == ADD || score.getUpdateType() == UPDATE || teamChanged) { score.update(); } @@ -191,12 +192,6 @@ public class Scoreboard { removeScores.add(score.getCachedInfo()); } - if (add || remove) { - scoreChanged = true; - } - // score is pending to be updated, so we use the current score as the old score - score.setOldScore(score.getScore()); - // score is pending to be removed, so we can remove it from the objective if (score.getUpdateType() == REMOVE) { objective.removeScore0(score.getName()); @@ -205,17 +200,17 @@ public class Scoreboard { score.setUpdateType(NOTHING); } - if (globalRemove || globalUpdate || scoreChanged) { + if (globalRemove || globalUpdate) { RemoveObjectivePacket removeObjectivePacket = new RemoveObjectivePacket(); removeObjectivePacket.setObjectiveId(objective.getObjectiveName()); session.sendUpstreamPacket(removeObjectivePacket); - if (objective.getUpdateType() == REMOVE) { + if (globalRemove) { objectives.remove(objective.getObjectiveName()); // now we can deregister objective.removed(); } } - if (globalAdd || globalUpdate || scoreChanged) { + if ((globalAdd || globalUpdate) && !globalRemove) { SetDisplayObjectivePacket displayObjectivePacket = new SetDisplayObjectivePacket(); displayObjectivePacket.setObjectiveId(objective.getObjectiveName()); displayObjectivePacket.setDisplayName(objective.getDisplayName());