Ir para conteúdo

[API] BossBar


AstroCoder

Posts Recomendados

BossBar
 
Requer: ProtocolLib
 
Bem a uns dias atrás comecei a fazer o core da minha network e comecei a perceber
que precisava de uma BossBar para passar mais facilmente anúncios e não estar
a utilizar excessivamente o Title,chat ou o ActionBar, portanto peguei no protocol lib e
fiz esta pequena api para me ajudar neste trabalho. Se tás a perguntar o porque de usar
protocol lib a resposta é muito simples por mais que eu adore NMS/Packets etc ele faz esse trabalho ser mais fácil
 
BossBar Classe:

import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

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

public class BossBar {

    private static int enderdragonId;
    private static Plugin plugin = aTuaMainClass;
    private static HashMap<String, BukkitRunnable> toHide = new HashMap<String, BukkitRunnable>();
   
    static {
        try {
            Field field = Class.forName(
                    "net.minecraft.server." + Bukkit.getServer().getClass().getName().split("\\.")[3] + ".Entity")
                    .getDeclaredField("entityCount");
            field.setAccessible(true);
            enderdragonId = field.getInt(null);
            field.set(null, enderdragonId + 1);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void removeBar(final Player player, int ticks) {
        if (player.hasMetadata("SeesEnderdragon") && !toHide.containsKey(player.getName())) {
            BukkitRunnable runnable = new BukkitRunnable() {
                @Override
                public void run() {
                    player.removeMetadata("SeesEnderdragon", plugin);
                    sendRemove(player);
                    toHide.remove(player.getName());
                }
            };
            runnable.runTaskLater(plugin, ticks);
            toHide.put(player.getName(), runnable);
        }
    }

    /* Remove Packet */
    private static void sendRemove(Player player) {
        try {
            PacketContainer spawnPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
            spawnPacket.getIntegerArrays().write(0, new int[] { enderdragonId });
            ProtocolLibrary.getProtocolManager().sendServerPacket(player, spawnPacket, false);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /* Spawn Packet */
    private static void sendSpawn(Player player, String message, float health) throws Exception {
        PacketContainer spawnPacket = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING);
        StructureModifier<Object> spawnPacketModifier = spawnPacket.getModifier();
        Location toSpawn = player.getEyeLocation().add(player.getEyeLocation().getDirection().normalize().multiply(23));
        spawnPacketModifier.write(0, enderdragonId);
        spawnPacketModifier.write(1, (byte) 64);
        spawnPacketModifier.write(2, toSpawn.getBlockX() * 32);
        spawnPacketModifier.write(3, toSpawn.getBlockY() * 32);
        spawnPacketModifier.write(4, toSpawn.getBlockZ() * 32);

        WrappedDataWatcher watcher = new WrappedDataWatcher();
        watcher.setObject(0, (byte) 32);
        watcher.setObject(2, message);
        watcher.setObject(6, health, true);
        watcher.setObject(10, message);
        watcher.setObject(20, 881);
        spawnPacket.getDataWatcherModifier().write(0, watcher);
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, spawnPacket, false);
    }

    public static void setBossName(Player player, String message, float health) {
        try {
            if (!player.hasMetadata("SeesEnderdragon")) {
                player.setMetadata("SeesEnderdragon", new FixedMetadataValue(plugin, true));
            }
            if (toHide.containsKey(player.getName())) {
                toHide.remove(player.getName()).cancel();
            }
            sendSpawn(player, message, health);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}
Link para o comentário
Compartilhar em outros sites

ANÁLISE DE INATIVIDADE
 

Este tópico foi automaticamente arquivado devido à inatividade. Para manter a organização e fluidez das discussões na comunidade, tópicos que permanecem sem novas interações por um período prolongado são fechados automaticamente.
 

Se houver interesse em retomar o conteúdo, sinta-se à vontade para criar um novo tópico ou entre em contato com a equipe da comunidade para reabrir este tópico.


Equipe de Moderação
Gamer's Board
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...