PlayerScoreboard.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package me.km.overrides;
  2. import java.util.HashMap;
  3. import java.util.HashSet;
  4. import net.minecraft.entity.player.ServerPlayerEntity;
  5. import net.minecraft.network.play.server.SDisplayObjectivePacket;
  6. import net.minecraft.network.play.server.SScoreboardObjectivePacket;
  7. import net.minecraft.network.play.server.SUpdateScorePacket;
  8. import net.minecraft.scoreboard.ScoreCriteria;
  9. import net.minecraft.scoreboard.ScoreCriteria.RenderType;
  10. import net.minecraft.scoreboard.ScoreObjective;
  11. import net.minecraft.scoreboard.Scoreboard;
  12. import net.minecraft.scoreboard.ServerScoreboard.Action;
  13. import net.minecraft.util.text.StringTextComponent;
  14. public class PlayerScoreboard {
  15. private final HashMap<Integer, String> elements = new HashMap<>();
  16. private final HashSet<Integer> toRemove = new HashSet<>();
  17. private final HashMap<Integer, String> toAdd = new HashMap<>();
  18. private final Scoreboard board = new Scoreboard();
  19. private final ScoreObjective o;
  20. private boolean changeNeeded = true;
  21. private boolean init = true;
  22. public PlayerScoreboard() {
  23. o = new ScoreObjective(board, "ScoreBoardAPI", ScoreCriteria.DUMMY,
  24. new StringTextComponent("§6---------------"), RenderType.INTEGER);
  25. }
  26. public void addText(int id, String text) {
  27. String s = elements.get(id);
  28. if(s != null && !s.equals(text)) {
  29. toRemove.add(id);
  30. toAdd.put(id, text);
  31. changeNeeded = true;
  32. } else if(s == null) {
  33. toAdd.put(id, text);
  34. changeNeeded = true;
  35. }
  36. }
  37. public void removeText(int id) {
  38. if(elements.containsKey(id)) {
  39. toRemove.add(id);
  40. changeNeeded = true;
  41. }
  42. }
  43. public void clear(ServerPlayerEntity p) {
  44. elements.keySet().forEach(i -> toRemove.add(i));
  45. changeNeeded = true;
  46. update(p);
  47. }
  48. public boolean update(ServerPlayerEntity p) {
  49. if(!changeNeeded) {
  50. return false;
  51. }
  52. if(init) {
  53. init = false;
  54. p.connection.send(new SScoreboardObjectivePacket(o, 0));
  55. }
  56. if(!toRemove.isEmpty()) {
  57. toRemove.forEach(i -> {
  58. String s = elements.remove(i);
  59. if(s != null) {
  60. p.connection.send(new SUpdateScorePacket(Action.REMOVE, o.getName(), s, -1));
  61. }
  62. });
  63. toRemove.clear();
  64. }
  65. if(!toAdd.isEmpty()) {
  66. toAdd.entrySet().stream().forEach((e) -> {
  67. elements.put(e.getKey(), e.getValue());
  68. p.connection.send(new SUpdateScorePacket(Action.CHANGE, o.getName(), e.getValue(),
  69. e.getKey()));
  70. });
  71. toAdd.clear();
  72. }
  73. changeNeeded = false;
  74. // displaying objective in sidebar
  75. p.connection.send(new SDisplayObjectivePacket(1, o));
  76. return false;
  77. }
  78. }