KeyTracking
基本信息
| 属性 | 值 |
|---|---|
| 路径 | mrtjp.core.data.KeyTracking |
| 源码 | src/main/scala/mrtjp/core/data/KeyTracking.scala |
服务端可读取「某玩家某个按键是否按下」的同步机制。客户端每 tick 检测按键状态变化,
经 keyBindPacket 上报,服务端存为 Map[Int, Map[UUID, Boolean]]。
关键 API
| 成员 | 说明 |
|---|---|
registerTracker(tracker: TServerKeyTracker) |
分配递增 id(从 0)并初始化该 id 的 map |
updatePlayerKey(id, player, state) |
服务端侧更新 |
isKeyDown(id, player) |
服务端侧查询(按玩家 UUID) |
两个 trait
| trait | 职责 |
|---|---|
TServerKeyTracker |
服务端侧;var id = -1;register() 申请 id;isKeyDown(p) 查询 |
TClientKeyTracker |
客户端侧;@SubscribeEvent 监听 ClientTickEvent;状态变化时发包;register() 时若自身是 KeyBinding 则自动注册到 ClientRegistry |
缺陷
isKeyDown用map(id)(player.getGameProfile.getId)——MHashMap的withDefaultValue(false)只在getOrElseUpdate建立的 key 上生效;若某 id 未注册,调用会抛NoSuchElementException而非返回 false。- 整个机制假设玩家有
GameProfile(即非假玩家),对假玩家会 NPE。
相关条目
- MrTJPCorePH —
keyBindPacket