WaypointShare
基本信息
| 属性 | 值 |
|---|---|
| 默认按键 | INSERT |
| 分类 | Share Where I am |
| 注册类 | com.muxiu1997.sharewhereiam.client.key.KeyBindings#WaypointShare |
| 注册方式 | ClientRegistry.registerKeyBinding |
| 触发事件 | InputEvent.KeyInputEvent(在 EventHandler#handleKeyInput 中处理) |
按键可在 Minecraft「Controls…」设置界面(分类
Share Where I am)下由玩家重新绑定。原文注册位置:src/main/java/com/muxiu1997/sharewhereiam/client/key/KeyBindings.java。
功能
该按键是 Share Where I am 唯一的客户端按键。通过 Shift 与 Ctrl 修饰键与 KeyBindings.WaypointShare 组合,可触发 4 种不同的行为(核心逻辑在 EventHandler#handleKeyInput):
| 修饰键 | 目标位置 | Ctrl | 行为 |
|---|---|---|---|
| 无 | 玩家视线 rayTrace 128 格命中方块 | 不按 | 在世界中标记一个 3 秒临时 Beacon(不广播给其他玩家) |
| Shift | 玩家当前位置 | 不按 | 在世界中标记一个 3 秒临时 Beacon(基于玩家自身位置) |
| 无 | 玩家视线 rayTrace 命中方块 | 按下 | 发送 MessageShareWaypoint,广播给所有玩家并弹出 SAVE/EDIT/Toggle 按钮 |
| Shift | 玩家当前位置 | 按下 | 发送 MessageShareWaypoint,广播给所有玩家 |
上表中 4 行的判定均要求
Minecraft.getMinecraft().currentScreen == null(不能在 GUI 中按下)和Mods.JourneyMap.isLoaded()(必须安装 JourneyMap)。
行为细节
仅 INSERT(无 Shift 无 Ctrl,标记 Beacon)
- 通过
WaypointUtil.waypointOfRayTrace()取得玩家当前视线 128 格内的命中方块坐标,作为白色(#FFFFFF)Waypoint。 - 客户端向服务端发送
MessageMarkWaypoint,服务端sendToAll广播给所有客户端。 - 每个客户端
WaypointManager.addTransientBeacon(playerName, waypoint)加入本地缓存,并用WaypointMarker在世界中渲染一个白色半透明(alpha=0.8)的线框方块 Beacon,持续TRANSIENT_BEACON_DURATION = 3000L毫秒(3 秒)后被清理。
Shift + INSERT(标记玩家自身位置的 Beacon)
- 与上一行的差别仅在于
WaypointUtil.waypointOfLocation()使用thePlayer.posX/Y/Z作为坐标,颜色仍为白色。
Ctrl + INSERT(分享视线命中位置的 Waypoint)
WaypointUtil.waypointOfRayTrace()拿到PlayerWaypoint,客户端发送MessageShareWaypoint到服务端。- 服务端再
sendToAll广播给所有客户端,每个客户端通过WaypointUtil.addShareWaypointChat弹出 3 行聊天信息:[JourneyMap] <playerName> shared a waypoint:<waypointName> (<x>, <y>, <z>) [Save] [Edit] [Toggle](可点击按钮)- 若来自 VisualProspecting(
additionalInformation不为空):This is a VisualProspecting Waypoint, you still need to add the Waypoint to the VP in the way that the VP allows
Ctrl + Shift + INSERT(分享玩家位置的 Waypoint)
- 与上一行行为一致,但坐标来自玩家当前位置。该行为与
/sharewhereiam命令同效。
视觉反馈
RenderWorldLastEvent 事件由 WaypointMarker.render(event) 接管:在玩家世界中渲染所有 3 秒内收到的 transient Beacon 为白色半透立方体线框。仅在客户端渲染,无服务端世界修改。
JourneyMap 6 额外行为
JourneyMap 6 下还注册了 IClientPlugin(JourneyMapV6Plugin),每客户端 tick 末检查:
- 全屏地图激活
- VisualProspecting 与 Navigator 已加载
INSERT刚刚被按下(边缘触发)
若三个条件同时满足,从 Navigator 当前悬停的渲染层读取 VP 图标对应的 Waypoint,转成 SharedWaypoint 后调用 shareWaypoint(waypoint, SHARE_WAYPOINT_VP),等效于 Ctrl + INSERT 但附加 VisualProspecting 提示文本。
数值
| 数值 | 默认值 |
|---|---|
| 默认按键 | Keyboard.KEY_INSERT |
| 瞬时 Beacon 持续时间 | 3000 毫秒(3 秒) |
| Ray trace 距离 | 128 格 |
| Ray trace 液体 | true(player.rayTrace(128.0, 1.0f) 第二参数) |
跨版本差异
| JourneyMap 版本 | 行为差异 |
|---|---|
| JourneyMap 5(legacy) | MessageShareWaypoint 中 [Edit] 按钮可用(依赖 JourneyMapIntegration.canOpenWaypointEditor(),仅 V5 返回 true),通过 UIManager.getInstance().openWaypointEditor 打开原版编辑器 |
| JourneyMap 6(v2 API) | 无 [Edit] 按钮(API 未暴露编辑器);新增 FullscreenMap 右键弹出菜单的 Share 项,依赖 PopupMenuEvent.WaypointPopupMenuEvent 注册 |