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

Помогите Простой кастомный hitbox

Тема в разделе "Разработка плагинов для новичков", создана пользователем Gru2303, 5 июн 2021.

Статус темы:
Закрыта.
  1. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    У меня есть армор стенд с кастомной текстурой размером 2х3 блока. Армор стенд получается по середине. Как можно сделать что-бы данная текстура не проваливалась вниз когда сломали блок под стендом, а что-бы она провалилась нужно сломать все блоки которые входят в хитбокс?

    Нужно как-то делать расчеты по локации стенда, и координатам хитбокса (x1, y1, z1, x2, y2, z2)
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Простой в реализации, но не особо производительный вариант:

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

    Костыльный, но более производительный и совместимый с другими механиками:

    При спауне стенда при помощи NMS меняешь ему размеры хитбокса (коллижн-бокса). Далее ядро всё сделает за тебя
     
  3. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Я пробовал изменять переменную boundingBox в net.minecraft.server.v1_12_R1.Entity
    PHP:
    public static void setBoundingBox(ArmorStand paramArmorStand) {
       try {
          
    Location location paramArmorStand.getLocation();

          
    net.minecraft.server.v1_12_R1.Entity e net.minecraft.server.v1_12_R1.Entity.class.cast(CraftEntity.class.cast(paramArmorStand).getHandle());

          
    Field f net.minecraft.server.v1_12_R1.Entity.class.getDeclaredField("boundingBox");

          
    f.setAccessible(true);

          
    f.set(e, new AxisAlignedBB(location.getX() - 1.6Dlocation.getY() + 1.0Dlocation.getZ() - 1.6Dlocation.getX() + 1.6Dlocation.getY() + 4.5Dlocation.getZ() + 1.6D));

       } catch (
    Exception exception) {
          
    exception.printStackTrace();
       }
    }
    Ну что-то результата я не увидел...
    Или я не понял как работает AxisAlignedBB?
     
  4. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
  5. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если AxisAlignedBB привязан к локации то, вполне вероятно, он перезаписывается при передвижении сущности. Дебажить надо. Если так - придётся городить больше костылей по типу переопределения некоторых методов сущности. Если не изменяется, тогда не знаю, в чём дело
     
  6. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Все работает!
    AxisAlignedBB перезаписывается в каждом тике, нужно просто сделать изменение переменой в каждом тике...


    PHP:
    Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () -> {
         
    setBoundingBox(stand);
    }, 
    0L0L);
     
Статус темы:
Закрыта.

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