如何在VCMP服务器中通过加入Mod理解资源管理? - 教程 - GTAMODX
教程如何在VCMP服务器中通过加入Mod理解资源管理?
VEGETAZ 2026年6月27日 0 评论 VCMP极简开服教学:精彩的Mod
0.前置依赖
- 引擎准备完毕
- 基本的插件、脚本环境配置完毕
- 初步理解VCMP的事件驱动环境
- 初步理解VCMP的指令实现模式
- 求知的好奇心和冷静的思考脑
1.基础认知
- VCMP的首席开发者(VC:MP lead developer)maxorator,将其开发的一款mod管理工具MVL(Maxo's Vehicle Loader)内置到VCMP 0.4中,使得服主们得以很方便地管理Mod资源。
- 在wiki中可查,自定义内容分为以下几种:
- Sprite(精灵图片)
- Maps(地图物体)
- Objects(单个物体)
- Weapons(武器)
- Vehicles(载具)
- Skins(皮肤)
- Sounds(音效)
- Map icons(地图图标)
2.内容介绍,组成,位置,命名,用法
2.1.Sprite 精灵图片
- 作用:客户端脚本可使用GUI功能将该图片展示出来(GUISprite)。
- 位置:放置在<服务器目录,即引擎所在位置>/store/sprites/下,如/store/sprites/Filename.png。
- 用法:使用vcmp提供的api,GUISprite来创建图片并显示。
2.2. Maps 地图物体
- 作用:使用已定义的物体(物体项目放置说明),生成到世界某位置上。
- 位置:主要是xml文件,可和物体模型文件压缩包一起放置在其内的maps文件夹内,更推荐放置在/store/maps中,名称以_mem结尾可实现玩家客户端环境只加载进内存而不会存放到硬盘空间中,否则和其余Mod资源一起存在于%appdata%\VCMP\04beta\store目录下(该目录下以服务器ip+端口区分不同的服务器资源如本地服务器资源则在是%appdata%\VCMP\04beta\store\127.0.0.1-8192文件夹下)。
- 组成:由事先在Objects中定义的外部物体Mod或者游戏原生的物体、位置、旋转信息组成xml文本,具体内容参考:
<?xml version="1.0" encoding="ASCII" ?>
<itemlist>
<item model="6000" name="drugstoreint">
<position x="-856.7597046" y="-79.71799469" z="12.73265266" />
<rotation format="axisangle" x="0.0" y="0.0" z= = />
"0.0"
angle
"1.0"
</item>
<item model="6001" name="drugstoreext">
<position x="-856.3429565" y="-79.98773956" z="12.64423846" />
<rotation format="axisangle" x="0.0" y="0.0" z="0.0" angle="1.0" />
</item>
</itemlist>
- 上述xml内容解析:
-
<?xml version="1.0" encoding="ASCII" ?>描述了该文件为xml;
- 由<itemlist>标签开始至</itemlist>标签结束,表示其中的内容是物体项目列表;
- <item>至</item>标签表示单个物体;
- model="6000"表示使用模型id为0的外部物体,因为在MVL物体使用中,事先定义的0id需要加上偏移6000,这样才可区分是游戏原生的模型id还是游戏外的mod模型;
- name对应的是该模型定义的名称;
- position和rotation分别对应世界三维坐标和旋转;
- 该xml内容对应单机中的ipl文本内容中的INST部分。
2.3. Objects
- 作用:定义单个外部物体Mod,可被maps中xml使用,或在脚本中用CreateObject方法使用。
- 组成:分为物体模型文件和xml信息文件。模型文件由dff模型、txd贴图、col碰撞组成,可以不需要碰撞。xml文本内容由id、类型标志、碰撞信息、贴图信息、模型信息和渲染距离组成(下方是内容示例)。必须打包为单个7z压缩包,名称以_unp结尾。其中xml文件可一起放置在压缩包内objects文件夹中,或可放置到外层的store目录下的objects中(推荐后者,统一管理)。
- 用法:使用vcmp提供的api,CreateObject来创建物体到游戏世界内;该api可创建游戏原生的物体,也可创建额外添加的物体。
<?xml version="1.0" encoding="ASCII"?>
<objectlist>
<object id="0">
<flags value="0" />
<collision path="drugstoreint.col" />
<texture path="chem2.txd" />
<model path="drugstoreint.dff" distance="350" />
</object>
<object id="1">
<flags value="0" />
<collision path="drugstoreext.col" />
<texture path="chem.txd" />
<model path="drugstoreext.dff" distance="350" />
</object>
</objectlist>
- 上述xml内容解析:
-
<?xml version="1.0" encoding="ASCII" ?>描述了该文件为xml;
- 由<objectlist>标签开始至</objectlist>标签结束,表示其中的内容是物体列表;
- <object>至</object>标签表示单个物体;
- <object>标志中的属性id="0"表示定义该物体模型id为0,其他地方要使用该物体模型则需要将id加上偏移6000(最终用模型id 6000表示该物体);
- <flag>标签表示类型标识,value属性才是flag的真实取值,vc中该类型取值可查gtamods的wiki
- collision对应的是该模型对应的碰撞文件,path属性值是碰撞文件全名,若不存在碰撞,可写为<collision type="none"/>;
- <texture>标签里对应贴图文件,path属性值是贴图文件全名;
- <model>标签里对应模型文件,path属性值是模型文件全名,distance属性值是该模型的渲染距离(近距离物体应填小于300,因为在 GTA 3 和 Vice City 中,LOD 物体(绘制距离大于 300)的碰撞数据会被引擎忽略);
- 该xml内容对应单机中的ide文本内容中的OBJS部分。
2.4. Weapons 武器
-
作用:作为额外的武器供游戏内使用。
-
组成:武器信息xml文件,图标文件(?选),动作文件(可选),模型文件(可选),贴图文件(可选),开镜图片(可选),枪声(可选)。打包为单个7z压缩包,放置/store/weapons下。
-
压缩包命名规则:w<id>_s<slot>_l<weapon>_name.7z
- <id>从100开始使用,用于游戏内确定到该武器mod。
- <slot>武器槽位,从0到8用途分别是:
- 0:帽子、空手、指环等;
- 1:近身武器类,武士刀、电锯、锤子等;
- 2:投掷武器类,手雷、燃烧瓶、催泪弹等;
- 3:手枪类;
- 4:散弹枪类;
- 5:冲锋枪类;
- 6:步枪类;
- 7:机枪类,M60、RPG、加特林等;
- 8:狙击枪类。
- <weapon>对应原版的武器id,如6对应棒球棍。
-
用法:使用vcmp提供的api,player.SetWeapon或者.GiveWeapon来设置玩家武器,亦或者在AddClass(创建可选角色用)中使用;游戏原生的武器在脚本代码中的使用方法,同样也适用于额外添加的武器。
-
武器信息xml文件示例如下,具体各项内容可对应单机里的weapon.dat。
<?xml version="1.0" encoding="ASCII"?>
<weapon>
<basic>
<name>Pike</name>
<logicalid>6</logicalid>
</basic>
<properties>
<type>melee</type>
<range>2.000000</range>
<firerate>450</firerate>
<reload>100</reload>
<clipsize>1000</clipsize>
<damage>21</damage>
<speed>-1.000000</speed>
<radius>0.800000</radius>
<lifespan>-1.000000</lifespan>
<spread>-1.000000</spread>
<offset>
<x>0.100000</x>
<y>1.800000</y>
<z>0.300000</z>
</offset>
<animgroup>baseball</animgroup>
<animstart>5</animstart>
<animend>20</animend>
<animfire>16</animfire>
<anim2start>3</anim2start>
<anim2end>17</anim2end>
<anim2fire>11</anim2fire>
<animbreak>99</animbreak>
<modelindex>-1</modelindex>
<model2index>-1</model2index>
<flags>00102000</flags>
<weaponslot>1</weaponslot>
</properties>
</weapon>
2.5. Vehicles 载具
-
作用:作为额外的载具供游戏内使用。
-
组成:载具信息xml文件,模型文件(必须),贴图文件(必须),碰撞文件(模型中不带碰撞时必须),动作文件(可选)。打包为单个7z压缩包,放置到store/vehicles下。
-
压缩包命名规则:v<modelid>_t<vehicletype>p<maxpassengers><vehiclename>.7z
- <modelid>是载具id,范围为6400-6499.。
- <vehicletype>是载具类型,0代表汽车和飞机, 1代表摩托,2代表船。
- <maxpassengers>是最大乘客数。vc里最大4个所以写多了也无用;同时也和模型本身有关。
- <vehiclename>载具名称。
-
用法:使用vcmp提供的api,CreateVehicle来创建载具;该api可创建游戏原生的载具,也可创建额外添加的载具。
-
载具信息xml文件示例如下,具体各项内容可对应单机里的handling.cfg。
<?xml version="1.0" encoding="ASCII"?>
<vehicle>
<basic>
<type>bike</type>
<name>PCJ 600</name>
<anims>bikes</anims>
<comprules>0</comprules>
<extraflags>0000</extraflags>
<wheelrotangle>16</wheelrotangle>
<wheelscale>0.670000</wheelscale>
<immunity>0</immunity>
</basic>
<aidata>
<class>motorbike</class>
<freq>10</freq>
<level>7</level>
</aidata>
<colors>
<carcol>13,13</carcol>
<carcol>22,22</carcol>
<carcol>35,35</carcol>
<carcol>38,38</carcol>
<carcol>2,2</carcol>
<carcol>3,3</carcol>
<carcol>48,48</carcol>
<carcol>51,51</carcol>
</colors>
<audio>
<enginefarsample>287</enginefarsample>
<enginenearsample>23</enginenearsample>
<hornsample>0</hornsample>
<hornfreq>27000</hornfreq>
<sirensample>0</sirensample>
<sirenfreq>9600</sirenfreq>
<doorsounds>1</doorsounds>
</audio>
<handling>
<mass>500.000000</mass>
<percentsubmerged>103</percentsubmerged>
<steeringlock>35.000000</steeringlock>
<seatoffset>0.300000</seatoffset>
<damagemultiplier>0.150000</damagemultiplier>
<value>10000</value>
<flags>00010102</flags>
<dimensions>
<x>0.800000</x>
<y>1.800000</y>
<z>1.200000</z>
</dimensions>
<centreofmass>
<x>0.000000</x>
<y>0.050000</y>
<z>-0.090000</z>
</centreofmass>
<traction>
<multiplier>1.600000</multiplier>
<loss>0.900000</loss>
<bias>0.480000</bias>
</traction>
<transmission>
<numofgears>5</numofgears>
<maxspeed>190.000000</maxspeed>
<acceleration>50.000000</acceleration>
<drivetype>R</drivetype>
<enginetype>P</enginetype>
</transmission>
<brakes>
<deceleration>15.000000</deceleration>
<bias>0.500000</bias>
<abs>0</abs>
</brakes>
<suspension>
<forcelevel>0.850000</forcelevel>
<dampening>0.150000</dampening>
<upperlimit>0.150000</upperlimit>
<lowerlimit>-0.160000</lowerlimit>
<bias>0.500000</bias>
<antidive>0.000000</antidive>
</suspension>
<lights>
<front>1</front>
<rear>1</rear>
</lights>
</handling>
<bikehandling>
<leanfwdcom>0.330000</leanfwdcom>
<leanfwdforce>0.150000</leanfwdforce>
<leanbackcom>0.280000</leanbackcom>
<leanbackforce>0.150000</leanbackforce>
<maxlean>44.999996</maxlean>
<fullanimlean>38.000004</fullanimlean>
<deslean>0.930000</deslean>
<speedsteer>0.700000</speedsteer>
<slipsteer>0.500000</slipsteer>
<noplayercomz>0.100000</noplayercomz>
<wheelieang>35.000008</wheelieang>
<stoppieang>-40.000000</stoppieang>
<wheeliesteer>-0.009000</wheeliesteer>
<wheeliestabmult>0.700000</wheeliestabmult>
<stoppiestabmult>0.600000</stoppiestabmult>
</bikehandling>
</vehicle>
2.6. Skins 皮肤
-
作用:作为额外的人物皮肤供游戏内使用。
-
组成:皮肤信息xml文件,模型dff文件,贴图txd文件。
打包为单个7z压缩包,放置到store/skins下。
-
压缩包命名规则: z<skinid>_<skinname>.7z
- <skinid>是皮肤id,可从200到249。
- <skinname>是皮肤名称。
-
用法:使用vcmp提供的api,player.Skin来设置皮肤,亦或者在AddClass中使用;游戏原生的皮肤在脚本代码中的使用方法,同样也适用于额外添加的皮肤(有点特别注意是mod皮肤无法设置Alpha-透明度)。
-
皮肤信息xml文件示例如下:
<?xml version="1.0" encoding="ASCII"?>
<skin>
<basic>
<name>Awesome Skin</name>
<animgroup>man</animgroup>
<animfile>null</animfile>
</basic>
</skin>
2.7. Sounds 音效
- 作用:作为音效供服务器中使用。
- 组成:单个音频文件,.wav类型或者.ogg类型。放置到store/sounds下。
- 压缩包命名规则:s<id>_NAME.wav
- 用法:使用vcmp提供的api,PlaySound来播放音效;该api可播放游戏原生的音效,也可播放额外添加的音效。
2.8. Map icons 地图图标
- 作用:作为地图图标供服务器中使用。
- 组成:单个图标图片,需要png类型。放置到store/mapicons下。
- 压缩包命名规则:m<icon id>_<name>
- <icon id>代表图标id,从100开始使用。
- 用法:使用vcmp提供的api,CreateMarker来创建地图图标;该api可创建游戏原生的地图图标,也可创建额外添加的地图图标。
3.示范:物体资源的使用
3.1.获取物体资源
- 亦可直接使用他人制作完成的物体mod(在vc单机中可用的,或者他人服务器中的资源)
3.2.他人服务器资源用法
- 直接放置到store即可。
- 需要注意的是物体的id冲突问题,每个物体需要给它们安排唯一的id避免冲突。
- 服务器中可使用代码创建,或者用相当于单机中ipl文件定义的方式让环境读取时创建 —— vcmp中则用的是maps下的xml文件;下面分别有具体示范。
3.3.原始物体mod资源用法
3.3.1.编写xml文件
- 在服务器目录下,创建store文件夹,再在里面创建objects文件夹。
- 改名为.xml格式,名称可随意;文件名中若以_mem结尾代表玩家读取时只会读入内存而不会保存到硬盘中。
- 根据物体mod文件,填写如图xml内容;这里用的是一个金字塔物体(制作方法可查上面关联专栏),赋予0号id给服务器使用。
<?xml version="1.0" encoding="ASCII" ?>
<objectlist>
<object id = "0">
<flags value="0"/>
<texture path="pyramid.txd"/>
<collision path="pyramid.col" name="pyramid"/>
<model path="pyramid.dff" distance="299"/>
</object>
</objectlist>
3.3.2.打包压缩
- 将模型、贴图、碰撞打包成如图结构,注意压缩包中直接就是这三个文件。
- 同时文件名必须要以_unp结尾。
- 压缩包类型必须是7z。
- 压缩包放置到store文件夹下即可
3.4.物体mod在游戏中的创建方法
3.4.1.调用vcmp的api创建
- 可以像之前文章中创建拾取物那样在脚本加载时创建,也可以用指令来实现创建;这里设计一个cobj指令,在玩家附近位置创建指定的物体:
else if (cmd == "cobj") {
if (text) {
text = text.tointeger();
local pos = Vector(player.Pos.x + 15, player.Pos.y, player.Pos.z);
CreateObject(text, player.World, pos, 255);
}
}
- 上述代码解析:
- 在现有的指令事件中对if结构续写,拼接一个else if结构表示和上面的if同属于同一次条件判断;
- 若传入的指令为cobj,就判断是否后面带着文本text;
- 是的话把文本转为整数类型;
- 再创建一个三维向量表示坐标,X值那里取玩家当前坐标X+10的值表示往东15个单位;
- 最后调用vcmp提供的功能api来创建物体,四个参数分别是物体id、世界id、坐标、透明度。
- 开启服务器后使用指令/cobj 6000,因为上面给金字塔定义的id是0,在使用中要+6000来对应(为了和游戏原生的物体id区分)。
- 可按Tab打开大聊天框,在输出坐标这行使用快捷键Ctrl+C复制内容。
- 在store文件夹下创建maps文件夹,再在其内创建xml文件(新建文本文档后改类型),同样名字以_mem结尾也是会令玩家端直接读取进内存而不会保存到硬盘上;编写上图内容,其中z值调整了一下,因为人物坐标的高度值z值差不多是在地面往上一个单位的,这里把取到的z值减了一个单位。
<?xml version="1.0" encoding="ASCII" ?>
<itemlist>
<item model = "6000">
<position x="-453.165" y="773.582" z="10.0712" />
<rotation format="axisangle" x="0" y="0" z="0" angle="1"/>
</item>
</itemlist>
4.总结
- VCMP嵌入了MVL来管理外部的Mod资源;
- 文件以一定的规则打包压缩、命名;
- 通过xml作为资源配置信息告知MVL这些引入的Mod是如何定义的;
- MVL从而可以把外部Mod资源的使用简化为游戏原生的资源用法一般。
VCMP极简开服教学系列,
上一篇专栏: