Vinetos

[Packets Bukkit] BossBar API [Protocolib]

Oct 27th, 2015
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.18 KB | None | 0 0
  1. package au.com.addstar.pandora;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.util.WeakHashMap;
  5.  
  6. import org.apache.commons.lang.Validate;
  7. import org.bukkit.Bukkit;
  8. import org.bukkit.Location;
  9. import org.bukkit.entity.Player;
  10. import org.bukkit.event.EventHandler;
  11. import org.bukkit.event.EventPriority;
  12. import org.bukkit.event.Listener;
  13. import org.bukkit.event.player.PlayerMoveEvent;
  14. import org.bukkit.plugin.Plugin;
  15.  
  16. import com.comphenix.protocol.PacketType;
  17. import com.comphenix.protocol.ProtocolLibrary;
  18. import com.comphenix.protocol.ProtocolManager;
  19. import com.comphenix.protocol.events.PacketContainer;
  20. import com.comphenix.protocol.wrappers.WrappedDataWatcher;
  21.  
  22. public class DisplayManager
  23. {
  24.     private static final int ENTITY_DRAGON_ID = 999999999;
  25.    
  26.     private static WeakHashMap<Player, DisplayManager> mAllManagers = new WeakHashMap<Player, DisplayManager>();
  27.     private static ProtocolManager mLib;
  28.    
  29.     private Player mPlayer;
  30.     private Location mLocation;
  31.    
  32.     private boolean mShowBossBar;
  33.     private String mCurrentBossText;
  34.     private float mCurrentBossValue;
  35.    
  36.     private DisplayManager(Player player)
  37.     {
  38.         mPlayer = player;
  39.         mLocation = mPlayer.getLocation();
  40.         mShowBossBar = false;
  41.     }
  42.    
  43.     public void updateDisplays()
  44.     {
  45.         Location loc = mPlayer.getLocation();
  46.        
  47.         if(mShowBossBar)
  48.         {
  49.             if(mLocation.getWorld() != loc.getWorld())
  50.             {
  51.                 int value = (int)Math.min(Math.max(mCurrentBossValue * 200, 0), 200);
  52.                 spawnFakeDragon(mCurrentBossText, value);
  53.             }
  54.             else
  55.             {
  56.                 double dist = mLocation.distanceSquared(loc);
  57.                
  58.                 if(dist >= 640000)
  59.                 {
  60.                     int value = (int)Math.min(Math.max(mCurrentBossValue * 200, 0), 200);
  61.                     spawnFakeDragon(mCurrentBossText, value);
  62.                     mLocation = loc;
  63.                 }
  64.                 else if(dist > 500)
  65.                 {
  66.                     positionDragon();
  67.                     mLocation = loc;
  68.                 }
  69.             }
  70.         }
  71.     }
  72.    
  73.     public void displayBossBar(String text, float percent)
  74.     {
  75.         mCurrentBossText = text;
  76.         mCurrentBossValue = percent;
  77.         int value = (int)Math.min(Math.max(percent * 200, 0), 200);
  78.        
  79.         if(mShowBossBar)
  80.             spawnFakeDragon(text, value);
  81.         else
  82.             updateDragonStats(text, value);
  83.        
  84.         mShowBossBar = true;
  85.     }
  86.    
  87.     public void hideBossBar()
  88.     {
  89.         if(!mShowBossBar)
  90.             return;
  91.        
  92.         mShowBossBar = false;
  93.         removeDragon();
  94.     }
  95.    
  96.     private void spawnFakeDragon(String name, int health)
  97.     {
  98.         Location loc = mPlayer.getLocation();
  99.        
  100.         PacketContainer spawnPacket = mLib.createPacket(PacketType.Play.Server.SPAWN_ENTITY_LIVING);
  101.         spawnPacket.getIntegers().write(0, ENTITY_DRAGON_ID); // EntityId
  102.         spawnPacket.getIntegers().write(1, 63); // EntityType
  103.         spawnPacket.getIntegers().write(2, loc.getBlockX() * 32); // X
  104.         spawnPacket.getIntegers().write(3, -500 * 32); // Y
  105.         spawnPacket.getIntegers().write(4, loc.getBlockZ() * 32); // Z
  106.         spawnPacket.getBytes().write(0, (byte)0); // Yaw
  107.         spawnPacket.getBytes().write(1, (byte)0); // Pitch
  108.         spawnPacket.getBytes().write(2, (byte)0); // ? head?
  109.        
  110.         spawnPacket.getIntegers().write(5, 0); // MotX
  111.         spawnPacket.getIntegers().write(6, 0); // MotY
  112.         spawnPacket.getIntegers().write(7, 0); // MotZ
  113.        
  114.         WrappedDataWatcher wrapper = new WrappedDataWatcher();
  115.        
  116.         if(name.length() > 64)
  117.             name = name.substring(0,64);
  118.         wrapper.setObject(0, (byte)0x20);
  119.         wrapper.setObject(6, Float.valueOf(health));
  120.         wrapper.setObject(10, name);
  121.         wrapper.setObject(11, Byte.valueOf((byte)1));
  122.        
  123.         spawnPacket.getDataWatcherModifier().write(0, wrapper); // DataWatcher
  124.        
  125.         try
  126.         {
  127.             mLib.sendServerPacket(mPlayer, spawnPacket, false);
  128.         }
  129.         catch ( InvocationTargetException e )
  130.         {
  131.             e.printStackTrace();
  132.         }
  133.     }
  134.    
  135.     private void updateDragonStats(String name, int health)
  136.     {
  137.         PacketContainer update = mLib.createPacket(PacketType.Play.Server.ENTITY_METADATA);
  138.         update.getIntegers().write(0, ENTITY_DRAGON_ID); // EntityId
  139.        
  140.         WrappedDataWatcher wrapper = new WrappedDataWatcher();
  141.        
  142.         if(name.length() > 64)
  143.             name = name.substring(0,64);
  144.         wrapper.setObject(0, (byte)0x20);
  145.         wrapper.setObject(6, Float.valueOf(health));
  146.         wrapper.setObject(10, name);
  147.         wrapper.setObject(11, Byte.valueOf((byte)1));
  148.        
  149.         update.getWatchableCollectionModifier().write(0, wrapper.getWatchableObjects()); // DataWatcher
  150.        
  151.         try
  152.         {
  153.             mLib.sendServerPacket(mPlayer, update, false);
  154.         }
  155.         catch ( InvocationTargetException e )
  156.         {
  157.             e.printStackTrace();
  158.         }
  159.     }
  160.    
  161.     private void positionDragon()
  162.     {
  163.         Location loc = mPlayer.getLocation();
  164.        
  165.         PacketContainer movePacket = mLib.createPacket(PacketType.Play.Server.ENTITY_TELEPORT);
  166.         movePacket.getIntegers().write(0, ENTITY_DRAGON_ID); // EntityId
  167.         movePacket.getIntegers().write(1, loc.getBlockX() * 32); // X
  168.         movePacket.getIntegers().write(2, -500 * 32); // Y
  169.         movePacket.getIntegers().write(3, loc.getBlockZ() * 32); // Z
  170.         movePacket.getBytes().write(0, (byte)0); // Yaw
  171.         movePacket.getBytes().write(1, (byte)0); // Pitch
  172.        
  173.  
  174.         try
  175.         {
  176.             mLib.sendServerPacket(mPlayer, movePacket, false);
  177.         }
  178.         catch ( InvocationTargetException e )
  179.         {
  180.             e.printStackTrace();
  181.         }
  182.     }
  183.    
  184.     private void removeDragon()
  185.     {
  186.         PacketContainer deletePacket = mLib.createPacket(PacketType.Play.Server.ENTITY_DESTROY);
  187.         deletePacket.getIntegerArrays().write(0, new int[] {ENTITY_DRAGON_ID});
  188.        
  189.         try
  190.         {
  191.             mLib.sendServerPacket(mPlayer, deletePacket, false);
  192.         }
  193.         catch ( InvocationTargetException e )
  194.         {
  195.             e.printStackTrace();
  196.         }
  197.     }
  198.    
  199.     public static void initialize(Plugin plugin)
  200.     {
  201.         Validate.isTrue(mLib == null);
  202.        
  203.         mLib = ProtocolLibrary.getProtocolManager();
  204.        
  205.         Bukkit.getPluginManager().registerEvents(new DisplayListener(), plugin);
  206.     }
  207.    
  208.     public static DisplayManager getDisplayManager(Player player)
  209.     {
  210.         DisplayManager manager = mAllManagers.get(player);
  211.         if(manager == null)
  212.         {
  213.             manager = new DisplayManager(player);
  214.             mAllManagers.put(player, manager);
  215.         }
  216.        
  217.         return manager;
  218.     }
  219.    
  220.     private static class DisplayListener implements Listener
  221.     {
  222.         @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  223.         private void onPlayerMove(PlayerMoveEvent event)
  224.         {
  225.             DisplayManager manager = mAllManagers.get(event.getPlayer());
  226.             if(manager != null)
  227.                 manager.updateDisplays();
  228.         }
  229.     }
  230. }
Advertisement
Add Comment
Please, Sign In to add comment