Implement Scoreboard API. Adds BUKKIT-3776
This implementation facilitates the correspondence of the Bukkit Scoreboard API to the internal minecraft implementation. When the first scoreboard is loaded, the scoreboard manager will be created. It uses the newly added WeakCollection for handling plugin scoreboard references to update the respective objectives. When a scoreboard contains no more active references, it should be garbage collected. An active reference can be held by a still registered objective, team, and transitively a score for a still registered objective. An internal reference will also be kept if a player's specific scoreboard has been set, and will remain persistent until that player logs out. A player's specific scoreboard becomes the scoreboard used when determining team structure for the player's attacking damage and the player's vision.
This commit is contained in:
@@ -436,11 +436,13 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
||||
|
||||
public void c(Entity entity, int i) {
|
||||
this.addScore(i);
|
||||
Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e);
|
||||
// CraftBukkit - Get our scores instead
|
||||
Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getLocalizedName(), new java.util.ArrayList<ScoreboardScore>());
|
||||
|
||||
if (entity instanceof EntityHuman) {
|
||||
this.a(StatisticList.A, 1);
|
||||
collection.addAll(this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.d));
|
||||
// CraftBukkit - Get our scores instead
|
||||
this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getLocalizedName(), collection);
|
||||
} else {
|
||||
this.a(StatisticList.z, 1);
|
||||
}
|
||||
@@ -448,8 +450,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
||||
Iterator iterator = collection.iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next();
|
||||
ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getLocalizedName(), scoreboardobjective);
|
||||
ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead
|
||||
|
||||
scoreboardscore.incrementScore();
|
||||
}
|
||||
@@ -687,10 +688,28 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
||||
}
|
||||
|
||||
public boolean a(EntityHuman entityhuman) {
|
||||
ScoreboardTeam scoreboardteam = this.getScoreboardTeam();
|
||||
ScoreboardTeam scoreboardteam1 = entityhuman.getScoreboardTeam();
|
||||
// CraftBukkit start - Change to check player's scoreboard team according to API reference to this (or main) scoreboard
|
||||
org.bukkit.scoreboard.Team team;
|
||||
if (this instanceof EntityPlayer) {
|
||||
EntityPlayer thisPlayer = (EntityPlayer) this;
|
||||
team = thisPlayer.getBukkitEntity().getScoreboard().getPlayerTeam(thisPlayer.getBukkitEntity());
|
||||
if (team == null || team.allowFriendlyFire()) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
// This should never be called, but is implemented anyway
|
||||
org.bukkit.OfflinePlayer thisPlayer = this.world.getServer().getOfflinePlayer(this.name);
|
||||
team = this.world.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer);
|
||||
if (team == null || team.allowFriendlyFire()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return scoreboardteam != scoreboardteam1 ? true : (scoreboardteam != null ? scoreboardteam.allowFriendlyFire() : true);
|
||||
if (entityhuman instanceof EntityPlayer) {
|
||||
return team.hasPlayer(((EntityPlayer) entityhuman).getBukkitEntity());
|
||||
}
|
||||
return team.hasPlayer(this.world.getServer().getOfflinePlayer(entityhuman.name));
|
||||
// CraftBukkit end
|
||||
}
|
||||
|
||||
protected void a(EntityLiving entityliving, boolean flag) {
|
||||
@@ -1494,6 +1513,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
|
||||
}
|
||||
|
||||
public String getScoreboardDisplayName() {
|
||||
// TODO: fun
|
||||
return ScoreboardTeam.getPlayerDisplayName(this.getScoreboardTeam(), this.name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,14 +201,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
|
||||
public void setHealth(int i) {
|
||||
super.setHealth(i);
|
||||
Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.f);
|
||||
Iterator iterator = collection.iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next();
|
||||
|
||||
this.getScoreboard().getPlayerScoreForObjective(this.getLocalizedName(), scoreboardobjective).updateForList(Arrays.asList(new EntityHuman[] { this}));
|
||||
}
|
||||
// CraftBukkit - Update ALL the scores!
|
||||
this.world.getServer().getScoreboardManager().updateAllScoresForList(IScoreboardCriteria.f, this.getLocalizedName(), com.google.common.collect.ImmutableList.of(this));
|
||||
}
|
||||
|
||||
public void g() {
|
||||
@@ -304,12 +298,12 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
||||
this.closeInventory();
|
||||
// CraftBukkit end
|
||||
|
||||
Collection collection = this.world.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.c);
|
||||
// CraftBukkit - Get our scores instead
|
||||
Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getLocalizedName(), new java.util.ArrayList<ScoreboardScore>());
|
||||
Iterator iterator = collection.iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next();
|
||||
ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getLocalizedName(), scoreboardobjective);
|
||||
ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead
|
||||
|
||||
scoreboardscore.incrementScore();
|
||||
}
|
||||
|
||||
@@ -225,6 +225,8 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
||||
world.getWorld().getPopulators().addAll(gen.getDefaultPopulators(world.getWorld()));
|
||||
}
|
||||
|
||||
this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard());
|
||||
|
||||
this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld()));
|
||||
|
||||
world.addIWorldAccess(new WorldManager(this, world));
|
||||
|
||||
@@ -126,7 +126,7 @@ public abstract class PlayerList {
|
||||
}
|
||||
}
|
||||
|
||||
protected void a(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) {
|
||||
public void a(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { // CraftBukkit - protected -> public
|
||||
HashSet hashset = new HashSet();
|
||||
Iterator iterator = scoreboardserver.getTeams().iterator();
|
||||
|
||||
@@ -277,6 +277,8 @@ public abstract class PlayerList {
|
||||
entityplayer1.playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
// This removes the scoreboard (and player reference) for the specific player in the manager
|
||||
this.cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity());
|
||||
|
||||
return playerQuitEvent.getQuitMessage();
|
||||
// CraftBukkit end
|
||||
|
||||
@@ -20,7 +20,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
public void handleScoreChanged(ScoreboardScore scoreboardscore) {
|
||||
super.handleScoreChanged(scoreboardscore);
|
||||
if (this.b.contains(scoreboardscore.getObjective())) {
|
||||
this.a.getPlayerList().sendAll(new Packet207SetScoreboardScore(scoreboardscore, 0));
|
||||
this.sendAll(new Packet207SetScoreboardScore(scoreboardscore, 0)); // CraftBukkit - Internal packet method
|
||||
}
|
||||
|
||||
this.b();
|
||||
@@ -28,7 +28,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
public void handlePlayerRemoved(String s) {
|
||||
super.handlePlayerRemoved(s);
|
||||
this.a.getPlayerList().sendAll(new Packet207SetScoreboardScore(s));
|
||||
this.sendAll(new Packet207SetScoreboardScore(s)); // CraftBukkit - Internal packet method
|
||||
this.b();
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
super.setDisplaySlot(i, scoreboardobjective);
|
||||
if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) {
|
||||
if (this.h(scoreboardobjective1) > 0) {
|
||||
this.a.getPlayerList().sendAll(new Packet208SetScoreboardDisplayObjective(i, scoreboardobjective));
|
||||
this.sendAll(new Packet208SetScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method
|
||||
} else {
|
||||
this.g(scoreboardobjective1);
|
||||
}
|
||||
@@ -46,7 +46,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
if (scoreboardobjective != null) {
|
||||
if (this.b.contains(scoreboardobjective)) {
|
||||
this.a.getPlayerList().sendAll(new Packet208SetScoreboardDisplayObjective(i, scoreboardobjective));
|
||||
this.sendAll(new Packet208SetScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method
|
||||
} else {
|
||||
this.e(scoreboardobjective);
|
||||
}
|
||||
@@ -57,13 +57,13 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
public void addPlayerToTeam(String s, ScoreboardTeam scoreboardteam) {
|
||||
super.addPlayerToTeam(s, scoreboardteam);
|
||||
this.a.getPlayerList().sendAll(new Packet209SetScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3));
|
||||
this.sendAll(new Packet209SetScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); // CraftBukkit - Internal packet method
|
||||
this.b();
|
||||
}
|
||||
|
||||
public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) {
|
||||
super.removePlayerFromTeam(s, scoreboardteam);
|
||||
this.a.getPlayerList().sendAll(new Packet209SetScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4));
|
||||
this.sendAll(new Packet209SetScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); // CraftBukkit - Internal packet method
|
||||
this.b();
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) {
|
||||
super.handleObjectiveChanged(scoreboardobjective);
|
||||
if (this.b.contains(scoreboardobjective)) {
|
||||
this.a.getPlayerList().sendAll(new Packet206SetScoreboardObjective(scoreboardobjective, 2));
|
||||
this.sendAll(new Packet206SetScoreboardObjective(scoreboardobjective, 2)); // CraftBukkit - Internal packet method
|
||||
}
|
||||
|
||||
this.b();
|
||||
@@ -92,19 +92,19 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
public void handleTeamAdded(ScoreboardTeam scoreboardteam) {
|
||||
super.handleTeamAdded(scoreboardteam);
|
||||
this.a.getPlayerList().sendAll(new Packet209SetScoreboardTeam(scoreboardteam, 0));
|
||||
this.sendAll(new Packet209SetScoreboardTeam(scoreboardteam, 0)); // CraftBukkit - Internal packet method
|
||||
this.b();
|
||||
}
|
||||
|
||||
public void handleTeamChanged(ScoreboardTeam scoreboardteam) {
|
||||
super.handleTeamChanged(scoreboardteam);
|
||||
this.a.getPlayerList().sendAll(new Packet209SetScoreboardTeam(scoreboardteam, 2));
|
||||
this.sendAll(new Packet209SetScoreboardTeam(scoreboardteam, 2)); // CraftBukkit - Internal packet method
|
||||
this.b();
|
||||
}
|
||||
|
||||
public void handleTeamRemoved(ScoreboardTeam scoreboardteam) {
|
||||
super.handleTeamRemoved(scoreboardteam);
|
||||
this.a.getPlayerList().sendAll(new Packet209SetScoreboardTeam(scoreboardteam, 1));
|
||||
this.sendAll(new Packet209SetScoreboardTeam(scoreboardteam, 1)); // CraftBukkit - Internal packet method
|
||||
this.b();
|
||||
}
|
||||
|
||||
@@ -146,6 +146,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
EntityPlayer entityplayer = (EntityPlayer) iterator.next();
|
||||
if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board
|
||||
Iterator iterator1 = list.iterator();
|
||||
|
||||
while (iterator1.hasNext()) {
|
||||
@@ -178,6 +179,7 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
EntityPlayer entityplayer = (EntityPlayer) iterator.next();
|
||||
if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board
|
||||
Iterator iterator1 = list.iterator();
|
||||
|
||||
while (iterator1.hasNext()) {
|
||||
@@ -201,4 +203,14 @@ public class ScoreboardServer extends Scoreboard {
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
// CraftBukkit start - Send to players
|
||||
private void sendAll(Packet packet) {
|
||||
for (EntityPlayer entityplayer : (List<EntityPlayer>) this.a.getPlayerList().players) {
|
||||
if (entityplayer.getBukkitEntity().getScoreboard().getHandle() == this) {
|
||||
entityplayer.playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
// CraftBukkit end
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user