Skip to content

Instantly share code, notes, and snippets.

@chaseking
Created July 21, 2013 22:15

Revisions

  1. Chase created this gist Jul 21, 2013.
    187 changes: 187 additions & 0 deletions Utilizing the Boss Health Bar
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,187 @@
    package com.chasechocolate.example;

    import java.lang.reflect.Field;
    import java.util.HashMap;

    import net.minecraft.server.v1_6_R2.DataWatcher;
    import net.minecraft.server.v1_6_R2.EntityPlayer;
    import net.minecraft.server.v1_6_R2.Packet;
    import net.minecraft.server.v1_6_R2.Packet205ClientCommand;
    import net.minecraft.server.v1_6_R2.Packet24MobSpawn;
    import net.minecraft.server.v1_6_R2.Packet29DestroyEntity;
    import net.minecraft.server.v1_6_R2.Packet40EntityMetadata;

    import org.bukkit.Location;
    import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.Player;
    import org.bukkit.scheduler.BukkitRunnable;

    public class PacketUtils {
    public static final int ENTITY_ID = 1234;

    private static HashMap<String, Boolean> hasHealthBar = new HashMap<String, Boolean>();

    public static void sendPacket(Player player, Packet packet){
    EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();

    entityPlayer.playerConnection.sendPacket(packet);
    }

    //Accessing packets
    public static Packet24MobSpawn getMobPacket(String text, Location loc){
    Packet24MobSpawn mobPacket = new Packet24MobSpawn();

    mobPacket.a = (int) ENTITY_ID; //Entity ID
    mobPacket.b = (byte) EntityType.WITHER.getTypeId(); //Mob type (ID: 64)
    mobPacket.c = (int) Math.floor(loc.getBlockX() * 32.0D); //X position
    mobPacket.d = (int) Math.floor(loc.getBlockY() * 32.0D); //Y position
    mobPacket.e = (int) Math.floor(loc.getBlockZ() * 32.0D); //Z position
    mobPacket.f = (byte) 0; //Pitch
    mobPacket.g = (byte) 0; //Head Pitch
    mobPacket.h = (byte) 0; //Yaw
    mobPacket.i = (short) 0; //X velocity
    mobPacket.j = (short) 0; //Y velocity
    mobPacket.k = (short) 0; //Z velocity

    DataWatcher watcher = getWatcher(text, 300);

    try{
    Field t = Packet24MobSpawn.class.getDeclaredField("t");

    t.setAccessible(true);
    t.set(mobPacket, watcher);
    } catch(Exception e){
    e.printStackTrace();
    }

    return mobPacket;
    }

    public static Packet29DestroyEntity getDestroyEntityPacket(){
    Packet29DestroyEntity packet = new Packet29DestroyEntity();

    packet.a = new int[]{ENTITY_ID};

    return packet;
    }

    public static Packet40EntityMetadata getMetadataPacket(DataWatcher watcher){
    Packet40EntityMetadata metaPacket = new Packet40EntityMetadata();

    metaPacket.a = (int) ENTITY_ID;

    try{
    Field b = Packet40EntityMetadata.class.getDeclaredField("b");

    b.setAccessible(true);
    b.set(metaPacket, watcher.c());
    } catch(Exception e){
    e.printStackTrace();
    }

    return metaPacket;
    }

    public static Packet205ClientCommand getRespawnPacket(){
    Packet205ClientCommand packet = new Packet205ClientCommand();

    packet.a = (int) 1;

    return packet;
    }

    public static DataWatcher getWatcher(String text, int health){
    DataWatcher watcher = new DataWatcher();

    watcher.a(0, (Byte) (byte) 0x20); //Flags, 0x20 = invisible
    watcher.a(6, (Float) (float) health);
    watcher.a(10, (String) text); //Entity name
    watcher.a(11, (Byte) (byte) 1); //Show name, 1 = show, 0 = don't show
    //watcher.a(16, (Integer) (int) health); //Wither health, 300 = full health

    return watcher;
    }

    //Other methods
    public static void displayTextBar(String text, final Player player){
    Packet24MobSpawn mobPacket = getMobPacket(text, player.getLocation());

    sendPacket(player, mobPacket);
    hasHealthBar.put(player.getName(), true);

    new BukkitRunnable(){
    @Override
    public void run(){
    Packet29DestroyEntity destroyEntityPacket = getDestroyEntityPacket();

    sendPacket(player, destroyEntityPacket);
    hasHealthBar.put(player.getName(), false);
    }
    }.runTaskLater(MinecraftFPS.getInstance(), 120L);
    }

    public static void displayLoadingBar(final String text, final String completeText, final Player player, final int healthAdd, final long delay, final boolean loadUp){
    Packet24MobSpawn mobPacket = getMobPacket(text, player.getLocation());

    sendPacket(player, mobPacket);
    hasHealthBar.put(player.getName(), true);

    new BukkitRunnable(){
    int health = (loadUp ? 0 : 300);

    @Override
    public void run(){
    if((loadUp ? health < 300 : health > 0)){
    DataWatcher watcher = getWatcher(text, health);
    Packet40EntityMetadata metaPacket = getMetadataPacket(watcher);

    sendPacket(player, metaPacket);

    if(loadUp){
    health += healthAdd;
    } else {
    health -= healthAdd;
    }
    } else {
    DataWatcher watcher = getWatcher(text, (loadUp ? 300 : 0));
    Packet40EntityMetadata metaPacket = getMetadataPacket(watcher);
    Packet29DestroyEntity destroyEntityPacket = getDestroyEntityPacket();

    sendPacket(player, metaPacket);
    sendPacket(player, destroyEntityPacket);
    hasHealthBar.put(player.getName(), false);

    //Complete text
    Packet24MobSpawn mobPacket = getMobPacket(completeText, player.getLocation());

    sendPacket(player, mobPacket);
    hasHealthBar.put(player.getName(), true);

    DataWatcher watcher2 = getWatcher(completeText, 300);
    Packet40EntityMetadata metaPacket2 = getMetadataPacket(watcher2);

    sendPacket(player, metaPacket2);

    new BukkitRunnable(){
    @Override
    public void run(){
    Packet29DestroyEntity destroyEntityPacket = getDestroyEntityPacket();

    sendPacket(player, destroyEntityPacket);
    hasHealthBar.put(player.getName(), false);
    }
    }.runTaskLater(MinecraftFPS.getInstance(), 40L);

    this.cancel();
    }
    }
    }.runTaskTimer(MinecraftFPS.getInstance(), delay, delay);
    }

    public static void displayLoadingBar(final String text, final String completeText, final Player player, final int secondsDelay, final boolean loadUp){
    final int healthChangePerSecond = 300 / secondsDelay;

    displayLoadingBar(text, completeText, player, healthChangePerSecond, 20L, loadUp);
    }
    }