LogoyStore

NPCs

Aprenda a criar e gerenciar NPCs pela NpcFactory do yPlugins.

A biblioteca de NPCs do yPlugins oferece uma interface comum para criar personagens com nome, skin e ações de clique. O acesso é feito pela NpcFactory, e cada NPC criado é manipulado pela interface Npc.

As interfaces públicas estão no pacote:

br.com.ystoreplugins.lib.helper.entity.npc

Preparação

Adicione o yPlugins ao seu projeto conforme o guia de API dos Plugins. Se o seu plugin é carregado pelo loader, consulte também Desenvolva com o yPlugins.

Obtendo a factory

A instância é disponibilizada pelo BukkitBootstrap:

import br.com.ystoreplugins.bootstrap.BukkitBootstrap;
import br.com.ystoreplugins.lib.helper.entity.npc.NpcFactory;

NpcFactory factory = BukkitBootstrap.get().getNpcFactory();

if (factory == null) {
    // A factory ainda não está disponível. Adie a criação dos NPCs.
    return;
}

Dentro de uma classe que estende BukkitPlugin, o acesso também pode ser feito por getLoader():

NpcFactory factory = getLoader().getNpcFactory();

A inicialização das factories é agendada para 1 tick após o onEnable() do yPlugins. Obtenha a factory após essa etapa e verifique se ela está disponível antes de criar NPCs.

Métodos da NpcFactory

Criação com textura e assinatura

Npc spawnNpc(Location location, String nametag,
             String skinTextures, String skinSignature);

Npc spawnNpc(Location location, String nametag,
             String skinTextures, String skinSignature, boolean lookClose);
ParâmetroDescrição
locationLocalização de criação do NPC.
nametagNome exibido sobre o NPC.
skinTexturesValor da propriedade textures da skin, em Base64.
skinSignatureAssinatura correspondente à propriedade textures.
lookCloseDefine se o NPC deve olhar para jogadores próximos. Na sobrecarga sem esse argumento, o valor utilizado é true.

Os métodos retornam um Npc. Forneça textura e assinatura da mesma skin; skinTextures é o valor da propriedade, e não uma URL de imagem.

Criando um NPC

O exemplo abaixo recebe a factory já obtida, a localização e os dados da skin:

import br.com.ystoreplugins.lib.helper.entity.npc.Npc;
import br.com.ystoreplugins.lib.helper.entity.npc.NpcFactory;
import org.bukkit.Location;

public Npc criarNpc(NpcFactory factory, Location location,
                    String skinTextures, String skinSignature) {
    Npc npc = factory.spawnNpc(
        location.clone(),
        "§6Loja",
        skinTextures,
        skinSignature,
        true
    );

    npc.setShowNametag(true);
    npc.setClickCallback(player -> player.sendMessage("§aBem-vindo à loja!"));

    return npc;
}

Guarde a referência retornada para alterar o NPC ou removê-lo posteriormente.

Sobrecargas obsoletas

As versões que recebem o nome de um jogador para definir a skin estão marcadas como @Deprecated na interface:

@Deprecated
Npc spawnNpc(Location location, String nametag, String skinPlayer);

@Deprecated
Npc spawnNpc(Location location, String nametag, String skinPlayer, boolean lookClose);

Para novas integrações, utilize as sobrecargas com skinTextures e skinSignature.

Encerramento

void close();

Executa a limpeza dos NPCs gerenciados pela factory compartilhada. O loader chama esse método no seu encerramento. Para remover apenas os NPCs criados pelo seu plugin, guarde as referências e utilize Npc.delete().

Métodos do Npc

MétodoRetornoDescrição
setClickCallback(Consumer<Player> callback)voidDefine a mesma ação para os cliques esquerdo e direito. Aceita null para remover as ações.
setClickCallback(Consumer<Player> left, Consumer<Player> right)voidDefine ações separadas para os cliques esquerdo e direito. Cada argumento aceita null.
setSkin(String textures, String signature)voidAltera a skin usando textura e assinatura.
setSkin(String skinPlayer)voidAltera a skin pelo nome de um jogador. Método obsoleto (@Deprecated).
setName(String name)voidAltera o nome do NPC.
setShowNametag(boolean show)voidDefine se o nome deve ser exibido.
setGlow(boolean glow)voidSolicita o efeito de brilho, conforme o suporte do provedor e da versão do servidor.
traitLookAltern(boolean value)voidAtiva ou desativa o comportamento de olhar para jogadores próximos.
getMeta()StringRetorna a chave de identificação por metadata utilizada pelo provedor.
setMeta(String meta, FixedMetadataValue value)voidDefine uma metadata quando há uma entidade Bukkit compatível.
getEntity()EntityRetorna a entidade Bukkit associada, quando disponível. Pode retornar null.
getInitialSpawn()LocationRetorna a localização de criação.
delete()voidRemove o NPC.

Ações de clique

O callback recebe o Player que clicou no NPC. Com dois argumentos, o primeiro corresponde ao clique esquerdo e o segundo ao direito:

npc.setClickCallback(
    player -> player.sendMessage("§eVocê clicou com o botão esquerdo."),
    player -> player.sendMessage("§aVocê clicou com o botão direito.")
);

Para responder somente ao clique direito:

npc.setClickCallback(null, player -> {
    player.sendMessage("§aAbrindo a loja...");
    // Abra seu menu aqui.
});

Para remover ambas as ações:

npc.setClickCallback(null, null);

Aparência e comportamento

npc.setName("§bVendedor");
npc.setShowNametag(true);
npc.setSkin(skinTextures, skinSignature);
npc.setGlow(true);
npc.traitLookAltern(false);

setGlow(boolean) possui uma implementação padrão vazia na interface. O efeito depende do suporte oferecido pelo provedor ativo.

Entidade e metadata

A interface permite consultar a entidade Bukkit associada. Como ela pode não existir, verifique o retorno antes de utilizá-la:

import org.bukkit.entity.Entity;

Entity entity = npc.getEntity();

if (entity != null) {
    Location atual = entity.getLocation();
}

Quando há suporte a metadata na entidade, é possível associar dados usando um Plugin Bukkit como proprietário:

import org.bukkit.metadata.FixedMetadataValue;

if (npc.getEntity() != null) {
    npc.setMeta("minha-loja", new FixedMetadataValue(plugin, "principal"));
}

Em um BukkitPlugin, substitua plugin por getLoader(). Para consultar a posição de criação pela interface comum, use npc.getInitialSpawn().clone().

Remoção e ciclo de vida

Remova os NPCs criados pelo seu plugin quando eles deixarem de ser necessários ou durante o onDisable():

if (npc != null) {
    npc.delete();
    npc = null;
}

A NpcFactory não expõe um método de listagem de NPCs. Mantenha as referências retornadas por spawnNpc(...) em um campo ou coleção para controlar o ciclo de vida dos seus personagens.

Nesta página