Rust 快速命令行世界编辑器

下载地址:MapEditr

地图编辑器

MapEditr 是一个用于快速操作 Minetest 世界的命令行工具。它可以替换节点和项目、填充区域、组合不同世界的部分等等。

该工具在功能上类似于WorldEdit,但专为在 Minetest 中不切实际的大型操作而设计。由于它主要针对速度进行了优化,因此 MapEditr 缺少 WorldEdit 的一些更专业的功能。

MapEditr 最初基于MapEdit,除了用 Rust 而不是 Python 编写(因此添加了“r”)。切换到编译语言将使 MapEditr 更加健壮,并且在未来更易于维护。

编译/安装

选项 1:预构建版本

如果您使用的是 Windows 并且没有安装 Rust,您可以从发布页面下载 MapEditr 最新版本的构建。目前只有 64 位 Windows 版本可用。

要从任何地方运行mapeditr 命令,可执行文件的路径必须包含在系统的 Path 变量中。这是一篇 解释如何在 Windows 上编辑 Path 变量的文章。

选项 2:使用 Cargo 安装

此方法适用于任何操作系统。要使用 Cargo,您必须先安装 Rust,可以从Rust 网站下载。然后,只需运行:

cargo install --git https://github.com/random-geek/MapEditr.git

这将下载 MapEditr 并将其安装到$HOME/.cargo/bin . 安装后,您应该可以使用该 mapeditr 命令从任何地方运行 MapEditr。

选项 3:正常构建

如果您不想安装 MapEditr,您可以使用 Cargo 正常构建它。在 MapEditr 目录中,运行:

cargo build --release

--release 标志很重要,因为它会生成一个优化的可执行文件,该可执行文件的运行速度比默认的未优化版本快得多。编译后的可执行文件将在target/release 目录中。

用法

有关 MapEditr 工作原理的概述以及命令列表及其用法,请参阅Manual.md

这些只是您可以使用 MapEditr 做的一些有用的事情:

  • 删除旧模组留下的未知节点replacenodes
  • 使用 . 在几秒钟内建造极长的墙壁和道路fill
  • 使用 有选择地删除实体和/或丢弃的项目deleteobjects
  • 将多个世界或地图保存与overlay .

地图编辑器手册

介绍

MapEditr 是一个用于编辑 Minetest 世界的命令行工具。请注意,MapEditr 不是模组或插件;它是一个独立于 Minetest 运行的独立程序。

MapEditr 读取和编辑地图数据库 ,通常是map.sqlite 在每个 Minetest 世界目录中命名的文件。因此,术语“世界”和“地图”可以互换使用。请注意,当前仅支持 SQLite 格式映射。

要使大多数命令正常工作,必须已经生成要读取/修改的映射部分。这可以通过探索游戏中的区域或使用 Minetest 的内置/emergeblocks 命令来完成。

MapEditr 支持自 2012 年 7 月发布的 Minetest 版本 0.4.2-rc1 以来创建的所有地图。地图中任何不受支持的部分都将被跳过。

一般用法

mapeditr [-h] [-y] <map> <SUBCOMMAND>

论据:

  • -h, --help :打印帮助信息并退出。
  • -y, --yes :跳过默认的确认提示(对于那些感到勇敢的人)。
  • <map> :要编辑的 Minetest 世界/地图的路径;这可以是世界目录或map.sqlite 文件。这个世界/地图将被修改,所以在执行任何命令之前总是 关闭游戏或服务器。
  • <SUBCOMMAND> : 要执行的命令。请参阅下面的“命令”部分。

常用命令参数

  • --p1 <x> <y> <z>--p2 <x> <y> <z> :用于选择一个角在p1 和处的矩形区域p2 ,类似于 WorldEdit 的区域选择工作方式。可以使用任意两个对角。这些坐标可以使用 Minetest 的 F5 调试菜单找到。
  • 节点/项目名称,包括nodenew_node 等:必须是全名,例如“default:stone”,而不仅仅是“stone”。

其他提示

可选参数使用 [方括号] 表示。

如果类似文本的参数包含空格,则可以用“引号”括起来。

由于技术限制,MapEditr 经常会留下照明故障。要解决这些问题,请使用 Minetest 的内置/fixlight 命令或等效的 WorldEdit//fixlight 命令。

命令

克隆

用法:clone --p1 x y z --p2 x y z --offset x y z

将区域的内容克隆(复制)到新位置。

论据:

  • --p1, --p2 :要克隆的区域。
  • --offset x y z : 用于移动区域内容的向量。例如,要向下复制一个区域 50 个节点(负 Y 方向),请使用--offset 0 -50 0 . 可以使用 Minetest 的 F5 调试菜单确定方向。

此命令复制节点、param1、param2 和元数据。任何内容都不会从尚未生成的地图块中复制或复制到其中。

例子:

  • 克隆一个围绕生成 500 个节点以西和 360 个节点以北的区域: clone --p1 200 80 200 --p2 -200 -15 -200 --offset -500 0 360

删除块

用法:deleteblocks --p1 x y z --p2 x y z [--invert]

删除区域内或区域外的所有地图块。这个命令通常比 Minetest 的内置/deleteblocks 命令快得多。

论据:

  • --p1, --p2 :包含要删除的地图块的区域。默认情况下,只会删除完全位于该区域内的地图块。
  • --invert :完全删除给定区域之外的所有地图块。 谨慎使用;你可以抹去你世界的很大一部分!

注意: 删除地图块 填充空气不同!Mapgen 将在块被删除的地方被调用,这有时会导致地形故障。

例子:

  • 删除 y = -200 和 y = 200 以上的所有已保存地图块: deleteblocks --p1 -31000 -200 -31000 --p2 31000 200 31000 --invert

删除元

用法:deletemeta [--node <node>] [--p1 x y z] [--p2 x y z] [--invert]

删除某些节点的节点元数据。节点库存(例如箱子/熔炉内容)也被删除。

论据:

  • --node <node> :(可选)要从中删除元数据的节点名称。如果未指定,将从任何节点删除元数据。
  • --p1, --p2 :(可选)删除元数据的区域。如果未指定,元数据将在各处删除。
  • --invert :删除给定区域之外的元数据。

删除对象

用法:deleteobjects [--obj <object>] [--items [items]] [--p1 x y z] [--p2 x y z] [--invert]

删除某些对象(实体)和/或项目实体(丢弃的项目)。

论据:

  • --obj <object> :(可选)要删除的对象的名称,例如“boats:boat”。
  • --items [items] :(可选)仅删除项目实体(丢弃的项目)。如果在 之后列出了一个或多个项目名称--items ,则只会删除这些项目。
  • --p1, --p2 :(可选)删除对象的区域。如果未指定,对象将在所有地方被删除。
  • --invert :删除给定区域之外的对象。

--obj 并且--items 不能同时使用。

例子:

  • 删除所有对象:deleteobjects
  • 删除所有购物车实体:deleteobjects --obj carts:cart
  • 删除掉落的石头和砾石: deleteobjects --items default:stone default:gravel

删除定时器

用法:deletetimers [--node <node>] [--p1 x y z] [--p2 x y z] [--invert]

删除某些节点的节点定时器。

论据:

  • --node <node> :(可选)要从中删除节点计时器的节点名称。如果不指定,任何节点的节点定时器都将被删除。
  • --p1, --p2 :(可选)删除节点计时器的区域。如果未指定,节点计时器将在任何地方被删除。
  • --invert :删除给定区域 的节点计时器。

充满

用法:fill --p1 x y z --p2 x y z [--invert] <new_node>

设置区域内或区域外的所有节点。尚未生成的地图块不会受到影响。

该命令不影响 param2、节点元数据等。

论据:

  • --p1, --p2 :要填充的区域。
  • --invert :填充给定区域之外 的所有生成节点。
  • <new_node> :要填充的节点的名称。

例子:

  • 在地上挖出一个大洞: fill --p1 224 50 347 --p2 817 -40 73 air
  • 建造一堵长长的黑曜石玻璃墙,向南/北移动: fill --p1 0 -30 -10000 --p2 0 30 10000 default:obsidian_glass

覆盖

用法:overlay <input_map> [--p1 x y z] [--p2 x y z] [--invert] [--offset x y z]

将部分或全部源地图复制到主地图中。

论据:

  • <input_map> :源地图/世界的路径。此地图不会被修改。
  • --p1, --p2 :(可选)要复制的区域。如果未指定,MapEditr 将尝试从源地图复制所有内容。
  • --invert :复制给定区域之外的所有内容。
  • --offset x y z :(可选)复制时移动节点的向量;默认为无偏移。目前,偏移量不能与反向选择一起使用。

如果使用区域和/或偏移量: 为确保复制所有数据,请确保至少生成目标区域的“边缘”,或者如果使用偏移量,则生成整个目标区域。

此命令将始终复制节点、param1、param2 和元数据。如果不使用偏移量,也可以复制对象/实体和节点计时器。

提示: 如果不使用偏移量,叠加将明显更快。

示例(您的世界/地图路径会有所不同):

  • 将所有地图复制backup.sqlite 到主世界: overlay backup-maps/backup.sqlite
  • 将世界复制test 到主世界,不包括 120 个节点内的区域:overlay test --p1 -120 -120 -120 --p2 120 120 120 --invert
  • map.sqlite 从主世界 复制一个区域,将其向北移动 32 个节点:overlay map.sqlite --p1 6 36 -49 --p2 -9 74 -78 --offset 0 0 32

