【哥萨克3】创建新的战斗单位全能龙骑兵 - 0度
本帖最后由 o度 于 2021-6-22 11:04 编辑创建新单位
在本教程中,我将介绍将新单位引入游戏、使其可训练和配置以使其受升级影响的基础知识。
我将根据轻骑兵单位的视觉效果制作自定义龙骑兵,这个龙骑兵既能攻击士兵也能攻击舰船,围墙,建筑。本来可以修改基本单位,但创建一个全新的单元要有趣得多,也更有用。
准备
首先,拿起你最喜欢的文本编辑器并打开以下文件:
- data/scripts/country.script
- data/scripts/unit.script
- data/hud/hud.mat
- data/objects/units.objects
1.模型动作外观
接下来,我们需要创建单位 .prop 文件。这些文件可以在data\objects\units中找到,这个文件包含我们新单位的视觉效果及动画。
这里复制“lightcavalry.prop”文件并将其重命名为“dragon21th.prop”。
(想用那个外观就复制哪个,最好是同类型,乱用不知道什么后果)
复制并重命名新单位文件后,打开它进行编辑。
打开后,查找以“CustomName”和“BaseName”开头的两行(应该是 4 和 5)。
将这些更改为新单位的 ID。这里改为 dragon21th',
actorproperty : section.begin {refurl=.\data\objects\ref\refunit.prop; refkey=actorproperty}
LODActorName = tatar
DefaultMeshName = tatar.mesh(这里是模型和动作,不能乱改)
materialproperty : section.begin {refurl=.\data\objects\ref\refunit.prop; refkey=materialproperty}
Mesh.DefaultMaterialName = dragoon18net
Mesh.UseableMaterials = dragoon18net(这里是贴图,可以改,但和模型不对应的话会有点奇怪)
还可以修改战马的外观,horseblack黑马horsewhite白马 horsebrown棕马 sipahihorse战马
这里我改为西帕奇的马
BaseName = tatar_horse
DefaultMeshName = tatar_horse.mesh(这里是模型和动作,不能乱改)
Mesh = tatar_horse.mesh(这里是模型和动作,不能乱改)
DefaultMaterialName = sipahihorse
Materials = sipahihorse (这里是贴图,可以改,但和模型不对应的话会有点奇怪)
保存并关闭文件。
注意:为 BaseName 指定的正确 ID 很重要,因为这个ID是要在以后的文件中引用的。
我们如何使用它?获得单位文件后,我们需要告诉游戏加载它。
打开units.objects 并搜索添加基本单位的行,复制它并更改它指向的文件。
这里就是,找到并复制“ObjectItems.PropertiesFileName=.\data\objects\units\lightcavalry.prop”行,
然后修改为, “ObjectItems.PropertiesFileName=.\data\objects\units\dragon21th.prop”
完成后,保存并关闭文件。
问题1,这里如果要创建有第二武器的单位就只能复制有第二武器的单位,否则第二武器攻击时会卡住。应该是没有第二武器动作。
骑兵中有第二武器的只有鞑靼人,别的都不行。步兵有各种弓箭手和掷弹兵。
只要复制了有第二武器的prop文件,两种武器类型可以随便定义,火枪,弓箭,炸弹,均可,只是动作还是原单位动作。
比如复制了鞑靼人,把第一武器设为火枪,第二武器设为炸弹。攻击时还是射箭的动作,但声光效果会变为枪击和炸弹。
后续1:问题解决,不用非得用清兵一样的鞑靼人才能两种武器了。
只需要把编辑对应兵种的aaf文件,我用的是data\animations\aaf\dragoon18pie.aaf 打开,
把"attack0",592,604,morph复制一行,
改为"attack1",592,604,morph,
第二武器就有了动作,以此类推,可以加第三武器"attack2",592,604,morph
这样任何单位都可以两种武器了,当然,动作跟第一武器是一样的,因为是单纯复制的第一武器动作。
而天生两种武器的单位,两种动作是设计不一样的。有个问题就是第二武器动作前会发呆一两秒,
这几个参数是火枪开枪时的枪口火焰,烟雾效果,如果不加显得不够真实。不要忘记。其它武器也有对应效果,记得去原版处对应复制即可。
后续2第二种解决方案,只设第一武器,但把增加修改下列代码
SetObjBaseMaterialCanKill(objprop, gc_obj_material_iron, gc_obj_material_body, gc_obj_material_wood, gc_obj_material_woodwall, gc_obj_material_iron, gc_obj_material_building);
原来的代码没有后4项,增加的后4项是可攻击木,铁,建筑等选项。缺点就是,攻击力稍低。一般攻击建筑的第二武器攻击力是远高于第一武器的,这里都一样了。
问题2,这个文件决定了骑兵的速度,之后尝试改哪里都没有用。复制的是重骑兵就是重骑兵的速度,除非把所有重骑兵定义速度都改成轻骑兵的。
另外,快速骑兵有:波兰翼骑兵(波兰),西奇哥萨克(哥萨克轻骑兵,乌克兰),苏格兰突袭者(苏格兰),胡萨尔骑兵(瑞士),普鲁士轻骑兵 ,芬兰骑兵(瑞典),克罗地亚人(奥地利)
比较帅的骑兵(慢速重骑兵):国王火枪手(法国),马穆鲁克(阿尔及利亚),兰瑟枪骑士(苏格兰),哥萨克近卫骑(俄罗斯),最特殊的鞑靼人(土耳其)两种武器。
2.新单位图标
切换到 data/hud/hud.mat,找到与您的基本单位对应的部分,
Material.Name = icons.unit.lightcavalry复制整段代码,然后更改“Material.Name”为新单位 ID。
代码:(用谁的图标就复制谁,也可以自建新图标,\data\hud\textures\ui\iconsunits.bmp这是单位图标文件)
section.begin {refurl=.\data\hud\ref\reflibmat.mat}
Material.Name = icons.unit.lightcavalry
Material.LibTextureName = iconsunits
Material.TextureCoord.ImageW = 1024
Material.TextureCoord.ImageH = 512
Material.TextureCoord.CoordX = 276
Material.TextureCoord.CoordY = 368
Material.TextureCoord.CoordW = 46
Material.TextureCoord.CoordH = 46
section.end
改为:
section.begin {refurl=.\data\hud\ref\reflibmat.mat}
Material.Name = icons.unit.dragon21th
Material.LibTextureName = iconsunits 图标文件
Material.TextureCoord.ImageW = 1024图像宽
Material.TextureCoord.ImageH = 512 图像宽
Material.TextureCoord.CoordX = 276 图标横坐标(左上角)因为图标是46x46的所以坐标都是46的倍数。
Material.TextureCoord.CoordY = 368 图标纵坐标(左上角)换句话说,数字除以46就可以知道是第几行第几列的图标
Material.TextureCoord.CoordW = 46 图标宽
Material.TextureCoord.CoordH = 46 图标高
section.end保存并关闭文件。
后面还有很多空格,可以自建图标来使用
3.新单位属性
设置一些基本信息接下来,切换到“data/scripts/unit.script”。
给我们的新龙骑士一些属性了,否则他一出生就会死。
因为我正在制作的是一个新的龙骑兵,所以搜索以下龙骑兵代码行,其它兵种类似
代码:
'dragon', 'kingmusketeer', 'dragoon18fra', 'dragoon18', 'dragoon18dip', 'lightcavalry', 'lightcavalrydip':: begin
这样做的作用是,当一个单元被创建时,如果它的 id 与上述任何一个匹配,则执行以下代码,所以让我们把新的 ID 添加到最后:
代码:
'dragoon', 'kingmusketeer', 'dragoon18fra', 'dragoon18', 'dragoon18dip', 'lightcavalry', 'lightcavalrydip', 'dragon21th' : begin
然后根据自己需要修改这个单位的属性,我们让他与普通的龙骑兵有点不同,但不要太变态。
往下看一点,你会看到一行写着“case objprop.sid of”,在它的正下方:
代码:
'dragoon' : begin
objprop.aiforce := 10;
end;
让我们复制它,并且更改为新 id,并且修改各项参数(这里参考单位的修改,不再赘述)
代码:
'dragon21th' : begin
objbase.maxhp := 350;
SetObjBaseWeapon(objprop, objbase, 0, 17, 200, 300, 900, 0, 100000, gc_obj_weapon_kind_bullet, True);
SetObjBaseSearchBuildVisionScore(objprop, objbase, 900, 1000, 3, 30);
end;
我决定将他的生产时间减少到 1000
'SetObjBaseSearchBuildVisionScore' (第二个参数),他提供的分数为 30(最后一个参数)。
四个参数依次为设定搜索范围(像素),建造时间(毫秒),单位视野和得分
保存并关闭文件。
4.添加到阵营
现在我们的新龙骑兵需要知道如何组建阵型、升级以及出现在建造列表。
让我们从阵型开始。打开country.script寻找以下两行
代码:
_country_ClearOfficerFormations(country);
var ind : Integer;
在其下方的某个地方,找到骑兵编队信息,
AddOfficersFormationCavExt(country, ind, 'dragoon18net', 1);复制并修改为
AddOfficersFormationCavExt(country, ind, 'dragon21th', 1);”
如果是步兵单位,组建步兵部队,则添加到步兵编队组。
接下来,我们将把他分配到一个国家。这里分配到英格兰,因为它们是马厩建造菜单中第二格没有骑兵单位的国家。
注:
马厩,奥地利,波兰,瑞典,法国 六格全满,匈牙利空第5格,阿尔及利亚仅有1格,其余大多空2,4格,基本2格全空。
17th兵营除土耳其外,第四格均为空缺,大部分第二格也空缺,哥萨克只有一个格。
寻找
// new units to preserve indexation put here(已经发布的国家的新单位在这里,)
然后在其下方仿照原来的代码
原来 if (pol) then _country_AddMember(country, 'dragoonpol', ind, True, gc_country_editorplace_category_cavalry, 29, gc_ai_unit_uniq_cav17);
添加 if (eng) then _country_AddMember(country, 'dragon21th', ind, True, gc_country_editorplace_category_cavalry, 25, gc_ai_unit_dragoon17);
如果写成if (aus)or (fra) or (eng) or (spa) or (rus) or (ukr) or (pol) or (swe) or (pru) or (ven) or (tur) or (alg) or (mis) or (net) or (den) or (por) or (pie) or (sax) or (bav) or (hun) or (swi) or (sco) or (tat) or (lit) then _country_AddMember(country, 'dragon21th', ind, True, gc_country_editorplace_category_cavalry, 29, gc_ai_unit_uniq_cav17);
则添加到所有国家。
也可以这样 用 if (not tur) 形式 排除某些国家,添加到其余所有国家
这里注意复制对应单位的代码,且不要放在DLC单位后面,会出错,还没搞懂为什么。
接下来,我们需要将他添加到建筑物中。查找
// FIXED PRODUCE”并向下滚动一点。您会发现一系列以
“_country_AddFixedProduceWithAccessControl”开头的行,这些行将单位添加到建筑物中。
由于我的单位是龙骑兵,所以我复制龙骑兵作为参考,并将其 id 更新为 'dragon21th' 并将其位置(id 后面的数字)从 '2' 更改为 1'
(0,0第一格,1,0第二格以此类推,原版所有马厩最多只有6格,不如果想占用原有单位位置可以改成6,0即占第七格,)
查找代码:
_country_AddFixedProduceWithAccessControl(country, fixedproduceind, member, 'dragoon', 2, 0, ind, csid+'bla', '', '');
复制并改为
_country_AddFixedProduceWithAccessControl(country, fixedproduceind, member, 'dragon21th', 1, 0, ind, csid+'bla', '', '');
接下来,设置升级。寻找
// UPGRADE + UPGRADEPLACE + UPGRADEENABLE + UPGRADELINKS”。
把我们的新单位添加到以下数组的底部:
'sarrUnitsAll'、'sarrUnitsShooters'、'sarrUnitsCavalry'。
注意:数组只有 64 个可用位置,而 'sarrUnitsAll' 数组当前使用了其中的 59 个。
我还没有测试它是否能够扩展超过64。
我们在每组的最下方添加新行:
代码:
k := k+1; sarrUnitsAll := 'dragon21th';
k := k+1; sarrUnitsShooters := 'dragon21th';
k := k+1; sarrUnitsCavalry := 'dragon21th';
完成
5.中文版的话在语言文件里添加个拉风的名字
不做这步也没关系,直接显示英文,不会的就不用做了。
自由龙骑兵 21世纪
@dragoon21th.ext
%include(units;descr.cav.any.musket)%
%include(units;descr.canshoot)%
%include(units;descr.cantshotclose)%
%include(units;descr.params.highattack)%
%include(units;descr.build.highspeed2)%
如果我上面没写错代码并且没有遗漏任何东西(难说),
并且你已经正确地按照教程完成的话应该已经添加成功了。
去英格兰(或您将新单位分配到的任何国家),
选择生产看看是否成功。
专业啊:o
页:
[1]