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

  • Автор темы Автор темы Gru2303
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Gru2303

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

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

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

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

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

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

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

При спауне стенда при помощи NMS меняешь ему размеры хитбокса (коллижн-бокса). Далее ядро всё сделает за тебя
Я пробовал изменять переменную 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.6D, location.getY() + 1.0D, location.getZ() - 1.6D, location.getX() + 1.6D, location.getY() + 4.5D, location.getZ() + 1.6D));

   } catch (Exception exception) {
      exception.printStackTrace();
   }
}
Ну что-то результата я не увидел...
Или я не понял как работает AxisAlignedBB?
 
Я пробовал изменять переменную 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.6D, location.getY() + 1.0D, location.getZ() - 1.6D, location.getX() + 1.6D, location.getY() + 4.5D, location.getZ() + 1.6D));

   } catch (Exception exception) {
      exception.printStackTrace();
   }
}
Ну что-то результата я не увидел...
Или я не понял как работает AxisAlignedBB?
Если AxisAlignedBB привязан к локации то, вполне вероятно, он перезаписывается при передвижении сущности. Дебажить надо. Если так - придётся городить больше костылей по типу переопределения некоторых методов сущности. Если не изменяется, тогда не знаю, в чём дело
 
Если AxisAlignedBB привязан к локации то, вполне вероятно, он перезаписывается при передвижении сущности. Дебажить надо. Если так - придётся городить больше костылей по типу переопределения некоторых методов сущности. Если не изменяется, тогда не знаю, в чём дело
Все работает!
AxisAlignedBB перезаписывается в каждом тике, нужно просто сделать изменение переменой в каждом тике...


PHP:
Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () -> {
     setBoundingBox(stand);
}, 0L, 0L);
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх