形状命令

形状命令

一个Hytale命令插件,提供命令(和图形用户界面)来在创意世界中创建程序化形状,以便使用Hytale内置的“粘贴工具”进行放置。

实用

斯图蒂的形状指令

一个海特尔命令插件,提供在创造世界中创建程序化形状的命令。

示例图片

使用方法

主命令是 /generateshape,它接受一个形状类型和若干参数来生成形状(作为内存中的预制件,配合"粘贴工具"使用)。虽然可以从控制台使用带参数的命令,但最便捷的方式是利用 ShapeCommands 自带的图形界面:

/generateshape --ui

这将打开一个对话框,提供更便捷的方式来输入所有必要参数:

界面截图

工作原理

该命令会根据提供的信息生成一个内存中的预制件,供玩家使用"粘贴工具"放置。它根据尺寸(以方块为单位)生成指定形状,填充提供的长方体选区。这意味着,不是告诉命令"在某个位置用某个半径创建一个球体",而是简单地接受提供的尺寸并用指定形状填充它。这也意味着,如果选区在每个轴向上尺寸不同,形状将相应地被拉伸。例如,如果你指定一个球体,但提供的选区宽5格、高10格、深5格,生成的形状将是一个在垂直方向上被拉伸的椭球体。这适用于所有可能的形状。

默认的工作方式是使用该命令创建一个内存中的形状,然后通过"粘贴工具"放置。但是,如果玩家已经用"选择工具"标记了一个选区,并勾选了"直接放置到选区"复选框,也可以直接将形状放置到世界中。

某些形状(如圆柱体、圆锥体和棱锥体)始终朝上生成(即沿垂直轴)。这意味着,如果你想要创建一个水平圆柱体,你需要先生成一个竖直圆柱体,然后使用海特尔内置的"粘贴工具"控制将其旋转。

选区处理

/generateshape 命令可以在有或没有方块选区的情况下使用。如果已使用"选择工具"创建了选区,该命令将使用指定的选区尺寸(并将这些数值填入"尺寸"文本字段)。但这并不意味着形状会立即在选区位置生成。为此,需要启用"直接放置到选区"复选框(或在命令中提供参数 --inplace)。

参数

形状类型 (--shape=[类型])

形状类型参数指定要生成的形状类型。可用的形状类型如下:

sphere (球体)

用球体填充提供的选区。

dome (穹顶)

用穹顶(即半球体)填充提供的选区。注意:要制作完美的半球体,选区的宽度应比高度大一倍。

cylinder (圆柱体)

填充提供的选区的圆柱体(竖直,沿垂直轴)。

cone (圆锥体)

填充提供的选区的圆锥体(竖直,沿垂直轴)。注意:要制作完美的圆锥体,选区的宽度应比高度大一倍。

pyramid (棱锥体)

填充提供的选区的棱锥体(竖直,沿垂直轴)。注意:要制作完美的棱锥体,选区的宽度应比高度大一倍。

torus (环面)

一个环面(即甜甜圈形状)。

box (长方体)

一个长方体。

frame (框架)

仅由边缘组成的长方体。用于标记矩形区域。

grid box (网格长方体)

具有"笼状"外观的长方体。使用"gridstep"参数确定网格线之间的间距(以格为单位)。

grid sphere (网格球体)

具有"笼状"外观的球体。使用"gridstep"参数确定网格线之间的间距(以格为单位)。

revolution (旋转体)

通过围绕垂直轴旋转一个轮廓来创建的旋转对称形状。轮廓使用"profile"参数(或参数 --profile=[轮廓])定义,指定将围绕垂直轴旋转以创建最终形状的轮廓形状。

roof (屋顶)

创建一个简单的屋顶形状,可选南北向或东西向的屋顶方向。请注意,这不适用于海特尔的屋顶方块。方块朝向仍不在 ShapeCommands 的处理范围内。

formula (公式)

由公式定义的形状。公式使用"formula"参数(或参数 --formula=[公式])定义,指定一个定义形状的数学公式。公式格式应为 "y = f(x,z)",其中 f 是 x、y 和 z 的函数。例如,公式 "x^2+z^2" 指定了一个抛物面。

注意,X 和 Z 在 -1 到 1 的范围内求值,Y 的结果值也在 -1 到 1 的范围内。与其他所有形状一样,生成的表面随后被拉伸以适合指定的尺寸或选区。

