👁️ Линия обзора и механика препятствий (MC 26.2)
📌 Отказ от ответственности за исходный код репозитория: Документация в этой Wiki отражает текущее состояние исходного кода в репозитории, которое может включать недавние невыпущенные коммиты или функции в разработке до публичных релизов на CurseForge и Modrinth.
| Инфоблок механики | Технические параметры |
|---|---|
| Основной движок видимости | net.dasik.social.api.vision.PlayerVisionTracker |
| Вторичный движок видимости | net.instantgratification.magnet.SecondaryVisionCheck |
| Сферическое поле зрения | $360.0^\circ$ (Полное круговое восприятие) |
| Допуск дистанции контакта | $0.3\text{ м}$ порог контакта с целью |
| Тег удержания памяти | ig_magnet$isMagnetized() / ig_magnet$setMagnetized() |
| Правило сохранения импульса | ig:magnet_keep_moving_if_unseen = true |
| Детальные фильтры | Прозрачные блоки, Растительность, Блоки-сущности |
📖 Двухпроходная архитектура видимости
Чтобы исключить нечестный сбор предметов сквозь стены пещер и базы, сохраняя при этом высокую производительность без задержек, Magnet, Let me get that! использует быстрый двухпроходный конвейер проверки видимости:
+---------------------------+
| ЦЕЛЕВОЙ ПРЕДМЕТ ОБНАРУЖЕН|
+-------------+-------------+
|
v
+-------------------------------+
| ПЕРВЫЙ ПРОХОД (360° LOS) |
| PlayerVisionTracker.canSee |
+---------------+---------------+
|
+---------------------+---------------------+
| |
[ВИДИМ] [ПРЕПЯТСТВИЕ]
| |
v v
+-----------------------------------+ +--------------------+
| ВТОРОЙ ПРОХОД (ДЕТАЛЬНЫЙ) | | ПРОВЕРКА ИМПУЛЬСА |
| SecondaryVisionCheck.canSee | | keepMovingIfUnseen |
+-----------------+-----------------+ +---------+----------+
| |
+-----------+-----------+ +---------+---------+
| | | |
[ПРОШЕЛ] [ЗАБЛОКИРОВАН] [НАМАГНИЧЕН] [НЕ НАМАГНИЧЕН]
| | | |
v v v v
+---------------+ +---------------+ +---------------+ +---------------+
| ПРИТЯНУТЬ И | | ОТКЛОНИТЬ / | | ПРОДОЛЖИТЬ | | ОТКЛОНИТЬ |
| НАМАГНИТИТЬ | | ОСТАНОВИТЬ | | ПРИТЯГИВАНИЕ | | ПРИТЯГИВАНИЕ |
+---------------+ +---------------+ +---------------+ +---------------+🔍 Проход 1: Основная круговая проверка видимости 360°
Первый проход обращается к оптимизированному движку рейкастинга DasikLibrary:
boolean canSee = net.dasik.social.api.vision.PlayerVisionTracker.canSee(player, entity, (double) range, 360.0);- Круговой угол обзора: С конусом видимости $360.0^\circ$ игрок может притягивать предметы прямо за спиной, над головой или под ногами, если между ними нет твердой стены.
- Допуск контакта 0.3м: Когда предметы вплотную прижаты к углам блоков, субвоксельный рейкастинг с радиусом $0.3\text{м}$ исключает ложные блокировки.
🌿 Проход 2: Детальная фильтрация блоков (SecondaryVisionCheck)
Если первый проход успешен, мод вычисляет опциональные правила препятствий через BlockGetter.traverseBlocks:
public static boolean canSee(Player player, Entity target, boolean blockTransparent, boolean blockFlora, boolean blockEntities)- Фильтрация растительности и листвы (
ig:magnet_blocked_by_flora):- Проверяет, является ли блок экземпляром
BushBlock(высокая трава, цветы, культуры, саженцы) илиLeavesBlock(листва деревьев). - Если включено (
true), растительность становится преградой для притягивания предметов.
- Проверяет, является ли блок экземпляром
- Интерактивные блоки-сущности (
ig:magnet_blocked_by_block_entities):- Проверяет
state.hasBlockEntity()по траектории луча. - Если включено (
true), сундуки, сундуки-ловушки, бочки, шалкеровые ящики, кровати и раздатчики блокируют видимость.
- Проверяет
- Прозрачные и неполные блоки (
ig:magnet_blocked_by_transparent):- Проверяет форму
state.getVisualShape(...). - Если включено (
true), стекло, стеклянные панели, железные прутья, заборы, плиты и ступени блокируют подбор предметов.
- Проверяет форму
🚀 Сохранение импульса (keepMovingIfUnseen)
В динамичном бою или при копании шахты предметы, огибающие угол, часто на мгновение пропадают из прямой видимости. Чтобы они не застревали и не падали в лаву:
- Метка намагничивания: Когда предмет замечен в линии обзора, метод
((IMagnetEntity) entity).ig_magnet$setMagnetized()выставляет флаг в памяти. - Удержание импульса: Если на следующих тиках линия обзора теряется:
- Если
ig:magnet_keep_moving_if_unseen = trueИig_magnet$isMagnetized() == true: Предмет продолжает притягиваться к игроку. - Если
ig:magnet_keep_moving_if_unseen = false: Притягивание немедленно прекращается при потере видимости. - Если предмет никогда не был виден (например, выброшен за стеной взрывом или раздатчиком): Притягивание отклоняется сразу.
- Если
⚙️ Связанные настройки и игровые правила (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, сундуки, кровати и блоки-сущности перекрывают обзор. |
