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 注册

相关条目