Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.55 KB | None | 0 0
  1. package com.luxormc.hub.tab;
  2.  
  3. import java.util.Arrays;
  4. import java.util.UUID;
  5. import java.util.stream.Stream;
  6.  
  7. import org.apache.commons.lang.StringEscapeUtils;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.ChatColor;
  11. import org.bukkit.entity.Player;
  12. import org.spigotmc.ProtocolInjector;
  13.  
  14. import com.google.common.collect.Table;
  15. import com.luxormc.hub.tab.reflection.ReflectionConstants;
  16.  
  17. import lombok.Getter;
  18. import net.minecraft.server.v1_7_R4.ChatSerializer;
  19. import net.minecraft.util.com.mojang.authlib.GameProfile;
  20. import net.minecraft.util.com.mojang.authlib.properties.Property;
  21.  
  22. public class Tablist {
  23.  
  24. public static final Object[] GAME_PROFILES;
  25. public static final String[] TAB_NAMES;
  26.  
  27. public static String[] BLANK_SKIN = {
  28. "eyJ0aW1lc3RhbXAiOjE0MTEyNjg3OTI3NjUsInByb2ZpbGVJZCI6IjNmYmVjN2RkMGE1ZjQwYmY5ZDExODg1YTU0NTA3MTEyIiwicHJvZmlsZU5hbWUiOiJsYXN0X3VzZXJuYW1lIiwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg0N2I1Mjc5OTg0NjUxNTRhZDZjMjM4YTFlM2MyZGQzZTMyOTY1MzUyZTNhNjRmMzZlMTZhOTQwNWFiOCJ9fX0=",
  29. "u8sG8tlbmiekrfAdQjy4nXIcCfNdnUZzXSx9BE1X5K27NiUvE1dDNIeBBSPdZzQG1kHGijuokuHPdNi/KXHZkQM7OJ4aCu5JiUoOY28uz3wZhW4D+KG3dH4ei5ww2KwvjcqVL7LFKfr/ONU5Hvi7MIIty1eKpoGDYpWj3WjnbN4ye5Zo88I2ZEkP1wBw2eDDN4P3YEDYTumQndcbXFPuRRTntoGdZq3N5EBKfDZxlw4L3pgkcSLU5rWkd5UH4ZUOHAP/VaJ04mpFLsFXzzdU4xNZ5fthCwxwVBNLtHRWO26k/qcVBzvEXtKGFJmxfLGCzXScET/OjUBak/JEkkRG2m+kpmBMgFRNtjyZgQ1w08U6HHnLTiAiio3JswPlW5v56pGWRHQT5XWSkfnrXDalxtSmPnB5LmacpIImKgL8V9wLnWvBzI7SHjlyQbbgd+kUOkLlu7+717ySDEJwsFJekfuR6N/rpcYgNZYrxDwe4w57uDPlwNL6cJPfNUHV7WEbIU1pMgxsxaXe8WSvV87qLsR7H06xocl2C0JFfe2jZR4Zh3k9xzEnfCeFKBgGb4lrOWBu1eDWYgtKV67M2Y+B3W5pjuAjwAxn0waODtEn/3jKPbc/sxbPvljUCw65X+ok0UUN1eOwXV5l2EGzn05t3Yhwq19/GxARg63ISGE8CKw=" };
  30.  
  31. @Getter
  32. private final ClientVersion version;
  33.  
  34. @Getter
  35. private final Player player;
  36.  
  37. @Getter
  38. private boolean initiated;
  39.  
  40. @SuppressWarnings("unchecked")
  41. public Tablist(Player player) {
  42. this.player = player;
  43. this.version = ClientVersion.getVersion(player);
  44. for (int i = 0; i < 80; i++) {
  45. Object packet = ReflectionConstants.SCOREBOARD_TEAM_CONSTRUCTOR.invoke();
  46. ReflectionConstants.SCOREBOARD_TEAM_NAME.set(packet, TAB_NAMES[i]);
  47. ReflectionConstants.SCOREBOARD_TEAM_PLAYERS.get(packet).add(TAB_NAMES[i]);
  48. sendPacket(player, packet);
  49. }
  50. addFakePlayers();
  51. update();
  52. }
  53.  
  54. public void sendPacket(Player player, Object packet) {
  55. Object handle = ReflectionConstants.GET_HANDLE_METHOD.invoke(player);
  56. Object connection = ReflectionConstants.PLAYER_CONNECTION.get(handle);
  57. ReflectionConstants.SEND_PACKET.invoke(connection, packet);
  58. }
  59.  
  60. @SuppressWarnings("unused")
  61. public Tablist update() {
  62. TablistManager manager = TablistManager.INSTANCE;
  63. if (!initiated || manager == null)
  64. return this;
  65. Table<Integer, Integer, String> entries = manager.getSupplier().getEntries(player);
  66. boolean useProfiles = version.ordinal() != 0;
  67. int magic = useProfiles ? 4 : 3;
  68. if (useProfiles) {
  69. String header = manager.getSupplier().getHeader(player);
  70. if (header == null) {
  71. header = "";
  72. }
  73. String footer = manager.getSupplier().getFooter(player);
  74. if (footer == null) {
  75. footer = "";
  76. }
  77. ProtocolInjector.PacketTabHeader packet = new ProtocolInjector.PacketTabHeader(
  78. ChatSerializer.a("{text:\"" + StringEscapeUtils.escapeJava(header) + "\"}"),
  79. ChatSerializer.a("{text:\"" + StringEscapeUtils.escapeJava(footer) + "\"}"));
  80. sendPacket(player, packet);
  81. }
  82. for (int i = 0; i < (magic * 20); i++) {
  83. int x = i % magic;
  84. int y = i / magic;
  85. String text = entries.get(x, y);
  86. if (text == null) {
  87. text = "";
  88. }
  89. String name = TAB_NAMES[i];
  90. String prefix = "", suffix = "";
  91. if (text.length() < 17) {
  92. prefix = text;
  93. } else {
  94. String left = text.substring(0, 16), right = text.substring(16, text.length());
  95. if (left.endsWith("§")) {
  96. left = left.substring(0, left.length() - 1);
  97. right = "§" + right;
  98. }
  99. String last = ChatColor.getLastColors(left);
  100. right = last + right;
  101. prefix = left;
  102. suffix = StringUtils.left(right, 16);
  103. }
  104. Object packet = ReflectionConstants.SCOREBOARD_TEAM_CONSTRUCTOR.invoke();
  105. ReflectionConstants.SCOREBOARD_TEAM_NAME.set(packet, TAB_NAMES[i]);
  106. ReflectionConstants.SCOREBOARD_TEAM_ACTION.set(packet, 2);
  107. ReflectionConstants.SCOREBOARD_TEAM_PREFIX.set(packet, prefix);
  108. ReflectionConstants.SCOREBOARD_TEAM_SUFFIX.set(packet, suffix);
  109. sendPacket(player, packet);
  110. }
  111. return this;
  112. }
  113.  
  114. @SuppressWarnings("deprecation")
  115. public Tablist hideRealPlayers() {
  116. if (!initiated)
  117. return this;
  118. boolean useProfiles = version.ordinal() != 0;
  119. Stream.of(Bukkit.getOnlinePlayers()).forEach(other -> {
  120. if (!player.canSee(other))
  121. return;
  122. Object packet = ReflectionConstants.TAB_PACKET_CONSTRUCTOR.invoke();
  123. if (useProfiles) {
  124. Object profile = ReflectionConstants.GET_PROFILE_METHOD.invoke(other);
  125. ReflectionConstants.TAB_PACKET_PROFILE.set(packet, profile);
  126. } else {
  127. ReflectionConstants.TAB_PACKET_NAME.set(packet, other.getName());
  128. }
  129. ReflectionConstants.TAB_PACKET_ACTION.set(packet, 4);
  130. sendPacket(player, packet);
  131. });
  132. return this;
  133. }
  134.  
  135. public Tablist hideFakePlayers() {
  136. if (!initiated)
  137. return this;
  138. boolean useProfiles = version.ordinal() != 0;
  139. Arrays.stream(GAME_PROFILES).forEach(other -> {
  140. Object packet = ReflectionConstants.TAB_PACKET_CONSTRUCTOR.invoke();
  141. if (useProfiles) {
  142. ReflectionConstants.TAB_PACKET_PROFILE.set(packet, other);
  143. } else {
  144. String name = ReflectionConstants.GAME_PROFILE_NAME.get(other);
  145. ReflectionConstants.TAB_PACKET_NAME.set(packet, name);
  146. }
  147. ReflectionConstants.TAB_PACKET_ACTION.set(packet, 4);
  148. sendPacket(player, packet);
  149. });
  150. return this;
  151. }
  152.  
  153. @SuppressWarnings("unused")
  154. public Tablist addFakePlayers() {
  155. if (initiated)
  156. return this;
  157. boolean useProfiles = version.ordinal() != 0;
  158. int magic = useProfiles ? 4 : 3;
  159. for (int i = 0; i < (magic * 20); i++) {
  160. int x = i % magic;
  161. int y = i / magic;
  162. Object packet = ReflectionConstants.TAB_PACKET_CONSTRUCTOR.invoke();
  163. Object profile = GAME_PROFILES[i];
  164. if (useProfiles) {
  165. ReflectionConstants.TAB_PACKET_PROFILE.set(packet, profile);
  166. } else {
  167. String name = ReflectionConstants.GAME_PROFILE_NAME.get(profile);
  168. ReflectionConstants.TAB_PACKET_NAME.set(packet, name);
  169. }
  170. ReflectionConstants.TAB_PACKET_ACTION.set(packet, 0);
  171. sendPacket(player, packet);
  172. }
  173. initiated = true;
  174. return this;
  175. }
  176.  
  177. public void clear() {
  178. for (int i = 0; i < 80; i++) {
  179. Object packet = ReflectionConstants.SCOREBOARD_TEAM_CONSTRUCTOR.invoke();
  180. ReflectionConstants.SCOREBOARD_TEAM_NAME.set(packet, TAB_NAMES[i]);
  181. ReflectionConstants.SCOREBOARD_TEAM_ACTION.set(packet, 4);
  182. sendPacket(player, packet);
  183. }
  184. }
  185.  
  186. static {
  187. GAME_PROFILES = new Object[80];
  188. TAB_NAMES = new String[80];
  189. for (int i = 0; i < 80; i++) {
  190. int x = i % 4;
  191. int y = i / 4;
  192. String name = (x > 9 ? ("§" + String.valueOf(x).toCharArray()[0] + "§" + String.valueOf(x).toCharArray()[1])
  193. : "§0§" + x)
  194. + (y > 9 ? ("§" + String.valueOf(y).toCharArray()[0] + "§" + String.valueOf(y).toCharArray()[1])
  195. : "§0§" + String.valueOf(y).toCharArray()[0])
  196. + ChatColor.DARK_AQUA;
  197. UUID id = UUID.randomUUID();
  198. GameProfile profile = new GameProfile(id, name);
  199. profile.getProperties().put("textures", new Property("textures",
  200. "eyJ0aW1lc3RhbXAiOjE0MTEyNjg3OTI3NjUsInByb2ZpbGVJZCI6IjNmYmVjN2RkMGE1ZjQwYmY5ZDExODg1YTU0NTA3MTEyIiwicHJvZmlsZU5hbWUiOiJsYXN0X3VzZXJuYW1lIiwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg0N2I1Mjc5OTg0NjUxNTRhZDZjMjM4YTFlM2MyZGQzZTMyOTY1MzUyZTNhNjRmMzZlMTZhOTQwNWFiOCJ9fX0=",
  201. "u8sG8tlbmiekrfAdQjy4nXIcCfNdnUZzXSx9BE1X5K27NiUvE1dDNIeBBSPdZzQG1kHGijuokuHPdNi/KXHZkQM7OJ4aCu5JiUoOY28uz3wZhW4D+KG3dH4ei5ww2KwvjcqVL7LFKfr/ONU5Hvi7MIIty1eKpoGDYpWj3WjnbN4ye5Zo88I2ZEkP1wBw2eDDN4P3YEDYTumQndcbXFPuRRTntoGdZq3N5EBKfDZxlw4L3pgkcSLU5rWkd5UH4ZUOHAP/VaJ04mpFLsFXzzdU4xNZ5fthCwxwVBNLtHRWO26k/qcVBzvEXtKGFJmxfLGCzXScET/OjUBak/JEkkRG2m+kpmBMgFRNtjyZgQ1w08U6HHnLTiAiio3JswPlW5v56pGWRHQT5XWSkfnrXDalxtSmPnB5LmacpIImKgL8V9wLnWvBzI7SHjlyQbbgd+kUOkLlu7+717ySDEJwsFJekfuR6N/rpcYgNZYrxDwe4w57uDPlwNL6cJPfNUHV7WEbIU1pMgxsxaXe8WSvV87qLsR7H06xocl2C0JFfe2jZR4Zh3k9xzEnfCeFKBgGb4lrOWBu1eDWYgtKV67M2Y+B3W5pjuAjwAxn0waODtEn/3jKPbc/sxbPvljUCw65X+ok0UUN1eOwXV5l2EGzn05t3Yhwq19/GxARg63ISGE8CKw="));
  202. TAB_NAMES[i] = name;
  203. GAME_PROFILES[i] = profile;
  204. }
  205. }
  206.  
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement