Ir para conteúdo

Como salvar informações em ItemStacks - NBT Tag


Gcunha

Posts Recomendados

TUTORIAL DO GCUNHA

Fala galerinha do mal, tudo bem? A pouco tempo dando uma fuçada na NMS do ItemStack acabei descobrindo esse recurso bem bacana que possibilitaria gravar,editar e acessas informações salvas em uma ItemStack(quais quer que seja).

O que é NBT Tag?

Bom, basicamente NBTag é um conjunto de bytes que o Minecraft usa para salvar algumas informações, que tipos de informações Gcunha? Informações como por exemplo a velocidade de ataque de uma espada, o dano que ela causa, durabilidade e outros atributos. Mas não para por ai, além de ser possível modificar os atributos já existentes a gente pode criar uma Tag que armazena uma String por exemplo, sendo assim conseguimos salvar informações em um Item e resgatar de uma maneira muito melhor do que verificar o Titulo ou Lore do ItemStack.

API

Desenvolvi essa API em 5 minutos apenas para demonstrar de maneira dinâmica como acessar a classe NMS do item sendo assim verificar, editar e gravar TAGS do item. 

(Levem em conta que essa classe é apenas exemplo, caso você queria que seja compatível com diversas versões tem que dar uma editada)

Spoiler

 


import net.minecraft.server.v1_8_R3.NBTTagCompound;
import net.minecraft.server.v1_8_R3.NBTTagString;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;

public class NbtApi {

    public static ItemStack setNBTData(ItemStack item,String tag, String data){

        net.minecraft.server.v1_8_R3.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);

        NBTTagCompound itemCompound = (nmsItem.hasTag()) ? nmsItem.getTag() : new NBTTagCompound();

        itemCompound.set(tag, new NBTTagString(data));

        nmsItem.setTag(itemCompound);

        return CraftItemStack.asBukkitCopy(nmsItem);
    }

    public static boolean hasTag(ItemStack item, String tag){
        net.minecraft.server.v1_8_R3.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);

        if(!nmsItem.hasTag()) return false;

        NBTTagCompound itemCompound = (nmsItem.hasTag()) ? nmsItem.getTag() : new NBTTagCompound();

        if(itemCompound.getString(tag) != null) return true;

        return false;
    }

    public static String getTag(ItemStack item, String tag){
        net.minecraft.server.v1_8_R3.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);

        NBTTagCompound itemCompound = nmsItem.getTag();

        return itemCompound.getString(tag);
    }

}

 

Criando item

Spoiler

public ItemStack getSelectServeritem(){
        ItemStack item = new ItemStack(Material.WATCH);
        ItemMeta meta = item.getItemMeta();

        meta.setDisplayName(ChatColor.GREEN + "Selecionar servidor" + ChatColor.GRAY + " (Clique direito)");

        item.setItemMeta(meta);

        item = NbtApi.setNBTData(item,"click","selectserver");

        return item;
    }

 

Verificando se item possui a TAG

Spoiler

@EventHandler
    public void onInteract(PlayerInteractEvent event){

        Player player = event.getPlayer();
        ItemStack item = event.getItem();

        if(!NbtApi.hasTag(item,"click")) return;

        if(NbtApi.getTag(item,"click").equalsIgnoreCase("selectserver")){
           //faz alguma ação
        }
    }

 

 

Se te ajudei não se esqueça de deixar um like, é isso ai, é nois ?

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Mounton disse:

Nossa! Muito bom, vou até deixar salvo caso eu precise futuramente(certeza kk),

 

~queria aprender como faz nbt pra spawner mas, npc humano e com sua visão ao jogador perto ._.

Quem saiba em breve eu poste um tutorial relacionado a isso, mas a ideia é mais ou menos a mesma. Abraços

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, a class='ipsType_brandedLink' href='https://gamersboard.com.br/login/' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='Sign In Now'>acesse agora para postar com sua conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

Processando...
×
×
  • Criar Novo...