Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Наложение текстур из ресурспака на блок без замены текстур

Fizer228

Активный участник
Пользователь
Баллы
66
Требуется наложить текстуру на один или несколько конкретных блоков установленных в мире. Без использования рамок, стоек с бронёй или других энтити. модификация клиента не приветствуется, за исключением ресурс паков.
Пример: у меня есть блок камня и в мире с обычной текстурой, я ставлю камень с метадатой и он должен иметь другую текстуру в отличии от других блоков камня. По итогу у меня будет в мире тот же камень, но с метадатой и заменённой текстурой.

Если это возможно, то прошу помочь реализовать.
Если невозможно, то встаёт вопрос, как работают другие плагины на изменение текстур блоков в мире, в которых ты буквально можешь сделать "новые" блоки без замены старых. Прошу объяснить и по возможности дать код, который позволит реализовать похожий функционал, даже если используются арморстенды или иные энтити.

готов к работе с NMS и ProtocolLib.
Версия - 1.21.1 paper
Зависимости:
Код:
    <dependencies>
        <dependency>
            <groupId>io.papermc.paper</groupId>
            <artifactId>paper-api</artifactId>
            <version>1.21-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.comphenix.protocol</groupId>
            <artifactId>ProtocolLib</artifactId>
            <version>5.3.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

Один из последних способов, который пробовал.
Код:
    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        Block block = event.getBlock();
        // Проверяем, что игрок поставил золотой блок
        if (event.getItemInHand().hasItemMeta() && block.getType() == Material.GOLD_BLOCK) {
            // Изменяем текстуру блока
            changeBlockTexture(block.getLocation().toVector(), event.getPlayer());
        }
    }
    private void changeBlockTexture(Vector location, Player player) {
        // Изменение текстуры блока с помощью ProtocolLib
        // Устанавливаю кастомный блок
        PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.BLOCK_CHANGE);
        // Указываю местоположение блока
        packet.getBlockPositionModifier().write(0, new com.comphenix.protocol.wrappers.BlockPosition(location));
        // Устанавливаю ID блока, который будет использоваться для отображения текстуры
        packet.getIntegers().write(0, Material.GOLD_BLOCK.ordinal());
        packet.getIntegers().write(1, 1);
        // Устанавливаю текстуру для кастомного блока
        // текстура minecraft:textures/custom_gold_block_texture из ресурс пака
        packet.getStrings().write(0, "minecraft:textures/custom_gold_block_texture");
        // Отправляю пакет игроку
        try {
            protocolManager.sendServerPacket(player, packet);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
как работают другие плагины на изменение текстур блоков в мире, в которых ты буквально можешь сделать "новые" блоки без замены старых
Нет таких плагинов, без модификации клиента невозможно вешать произвольные текстуры на блоки или добавлять новые виды блоков без замены текстур старых.
На текущий момент все плагины, которые ты упомянул, используют различные комбинации состояний блоков гигантских грибов, нотных блоков, ниток и прочего. Есть также несколько "экзотических" способов по типу спаунеров со стойками, на которые надеты кожаные ботинки с кастомной моделью и текстурой.

Расписал тут все известные мне способы смены текстур блокам:
http://rubukkit.org/threads/163886/page-2#post-1587743

С того времени особо ничего не изменилось.

Разве что ItemDisplay добавился. Теоретически можно попробовать использовать и его вместе с CustomModelData, но лично я не пробовал и не в курсе, какие там подводные камни.

Также если ты делаешь кастомные блоки, то, возможно, тебе пригодится вот этот плагин или его исходный код: https://spigotmc.org/resources/breaker-2.99022/
 
Расписал тут все известные мне способы смены текстур блокам:
http://rubukkit.org/threads/163886/page-2#post-1587743
Спасибо, очень полезно, так как даже если что-то изменилось, то на основе старого можно найти обновлённый аналог!
Также если ты делаешь кастомные блоки, то, возможно, тебе пригодится вот этот плагин или его исходный код: https://spigotmc.org/resources/breaker-2.99022/
Да, будет крайне полезно если это можно применить точечно и ещё полезней, если и к любому блоку в заданном диапазоне.

Ещё со стойками видел интересный вариант, который встроен в сам ресурс пак, как скрипт. Попробую его адаптировать в java код.

Вероятней всего буду использовать оба варианта. Грибы для большого объёма блоков, а стойки более точечно.
Благодарствую за помощь, пойду пробовать грибы и стойки для брони.
 
Ещё на 1.19.4(?)+ можно на пустой блок дисплеем вешать текстуру, видел так на серверах. Правда придётся делать свою систему ломания таких блоков а ещё это лагает прилично(но оптимизированнее стоек вроде).
 
Ещё на 1.19.4(?)+ можно на пустой блок дисплеем вешать текстуру, видел так на серверах. Правда придётся делать свою систему ломания таких блоков а ещё это лагает прилично(но оптимизированнее стоек вроде).
Стойки вообще не лагают, ибо у них нулевой ai, если конечно их не начать двигать.
 

Поделиться этой страницей

Назад
Верх