🧲 Вакуумное движение и фазовый сдвиг (MC 26.1.2)
📌 Отказ от ответственности за исходный код репозитория: Документация в этой Wiki отражает текущее состояние исходного кода в репозитории, которое может включать недавние невыпущенные коммиты или функции в разработке до публичных релизов на CurseForge и Modrinth.
| Инфоблок механики | Технические параметры |
|---|---|
| Системный класс | net.instantgratification.magnet.MagnetMovement |
| Событие срабатывания | Серверный тик игрока (PlayerMixin $\rightarrow$ MagnetManager.tick) |
| Радиус притягивания по умолчанию | 12 блоков (ig:magnet_range) |
| Предельная скорость по умолчанию | 80% ($0.8\text{ блоков/тик} = 16.0\text{ м/с}$) |
| Ускорение по умолчанию | 10% ($0.10\text{ фактор lerp/тик}$) |
| Фазовый сдвиг (NoClip) | Включен (ig:magnet_noclip = true) |
| Вектор цели | Позиция глаз игрока (player.getEyePosition()) |
| Смещение от земли | $+0.05\text{ м}$ по оси Y, когда entity.onGround() |
📖 Обзор системы
В Minecraft 26.1.2 вакуумный движок непрерывно отслеживает допустимые сущности ItemEntity в пределах сферического радиуса игрока и плавно притягивает их к уровню глаз с помощью интерполяции lerp.
При активном Фазовом сдвиге (NoClip) предметы плавно проходят сквозь твердые стены и блоки, что исключает застревание лута за препятствиями во время добычи руды или сражений.
+-------------+ Линия обзора OK +----------------------+ Применена скорость Lerp +------------------+
| Item Entity | -------------------------> | Вкл NoClip (2 тика) | --------------------------------> | Глаза игрока |
+-------------+ +----------------------+ +------------------+
|
v
[Отмена выталкивания]
[Игнорирование коллизий]
[Отмена гравитации в блоке]🧮 Физика и векторная математика
1. Единичный вектор направления
$$\vec{v}{\text{target}} = \vec{p}{\text{eye}} - \vec{p}{\text{entity}}$$ $$\hat{d} = \frac{\vec{v}{\text{target}}}{|\vec{v}_{\text{target}}|}$$
2. Интерполяция скорости
$$\text{Скаляр скорости } s = \frac{\text{GameRule}(\text{ig:magnet_speed})}{100.0} = 0.8\text{ блоков/тик}$$ $$\vec{u}{\text{target}} = \hat{d} \times s$$ $$\text{Коэффициент ускорения } a = \frac{\text{GameRule}(\text{ig:magnet_acceleration})}{100.0} = 0.10$$ $$\vec{v}{\text{new}} = \vec{v}{\text{current}} + (\vec{u}{\text{target}} - \vec{v}_{\text{current}}) \times a$$
3. Устранение трения о землю
if (entity.onGround()) {
entity.setOnGround(false);
entity.setPos(entity.position().add(0, 0.05, 0));
}🧱 Фазовый сдвиг (Движок NoClip)
- Активация состояния: Вызов
((IMagnetEntity) entity).ig$setMagnetNoClip()активирует обратный отсчет на 2 тика. - Переопределение физики (
MixinEntity.java):move(MoverType, Vec3): Инъекция@Inject(at = @At("HEAD"))сохраняетoriginalNoPhysicsи выставляетentity.noPhysics = true.move(MoverType, Vec3): Инъекция@Inject(at = @At("RETURN"))восстанавливаетentity.noPhysics = originalNoPhysics.
- Предотвращение выталкивания:
@Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true)блокирует ванильное выталкивание из стен. - Отмена гравитации в блоке:
@Inject(method = "applyGravity", at = @At("HEAD"), cancellable = true)отменяет гравитацию только в момент, когда предмет физически находится внутри вокселя блока.
⚙️ Связанные настройки и игровые правила (GameRules)
| GameRule | Тип | По умолчанию | Описание |
|---|---|---|---|
ig:magnet_enabled | Boolean | true | Главный переключатель механики вакуума. |
ig:magnet_range | Integer | 12 | Радиус вакуума в блоках (от 1 до 64). |
ig:magnet_speed | Integer | 80 | Процент предельной скорости ($80 = 0.8\text{ б/т}$). |
ig:magnet_acceleration | Integer | 10 | Коэффициент ускорения ($10 = 10%\text{ lerp/тик}$). |
ig:magnet_noclip | Boolean | true | Включает фазовый сдвиг сквозь блоки при притягивании. |