公式的求值使用表达式求值库 "exp4j"。这意味着公式可以包含该库支持的任何函数。例如,你可以使用 "y = sin(sqrt(x^2+z^2))" 来创建一个波浪形状。

https://www.objecthunter.net/exp4j/

尺寸 (--x=[x] --y=[y] --z=[z])

指定要生成的形状的所需尺寸。如果在打开图形界面时提供了选区,尺寸将自动填充为选区的尺寸,但仍可手动调整。

材质 (--material=[材质ID_1,材质ID_2,…])

这是一个逗号分隔的材质列表。生成的形状将使用这些材质创建,具体取决于所选图案和材质数量。注意,这里必须指定所需方块的 itemId(),例如 "Rock_Marble_Bricks" 而不是仅仅 "Marble Bricks"。另外请注意,材质必须是可放置的方块。如果提供了不可放置的方块,它将被忽略,不用于生成形状。

由于每次生成新形状时查找所有物品 ID 并输入可能很繁琐,界面中还有一个"快捷栏"按钮,可以快速用玩家当前快捷栏中的方块填充材质列表,忽略任何不可放置的物品。注意,这将替换材质列表的当前内容。

图案 (--pattern=[图案])

此参数指定用于材质的图案。可用的图案如下:

  • "random" (随机)
  • "layered_x" (X轴层叠)
  • "layered_y" (Y轴层叠)
  • "layered_z" (Z轴层叠)
  • "checker" (棋盘格)
  • "checker_2d" (2D棋盘格)
  • "plain" (纯色)

随机将简单地为每个方块从提供的材质中随机选择一个。

层叠将按指定方向(x、y 或 z)创建提供材质的层。

棋盘格将使用提供的材质创建棋盘格图案。注意,这可以与超过3种材质一起使用,按提供的顺序遍历材质。

2D棋盘格将创建一个2D棋盘格图案,仅考虑 X 和 Z 坐标,这会在墙壁上产生垂直条纹。

纯色将简单地对整个形状使用第一个提供的材质(实际上是"无图案")。

图案尺寸 (--patternSize=[图案尺寸])

此参数指定图案的尺寸。例如,如果你选择层叠图案并指定图案尺寸为3,生成的形状将有3格厚的层。相应地,棋盘格图案将具有3格宽和深的方格。

对"纯色"和"随机"无效。

厚度 (--thickness=[厚度])

如果设置了空心标志,形状可以是空心的。那么"厚度"指定空心形状的墙壁厚度(以格为单位)。对大多数形状来说,这或多或少是可靠的。

对于"框架"和"网格长方体"形状,厚度参数指定框架边缘的厚度。

空心 (--hollow)

控制形状是空心还是实心的标志。某些形状(如"公式")忽略此参数。

雕刻 (--carve)

仅适用于空心形状:如果设置,则当使用"粘贴工具"将形状放置到世界中时,形状的"内部"会从世界中雕刻掉。

直接放置到选区 (--inPlace)

如果(且仅当)之前已使用选择工具创建了选区,此标志控制是否应将生成的形状直接放置到世界中的选区位置。

特殊参数

虽然"形状"、"x"、"y"、"z"、"材质"和"厚度"是全局设置,但也有一些仅适用于特定形状的参数。例如,"轮廓"参数仅适用于"旋转体"形状类型,并指定围绕垂直轴旋转以创建形状的轮廓。同样,"主半径"和"内半径"仅适用于"环面"形状类型。

轮廓和插值

这些设置仅适用于"旋转体"形状类型。

轮廓

"轮廓"参数指定围绕垂直轴旋转以创建形状的轮廓。这个设置可能需要一点时间来理解,但实际上非常简单。轮廓定义为一个点列表,格式为 "y1,r1; y2,r2; …; yn,rn"。这些点定义了将围绕垂直轴旋转以创建最终形状的轮廓形状。

注意,这些点定义在单位正方形内,这意味着 y 值应在0到1之间,其中0对应形状的底部,1对应形状的顶部。r 值也应在0到1之间,其中0对应半径为0(即一个点),1对应最大半径(由选区的尺寸决定)。例如,如果你指定一个点 "0.5,0.5",这意味着在形状的一半高度处(y=0.5),半径应为最大半径的一半(r=0.5)。

也可以提供一些内置轮廓的名称,而不是自定义轮廓。这些内置轮廓包括:

  • cooling_tower (冷却塔)
  • onion_tower (洋葱塔)
  • dome (穹顶)
  • vase (花瓶)

轮廓示例:

这是内置轮廓 "cooling_tower":

"0.0, 1.0; 0.6, 0.7; 1.0, 0.8"

这读作"从底部开始,最大半径为1.0,然后在60%高度处,半径应为0.7,在顶部(100%高度),半径应为0.8"。这产生了一个底部宽、中间收窄、顶部又变宽的形状,这是冷却塔的常见形状。

另一个示例:

"0.0, 1.0; 0.25, 0.5; 0.5, 1.0; 0.75, 0.5; 1.0, 0.0"

使用"Catmull Rom 样条"插值得到这种形状:

轮廓示例图

插值

这指定轮廓点将如何连接。"线性"意味着不应用插值,点将通过直线连接。"Catmull Rom 样条"意味着将对点应用"Catmull Rom"样条插值,从而产生更平滑的形状。

环面参数

"主半径"和"内半径"这两个参数仅适用于"环面"形状类型。"主半径"指定从环面中心到管中心的距离,而"内半径"指定管本身的半径。

同样,这里主半径为1.0意味着环面管中心位于选区的边缘(从而切掉形状的很大一部分)。经验法则是确保主半径和内半径之和不超过1。也可以超过(各个半径最大限制为5.0),但生成的形状将被选区截断,看起来有点奇怪——但这可能正是你想要的……

网格间距

某些形状类型(网格长方体和网格球体)有一个"网格间距"参数,指定网格线之间的间距。此参数对于其他形状类型被忽略。网格间距为1意味着每格有一条网格线,网格间距为2意味着每2格有一条网格线,以此类推。

命令参考

/generateshape --shape=[类型] --x=[x] -y=[y] -z=[z] --material=[材质ID_1,材质ID_2,…] --pattern=[图案] --patternSize=[图案尺寸] --thickness=[厚度] --profile=[轮廓] --interpolation=[插值] --torusMainRadius=[主半径] --torusInnerRadius=[内半径] --gridstep=[网格间距] --formula=[公式] --hollow --carve --inPlace

整合包

欢迎将 ShapeCommands 包含在你的整合包中。

未来计划 / 创意

  • 更多形状(例如分形、高度图等)
  • 更动态的界面(对话框应仅显示与所选形状类型相关的参数)
  • 有创意或建议?欢迎评论。

更新日志

0.1.3

  • 更新到当前服务器版本(终于……)
    • 服务器版本:2026.03.26-89796e57b
  • 添加了模组图标

0.1.2

服务器版本:2026.02.19-1a311a592

错误修复与改进

  • 修正了屋顶方向(南北和东西方向之前被交换了)

新功能

  • 添加了形状类型"公式",允许基于数学公式创建形状。公式格式应为 "y = f(x,z)",其中 f 是 x 和 z 的函数。例如,公式 "x^2+z^2" 指定了一个抛物面。
  • 在材质列表旁边添加了"快捷栏"按钮。此按钮可以快速用玩家当前快捷栏中的方块填充材质列表,忽略任何不可放置的物品。

0.1.1

服务器版本:2026.02.19-1a311a592

错误修复与改进

  • 将"形状"、"插值"和新"图案"功能的文本字段改为下拉框
  • 添加了所有参数的适当验证。错误消息会显示在聊天中
  • 修复了环面不尊重提供的半径总是使用默认值的问题
  • 允许环面使用更大的半径。这意味着如果主半径和内半径之和超过1.0,形状仍会生成,但会被选区截断。这可能有用。

新功能

  • 添加了以逗号分隔列表形式输入多种材质的可能性。
  • 在界面中添加了"图案"选择,允许指定材质的图案。目前已实现:
    • "随机"(每个方块随机使用提供的材质之一)
    • "层叠"(创建提供材质的重复层,适用于所有3个轴)
    • "棋盘格"(使用提供的材质创建棋盘格图案。也适用于超过2种材质)
    • "2D棋盘格"(创建一个2D棋盘格,仅考虑 X 和 Z 坐标,在墙壁上产生垂直条纹)
    • "纯色"(默认图案,简单地对整个形状使用第一个提供的材质)
  • 添加了新形状"屋顶"。创建一个简单的屋顶形状,可选南北向或东西向的屋顶方向。请注意,这不适用于海特尔的屋顶方块。方块朝向仍不在 ShapeCommands 的处理范围内

0.1.0

初始发布