受伤时禁用
基本信息
| 属性 | 值 |
|---|---|
| 所属配置类 | 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 |
❌ |
相关条目
- Mixin 加载阶段 -
MixinEntityLivingBase.setHealth在全部 7 个 Mixin 中的位置 - 自由相机状态机 -
scheduleDisable()/pendingDisable的消费时机 - 已被禁用 - 同属
GeneralConfig,且退出路径会与之叠加 - 玩家控制开关 - 玩家操控模式下受伤同样会触发退出