Ir para conteúdo

Preciso de ajuda para uma grande duvida!


Intrometimido

Posts Recomendados

    Galera, estou com uma grande duvida com relação a eventos com baus(chest, ender chest). Queria muito saber se da para manipular o evento de abertura deles(quando abrimos e a tampa tem aquela animação).

    Estou trabalhando em um plugin ai queria abri-lo, e mante-lo aberto até o evento do plugin terminar e só depois ele fechar, desde já agradeço....

Editado por Intrometimido
Erros de português, etc...
Link para o comentário
Compartilhar em outros sites

Man, eu quero apenas modificar o evento de abertura do bau(chest ou Ender_Chest), e queria saber como fazer isso.

Tipo, quando um player clica em um bau ele abre(animação de abertura de bau) e abre o inventario do bau,

Eu queria saber como modificar o evento da abertura do bau(animação) e nao do inventario do mesmo.

Link para o comentário
Compartilhar em outros sites

É como o @Jheyson falou, você vai precisar usar um "packet" chamado "PacketPlayOutBlockAction".
Protocol: https://wiki.vg/Protocol#Block_Action.

Exemplo:

//Animação de como estivesse abrindo o baú...
Block block = ...;
Packet packet = new PacketPlayOutBlockAction(new BlockPosition(block.getX(), block.getY(), block.getZ()), CraftMagicNumbers.getBlock(block), 1, 1);

 

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

Man, meio que tentei isso mas quebra o bloco que eu refencio mesmo sendo um Bau

Achei isso na net...

@SuppressWarnings("deprecation")


    public static void changeChestState(Location loc, boolean open) {
        byte dataByte = (open) ? (byte) 1 : 0; // The byte of data used for the note and animation packet (1 if true, 0 if false)
        for (Player player : Bukkit.getOnlinePlayers()) {
            player.playNote(loc, (byte) 1, dataByte); // Play the sound
            BlockPosition position = new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); // Create the block position using loc
            // Instantiate animation packet, get NMS Block using getById() and loc.getBlock() (deprecated), the server version may vary
            PacketPlayOutBlockAction blockActionPacket = new PacketPlayOutBlockAction(position, net.minecraft.server.v1_8_R3.Block.getById(loc.getBlock().getTypeId()), (byte) 1, dataByte);
            ((CraftPlayer) player).getHandle().playerConnection.sendPacket(blockActionPacket); // Send animation packet to CraftPlayer
        }
    }[spoiler/]
Link para o comentário
Compartilhar em outros sites

Em 17/08/2018 em 18:35, bieel1503 disse:

É como o @Jheyson falou, você vai precisar usar um "packet" chamado "PacketPlayOutBlockAction".
Protocol: https://wiki.vg/Protocol#Block_Action.

Exemplo:


//Animação de como estivesse abrindo o baú...
Block block = ...;
Packet packet = new PacketPlayOutBlockAction(new BlockPosition(block.getX(), block.getY(), block.getZ()), CraftMagicNumbers.getBlock(block), 1, 1);

 

Sabe me indicar um bom tutorial/uma boa aula de packets que nao seja em video? se sim agradeço....

Link para o comentário
Compartilhar em outros sites

10 minutos atrás, Intrometimido disse:

Ok galeea, já resolvi, tive que usar packets mesmo mas pode-se usar ProtocolLib, eu que não quis usar

Agora só falta eu achar uma maneira de tirar o som da abertura do bau...

Procure alguns tópicos,

https://www.spigotmc.org/threads/remove-sound.54990/

https://bukkit.org/threads/protocollib-disable-a-sound.433955/

De uma olhada, partiu curso, to atrasado, fui...

Link para o comentário
Compartilhar em outros sites

33 minutos atrás, Intrometimido disse:

Ok galeea, já resolvi, tive que usar packets mesmo mas pode-se usar ProtocolLib, eu que não quis usar

Agora só falta eu achar uma maneira de tirar o som da abertura do bau...

Não conseguiu usando o código que mandei? Você só precisaria fazer algo como:
 

