PlayerScoreboard.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. {
  16. private final HashMap<Integer, String> elements = new HashMap<>();
  17. private final HashSet<Integer> toRemove = new HashSet<>();
  18. private final HashMap<Integer, String> toAdd = new HashMap<>();
  19. private final Scoreboard board = new Scoreboard();
  20. private final ScoreObjective o;
  21. private boolean changeNeeded = true;
  22. private boolean init = true;
  23. public PlayerScoreboard()
  24. {
  25. o = new ScoreObjective(board, "ScoreBoardAPI", ScoreCriteria.DUMMY, new StringTextComponent("§6---------------"), RenderType.INTEGER);
  26. }
  27. public void addText(int id, String text)
  28. {
  29. String s = elements.get(id);
  30. if(s != null && !s.equals(text))
  31. {
  32. toRemove.add(id);
  33. toAdd.put(id, text);
  34. changeNeeded = true;
  35. }
  36. else if(s == null)
  37. {
  38. toAdd.put(id, text);
  39. changeNeeded = true;
  40. }
  41. }
  42. public void removeText(int id)
  43. {
  44. if(elements.containsKey(id))
  45. {
  46. toRemove.add(id);
  47. changeNeeded = true;
  48. }
  49. }
  50. public void clear(ServerPlayerEntity p)
  51. {
  52. elements.keySet().forEach(i -> toRemove.add(i));
  53. changeNeeded = true;
  54. update(p);
  55. }
  56. public boolean update(ServerPlayerEntity p)
  57. {
  58. if(!changeNeeded)
  59. {
  60. return false;
  61. }
  62. if(init)
  63. {
  64. init = false;
  65. p.connection.sendPacket(new SScoreboardObjectivePacket(o, 0));
  66. }
  67. if(!toRemove.isEmpty())
  68. {
  69. toRemove.forEach(i ->
  70. {
  71. String s = elements.remove(i);
  72. if(s != null)
  73. {
  74. p.connection.sendPacket(new SUpdateScorePacket(Action.REMOVE, o.getName(), s, -1));
  75. }
  76. });
  77. toRemove.clear();
  78. }
  79. if(!toAdd.isEmpty())
  80. {
  81. toAdd.entrySet().stream().forEach((e) ->
  82. {
  83. elements.put(e.getKey(), e.getValue());
  84. p.connection.sendPacket(new SUpdateScorePacket(Action.CHANGE, o.getName(), e.getValue(), e.getKey()));
  85. });
  86. toAdd.clear();
  87. }
  88. changeNeeded = false;
  89. // displaying objective in sidebar
  90. p.connection.sendPacket(new SDisplayObjectivePacket(1, o));
  91. return false;
  92. }
  93. }