Skip to content

Instantly share code, notes, and snippets.

@Twister915
Created May 28, 2014 21:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Twister915/c7777a5f1578cd0b4e80 to your computer and use it in GitHub Desktop.
Save Twister915/c7777a5f1578cd0b4e80 to your computer and use it in GitHub Desktop.
Ender Bar ProtocolLib example (irrelevant without code from this project, but it's still pretty cool)
package net.cogzmc.core.enderBar;
import com.comphenix.packetwrapper.WrapperPlayServerEntityDestroy;
import com.comphenix.packetwrapper.WrapperPlayServerEntityMetadata;
import com.comphenix.packetwrapper.WrapperPlayServerEntityTeleport;
import com.comphenix.packetwrapper.WrapperPlayServerSpawnEntityLiving;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
import net.cogzmc.core.player.CPlayer;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
@Data
final class EnderBar {
private final CPlayer player;
private final Integer id;
private String text;
private Float health = 1f;
@Setter(AccessLevel.NONE) private boolean spawned;
@Setter(AccessLevel.NONE) private Location currentLocation;
private final WrappedDataWatcher dataWatcher = new WrappedDataWatcher();
void spawn() {
if (spawned) throw new IllegalStateException("You cannot spawn this entity twice!");
WrapperPlayServerSpawnEntityLiving packet = new WrapperPlayServerSpawnEntityLiving();
packet.setHeadYaw(0f);
packet.setHeadPitch(0f);
packet.setEntityID(id);
updateDataWatcher();
packet.setMetadata(dataWatcher);
packet.setType(EntityType.ENDER_DRAGON);
currentLocation = getBestLocation();
packet.setX(currentLocation.getX());
packet.setY(currentLocation.getY());
packet.setZ(currentLocation.getZ());
packet.sendPacket(player.getBukkitPlayer());
spawned = true;
}
void updateLocation() {
if (!spawned) return;
WrapperPlayServerEntityTeleport entityTeleport = new WrapperPlayServerEntityTeleport();
entityTeleport.setEntityID(id);
currentLocation = getBestLocation();
entityTeleport.setX(currentLocation.getX());
entityTeleport.setY(currentLocation.getY());
entityTeleport.setZ(currentLocation.getZ());
entityTeleport.setPitch(0f);
entityTeleport.setYaw(0f);
entityTeleport.sendPacket(player.getBukkitPlayer());
}
void remove() {
if (!spawned) throw new IllegalStateException("You cannot remove an entity that has not spawned!");
WrapperPlayServerEntityDestroy destroyPacket = new WrapperPlayServerEntityDestroy();
destroyPacket.setEntities(new int[]{id});
destroyPacket.sendPacket(player.getBukkitPlayer());
spawned = false;
}
void update() {
if (!spawned) return;
updateDataWatcher();
WrapperPlayServerEntityMetadata metaPacket = new WrapperPlayServerEntityMetadata();
metaPacket.setEntityId(id);
metaPacket.setEntityMetadata(dataWatcher.getWatchableObjects());
metaPacket.sendPacket(player.getBukkitPlayer());
}
void newWorld() {
if (!spawned) return;
spawned = false;
spawn();
}
void setText(String text) {
this.text = ChatColor.translateAlternateColorCodes('&',text.substring(0, Math.min(64, text.length())));
update();
}
void setHealth(Float health) {
this.health = health;
update();
}
Location getBestLocation() {
return player.getBukkitPlayer().getLocation().clone().add(0, -300, 0);
}
private void updateDataWatcher() {
dataWatcher.setObject(6, health*200f); //Set the health (health is a %, 200 is the actual health)
if (text != null) dataWatcher.setObject(10, text); //Set the display name text now.
}
}
package net.cogzmc.core.enderBar;
import lombok.Data;
import net.cogzmc.core.Core;
import net.cogzmc.core.player.CPlayer;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerMoveEvent;
@Data
final class EnderBarListener implements Listener {
private final EnderBarManager manager;
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerMove(PlayerMoveEvent event) {
CPlayer onlinePlayer = Core.getOnlinePlayer(event.getPlayer());
EnderBar enderBarFor = manager.getEnderBarFor(onlinePlayer);
if (enderBarFor != null && enderBarFor.isSpawned() && event.getTo().distanceSquared(enderBarFor.getCurrentLocation()) > 25) enderBarFor.updateLocation();
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerChangeWorld(PlayerChangedWorldEvent event) {
CPlayer player = Core.getOnlinePlayer(event.getPlayer());
EnderBar enderBarFor = manager.getEnderBarFor(player);
enderBarFor.newWorld();
}
}
package net.cogzmc.core.enderBar;
import net.cogzmc.core.Core;
import net.cogzmc.core.player.CPlayer;
import net.cogzmc.core.player.CPlayerConnectionListener;
import net.cogzmc.core.player.CPlayerJoinException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
/**
*
*/
@SuppressWarnings("UnusedDeclaration")
public final class EnderBarManager implements CPlayerConnectionListener {
private final Map<CPlayer, EnderBar> enderBars = new HashMap<>();
private int lastId = 3000;
/**
* Creates a manager for the EnderBar system.
*/
public EnderBarManager() {
Core.getPlayerManager().registerCPlayerConnectionListener(this); //Registers us as a listener so we can remove our CPlayer references when they disconnect.
Core.getInstance().registerListener(new EnderBarListener(this)); //Also need to move the ender dragon around.
}
/**
* Creates an Ender Dragon for the player if it does not exist, then updates the text for the dragon.
* @param player The {@link net.cogzmc.core.player.CPlayer} to set ender bar text for.
* @param text The text to set the bar to.
*/
public void setTextFor(CPlayer player, String text) {
createIfDoesNotExist(player);
enderBars.get(player).setText(text);
}
/**
* Creates an Ender Dragon for the player if it does not exist, then updates the health percentage for that dragon.
* @param player The {@link net.cogzmc.core.player.CPlayer} to set ender bar health for.
* @param health The health to set the ender dragon's bar to.
*/
public void setHealthPercentageFor(CPlayer player, Float health) {
createIfDoesNotExist(player);
enderBars.get(player).setHealth(health);
}
/**
* Hides the bar for the specified player if it is currently visible.
* @param player The {@link net.cogzmc.core.player.CPlayer} to hide the bar for.
*/
public void hideBarFor(CPlayer player) {
if (!enderBars.containsKey(player)) return;
EnderBar enderBar = enderBars.get(player);
if (enderBar.isSpawned()) enderBar.remove();
}
/**
* Creates an ender dragon if the player does not already have one, and then shows it if it is hidden.
* @param player The {@link net.cogzmc.core.player.CPlayer} to show the ender bar for.
*/
public void showBarFor(CPlayer player) {
EnderBar enderBar = enderBars.get(player);
if (!createIfDoesNotExist(player) && !enderBar.isSpawned()) enderBar.spawn();
}
private boolean createIfDoesNotExist(CPlayer player) {
if (enderBars.containsKey(player)) return false;
EnderBar enderBar = new EnderBar(player, getNextId());
enderBar.spawn();
enderBars.put(player, enderBar);
return true;
}
Integer getNextId() {
lastId++;
return lastId;
}
@Override
public void onPlayerLogin(CPlayer player, InetAddress address) throws CPlayerJoinException {
}
@Override
public void onPlayerDisconnect(CPlayer player) {
this.enderBars.remove(player);
}
EnderBar getEnderBarFor(CPlayer player) {
return this.enderBars.get(player);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment