Skip to content

车包 ​

车包是做车的主要方式:一个文件夹或 zip 压缩包,放进 <游戏目录>/vettura/packs/,不写代码、不编译模组。游戏启动时 Vettura 读取所有车包,里面的车出现在创造模式物品栏的「Vettura · 载具」里。

服务器和玩家要装同样的车包。进服务器时 Vettura 会对比双方的车包,缺少或版本不同会在聊天栏提示。

模板:制作工具包里的 examples/packs/example(白模双门跑车 example:whitebox_coupe)。复制整个文件夹、改名,就是一个新车包。

结构 ​

mypack/                                        文件夹,或者 mypack.zip(pack.json 在压缩包的根目录)
├─ pack.json
├─ vehicles/my_coupe.json                      一辆车一个文件;车的 ID 是 mypack:my_coupe
├─ assets/mypack/
│  ├─ meshes/my_coupe*.vxmesh.json             导出脚本生成(见「导出与碰撞外壳」)
│  ├─ geo/my_coupe*.geo.json                   导出脚本生成
│  ├─ textures/entity/vehicle/my_coupe*.png    图集(见「贴图」)
│  ├─ textures/item/my_coupe.png               生成器图标(可选,没有就显示 T15 的)
│  ├─ geo、meshes、textures/item 里的 my_coupe_key*   钥匙模型(可选,没有就用 T15 的钥匙)
│  ├─ sounds.json、sounds/                     自己的声音(可选)
│  └─ lang/zh_cn.json、lang/en_us.json         车名、钥匙名
└─ data/mypack/vehicle_hulls/my_coupe.bin      碰撞外壳(见「导出与碰撞外壳」)

pack.json:

json
{"id": "mypack", "name": "My Pack", "version": "1.0.0", "author": "你的名字", "description": "一句话介绍"}

id 只用小写字母、数字和下划线,它也是资源的命名空间(assets/<id>、data/<id>)。每次改了车包都要改 version,玩家和服务器才分得清是不是同一版。

vehicles/<名字>.json ​

节内容必填
format格式版本,现在是 1否
physics物理参数,字段见「物理参数」页的表;没写的字段用 T15 的值是
layout车身布局:车身盒子、座位、方向盘、车门、引擎盖、加油口,见「车身布局」页是
engine引擎声音,见下文否,默认 T15 的柴油机
sounds{"handbrake": [拉起, 放下] 或 null, "shift": 声音或 null, "horn": 声音, "doors": [开门, 关门]}否,默认 T15 的
fuel"diesel" 或 "petrol"否,默认柴油
keylesstrue:一键启动,钥匙带在身上,按住启动键否
paints出厂漆色:[{"id": "my_red", "main": "#A51616", "second": "#A51616"}, ...],至少两种否,默认 T15 的漆色
hudPanes损伤界面上四块玻璃的位置(风挡、后窗、左窗、右窗)否
gauges screens fonts仪表:指针表的量程,液晶屏的画面否

拼错的字段名、类型不对的值都会报错,报错写明是哪个文件的哪个字段,不会悄悄忽略。

单位:physics 和 Java 接口一样用米、千克、牛顿、秒、转/分,只有这几个换成了更好填的单位:maxSteer steerRate steerReturn slipPeak 用度,topSpeed fourWheelSpeed lowRangeSpeed 用 km/h,steerGrip 用 g。

碰撞形状 physics.hull:顶点列表 [x, y, z, x, y, z, ...](模型坐标),或者两个盒子拼的车形 {"box": [半宽, 车头 z, 车尾 z, 底, 腰线, 车厢半宽, 车厢前 z, 车厢后 z, 车顶]}。

布局:盒子写 [前0, 前1, 右0, 右1, 上0, 上1](米,车身坐标,每对从小到大);座位写 {"forward": -0.15, "right": -0.37},可以再加 cushion(坐垫高度)、yaw、look;第一个座位是驾驶座。

引擎声音,两种写法任选:

json
"engine": {"ladder": {"on": [[1170, "mypack:v10.on_1"], [1410, "mypack:v10.on_2"]], "off": [[1170, "mypack:v10.off_1"], [1410, "mypack:v10.off_2"]]},
           "crank": "mypack:v10.starter", "start": null, "stop": "mypack:v10.stop", "at": [-1.0, 0, 0.6]}
"engine": {"idle": "...", "mid": "...", "load": "...", "coast": "...", "rpms": [770, 1830, 1830, 1300], "crank": "...", "start": "...", "stop": "..."}

声音 ID 是 <车包 id>:<事件名>,事件写在车包的 assets/<id>/sounds.json 里,和资源包一样。每种声音的要求见「声音」页。

语言(assets/<id>/lang/zh_cn.json 和 en_us.json 一起写):entity.<id>.<名字> 车名(生成器也用它),item.<id>.<名字>_key 钥匙名,tooltip.<id>.vehicle_key.<名字> 钥匙说明,screen.vettura.vehicle_spawner.paint.<漆色 id> 漆色名。

检查、安装、分享 ​

  1. 进游戏前先跑检查工具:python tools/check_vehicle.py <车包文件夹> <名字>,把每条 FAIL 和 WARN 处理掉。
  2. 把文件夹放进 <游戏目录>/vettura/packs/(整合包是实例目录下的 vettura/packs/),重启游戏。车包只在启动时读取。
  3. 有错误时,日志里写明是哪个车包、哪个文件、哪个字段,进存档后屏幕上也会提示;同一个车包里其他没问题的车照常加载。
  4. 分享时打成 zip:python tools/make_pack_zip.py <车包文件夹>,生成 <id>-<版本>.zip(pack.json 在压缩包根目录,Blender 文件不打进去)。自己压缩的话,选中 pack.json 和 vehicles、assets、data 一起压,不要把外面那层文件夹压进去。
  5. 只分享你有权分发的模型、贴图和声音。