public void openChestAnimation(Player player, Block block){
  ((CraftPlayer)player).getHandle().playerConnection.sendPacket(new PacketPlayOutBlockAction(new BlockPosition(block.getX(), block.getY(), block.getZ()), CraftMagicNumbers.getBlock(block), 1, 1));
}

public void closeChestAnimation(Player player, Block block){
  ((CraftPlayer)player).getHandle().playerConnection.sendPacket(new PacketPlayOutBlockAction(new BlockPosition(block.getX(), block.getY(), block.getZ()), CraftMagicNumbers.getBlock(block), 1, 0));
}

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, bieel1503 disse:

Não conseguiu usando o código que mandei? Você só precisaria fazer algo como:
 


public void openChestAnimation(Player player, Block block){
  ((CraftPlayer)player).getHandle().playerConnection.sendPacket(new PacketPlayOutBlockAction(new BlockPosition(block.getX(), block.getY(), block.getZ()), CraftMagicNumbers.getBlock(block), 1, 1));
}

public void closeChestAnimation(Player player, Block block){
  ((CraftPlayer)player).getHandle().playerConnection.sendPacket(new PacketPlayOutBlockAction(new BlockPosition(block.getX(), block.getY(), block.getZ()), CraftMagicNumbers.getBlock(block), 1, 0));
}

 

Man, tentei usar esse ae mas ele abre e fecha o chest rápido e da um som de bloco de notas, me ensina como colocar o código assim ae posto o que usei....

 

Link para o comentário
Compartilhar em outros sites

14 horas atrás, Intrometimido disse:

Man, tentei usar esse ae mas ele abre e fecha o chest rápido e da um som de bloco de notas, me ensina como colocar o código assim ae posto o que usei....

Som de bloco de notas...? Que estranho. Você pode testar o código que mandei pegando um evento de interação, cancelando e mandando o packet. Assim:
 

@EventHandler
private void interact(PlayerInteractEvent event){
    if(event.getClickedBlock().getType() == Material.CHEST){
        event.setCancelled(true);
    	openChestAnimation(event.getPlayer(), event.getClickedBlock());
    }
}

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, bieel1503 disse:

Som de bloco de notas...? Que estranho. Você pode testar o código que mandei pegando um evento de interação, cancelando e mandando o packet. Assim:
 


@EventHandler
private void interact(PlayerInteractEvent event){
    if(event.getClickedBlock().getType() == Material.CHEST){
        event.setCancelled(true);
    	openChestAnimation(event.getPlayer(), event.getClickedBlock());
    }
}

 

Eu consegui, eu estou pedindo para e ensinar como colocar o código desse jeito que você colocou ae em cima, como colocar o código desse jeito na gamers board, tipo [sla]código[/sla], é isso ae pego o código que usei e posto assim

 

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

1 hora atrás, Intrometimido disse:

Eu consegui, eu estou pedindo para e ensinar como colocar o código desse jeito que você colocou ae em cima, como colocar o código desse jeito na gamers board, tipo [sla]código[/sla], é isso ae pego o código que usei e posto assim

Ué, só clicar ali no ícone "</>".

Link para o comentário
Compartilhar em outros sites

public static void playChestAction(Location paramLocation, boolean open) {
        World world = ((CraftWorld) paramLocation.getWorld()).getHandle();
        BlockPosition position = new BlockPosition(paramLocation.getX(), paramLocation.getY(), paramLocation.getZ());
        TileEntityEnderChest tileChest = (TileEntityEnderChest) world.getTileEntity(position);
        world.playBlockAction(position, tileChest.w(), 1, open ? 1 : 0);
    }

Pego a localização do bau(Chest/EnderChest), adiciono em paramLocation. Defino open como true para aberto, ou false para fechado.

Não sei se usa packets mas acho que sim, mas funcionou perfeitamente. Testei com dois mines abertos para ver se envia a animação para os dois player

e enviou de boas.

Corrijam-me se o codigo estiver estupidamente ********;-;

 

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

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