Skip to content

⚡ 瞬间拾取模式与 AABB 包围盒 (MC 26.2)

📌 仓库源码声明:本 Wiki 中的文档反映了仓库中的当前源代码状态,可能包含领先于 CurseForge 和 Modrinth 上公开发布版本的最新未发布提交或开发中功能。

特性信息栏技术参数
系统注入类net.instantgratification.magnet.mixin.PlayerMixin
启用游戏规则ig:magnet_instant(默认值:false
判定半径规则ig:magnet_range(默认值:12,范围:1..64
注入挂钩点@ModifyVariable(method = "aiStep", at = @At("STORE"), ordinal = 0)
目标变量玩家拾取碰撞包围盒(AABB pickupArea
物品栏处理逻辑100% 委托原版 Player.touch(ItemEntity) 流水线

📖 瞬间拾取模式概览

标准真空吸附模式通过速度插值在空中物理牵引掉落物,而**瞬间拾取模式(Instant Pickup Mode)**则彻底消除了飞行等待时间。一旦启用,周围有效范围内的掉落物将在生成后的一瞬间瞬时收入玩家背包。

Magnet, Let me get that! 并没有编写容易崩溃、漏洞百出的自定义物品栏塞入循环,而是选择在原版 Player.aiStep() 方法内部非破坏性地直接扩展玩家原生的物品碰撞拾取盒(AABB)。

+-----------------------------------------------------------------------------------+
|                            原版玩家 aiStep() TICK 流程                            |
+-----------------------------------------------------------------------------------+
                                          |
                                          v
                +---------------------------------------------------+
                |   PlayerMixin.ig_magnet$expandPickupArea()        |
                |   pickupArea = pickupArea.inflate(range);         |
                +---------------------------------------------------+
                                          |
                                          v
+-----------------------------------------------------------------------------------+
|               原版 ItemEntity.playerTouch(Player) 核心逻辑执行                    |
|   - 原生背包堆叠与部分拾取合并                                                   |
|   - 原版拾取动画与音效广播 (item.pickup / entity.experience_orb)                  |
|   - 原版统计数据 (Statistics) 与成就进度 (Advancements) 触发                      |
|   - 背包已满时自然保留剩余物品与防溢出保护                                        |
+-----------------------------------------------------------------------------------+

🧩 架构实现细节 (PlayerMixin.java)

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;
}

关键工程保证:

  1. 严格的安全守卫:若玩家处于死亡/濒死状态(player.isDeadOrDying())、旁观模式(player.isSpectator())或手动关闭了个人的磁铁开关(!isMagnetEnabled()),包围盒绝不会被扩展。
  2. 服务端权威性:拾取逻辑严格在逻辑服务端执行(!level.isClientSide()),从源头上消除了物品幽灵残留(Ghost Items)与物品栏不同步问题。
  3. 互斥物理保护:当 ig:magnet_instant 为 true 时,MagnetMovement.pull() 会自动终止速度插值,防止物理牵引与瞬间拾取产生争抢冲突。

⚙️ 相关配置与游戏规则(GameRules)

游戏规则 Identifier类型默认值说明
ig:magnet_instantBooleanfalse启用后物品将瞬间瞬移收入背包,无需空中飞行。
ig:magnet_rangeInteger12拾取包围盒(AABB)向外膨胀的方块半径。
ig:magnet_enabledBooleantrue全局模组主开关。

🔗 相关 Wiki 文档

Official documentation & web portal for Dasik Igaijinn mods.