Вопрос ProtocolLib | фикс наковальни

Версия Minecraft
1.20.X

Artur001

Пользователь
Сообщения
17
дарова, крч пишу плуг на фикс "слишком дорого" в наковальне. делаю через protocollib, paper 1.21.4
вроде все норм сообщение пропало, только результат на милисекунду появляется а потом пропадает
Java:
@Override
public void onEnable() {
protocolManager = ProtocolLibrary.getProtocolManager();
getServer().getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onAnvilPrepare(PrepareAnvilEvent e) {
sendPackets((Player) e.getView().getPlayer(), true);
}

@EventHandler
public void onAnvilClose(InventoryCloseEvent e) {
sendPackets((Player) e.getPlayer(), false);
}

private void sendPackets(Player player, boolean anvil) {
PacketContainer packet = protocolManager.createPacket(
com.comphenix.protocol.PacketType.Play.Server.ABILITIES
);

packet.getBooleans().write(3, anvil);
protocolManager.sendServerPacket(player, packet);
}
 
Последнее редактирование:
Попробуй через "подделку" окна с наковальней:

Java:
@Override
public void onEnable() {
    protocolManager = ProtocolLibrary.getProtocolManager();
    getServer().getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onAnvilPrepare(PrepareAnvilEvent e) {
    sendTooExpensivePacket((Player) e.getView().getPlayer(), false);
}

@EventHandler
public void onAnvilClose(InventoryCloseEvent e) {
    if (e.getInventory() instanceof AnvilInventory) {
        sendTooExpensivePacket((Player) e.getPlayer(), true);
    }
}

private void sendTooExpensivePacket(Player player, boolean show) {
    PacketContainer packet = protocolManager.createPacket(
        PacketType.Play.Server.OPEN_WINDOW
    );
   
    if (show) {
        // Восстанавливаем оригинальное окно
        int containerId = ((CraftPlayer)player).getHandle().containerMenu.containerId;
        packet.getIntegers()
            .write(0, containerId + 1) // Увеличиваем ID контейнера
            .write(1, 8); // Тип окна (8 - наковальня)
        packet.getChatComponents()
            .write(0, CraftChatMessage.fromString("Repair & Name")[0]); // Или оригинальное название
    } else {
        // Отправляем "фейковое" окно с невозможным ID
        packet.getIntegers()
            .write(0, Integer.MAX_VALUE)
            .write(1, -1); // Несуществующий тип окна
        packet.getChatComponents()
            .write(0, CraftChatMessage.fromString("")[0]);
    }
   
    try {
        protocolManager.sendServerPacket(player, packet);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
 
Последнее редактирование модератором:
Назад
Сверху Снизу