👁️ Линия обзора и механика препятствий (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_only | Boolean | true | Требует прямой видимости для притягивания предметов. |
ig:magnet_keep_moving_if_unseen | Boolean | true | Продолжает притягивать намагниченные предметы при потере видимости в полете. |
ig:magnet_blocked_by_transparent | Boolean | false | Если true, стекло и прозрачные блоки перекрывают линию обзора. |
ig:magnet_blocked_by_flora | Boolean | false | Если true, трава и цветы перекрывают линию обзора. |
ig:magnet_blocked_by_block_entities | Boolean | false | Если true, сундуки и блоки-сущности перекрывают линию обзора. |
