Various Scoreboard fixes (#1381)

* Various Scoreboard fixes

Fixes #1328 and a few other potential Scoreboard problems

* Consistent whitespacing

Co-authored-by: DoctorMacc <toy.fighter1@gmail.com>
This commit is contained in:
Tim203 2020-10-09 01:30:05 +02:00 committed by GitHub
parent 4514167835
commit 45c5ef02cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 29 deletions

View file

@ -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);

View file

@ -49,7 +49,6 @@ public class Score {
this.id = objective.getScoreboard().getNextId().getAndIncrement();
this.objective = objective;
this.name = name;
update();
}
public String getDisplayName() {

View file

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