Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. package fr.nathan.skybattle.manager;
  2.  
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.UUID;
  7. import java.util.stream.Collectors;
  8.  
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.entity.Player;
  11.  
  12. import com.google.common.collect.Maps;
  13.  
  14. import fr.nathan.skybattle.SkyBattle;
  15. import fr.nathan.skybattle.SkyBattle.GameStatus;
  16. import fr.nathan.skybattle.listener.PlayerDeathEventListener;
  17. import fr.nathan.skybattle.utils.Reflection;
  18.  
  19. public class ScoreboardManager
  20. {
  21. private static Map<UUID, ScoreboardManager> players = Maps.newHashMap();
  22. private static String display;
  23.  
  24. private static SkyBattle main;
  25. public static void init(SkyBattle main) {
  26. ScoreboardManager.main = main;
  27. }
  28.  
  29. public static void updateScoreboard()
  30. {
  31. if(!main.getStatus().equals(GameStatus.FINISHED))
  32. {
  33. display = main.getStatus().equals(GameStatus.WAITING) ? main.getSkyConfig().getScoreWaitingName() : main.getSkyConfig().getScoreIGName();
  34. List<String> lines;
  35. if(main.getStatus().equals(GameStatus.WAITING))
  36. lines = main.getSkyConfig().getScoreLinesWaiting().stream().map(line -> line
  37. .replace("%cooldown%", main.getCooldownManager().getCooldown() + "")
  38. .replace("%players%", Bukkit.getOnlinePlayers().size() + "")
  39. .replace("%max%", main.getSkyConfig().getMinPlayer() + "")
  40. .replace("%map%", main.getSkyConfig().getMapName()))
  41. .collect(Collectors.toList());
  42. else
  43. lines = main.getSkyConfig().getScoreLinesIG().stream().map(line -> line
  44. .replace("%redhearth%", main.getGameManager().getRedHearth().toString())
  45. .replace("%bluehearth%", main.getGameManager().getBlueHearth().toString())
  46. .replace("%time%", main.getGameManager().getTimer())
  47. .replace("%map%", main.getSkyConfig().getMapName()))
  48. .collect(Collectors.toList());
  49.  
  50. int j = lines.size();
  51. for(int i = 0; i < j; i++)
  52. setLine(lines.get(i), j - i - 1);
  53. }
  54. }
  55.  
  56. public static void init(Player p)
  57. {
  58. ScoreboardManager manager = new ScoreboardManager(p, display);
  59. players.put(p.getUniqueId(), manager);
  60. updateScoreboard();
  61. }
  62.  
  63. public static void remove(Player p)
  64. {
  65. if(players.containsKey(p.getUniqueId()))
  66. {
  67. players.get(p.getUniqueId()).destroy();
  68. players.remove(p.getUniqueId());
  69. }
  70. }
  71.  
  72. public static void setBoardName(String name)
  73. {
  74. players.values().forEach(m -> m.setDisplayName(name));
  75. }
  76.  
  77. public static void setLine(String text, int line)
  78. {
  79. players.forEach((k, v) -> v.setLine(text
  80. .replace("%kill%", PlayerDeathEventListener.getKill(k).toString())
  81. .replace("%death%", PlayerDeathEventListener.getDeath(k).toString())
  82. .replace("%kit%", main.getKitManager().getKit(k) != null ? main.getKitManager().getKit(k).getName() : "Aucun"), line, new boolean[0]));
  83. }
  84.  
  85. private Reflection ref;
  86.  
  87. private Player player;
  88. private HashMap<Integer, String> lines = new HashMap<>();
  89.  
  90. public ScoreboardManager(Player player, String name)
  91. {
  92. this.ref = new Reflection();
  93. this.player = player;
  94.  
  95. try
  96. {
  97. sendPacket(getEditPacket(0, name));
  98. sendPacket(getSettingPacket());
  99. }
  100. catch(Exception e) { e.printStackTrace(); }
  101. }
  102.  
  103. public void setDisplayName(String name)
  104. {
  105. try
  106. {
  107. sendPacket(getEditPacket(2, name));
  108. }
  109. catch(Exception e) { e.printStackTrace(); }
  110. }
  111.  
  112. @SuppressWarnings({ "unchecked", "rawtypes" })
  113. public void setLine(String text, int line, boolean... force)
  114. {
  115. if(lines.containsKey(line))
  116. {
  117. if(lines.get(line).equals(text) && (force.length > 0 ? !force[0] : true)) return;
  118. removeLine(line);
  119. }
  120.  
  121. try
  122. {
  123. Object packet = ref.getNMSClass("PacketPlayOutScoreboardScore").getConstructor(String.class).newInstance(text);
  124. ref.setField(packet, "b", player.getName());
  125. ref.setField(packet, "c", line);
  126. ref.setField(packet, "d", Enum.valueOf((Class<Enum>) ref.getNMSClass(getEnumScoreboardAction()), "CHANGE"));
  127.  
  128. sendPacket(packet);
  129. lines.put(line, text);
  130. }
  131. catch(Exception e) { e.printStackTrace(); }
  132. }
  133.  
  134. public void removeLine(int line)
  135. {
  136. try
  137. {
  138. sendPacket(ref.getNMSClass("PacketPlayOutScoreboardScore").getConstructor(String.class).newInstance(lines.get(line)));
  139. lines.remove(line);
  140. }
  141. catch(Exception e) { e.printStackTrace(); }
  142. }
  143.  
  144. public void destroy()
  145. {
  146. try
  147. {
  148. sendPacket(getEditPacket(1, null));
  149. }
  150. catch(Exception e) { e.printStackTrace(); }
  151. }
  152.  
  153. @SuppressWarnings({ "unchecked", "rawtypes" })
  154. private Object getEditPacket(int mode, String name) throws InstantiationException, IllegalAccessException
  155. {
  156. Object packet = ref.getNMSClass("PacketPlayOutScoreboardObjective").newInstance();
  157.  
  158. ref.setField(packet, "a", player.getName());
  159. ref.setField(packet, "d", mode);
  160.  
  161. if(mode == 0 || mode == 2)
  162. {
  163. ref.setField(packet, "b", name);
  164. ref.setField(packet, "c", Enum.valueOf((Class<Enum>) ref.getNMSClass(getEnumScoreboardHealthDisplay()), "INTEGER"));
  165. }
  166.  
  167. return packet;
  168. }
  169.  
  170. private Object getSettingPacket() throws InstantiationException, IllegalAccessException
  171. {
  172. Object packet = ref.getNMSClass("PacketPlayOutScoreboardDisplayObjective").newInstance();
  173. ref.setField(packet, "a", 1);
  174. ref.setField(packet, "b", player.getName());
  175.  
  176. return packet;
  177. }
  178.  
  179. private void sendPacket(Object packet)
  180. {
  181. ref.sendPacket(player, packet);
  182. }
  183.  
  184. private static String getEnumScoreboardHealthDisplay()
  185. {
  186. if(Integer.valueOf(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].replace("v", "").replace("R", "").replace("_", "")) <= 181) return "EnumScoreboardHealthDisplay";
  187. return "IScoreboardCriteria$EnumScoreboardHealthDisplay";
  188. }
  189.  
  190. private static String getEnumScoreboardAction()
  191. {
  192. if(Integer.valueOf(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].replace("v", "").replace("R", "").replace("_", "")) <= 181) return "EnumScoreboardAction";
  193. return "PacketPlayOutScoreboardScore$EnumScoreboardAction";
  194. }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement