受伤时禁用

基本信息

属性 值
所属配置类 GeneralConfig
字段 public static boolean disableOnDamage
类型 boolean
默认值 true(@Config.DefaultBoolean(true))——即默认开启
服务端同步 ❌ 无 @Config.Sync,属纯客户端选项
配置注释 Disable freecam when the player takes damage

注意这是 GeneralConfig 中唯一没有 @Config.Sync 标记的字段, 同类的 已被禁用 与 相机碰撞模式 都是服务端同步项。

门控的行为

实现点是 MixinEntityLivingBase(早期阶段 Mixin,目标 net.minecraft.entity.EntityLivingBase):

@Inject(method = "setHealth", at = @At("HEAD"))
private void freecam$setHealth(float health, CallbackInfo ci) {
    if (GeneralConfig.disableOnDamage && FreecamController.instance().isActive()
        && (this.equals(Minecraft.getMinecraft().thePlayer))) {
        if (!Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode && getHealth() > health) {
            FreecamController.instance().scheduleDisable();
        }
    }
}

四个条件必须同时成立才退出:

条件 含义
GeneralConfig.disableOnDamage 本配置项为真
FreecamController.instance().isActive() 自由相机已激活
this.equals(Minecraft.getMinecraft().thePlayer) 被改动的实体就是玩家自己(相机实体受伤不触发)
!thePlayer.capabilities.isCreativeMode 玩家不是创造模式
getHealth() > health 血量在下降(治疗、回血不上钩)

创造模式豁免是关键设计:创造模式玩家不会因摔落/溺水等被动掉血被反复踢出自由相机。

延迟退出

命中时调用的是 scheduleDisable() 而不是 disable()——它只置 pendingDisable = true, 实际退出发生在下一次 FreecamController.tick() 开头。这样避免在 setHealth 调用栈中间 就去改写 mc.renderViewEntity 与 thirdPersonView。

退出时还会输出 msg.freecam.disable 之外的行为:由 tick() 调用 disable() 完成还原, 还原动作与正常松开 F4 完全一致(见 自由相机状态机)。

与总开关的叠加

若同时 已被禁用 为真,tick() 会先因总开关调 disable(), 本 Mixin 的 isActive() 判定随即失效,两者不会重复退出。

其它配置项

GeneralConfig 共 3 项:

字段 类型 默认值 服务端同步
已被禁用 boolean false ✅
相机碰撞模式 CollisionMode FULL ✅
disableOnDamage boolean true ❌

相关条目