I use this code in bukkit:
package de.howaner.OITC.util;
import de.howaner.OITC.OITCPlugin;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.server.v1_7_R3.DataWatcher;
import net.minecraft.server.v1_7_R3.EntityPlayer;
import net.minecraft.server.v1_7_R3.EnumClientCommand;
import net.minecraft.server.v1_7_R3.Packet;
import net.minecraft.server.v1_7_R3.PacketPlayInClientCommand;
import net.minecraft.server.v1_7_R3.PacketPlayOutEntityDestroy;
import net.minecraft.server.v1_7_R3.PacketPlayOutEntityMetadata;
import net.minecraft.server.v1_7_R3.PacketPlayOutEntityTeleport;
import net.minecraft.server.v1_7_R3.PacketPlayOutSpawnEntityLiving;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
public class StatusBar {
public static final int ENTITY_ID = 1234;
public static List<String> hasHealthBar = new ArrayList<String>();
public static Map<String, Integer> schedulers = new HashMap<String, Integer>();
/* Set Variable with Reflections */
public static void setVar(String key, Object value, Object c) {
try {
Field f = c.getClass().getDeclaredField(key);
f.setAccessible(true);
f.set(c, value);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void sendPacket(Player player, Packet packet) {
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
entityPlayer.playerConnection.sendPacket(packet);
}
//Accessing packets
public static PacketPlayOutSpawnEntityLiving getMobPacket(String text, Location loc, int health) {
PacketPlayOutSpawnEntityLiving mobPacket = new PacketPlayOutSpawnEntityLiving();
setVar("a", (int) ENTITY_ID, mobPacket);
setVar("b", (byte) EntityType.ENDER_DRAGON.getTypeId(), mobPacket);
setVar("c", (int) Math.floor(loc.getBlockX() * 32.0D), mobPacket);
setVar("d", (int) Math.floor(loc.getBlockY() * 32.0D), mobPacket);
setVar("e", (int) Math.floor(loc.getBlockZ() * 32.0D), mobPacket);
setVar("f", (int) 0, mobPacket);
setVar("g", (byte) 0, mobPacket);
setVar("h", (byte) 0, mobPacket);
setVar("i", (byte) 0, mobPacket);
setVar("j", (byte) 0, mobPacket);
setVar("k", (byte) 0, mobPacket);
setVar("l", getWatcher(text, health), mobPacket);
return mobPacket;
}
public static PacketPlayOutEntityDestroy getDestroyEntityPacket() {
PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy();
setVar("a", new int[]{ENTITY_ID}, packet);
return packet;
}
public static PacketPlayOutEntityMetadata getMetadataPacket(DataWatcher watcher) {
PacketPlayOutEntityMetadata metaPacket = new PacketPlayOutEntityMetadata();
setVar("a", (int) ENTITY_ID, metaPacket);
setVar("b", watcher.c(), metaPacket);
return metaPacket;
}
public static PacketPlayOutEntityTeleport getTeleportPacket(Location loc) {
PacketPlayOutEntityTeleport packet = new PacketPlayOutEntityTeleport();
setVar("a", (int) ENTITY_ID, packet);
setVar("b", (int) Math.floor(loc.getX() * 32.0D), packet);
setVar("c", (int) Math.floor(loc.getY() * 32.0D), packet);
setVar("d", (int) Math.floor(loc.getZ() * 32.0D), packet);
setVar("e", (byte) ((int) (loc.getYaw() * 256.0F / 360.F)), packet);
setVar("f", (byte) ((int) (loc.getPitch() * 256.0F / 360.0F)), packet);
return packet;
}
public static PacketPlayInClientCommand getRespawnPacket() {
PacketPlayInClientCommand packet = new PacketPlayInClientCommand();
setVar("a", EnumClientCommand.PERFORM_RESPAWN, packet);
return packet;
}
public static DataWatcher getWatcher(String text, int health) {
DataWatcher watcher = new DataWatcher(null);
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;
}
public static void displayTextBar(String text, final Player player) {
displayTextBar(text, player, 200, -1);
}
public static void displayTextBar(String text, final Player player, int health, int time) {
if (hasHealthBar.contains(player.getName())) {
if (schedulers.containsKey(player.getName()))
Bukkit.getScheduler().cancelTask(schedulers.get(player.getName()));
schedulers.remove(player.getName());
sendPacket(player, getMetadataPacket(getWatcher(text, health)));
if (time != -1) {
schedulers.put(player.getName(), Bukkit.getScheduler().scheduleSyncDelayedTask(OITCPlugin.getPlugin(), new Runnable() {
@Override
public void run(){
PacketPlayOutEntityDestroy destroyEntityPacket = getDestroyEntityPacket();
sendPacket(player, destroyEntityPacket);
hasHealthBar.remove(player.getName());
schedulers.remove(player.getName());
}
}, 20L * time));
}
return;
}
PacketPlayOutSpawnEntityLiving mobPacket = getMobPacket(text, player.getLocation().clone().add(0, -200, 0), health);
sendPacket(player, mobPacket);
hasHealthBar.add(player.getName());
if (time != -1) {
schedulers.put(player.getName(), Bukkit.getScheduler().scheduleSyncDelayedTask(OITCPlugin.getPlugin(), new Runnable() {
@Override
public void run(){
PacketPlayOutEntityDestroy destroyEntityPacket = getDestroyEntityPacket();
sendPacket(player, destroyEntityPacket);
hasHealthBar.remove(player.getName());
schedulers.remove(player.getName());
}
}, 20L * time));
}
}
}