Created
May 28, 2014 21:37
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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