相机碰撞模式
基本信息
| 属性 | 值 |
|---|---|
| 所属配置类 | 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 |
❌ |