Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.57 KB | None | 0 0
  1. import java.lang.reflect.Method;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.HashMap;
  6. import java.util.List;
  7.  
  8. import org.bukkit.Bukkit;
  9. import org.bukkit.Location;
  10. import org.bukkit.entity.Player;
  11.  
  12. /**
  13. *
  14. * @author siloneco
  15. * version: 1.0.0
  16. *
  17. */
  18. public class Hologram {
  19.  
  20. private static String version;
  21. private static int versionNumber;
  22. private static Class<?> armorStand, spawnPacket, world, craftWorld, craftPlayer, iChatBaseComponent,
  23. chatComponentText, entityLiving, entityPlayer, playerConnection, packetRaw, nbtTagCompound, packetDestroy,
  24. packetTeleport;
  25.  
  26. private static boolean ready = false;
  27.  
  28. private List<String> messages = new ArrayList<String>();
  29. private Location defaultLocation = null;
  30. private HashMap<Player, Location> locMap = new HashMap<>();
  31.  
  32. static {
  33. version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + ".";
  34.  
  35. String verTemp = version.substring(3);
  36. versionNumber = Integer.parseInt(verTemp.substring(0, verTemp.indexOf("_")));
  37.  
  38. try {
  39. armorStand = Class.forName("net.minecraft.server." + version + "EntityArmorStand");
  40. spawnPacket = Class.forName("net.minecraft.server." + version + "PacketPlayOutSpawnEntityLiving");
  41. world = Class.forName("net.minecraft.server." + version + "World");
  42. craftWorld = Class.forName("org.bukkit.craftbukkit." + version + "CraftWorld");
  43. craftPlayer = Class.forName("org.bukkit.craftbukkit." + version + "entity.CraftPlayer");
  44. iChatBaseComponent = Class.forName("net.minecraft.server." + version + "IChatBaseComponent");
  45. chatComponentText = Class.forName("net.minecraft.server." + version + "ChatComponentText");
  46. entityLiving = Class.forName("net.minecraft.server." + version + "EntityLiving");
  47. entityPlayer = Class.forName("net.minecraft.server." + version + "EntityPlayer");
  48. playerConnection = Class.forName("net.minecraft.server." + version + "PlayerConnection");
  49. packetRaw = Class.forName("net.minecraft.server." + version + "Packet");
  50. packetDestroy = Class.forName("net.minecraft.server." + version + "PacketPlayOutEntityDestroy");
  51. packetTeleport = Class.forName("net.minecraft.server." + version + "PacketPlayOutEntityTeleport");
  52. Class<?> entity = Class.forName("net.minecraft.server." + version + "Entity");
  53.  
  54. if (versionNumber <= 8) {
  55. nbtTagCompound = Class.forName("net.minecraft.server." + version + "NBTTagCompound");
  56. }
  57.  
  58. HoloComponent.init(packetTeleport, armorStand, craftPlayer, entityPlayer, playerConnection, packetRaw,
  59. entity);
  60.  
  61. ready = true;
  62. } catch (ClassNotFoundException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66.  
  67. public void addLine(String msg) {
  68. messages.add(msg);
  69. }
  70.  
  71. public void addLines(String... msg) {
  72. messages.addAll(Arrays.asList(msg));
  73. }
  74.  
  75. public void setLine(int num, String message) {
  76. messages.set(num, message);
  77. }
  78.  
  79. public void setLocation(Location loc) {
  80. this.defaultLocation = loc.clone();
  81. }
  82.  
  83. public void setSpace(double space) {
  84. this.space = space;
  85. }
  86.  
  87. public double getSpace() {
  88. return this.space;
  89. }
  90.  
  91. public List<String> getLines() {
  92. return messages;
  93. }
  94.  
  95. public String getLine(int line) {
  96. if (messages.size() <= line) {
  97. return null;
  98. }
  99.  
  100. return messages.get(line);
  101. }
  102.  
  103. private double space = 0.3;
  104. private HashMap<Player, HoloComponent> holoMap = new HashMap<>();
  105.  
  106. public void display(Player... players) {
  107. for (Player p : players) {
  108.  
  109. if (holoMap.containsKey(p)) {
  110. continue;
  111. }
  112.  
  113. Location loc = defaultLocation;
  114. if (locMap.containsKey(p)) {
  115. loc = locMap.get(p);
  116. }
  117.  
  118. loc = loc.clone();
  119.  
  120. try {
  121. Object w = craftWorld.cast(loc.getWorld());
  122. Method getHandleMethod = craftWorld.getMethod("getHandle");
  123. Object wServer = getHandleMethod.invoke(w);
  124.  
  125. List<Object> armorStands = new ArrayList<Object>();
  126.  
  127. Collections.reverse(messages);
  128. for (String msg : messages) {
  129. Object armorStandEntity = armorStand.getConstructor(world).newInstance(world.cast(wServer));
  130. displayArmorStand(p, armorStandEntity, loc.add(0, space, 0), msg);
  131. armorStands.add(armorStandEntity);
  132. }
  133.  
  134. Collections.reverse(armorStands);
  135. HoloComponent comp = new HoloComponent(p, armorStands, space);
  136. holoMap.put(p, comp);
  137.  
  138. Collections.reverse(messages);
  139. } catch (Exception e) {
  140. e.printStackTrace();
  141. }
  142. }
  143. }
  144.  
  145. public void teleport(Location loc, Player... players) {
  146. loc = loc.clone();
  147. for (Player p : players) {
  148. if (!holoMap.containsKey(p)) {
  149. continue;
  150. }
  151.  
  152. HoloComponent comp = holoMap.get(p);
  153. comp.teleport(loc);
  154. locMap.put(p, loc);
  155. }
  156. }
  157.  
  158. public void removeFrom(Player... players) {
  159. for (Player p : players) {
  160.  
  161. if (!holoMap.containsKey(p)) {
  162. continue;
  163. }
  164.  
  165. try {
  166. List<Integer> idList = holoMap.get(p).armorStandIDList();
  167. int[] ids = new int[idList.size()];
  168.  
  169. int count = 0;
  170. for (Integer i : idList) {
  171. ids[count] = i.intValue();
  172. count++;
  173. }
  174.  
  175. Object packet = packetDestroy.getConstructor(int[].class).newInstance(ids);
  176. sendPacket(p, packet);
  177. } catch (Exception e) {
  178. e.printStackTrace();
  179. continue;
  180. }
  181.  
  182. holoMap.remove(p);
  183. }
  184. }
  185.  
  186. public void removeAll() {
  187. for (Player p : holoMap.keySet()) {
  188. removeFrom(p);
  189. }
  190. }
  191.  
  192. public void update(Player... players) {
  193. removeFrom(players);
  194. display(players);
  195. }
  196.  
  197. private int displayArmorStand(Player p, Object armorStandEntity, Location loc, String msg) {
  198. try {
  199. Method setName;
  200. if (versionNumber >= 13)
  201. setName = armorStand.getMethod("setCustomName", iChatBaseComponent);
  202. else
  203. setName = armorStand.getMethod("setCustomName", String.class);
  204. Method setNameVisible = armorStand.getMethod("setCustomNameVisible", boolean.class);
  205. Method invisible = armorStand.getMethod("setInvisible", boolean.class);
  206. Method marker = null;
  207. if (versionNumber >= 9)
  208. marker = armorStand.getMethod("setMarker", boolean.class);
  209. Method small = armorStand.getMethod("setSmall", boolean.class);
  210. Method location = armorStand.getMethod("setLocation", double.class, double.class, double.class, float.class,
  211. float.class);
  212.  
  213. if (versionNumber <= 8) {
  214. loc = loc.clone();
  215. loc.subtract(0, 1, 0);
  216. Object nbtTag = nbtTagCompound.getConstructor().newInstance();
  217. Method setBoolean = nbtTagCompound.getMethod("setBoolean", String.class, boolean.class);
  218. setBoolean.invoke(nbtTag, "Marker", true);
  219. setBoolean.invoke(nbtTag, "Small", true);
  220. Method setNBT = armorStand.getMethod("a", nbtTagCompound);
  221. setNBT.invoke(armorStandEntity, nbtTag);
  222. }
  223. if (versionNumber >= 13)
  224. setName.invoke(armorStandEntity, chatComponentText.getConstructor(String.class).newInstance(msg));
  225. else
  226. setName.invoke(armorStandEntity, msg);
  227. setNameVisible.invoke(armorStandEntity, true);
  228. invisible.invoke(armorStandEntity, true);
  229. if (versionNumber >= 9) {
  230. marker.invoke(armorStandEntity, true);
  231. small.invoke(armorStandEntity, true);
  232. }
  233. location.invoke(armorStandEntity, loc.getX(), loc.getY() - 0.7, loc.getZ(), 0f, 0f);
  234.  
  235. Object packet = spawnPacket.getConstructor(entityLiving).newInstance(entityLiving.cast(armorStandEntity));
  236.  
  237. sendPacket(p, packet);
  238.  
  239. return (int) armorStand.getMethod("getId").invoke(armorStandEntity);
  240. } catch (Exception e) {
  241. e.printStackTrace();
  242. return -1;
  243. }
  244. }
  245.  
  246. private static void sendPacket(Player p, Object packet) throws Exception {
  247. Object handle = craftPlayer.getMethod("getHandle").invoke(craftPlayer.cast(p));
  248. Object connection = entityPlayer.getField("playerConnection").get(handle);
  249. playerConnection.getMethod("sendPacket", packetRaw).invoke(connection, packet);
  250. }
  251.  
  252. public static Hologram create() {
  253.  
  254. if (!ready) {
  255. throw new IllegalStateException("Not ready yet or failed to initialize.");
  256. }
  257.  
  258. return new Hologram();
  259. }
  260.  
  261. public static Hologram create(String message) {
  262.  
  263. if (!ready) {
  264. throw new IllegalStateException("Not ready yet or failed to initialize.");
  265. }
  266.  
  267. return new Hologram(message);
  268. }
  269.  
  270. public static Hologram create(Location loc) {
  271.  
  272. if (!ready) {
  273. throw new IllegalStateException("Not ready yet or failed to initialize.");
  274. }
  275.  
  276. return new Hologram(loc);
  277. }
  278.  
  279. public static Hologram create(String message, Location loc) {
  280.  
  281. if (!ready) {
  282. throw new IllegalStateException("Not ready yet or failed to initialize.");
  283. }
  284.  
  285. return new Hologram(message, loc);
  286. }
  287.  
  288. private Hologram() {
  289.  
  290. }
  291.  
  292. private Hologram(String message) {
  293. messages.add(message);
  294. }
  295.  
  296. private Hologram(Location loc) {
  297. this.defaultLocation = loc.clone();
  298. }
  299.  
  300. private Hologram(String message, Location loc) {
  301. this.messages.add(message);
  302. this.defaultLocation = loc.clone();
  303. }
  304. }
  305.  
  306. class HoloComponent {
  307.  
  308. private List<Object> entityArmorStandList = new ArrayList<>();
  309.  
  310. private static Class<?> packetTeleport, armorStand, craftPlayer, entityPlayer, playerConnection, packetRaw, entity;
  311. private double space;
  312. private Player player;
  313.  
  314. public static void init(Class<?> packetTeleport, Class<?> armorStand, Class<?> craftPlayer, Class<?> entityPlayer,
  315. Class<?> playerConnection, Class<?> packetRaw, Class<?> entity) {
  316. HoloComponent.packetTeleport = packetTeleport;
  317. HoloComponent.armorStand = armorStand;
  318. HoloComponent.craftPlayer = craftPlayer;
  319. HoloComponent.entityPlayer = entityPlayer;
  320. HoloComponent.playerConnection = playerConnection;
  321. HoloComponent.packetRaw = packetRaw;
  322. HoloComponent.entity = entity;
  323. }
  324.  
  325. public HoloComponent(Player p, List<Object> entities, double space) {
  326. this.player = p;
  327. this.entityArmorStandList = entities;
  328. this.space = space;
  329. }
  330.  
  331. public void teleport(Location loc) {
  332. loc = loc.clone();
  333. Collections.reverse(entityArmorStandList);
  334.  
  335. for (Object armorStandEntity : entityArmorStandList) {
  336. try {
  337. armorStand.getMethod("setLocation", double.class, double.class, double.class, float.class, float.class)
  338. .invoke(armorStandEntity, loc.getX(), loc.getY(), loc.getZ(), 0f, 0f);
  339.  
  340. Object packet = packetTeleport.getConstructor(entity).newInstance(armorStandEntity);
  341. sendPacket(player, packet);
  342. } catch (Exception e) {
  343. e.printStackTrace();
  344. }
  345.  
  346. loc.add(0, space, 0);
  347. }
  348.  
  349. Collections.reverse(entityArmorStandList);
  350. }
  351.  
  352. public List<Integer> armorStandIDList() {
  353. List<Integer> idList = new ArrayList<>();
  354.  
  355. for (Object entityArmorStand : entityArmorStandList) {
  356. try {
  357. idList.add((int) armorStand.getMethod("getId").invoke(entityArmorStand));
  358. } catch (Exception e) {
  359. e.printStackTrace();
  360. }
  361. }
  362.  
  363. return idList;
  364. }
  365.  
  366. private static void sendPacket(Player p, Object packet) throws Exception {
  367. Object handle = craftPlayer.getMethod("getHandle").invoke(craftPlayer.cast(p));
  368. Object connection = entityPlayer.getField("playerConnection").get(handle);
  369. playerConnection.getMethod("sendPacket", packetRaw).invoke(connection, packet);
  370. }
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement