#roblox #instance #place #read-write #lua #scriptable #write-file

应用 重构

读取、修改和写入 Roblox 对象的工具

13 个版本 (重大更新)

0.10.0 2022年6月13日
0.9.1 2021年10月11日
0.9.0 2021年8月18日
0.8.1 2021年4月9日
0.5.0 2019年9月24日

580游戏开发 中排名

每月 45 次下载

MIT 许可证

195KB
2.5K SLoC

Rust 1.5K SLoC // 0.0% comments Lua 478 SLoC // 0.0% comments Shell 34 SLoC
Remodel Logo

重构

Remodel on crates.io Actions Status

重构是一个用于操作 Roblox 文件及其包含实例的命令行工具。它是一个可脚本化的工具,旨在实现其他工具无法完成的流程。

重构可以用于处理 Roblox 文件的几乎所有操作。一些用途包括

重构仍在早期开发阶段,但它的 API 大部分已经稳定。欢迎反馈!

安装

使用 Foreman

可以使用 Foreman(Roblox 项目工具链管理器)安装重构

[tools]
remodel = { source = "rojo-rbx/remodel", version = "0.10.0" }

从 GitHub 发布版

您可以从 重构的 GitHub 发布页面 下载预构建的二进制文件。

从 crates.io

您需要 Rust 1.56.0 或更高版本。

cargo install remodel

快速入门

重构的大部分界面是其 Lua API。用户编写 Lua 5.3 脚本,由重构运行,并提供一组特殊的 API。

重构的一个用途是将场景文件分解成多个模型文件。假设我们有一个名为 my-place.rbxlx 的场景文件,其中存储了一些模型在 ReplicatedStorage.Models 中。

我们希望将这些模型保存到名为 models 的文件夹中的单个文件中。

local game = remodel.readPlaceFile("my-place.rbxlx")

-- If the directory does not exist yet, we'll create it.
remodel.createDirAll("models")

local Models = game.ReplicatedStorage.Models

for _, model in ipairs(Models:GetChildren()) do
	-- Save out each child as an rbxmx model
	remodel.writeModelFile(model, "models/" .. model.Name .. ".rbxmx")
end

有关更多示例,请参阅 examples 文件夹。

支持的 Roblox API

重构支持 Roblox API 的某些部分,以便使代码对现有 Roblox 用户更加熟悉。

  • 实例.new(className) (0.5.0+)
    • 重构不支持第二个参数(父级)。
  • <实例>.Name (可读可写)
  • <实例>.ClassName (只读)
  • <实例>.Parent (可读可写)
  • <实例>:销毁() (0.5.0+)
  • <实例>:克隆() (0.6.0+)
  • <实例>:获取子对象()
  • <实例>:获取后代() (0.8.0+)
  • <实例>:查找第一个子对象(名称)
    • Remodel不支持递归的第二个参数。
  • <数据模型>:获取服务(名称) (0.6.0+)

Remodel API

Remodel拥有超出Roblox内部所能完成的自己的API。

remodel.readPlaceFile

remodel.readPlaceFile(path: string): Instance

从文件系统中加载一个rbxlx文件。

返回一个DataModel实例,相当于Roblox内部的game

出错时抛出异常。

remodel.readModelFile

remodel.readModelFile(path: string): List<Instance>

从文件系统中加载一个rbxmxrbxm (0.4.0+) 文件。

注意,这个函数返回的是一个实例列表而不是单个实例!这是因为模型可以包含多个顶层实例。

出错时抛出异常。

remodel.readPlaceAsset (0.5.0+)

remodel.readPlaceAsset(assetId: string): Instance

从Roblox.com读取场所资产,相当于remodel.readPlaceFile

此方法需要私有资产的Web认证!有关更多信息,请参阅认证

出错时抛出异常。

remodel.readModelAsset (0.5.0+)

remodel.readModelAsset(assetId: string): List<Instance>

从Roblox.com读取模型资产,相当于remodel.readModelFile

此方法需要私有资产的Web认证!有关更多信息,请参阅认证

出错时抛出异常。

remodel.writePlaceFile

remodel.writePlaceFile(instance: DataModel, path: string)

将给定的DataModel实例保存为rbxlx文件。

如果实例不是DataModel,则此方法将抛出异常。模型应使用writeModelFile保存。

出错时抛出异常。

remodel.writeModelFile

remodel.writeModelFile(instance: Instance, path: string)

将给定的Instance保存为rbxmxrbxm (0.4.0+) 文件。

如果实例是DataModel,则此方法将抛出异常。场所应使用writePlaceFile保存。

出错时抛出异常。

remodel.writeExistingPlaceAsset (0.5.0+)

remodel.writeExistingPlaceAsset(instance: Instance, assetId: string)

将给定的DataModel实例上传到Roblox.com,通过现有的场所。

如果实例不是DataModel,则此方法将抛出异常。模型应使用writeExistingModelAsset上传。

此方法始终需要Web认证!有关更多信息,请参阅认证

出错时抛出异常。

remodel.writeExistingModelAsset (0.5.0+)

remodel.writeExistingModelAsset(instance: Instance, assetId: string)

将给定的实例上传到Roblox.com,通过现有的模型。

如果实例是DataModel,则此方法将抛出异常。场所应使用writeExistingPlaceAsset上传。

此方法始终需要Web认证!有关更多信息,请参阅认证

出错时抛出异常。

remodel.getRawProperty (0.6.0+)

remodel.getRawProperty(instance: Instance, name: string): any?

从给定的实例获取给定名称的属性,绕过所有验证。

这是Remodel功能更加人性化的同时,旨在简单实现但非常强大的API。

如果实例上存储的值类型尚不能由Remodel表示,则抛出异常。有关更多详细信息,请参阅支持的Roblox类型

remodel.setRawProperty (0.6.0+)

remodel.setRawProperty(
	instance: Instance,
	name: string,
	type: string,
	value: any,
)

使用给定的名称、类型和值在给定的实例上设置属性。有效值对于类型支持的Roblox类型的左侧列表中定义。

这是Remodel功能更加人性化的同时,旨在简单实现但非常强大的API。

如果值类型尚不能由Remodel表示,则抛出异常。有关更多详细信息,请参阅支持的Roblox类型

remodel.readFile (0.3.0+)

remodel.readFile(path: string): string

读取给定路径的文件。

出错时抛出异常,如文件不存在。

remodel.readDir (0.4.0+)

remodel.readDir(path: string): List<string>

返回目录中所有子文件的文件名列表。

出错时会抛出异常,例如目录不存在时。

remodel.writeFile (0.3.0+)

remodel.writeFile(path: string, contents: string)

在给定的路径写入文件。

出错时抛出异常。

remodel.createDirAll

remodel.createDirAll(path: string)

在给定的路径创建目录,以及所有尚未存在的父目录。

这是Rust的fs::create_dir_all函数的一个薄包装。类似于Unix中的mkdir -p

出错时抛出异常。

remodel.isFile (0.7.0+)

remodel.isFile(path: string): bool

判断给定的路径是否是文件。

这是Rust的fs::metadata函数的一个薄包装。

出错时会抛出异常,例如路径不存在时。

remodel.isDir (0.7.0+)

remodel.isDir(path: string): bool

判断给定的路径是否是目录。

这是Rust的fs::metadata函数的一个薄包装。

出错时会抛出异常,例如路径不存在时。

JSON API

json.fromString (0.7.0+)

json.fromString(source: string): any

解码包含JSON的字符串。

出错时会抛出异常,例如输入的JSON无效。

json.toString (0.7.0+)

json.toString(value: any): string

将Lua对象编码为JSON字符串。只能编码Lua原语,如表、字符串、数字、布尔值和nil。实例不能编码为JSON。

出错时会抛出异常,例如输入的表无法编码。

json.toStringPretty (未发布)

json.toStringPretty(value: any, indent?: string = "  "): string

将Lua对象编码为格式化的JSON字符串。如果传递了缩进,将使用该缩进,否则默认为两个空格。

出错时会抛出异常,例如输入的表无法编码。

支持Roblox类型

当与Roblox实例交互时,Remodel尚不支持所有值类型,可能会抛出错误。

支持的类型及其Lua等价物

  • String: string
  • Content: string
  • Bool: boolean
  • Float64: number
  • Float32: number
  • Int64: number
  • Int32: number

随着时间的推移,将添加更多类型,并且Remodel将开始自动在更多上下文中推断正确的类型。

身份验证

Remodel的一些API访问Roblox Web API,并需要通过.ROBLOSECURITY cookie进行身份验证以访问私有资源。Auth cookie看起来像这样

_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|<actual cookie stuff here>

Auth cookie是非常敏感的信息!如果您在远程服务器(如Travis CI或GitHub Actions)上使用Remodel,应创建一个权限有限的临时账户,以确保您的宝贵账户不受损害!

在Windows上,Remodel将尝试使用登录的Roblox Studio会话中的cookie来验证所有请求。

要为Remodel提供不同的auth cookie,请使用--auth参数

remodel run foo.lua --auth "$MY_AUTH_COOKIE"

您还可以定义REMODEL_AUTH环境变量,以避免将--auth作为参数传递。

Remodel与rbxmk的比较

Remodel类似于rbxmk

  • Remodel和rbxmk都使用Lua
  • Remodel和rbxmk具有类似的功能集和使用场景
  • Remodel是命令式的,而rbxmk是声明式的
  • Remodel模拟Roblox的API,而rbxmk有自己的,非常独特的API

许可证

根据MIT许可证条款,Remodel可用。有关详细信息,请参阅LICENSE.txt

标志来源.

依赖项

~25–37MB
~670K SLoC