Ir para conteúdo

BossBar - HandMade


BlackFloyd

Posts Recomendados

Boa noite, estou trabalhando com a versão 1.6.4 do Bukkit (Triste...) e preciso criar um broadcast através daquela bossbar do ender dragon, que fica na parte superior da tela. Eu sei que tem um jeito de fazer na mão, já que eu ja vi gente fazendo numa equipe que trabalhava (Se eu tivesse contato deles ainda...). Sim, existem algumas API's que podem me ajudar, mas estou trabalhando com o Cauldron **houston, we have a problem** e o maldito cauldron não funciona bem com nenhuma dessas API's ou plugins que ja fornecem essas utilidades. Eu queria saber se alguma alma abençoada sabe fazer isso hand-made, pois ja fiquei horas procurando no forum do bukkit e spigot mas não achei nada e acredito que não acharei, afinal, 1.6.4... Ficaria muito agradecido, thanks ❤️

Editado por BlackFloyd
Link para o comentário
Compartilhar em outros sites

9 horas atrás, BlackFloyd disse:

Boa noite, estou trabalhando com a versão 1.6.4 do Bukkit (Triste...) e preciso criar um broadcast através daquela bossbar do ender dragon, que fica na parte superior da tela. Eu sei que tem um jeito de fazer na mão, já que eu ja vi gente fazendo numa equipe que trabalhava (Se eu tivesse contato deles ainda...). Sim, existem algumas API's que podem me ajudar, mas estou trabalhando com o Cauldron **houston, we have a problem** e o maldito cauldron não funciona bem com nenhuma dessas API's ou plugins que ja fornecem essas utilidades. Eu queria saber se alguma alma abençoada sabe fazer isso hand-made, pois ja fiquei horas procurando no forum do bukkit e spigot mas não achei nada e acredito que não acharei, afinal, 1.6.4... Ficaria muito agradecido, thanks ❤️

my friend cauldron realmente é um problema. creio que não tenha como fazer isso nele, pois quase todos os packets nessa bagaça não funciona direito, creio que se tiver como a forma mais fácil seria usando o protocollib talvez.

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Zeuss disse:

my friend cauldron realmente é um problema. creio que não tenha como fazer isso nele, pois quase todos os packets nessa bagaça não funciona direito, creio que se tiver como a forma mais fácil seria usando o protocollib talvez.

 

package me.libraryaddict.boss;

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

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 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;

public class BossBarApi {
    private static int enderdragonId;
    private static Plugin plugin = Bukkit.getPluginManager().getPlugins()[0];
    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(Player player) {
        removeBar(player, 2);
    }

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

    private static void sendRemovePacket(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();
        }
    }

    private static void sendSpawnPacket(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); // EntityID of wither
        spawnPacketModifier.write(2, toSpawn.getBlockX() * 32);
        spawnPacketModifier.write(3, toSpawn.getBlockY() * 32);
        spawnPacketModifier.write(4, toSpawn.getBlockZ() * 32);
        // Make the datawatcher that turns it invisible
        WrappedDataWatcher watcher = new WrappedDataWatcher();
        watcher.setObject(0, (byte) 32);
        watcher.setObject(2, message);
        watcher.setObject(6, health, true); // Set health
        watcher.setObject(10, message);
        watcher.setObject(20, 881);
        spawnPacket.getDataWatcherModifier().write(0, watcher);
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, spawnPacket, false);
    }

    public static void setName(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();
            }
            sendSpawnPacket(player, message, health);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Código não é meu Link para o código

Link para o comentário
Compartilhar em outros sites

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