相机碰撞模式

基本信息

属性 值
所属配置类 GeneralConfig
字段 public static CollisionMode collisionMode
类型 枚举 GeneralConfig.CollisionMode
默认值 FULL(@Config.DefaultEnum("FULL"))
服务端同步 ✅ @Config.Sync
配置注释 [Server Controlled] Camera collision mode: FULL (collide with all blocks), IGNORE_TRANSPARENT (pass through non-opaque blocks), IGNORE_OPENABLE (pass through doors/trapdoors/fence gates), NONE (no collision)

取值穷举

取值 过滤规则(CameraEntity.shouldIgnoreBlock) 效果
FULL 不过滤 撞所有方块;moveEntity 走 super.moveEntity 原版碰撞
IGNORE_TRANSPARENT !block.isOpaqueCube() → 放行 穿过所有非不透明方块(玻璃、树叶、栅栏、液体等)
IGNORE_OPENABLE BlockDoor / BlockTrapDoor / BlockFenceGate → 放行 只穿过这三类"可开关"方块,其余照常碰撞
NONE 不过滤 noClip = true,moveEntity 直接 setPosition,完全无碰撞

NONE 走的是 CameraEntity.moveEntity 里最靠前的短路分支,不会执行子步进, 也不会进入 getFilteredCollisionBoxes,因此没有任何碰撞查询开销。

IGNORE_TRANSPARENT 与 IGNORE_OPENABLE 走 moveEntityFiltered——自实现的分轴解算, 只对被过滤后的碰撞箱列表求解。FULL 同样参与子步进(MAX_STEP = 0.2、MAX_STEPS = 64), 只是分派给 super.moveEntity。

下发时机

该值是每 tick 重新下发的,因此可以在游戏运行中热改而立即生效:

时机 调用
FreecamController.enable() cameraEntity.setCollisionMode(...)
FreecamController.enableTripod(slot) cameraEntity.setCollisionMode(...)
FreecamController.switchTripod(slot) cameraEntity.setCollisionMode(...)
TripodRegistry.getOrCreate(slot) 新建机位时下发一次
FreecamController.tick() 每 tick 重新下发

CameraEntity 的字段初值本身就是 GeneralConfig.CollisionMode.FULL(@Setter 字段声明处), 所以即使从未显式下发也至少是 FULL,不会是 null。

其它配置项

GeneralConfig 共 3 项:

字段 类型 默认值 服务端同步
已被禁用 boolean false ✅
collisionMode CollisionMode FULL ✅
受伤时禁用 boolean true ❌

相关条目