Horizon Editor

基本信息

属性 值
主界面 visual/editor/WandEditorScreen.java(继承 GuiScreen)
自由相机 visual/editor/WandFreecamController.java
工具枚举 visual/editor/WandEditorTool.java(MOVE / RESIZE / MOVE_LABEL)
手柄数学 visual/editor/SelectionGizmoMath.java
布局计算 visual/editor/WandEditorLayout.java
标签输入框 visual/editor/WandEditorLabelPrompt.java
默认开启键 F10(WandFreecamController.java:55-57)
注册条件 仅 interactive 模式(ClientProxy.java:21-22)

[!IMPORTANT] 整个 Horizon Editor 只在 interactive 模式注册。ClientProxy.init 在 HorizonQAProperties.interactiveFeaturesEnabled() 为假时立即 return (ClientProxy.java:21-22),ci / off 模式下 F10 无任何作用,界面类不会被加载。

功能

Horizon Editor 是一个全屏 3D 自由相机编辑器:玩家脱离身体在结构选区周围自由飞行, 用箭头 / 立方体手柄调整选区包围盒,并用右侧面板管理坐标标签。改动的通过封包同步回服务端 Wand。

开启与关闭

WandFreecamController 注册 FREECAM_KEY(默认 F10)到 key.categories.horizonqa 分类 (WandFreecamController.java:55-57、108-110)。开启时聊天提示 Editor opened. Choose Move or Resize, then drag a selection handle., 关闭时提示 Editor closed.(en_US.lang:37-38)。

界面 WandEditorScreen 是 final class(包私有),按 F10 或 Esc 关闭 (en_US.lang:41:%s / Esc — Close)。

三种工具

WandEditorTool 定义 3 个工具(WandEditorTool.java:3-7):

工具 名称 作用
MOVE Move selection 拖拽箭头平移整个选区及其标签
RESIZE Resize selection 拖拽立方体扩缩选区单侧
MOVE_LABEL Move label 单独移动某个标签

三者对应 ItemHorizonWand.moveSelection / resizeSelection / moveLabel 三个静态方法。

操作方式

界面内控制(en_US.lang:69):

输入 行为
左键拖拽手柄 移动 / 缩放
右键拖拽 转动视角
W A S D 水平飞行
Space / Shift 垂直升降
疾跑 加速

飞行速度常量(WandFreecamController.java:60-61):

常量 值
NORMAL_SPEED 0.65
FAST_SPEED 1.8
LABEL_PICK_DISTANCE 256.0

WandFreecamController 在相机激活时屏蔽若干原版交互键以免误触(suppressWorldInteractionKeys, WandFreecamController.java:120-122),包括攻击、使用物品与拾取方块键 (WandFreecamController.java:470-472)。

界面布局

WandEditorScreen.drawScreen 依据 WandEditorLayout.sidebarWidth(width) 计算侧栏宽度, 并用 WandEditorLayout.isInsideViewport(...) 判断鼠标是否在 3D 视口内 (WandEditorScreen.java:38-41)。面板配色常量(WandEditorScreen.java:25-29):

常量 色值 用途
PANEL_BACKGROUND 0xF212171D 侧栏底色
PANEL_ACCENT 0xFF566579 强调色
TEXT_PRIMARY 0xFFF2F5F7 主文本
TEXT_MUTED 0xFFAAB3BC 次要文本
TOOL_SELECTED 0xCC253448 选中工具
TOOL_IDLE 0x66303A46 未选工具

界面分区(en_US.lang:42-68):工具区、坐标轴区、选区信息、标签列表。

标签面板

右侧面板列出 Wand 上的全部标签,可重命名 / 删除 / 新增 (en_US.lang:53-66)。放标签时的控制为 Click a block to label it · Shift-click selects adjacent air · Esc cancels (en_US.lang:66)。非法名字提示 Use [A-Za-z_][A-Za-z0-9_]*(en_US.lang:65), 重名提示 A label with that name already exists.(en_US.lang:64)。

面板用 +%d more 折叠超出显示上限的标签(en_US.lang:58)。

服务端同步

编辑器内的修改经 4 个封包回传服务端(network/HorizonQANetwork.java:16-24):

封包 discrim 方向
WandLabelMessage 0 → 服务端
WandSelectionMoveMessage 1 → 服务端
WandSelectionResizeMessage 2 → 服务端
WandLabelMoveMessage 3 → 服务端

四个封包全部注册为 Side.SERVER,客户端只发不收。 WandEditorScreen 直接 import WandLabelMessage 与 HorizonQANetwork 发包 (WandEditorScreen.java:15-16)。

数值

数值名 值 来源
工具数量 3 WandEditorTool.java:3-7
普通飞行速度 0.65 WandFreecamController.java:60
疾跑飞行速度 1.8 WandFreecamController.java:61
标签拾取距离 256.0 WandFreecamController.java:62
默认开启键 F10 WandFreecamController.java:56
网络封包数 4(discrim 0–3) HorizonQANetwork.java:16-24
editor 包类数 6 ls src/main/java/com/gtnewhorizons/horizonqa/visual/editor/

面板配色

常量 色值
PANEL_BACKGROUND 0xF212171D
PANEL_ACCENT 0xFF566579
TEXT_PRIMARY 0xFFF2F5F7
TEXT_MUTED 0xFFAAB3BC
TOOL_SELECTED 0xCC253448
TOOL_IDLE 0x66303A46

交互

选区不完整(Pos1 或 Pos2 未设)时,变换手柄禁用,界面提示 Set both selection corners to enable the transform handles.(en_US.lang:49)。

未选标签时提示 Select a label from the right panel(en_US.lang:52), 无任何标签时提示 No labels on this wand.(en_US.lang:54)。

客户端渲染器注册在 ClientProxy.init(ClientProxy.java:23-35): SelectionOutlineClientRenderer(选中轮廓)、GameTestOverlayRenderer(测试覆盖层)、 WandHudOverlay(HUD)、WandLabelRenderer(标签文字)、WandFreecamController(自由相机)。 InteractiveTestSession.onClearAllCallback 被接到 VisualManager::clearAll (ClientProxy.java:35),执行 /horizonqa clearall 时同步清理客户端可视化状态。

相关条目