2015-10-16 3 views
0

Я хочу, чтобы открытое событие сундука для сундука было отменено и чтобы показать открытую и близкую анимацию при щелчке правой кнопкой мыши. мой текущий код: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); 
     } 
    } 
} 

Когда я щелкаю правой кнопкой сундук, слышу звук, но никакой анимации не происходит. Спасибо вам за помощь!

ответ

4

Вы можете отправить игроку 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 
    } 
} 
+0

Спасибо вам большое! Это очень помогло. Идеально! –