Open LN5005 opened 2 months ago
最近有点想将自己以前做的 Stripper 地图上传到 Workshop(因为自己懒得建模),然而游戏引擎无法直接运行 Stripper 格式的代码,自己又不想做这种劳动密集型的脏活,所以出于好奇让 AI 写了一个 python 脚本来将自己的地图代码转换成兼容的格式:
这玩意真恐怖……
Stripper-to-VScript-Converter(2024-09-07).zip
自动生成 director_base_addon、自动运行用于生成实体的脚本:
一般要求: 把 Stripper 的代码扔进 input.txt 里; 在 config.cfg 里填入控制台获取的地图名称(如 c5m2_park)。
执行顺序(猜测):director_base_addon >> ladders & events >> entities >> OnMapSpawn.
支持转换的实体类型:
仅限我用过的实体键值。如果实体使用了 string_keyvalues 列表外具有 string 类键值的参数,那么转换的代码会因为缺少对相关键值的支持而出现问题,并在游戏内控制台报错; 同理,如果实体使用了预期外的、具有 vector 类键值的参数,那么转换的代码也会出现问题。无论是哪种情况,都需要修改代码以使转换器根据期望的格式来转换代码。
此外,键值的分隔符必须使用逗号。
已知问题: 由于 EntFire 不对 worldspawn 起作用,所以没办法修改 skybox;
需要删除 input.txt 中所有与 modify 和 filter 有关的代码,因为这个脚本不处理这些东西,并且如果这些代码包含 classname ,那么就会被脚本转换无效的 VScript 代码;这些无效的 VScript 代码会生成无效的实体,并可能会引起不可预料的问题,如游戏崩溃。
生成消耗品的实体在客户端上可能不会被正确地显示(invisible),在这种情况下消耗品仍然可以被拾取,但是视觉上不可见。我试过在 _event.nut 中运行生成有关实体的代码(而非 _entities.nut ),但是问题依然存在。
如果实体内(在 {} 里)有被注释的代码,那么这些被注释掉的代码也会被转换,换句话说这个脚本不会因为注释符而忽视掉实体内的代码。
如果输出(例如 OnTrigger 和 OnMapSpawn)不使用逗号作为分隔符,那么转换的代码也会出问题。 脚本根据 targetname 来为实体添加输出,因此如果具有多个同名的实体,它们将会共享代码所添加的输出。
梯子之类的东西也存在一些问题。如果是通过复制生成的梯子,那么这个脚本会正常工作; 由于没办法用 EntFire 和 Entity.Addoutput 来修改梯子的参数,被修改的原版梯子将无法正常工作(修改不起作用),因此需要删除原版梯子并用代码重建原版梯子。
这玩意应该可以自动处理未知的键值(不包括 OnMapSpawn 之类的 output 键值),但是前提是键值不属于 string 类,因为没办法区分 Stripper 代码中的键值究竟是不是属于 string 类,string 与非 string 类具有相同的特征(即双引号键值)。
可以把這些寫進你的github專案裡面 我對這方面不熟悉
最近有点想将自己以前做的 Stripper 地图上传到 Workshop(因为自己懒得建模),然而游戏引擎无法直接运行 Stripper 格式的代码,自己又不想做这种劳动密集型的脏活,所以出于好奇让 AI 写了一个 python 脚本来将自己的地图代码转换成兼容的格式:
这玩意真恐怖……
Stripper-to-VScript-Converter(2024-09-07).zip
自动生成 director_base_addon、自动运行用于生成实体的脚本:
一般要求: 把 Stripper 的代码扔进 input.txt 里; 在 config.cfg 里填入控制台获取的地图名称(如 c5m2_park)。
执行顺序(猜测):director_base_addon >> ladders & events >> entities >> OnMapSpawn.
支持转换的实体类型:
仅限我用过的实体键值。如果实体使用了 string_keyvalues 列表外具有 string 类键值的参数,那么转换的代码会因为缺少对相关键值的支持而出现问题,并在游戏内控制台报错; 同理,如果实体使用了预期外的、具有 vector 类键值的参数,那么转换的代码也会出现问题。无论是哪种情况,都需要修改代码以使转换器根据期望的格式来转换代码。
此外,键值的分隔符必须使用逗号。
已知问题: 由于 EntFire 不对 worldspawn 起作用,所以没办法修改 skybox;
需要删除 input.txt 中所有与 modify 和 filter 有关的代码,因为这个脚本不处理这些东西,并且如果这些代码包含 classname ,那么就会被脚本转换无效的 VScript 代码;这些无效的 VScript 代码会生成无效的实体,并可能会引起不可预料的问题,如游戏崩溃。
生成消耗品的实体在客户端上可能不会被正确地显示(invisible),在这种情况下消耗品仍然可以被拾取,但是视觉上不可见。我试过在 _event.nut 中运行生成有关实体的代码(而非 _entities.nut ),但是问题依然存在。
如果实体内(在 {} 里)有被注释的代码,那么这些被注释掉的代码也会被转换,换句话说这个脚本不会因为注释符而忽视掉实体内的代码。
如果输出(例如 OnTrigger 和 OnMapSpawn)不使用逗号作为分隔符,那么转换的代码也会出问题。 脚本根据 targetname 来为实体添加输出,因此如果具有多个同名的实体,它们将会共享代码所添加的输出。
梯子之类的东西也存在一些问题。如果是通过复制生成的梯子,那么这个脚本会正常工作; 由于没办法用 EntFire 和 Entity.Addoutput 来修改梯子的参数,被修改的原版梯子将无法正常工作(修改不起作用),因此需要删除原版梯子并用代码重建原版梯子。
这玩意应该可以自动处理未知的键值(不包括 OnMapSpawn 之类的 output 键值),但是前提是键值不属于 string 类,因为没办法区分 Stripper 代码中的键值究竟是不是属于 string 类,string 与非 string 类具有相同的特征(即双引号键值)。