⚡ Режим мгновенного подбора (MC 26.2)
📌 Отказ от ответственности за исходный код репозитория: Документация в этой Wiki отражает текущее состояние исходного кода в репозитории, которое может включать недавние невыпущенные коммиты или функции в разработке до публичных релизов на CurseForge и Modrinth.
| Инфоблок механики | Технические параметры |
|---|---|
| Системный класс | net.instantgratification.magnet.mixin.PlayerMixin |
| Включающее правило GameRule | ig:magnet_instant (По умолчанию: false) |
| Радиус действия GameRule | ig:magnet_range (По умолчанию: 12, Диапазон: 1..64) |
| Точка инъекции | @ModifyVariable(method = "aiStep", at = @At("STORE"), ordinal = 0) |
| Целевая переменная | Хитбокс подбора игрока (AABB pickupArea) |
| Логика инвентаря | 100% ванильный конвейер Player.touch(ItemEntity) |
📖 Обзор мгновенного подбора
В то время как стандартный режим вакуума физически перемещает предметы по воздуху с помощью интерполяции скорости, Режим мгновенного подбора полностью устраняет время полета. Когда он включен, выпавшие предметы в радиусе действия попадают в инвентарь игрока в ту же микросекунду, как только появляются.
Вместо опасных и подверженных сбоям самодельных алгоритмов вставки в инвентарь, Magnet, Let me get that! реализует мгновенный подбор путем безопасного расширения стандартного ванильного хитбокса сбора игрока внутри метода aiStep().
+-----------------------------------------------------------------------------------+
| ВАНИЛЬНЫЙ ТИК ИГРОКА aiStep() |
+-----------------------------------------------------------------------------------+
|
v
+---------------------------------------------------+
| PlayerMixin.ig_magnet$expandPickupArea() |
| pickupArea = pickupArea.inflate(range); |
+---------------------------------------------------+
|
v
+-----------------------------------------------------------------------------------+
| ВАНИЛЬНОЕ ВЫПОЛНЕНИЕ ItemEntity.playerTouch(Player) |
| - Ванильное объединение стаков и частичный подбор |
| - Ванильные анимации и звуки сбора (item.pickup / entity.experience_orb) |
| - Корректные триггеры статистики и достижений |
| - Полная обработка переполнения инвентаря и сохранение остатка |
+-----------------------------------------------------------------------------------+🧩 Архитектурная реализация (PlayerMixin.java)
@ModifyVariable(
method = "aiStep",
at = @At(value = "STORE"),
ordinal = 0
)
private AABB ig_magnet$expandPickupArea(AABB pickupArea) {
Player player = (Player) (Object) this;
if (!this.ig_magnet$isMagnetEnabled() || player.isDeadOrDying() || player.isSpectator()) {
return pickupArea;
}
Level level = player.level();
if (!level.isClientSide()) {
if (ModGameRules.getBoolean(level, ModGameRules.MAGNET_ENABLED) && ModGameRules.getBoolean(level, ModGameRules.MAGNET_INSTANT)) {
int range = ModGameRules.getInt(level, ModGameRules.MAGNET_RANGE);
if (range > 0) {
return pickupArea.inflate(range);
}
}
}
return pickupArea;
}Ключевые инженерные гарантии:
- Проверки безопасности: Если игрок мертв или погибает (
player.isDeadOrDying()), находится в режиме наблюдателя (player.isSpectator()) или отключил личный магнит (!isMagnetEnabled()), область подбора никогда не увеличивается. - Серверный авторитет: Логика подбора выполняется строго на логическом сервере (
!level.isClientSide()), исключая появление предметов-призраков и рассинхронизацию инвентаря. - Отсутствие конфликта движения: Когда
ig:magnet_instantравно true, методMagnetMovement.pull()автоматически прерывает обновление скоростей, поэтому физика и мгновенный подбор не конфликтуют между собой.
⚙️ Связанные настройки и игровые правила (GameRules)
| GameRule | Тип | По умолчанию | Описание |
|---|---|---|---|
ig:magnet_instant | Boolean | false | Включает мгновенную телепортацию в инвентарь вместо полета. |
ig:magnet_range | Integer | 12 | Радиус (в блоках), на который увеличивается хитбокс подбора AABB. |
ig:magnet_enabled | Boolean | true | Главный переключатель всего мода. |
