1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Fizer228, 11 янв 2025.

  1. Автор темы
    Fizer228

    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();
            }
        }
     
  2. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Нет таких плагинов, без модификации клиента невозможно вешать произвольные текстуры на блоки или добавлять новые виды блоков без замены текстур старых.
    На текущий момент все плагины, которые ты упомянул, используют различные комбинации состояний блоков гигантских грибов, нотных блоков, ниток и прочего. Есть также несколько "экзотических" способов по типу спаунеров со стойками, на которые надеты кожаные ботинки с кастомной моделью и текстурой.

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

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

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

    Также если ты делаешь кастомные блоки, то, возможно, тебе пригодится вот этот плагин или его исходный код: https://spigotmc.org/resources/breaker-2.99022/
     
  3. Автор темы
    Fizer228

    Fizer228 Активный участник Пользователь

    Баллы:
    66
    Спасибо, очень полезно, так как даже если что-то изменилось, то на основе старого можно найти обновлённый аналог!
    Да, будет крайне полезно если это можно применить точечно и ещё полезней, если и к любому блоку в заданном диапазоне.

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


    Вероятней всего буду использовать оба варианта. Грибы для большого объёма блоков, а стойки более точечно.
    Благодарствую за помощь, пойду пробовать грибы и стойки для брони.
     
  4. Shadow12

    Shadow12 Новичок Пользователь

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

    alexandrage Старожил Пользователь

    Баллы:
    173
    Стойки вообще не лагают, ибо у них нулевой ai, если конечно их не начать двигать.
     
  6. Shadow12

    Shadow12 Новичок Пользователь

    Баллы:
    21
    У дисплей энтити тоже, вообще то.
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну тогда со стороны сервера не будет разницы. Сам я их не изучал не знаю.
     

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