package jk_5.nailed.server.scoreboard;
import jk_5.nailed.api.player.Player;
import jk_5.nailed.api.scoreboard.Objective;
import jk_5.nailed.api.scoreboard.Score;
import jk_5.nailed.api.util.Checks;
import jk_5.nailed.server.player.NailedPlayer;
import net.minecraft.network.play.server.S3BPacketScoreboardObjective;
import net.minecraft.network.play.server.S3CPacketUpdateScore;
import net.minecraft.scoreboard.IScoreObjectiveCriteria;
import javax.annotation.Nonnull;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class NailedObjective implements Objective {
private final String id;
private final NetworkedScoreboardManager manager;
private final Set<Score> scores = new HashSet<Score>();
private final Map<String, Score> scoresByName = new HashMap<String, Score>();
private String displayName;
public NailedObjective(String id, NetworkedScoreboardManager manager) {
this.id = id;
this.manager = manager;
this.displayName = id;
}
@Nonnull
@Override
public String getId() {
return this.id;
}
@Nonnull
@Override
public String getDisplayName() {
return this.displayName;
}
@Override
public void setDisplayName(@Nonnull String displayName) {
Checks.notNull(displayName, "displayName may not be null");
Checks.check(displayName.length() <= 32, "displayName may not be longer than 32");
this.displayName = displayName;
S3BPacketScoreboardObjective packet = new S3BPacketScoreboardObjective();
packet.objectiveName = this.id;
packet.objectiveValue = this.displayName;
packet.type = IScoreObjectiveCriteria.EnumRenderType.INTEGER; //TODO: config option
packet.field_149342_c = 2; //Update
this.manager.sendPacket(packet);
}
@Nonnull
@Override
public Score getScore(@Nonnull String name) {
Checks.notNull(name, "name may not be null");
Score score = this.scoresByName.get(name);
if(score == null){
score = new NailedScore(this, name);
this.scores.add(score);
this.scoresByName.put(name, score);
}
return score;
}
@Override
public void removeScore(@Nonnull Score score) {
Checks.notNull(score, "score may not be null");
if(this.scores.remove(score)){
this.scoresByName.remove(score.getName());
S3CPacketUpdateScore p = new S3CPacketUpdateScore();
p.name = score.getName();
p.action = S3CPacketUpdateScore.Action.REMOVE;
manager.sendPacket(p);
}
}
public void sendData(Player player){
for(Score score : this.scores){
S3CPacketUpdateScore p = new S3CPacketUpdateScore();
p.name = score.getName();
p.objective = this.id;
p.value = score.getValue();
p.action = S3CPacketUpdateScore.Action.CHANGE;
((NailedPlayer) player).sendPacket(p);
}
}
public NetworkedScoreboardManager getManager() {
return manager;
}
}