Skip to content

👁️ Линия обзора и механика препятствий (MC 26.1.2)

📌 Отказ от ответственности за исходный код репозитория: Документация в этой Wiki отражает текущее состояние исходного кода в репозитории, которое может включать недавние невыпущенные коммиты или функции в разработке до публичных релизов на CurseForge и Modrinth.

Инфоблок механикиТехнические параметры
Основной движок видимостиnet.dasik.social.api.vision.PlayerVisionTracker
Вторичный движок видимостиnet.instantgratification.magnet.SecondaryVisionCheck
Сферическое поле зрения$360.0^\circ$ (Полное круговое восприятие)
Допуск дистанции контакта$0.3\text{ м}$ порог контакта с целью
Тег удержания памятиig$isMagnetized() / ig$setMagnetized()
Правило сохранения импульсаig:magnet_keep_moving_if_unseen = true
Реализация контекстаСтатическая запись VisionContext

📖 Двухпроходный конвейер видимости

В Minecraft 26.1.2 проверка линии обзора выполняется через не создающий лишних объектов в памяти двухпроходный конвейер видимости:

                                +---------------------------+
                                |  ЦЕЛЕВОЙ ПРЕДМЕТ ОБНАРУЖЕН|
                                +-------------+-------------+
                                              |
                                              v
                              +-------------------------------+
                              |    ПЕРВЫЙ ПРОХОД (360° LOS)   |
                              |   PlayerVisionTracker.canSee  |
                              +---------------+---------------+
                                              |
                        +---------------------+---------------------+
                        |                                           |
                   [ВИДИМ]                                     [ПРЕПЯТСТВИЕ]
                        |                                           |
                        v                                           v
      +-----------------------------------+               +--------------------+
      |     ВТОРОЙ ПРОХОД (ДЕТАЛЬНЫЙ)     |               |  ПРОВЕРКА ИМПУЛЬСА |
      |     SecondaryVisionCheck.canSee   |               | keepMovingIfUnseen |
      +-----------------+-----------------+               +---------+----------+
                        |                                           |
            +-----------+-----------+                     +---------+---------+
            |                       |                     |                   |
        [ПРОШЕЛ]               [ЗАБЛОКИРОВАН]        [НАМАГНИЧЕН]       [НЕ НАМАГНИЧЕН]
            |                       |                     |                   |
            v                       v                     v                   v
    +---------------+       +---------------+     +---------------+   +---------------+
    | ПРИТЯНУТЬ И   |       | ОТКЛОНИТЬ /   |     | ПРОДОЛЖИТЬ    |   | ОТКЛОНИТЬ     |
    | НАМАГНИТИТЬ   |       | ОСТАНОВИТЬ    |     | ПРИТЯГИВАНИЕ  |   | ПРИТЯГИВАНИЕ  |
    +---------------+       +---------------+     +---------------+   +---------------+

🔍 Проход 1: Основная круговая проверка видимости 360°

java
boolean canSee = net.dasik.social.api.vision.PlayerVisionTracker.canSee(player, entity, (double) range, 360.0);
  • Круговое поле: При угле обзора в $360^\circ$ выпавшие предметы сверху, снизу или позади игрока притягиваются плавно без необходимости поворачивать камеру.
  • Субвоксельный допуск контакта: Допуск в $0.3\text{м}$ исключает ложные отказы, когда предметы лежат вплотную к стене блока.

🌿 Проход 2: Детальный обход блоков (SecondaryVisionCheck)

java
private record VisionContext(
        Level level,
        boolean blockTransparent,
        boolean blockFlora,
        boolean blockEntities,
        CollisionContext collisionContext,
        Vec3 start,
        Vec3 end
) {}
  • Растительность (ig:magnet_blocked_by_flora): Проверяет наличие BushBlock и LeavesBlock.
  • Блоки-сущности (ig:magnet_blocked_by_block_entities): Проверяет state.hasBlockEntity() (сундуки, шалкеровые ящики, кровати).
  • Прозрачные блоки (ig:magnet_blocked_by_transparent): Проверяет пересечение state.getVisualShape().clip(...) со стеклом, панелями и плитами.

🚀 Сохранение импульса (keepMovingIfUnseen)

  • При первом обнаружении вызов ((IMagnetEntity) entity).ig$setMagnetized() помечает сущность флагом.
  • Если ig:magnet_keep_moving_if_unseen = true, предмет продолжает притягиваться вокруг углов и преград, если он уже был намагничен ранее.

⚙️ Связанные настройки и игровые правила (GameRules)

GameRuleТипПо умолчаниюОписание
ig:magnet_los_onlyBooleantrueТребует прямой видимости для притягивания предметов.
ig:magnet_keep_moving_if_unseenBooleantrueПродолжает притягивать намагниченные предметы при потере видимости в полете.
ig:magnet_blocked_by_transparentBooleanfalseЕсли true, стекло и прозрачные блоки перекрывают линию обзора.
ig:magnet_blocked_by_floraBooleanfalseЕсли true, трава и цветы перекрывают линию обзора.
ig:magnet_blocked_by_block_entitiesBooleanfalseЕсли true, сундуки и блоки-сущности перекрывают линию обзора.

🔗 Связанная документация Вики

Official documentation & web portal for Dasik Igaijinn mods.