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 时同步清理客户端可视化状态。
相关条目
- Horizon Wand -
moveSelection/resizeSelection/moveLabel的服务端实现 - HUD 与渲染 - 编辑器之外的客户端渲染器
- 结构模板与导出 - 编辑完成后用
/horizonqa export落盘 - JVM 系统属性 -
interactive模式门控