替代品

用法:replaceininv <item> [new_item] [--delete] [--deletemeta] [--nodes <nodes>] [--p1 x y z] [--p2 x y z] [--invert]

替换、删除或修改某些节点清单中的项目。

论据:

  • <item> :要替换/删除的项目的名称。
  • [new_item] :(可选)新项目的名称,如果替换项目。
  • --delete :删除项目而不是替换它们。
  • --deletemeta :删除受影响项目的元数据。可以与或不一起使用new_item ,具体取决于是否也应更换项目。
  • --nodes <nodes> :(可选)要修改其清单的一个或多个节点的名称。如果未指定,则将在具有库存的任何节点中修改项目。
  • --p1, --p2 :(可选)修改节点清单的区域。如果未指定,项目将随处修改。
  • --invert :修改给定区域 的节点库存。

例子:

  • 删除所有熔岩桶: replaceininv bucket:bucket_lava --delete
  • 用不成文的书替换箱子里的所有成书,删除元数据: replaceininv default:book_written default:book --deletemeta --nodes default:chest default:chest_locked

替换节点

用法:replacenodes <node> <new_node> [--p1 x y z] [--p2 x y z] [--invert]

用另一个节点替换一个节点。也可用于删除未知节点或交换更改名称的节点。

此命令不影响 param2、元数据等。

论据:

  • <node> :要替换的节点名称。
  • <new_node> :要替换的节点的名称。
  • --p1, --p2 :(可选)替换节点的区域。如果未指定,则将在整个地图中替换节点。
  • --invert :替换给定区域之外的节点。

例子:

  • 将所有遗留的 PB&J pup 节点替换为 mese 块: replacenodes pbj_pup:pbj_pup default:mese
  • 移除地面附近的火灾节点: replacenodes fire:basic_flame air --p1 -31000 -80 -31000 --p2 31000 200 31000

设置元变量

用法:setmetavar <key> [value] [--delete] [--nodes <nodes>] [--p1 x y z] [--p2 x y z] [--invert]

设置或删除某些节点的节点元数据中的变量。这仅适用于已设置变量的节点。

论据:

  • <key> : 要设置/删除的变量的名称,例如infotext ,formspec 等。
  • [value] : 设置变量的值,如果设置一个值。这应该是一个字符串。
  • --delete : 删除变量。
  • --nodes <nodes> :(可选)要修改的一个或多个节点的名称。如果未指定,任何具有给定变量的节点都将被修改。
  • --p1, --p2 :(可选)修改节点元数据的区域。如果未指定,节点将在任何地方进行修改。
  • --invert :修改给定区域 的节点元数据。

例子:

  • 清晰的标志信息文本: setmetavar infotext --delete --nodes default:sign_wall_steel default:sign_wall_wood
  • 将“player1”设置为所有钢活板门的所有者: setmetavar owner player1 --nodes doors:trapdoor_steel

设置参数2

用法:setparam2 [--node <node>] [--p1 x y z] [--p2 x y z] [--invert] <param2>

设置某些节点的 param2 值。

论据:

  • --node <node> :(可选)要修改的节点名称。如果未指定,将设置任何节点的 param2 值。
  • --p1, --p2 :(可选)设置 param2 值的区域。如果未指定,param2 将在任何地方设置。
  • --invert :在给定区域之外 设置 param2 值。
  • <param2> :新的 param2 值,介于 0 和 255 之间。

此命令需要区域和/或节点。

真空

用法:vacuum

重建地图数据库以减小其大小。对于大型地图,吸尘可能需要很长时间。

该命令只执行 SQLiteVACUUM 命令,该命令通过有效地“重新打包”所有地图块来缩小和优化地图数据库。没有地图数据被更改或删除。

注意: 因为数据被临时复制到另一个文件中,所以清理可能需要与地图已占用的磁盘空间一样多的可用磁盘空间。例如,如果 map.sqlite 为 10 GB,请确保您至少有 10 GB 的可用空间!

执照

MapEditr 受LICENSE.txt .

此外,如果您在另一个项目中使用 MapEditr 的代码,我将非常感谢您项目的自述文件或文档中对 MapEditr 的合理确认/归属。

致谢

Minetest项目对于MapEdit /MapEditr 的制作非常重要,原因很明显。

原始 MapEdit 代码的某些部分改编自 AndrejIT 的 map_unexplore项目。所有应得的功劳归于该项目的作者。

还要感谢 ExeterDad 和已故故乡服务器的版主,他们为 MapEdit/MapEditr 提供了部分灵感。