Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.13 KB | None | 0 0
  1. public class Tab {
  2.  
  3. @Getter private Scoreboard scoreboard;
  4. @Getter @Setter private Team elevatedTeam;
  5. private Map<TabEntryPosition, String> entries;
  6.  
  7. public Tab(Player player, boolean hook, TabList tabList) {
  8. this.entries = new ConcurrentHashMap<>();
  9.  
  10. scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
  11. if (hook && !player.getScoreboard().equals(Bukkit.getScoreboardManager().getMainScoreboard())) {
  12. scoreboard = player.getScoreboard();
  13. }
  14.  
  15. elevatedTeam = scoreboard.registerNewTeam(getBlanks().get(getBlanks().size() - 1));
  16.  
  17. for (Player other : Bukkit.getOnlinePlayers()) {
  18.  
  19. getElevatedTeam(other, tabList).addEntry(other.getName());
  20.  
  21. Tab tab = tabList.getTabByPlayer(other);
  22. if (tab != null) {
  23. tab.getElevatedTeam(player, tabList).addEntry(player.getName());
  24. }
  25.  
  26. PacketPlayOutPlayerInfo packet = PacketPlayOutPlayerInfo.removePlayer(((CraftPlayer)other).getHandle());
  27. ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet);
  28. }
  29.  
  30. player.setScoreboard(scoreboard);
  31.  
  32. initialize(player);
  33. }
  34.  
  35. public Team getElevatedTeam(Player player, TabList tabList) {
  36. if (player.hasMetadata("HydrogenPrefix")) {
  37. String prefix = ChatColor.getLastColors(player.getDisplayName().replace(ChatColor.RESET + "", ""));
  38.  
  39. String name = getBlanks().get(getBlanks().size() - 1) + prefix;
  40. if (name.length() > 16) {
  41. name = name.substring(0, 15);
  42. }
  43.  
  44. Team team = scoreboard.getTeam(name);
  45.  
  46. if (team == null) {
  47. team = scoreboard.registerNewTeam(name);
  48.  
  49. team.setPrefix(prefix);
  50.  
  51. }
  52.  
  53. return team;
  54. }
  55.  
  56. return elevatedTeam;
  57. }
  58.  
  59. public Set<TabEntryPosition> getPositions() {
  60. return entries.keySet();
  61. }
  62.  
  63. public Team getByLocation(int x, int y) {
  64. for (TabEntryPosition position : entries.keySet()) {
  65. if (position.getX() == x && position.getY() == y) {
  66. return scoreboard.getTeam(position.getKey());
  67. }
  68. }
  69. return null;
  70. }
  71.  
  72. private void initialize(Player player) {
  73. if (((CraftPlayer)player).getHandle().playerConnection.networkManager.getVersion() >= 47) {
  74. for (int x = 0; x < 4; x++) {
  75. for (int y = 0; y < 20; y++) {
  76. String key = getNextBlank();
  77. TabEntryPosition position = new TabEntryPosition(x, y, key, scoreboard);
  78.  
  79. System.out.println(x * y);
  80.  
  81. entries.put(position, key);
  82.  
  83. ((CraftPlayer) player).getHandle().playerConnection.sendPacket(getPlayerPacket(entries.get(position)));
  84.  
  85. Team team = scoreboard.getTeam(position.getKey());
  86.  
  87. if (team == null) {
  88. team = scoreboard.registerNewTeam(position.getKey());
  89. }
  90.  
  91. team.addEntry(entries.get(position));
  92. }
  93. }
  94. } else {
  95. for (int i = 0; i < 60; i++) {
  96. int x = i % 3;
  97. int y = i / 3;
  98.  
  99. String key = getNextBlank();
  100. TabEntryPosition position = new TabEntryPosition(x, y, key, scoreboard);
  101. entries.put(position, key);
  102.  
  103. ((CraftPlayer) player).getHandle().playerConnection.sendPacket(getPlayerPacket(entries.get(position)));
  104.  
  105. Team team = scoreboard.getTeam(position.getKey());
  106.  
  107. if (team == null) {
  108. team = scoreboard.registerNewTeam(position.getKey());
  109. }
  110.  
  111. team.addEntry(entries.get(position));
  112. }
  113. }
  114. }
  115.  
  116. private String getNextBlank() {
  117. outer: for (String blank : getBlanks()) {
  118.  
  119. if (scoreboard.getTeam(blank) != null) {
  120. continue;
  121. }
  122.  
  123. for (String identifier : entries.values()) {
  124. if (identifier.equals(blank)) {
  125. continue outer;
  126. }
  127. }
  128. return blank;
  129. }
  130. return null;
  131. }
  132.  
  133. public List<String> getBlanks() {
  134. List<String> toReturn = new ArrayList<>();
  135.  
  136. for (ChatColor color : ChatColor.values()) {
  137. for (int i = 0; i < 4; i++) {
  138.  
  139. String identifier = StringUtils.repeat(color + "", 4 - i) + ChatColor.RESET;
  140. toReturn.add(identifier);
  141. }
  142. }
  143.  
  144. return toReturn;
  145. }
  146.  
  147.  
  148. /*
  149. There should be a better way to do this without reflection
  150. */
  151. private static Packet getPlayerPacket(String name) {
  152. PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo();
  153.  
  154. Field action;
  155. Field username;
  156. Field player;
  157. try {
  158. action = PacketPlayOutPlayerInfo.class.getDeclaredField("action");
  159. username = PacketPlayOutPlayerInfo.class.getDeclaredField("username");
  160. player = PacketPlayOutPlayerInfo.class.getDeclaredField("player");
  161.  
  162. action.setAccessible(true);
  163. username.setAccessible(true);
  164. player.setAccessible(true);
  165.  
  166. action.set(packet, 0);
  167. username.set(packet, name);
  168. player.set(packet, new GameProfile(UUID.randomUUID(), name));
  169. } catch (NoSuchFieldException e) {
  170. e.printStackTrace();
  171. return null;
  172. } catch (IllegalAccessException e) {
  173. e.printStackTrace();
  174. }
  175.  
  176. return packet;
  177. }
  178.  
  179. public static class UpdatedPacketPlayOutPlayerInfo extends PacketPlayOutPlayerInfo {
  180.  
  181. }
  182.  
  183. public static class TabEntryPosition {
  184. @Getter private final int x, y;
  185. @Getter private final String key;
  186.  
  187. public TabEntryPosition(int x, int y, String key, Scoreboard scoreboard) {
  188. this.x = x;
  189. this.y = y;
  190. this.key = key;
  191. }
  192. }
  193.  
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement