末影箱打开和关闭动画

Ender Chest open and Close animation

我想要取消末影箱打开事件,并在右键单击时显示打开和关闭动画。我当前的代码是:

public void changeChestState(Location loc, boolean open) {
    if (open) {
        for (Player p : Bukkit.getOnlinePlayers()) {
            p.playNote(loc, (byte) 1, (byte) 1);
        }
    } else {
         for (Player p : Bukkit.getOnlinePlayers()) {
             p.playNote(loc, (byte) 1, (byte) 0);
         }
    }
}

当我右击箱子时,我听到声音,但没有动画发生。感谢您的帮助!

您可以向玩家发送一个 PacketPlayOutBlockAction 数据包,让他们看到箱子打开或关闭。此数据包还用于显示音符粒子、活塞运动和胸部状态变化。

您需要创建一个 BlockPosition 并获取 NMS Block(Minecraft 方块的类型,在本例中为箱子)并提供两个字节的数据。第一个字节在箱子动画的情况下不用,第二个字节表示箱子状态的变化,0表示关闭,1表示打开箱子。下面是您重写的方法,以显示相应的动画。

@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
    }
}