破门而入吧 关注:7,869贴子:32,995

回复:如何制作mod?

只看楼主收藏回复

最后是声音命令
<Sounds>
<Equip name="smg_eqp"/>
<Unequip name="smg_neqp"/>
<Reload name="smg_reld"/>
<ReloadEmpty name="smg_reldempt"/>
<Fire name="mp5a_fire"/>
<ShellDrop name="rifle_shell_drop"/>
<Empty name="gen_empty"/>
</Sounds>
分别是换枪、换弹、射击等不同的声音,参数里的短语是与sounds目录里的sounds_library.xml文件关联,然后在sounds_library.xml文件里会定义这个名称与哪个wav文件关联。要换声就需要大量的声音文件素材了,因为我搞MOD好多年了,从RAINBOW SIX、GHOST RECON、JA2什么的,所以累积了大量的声音素材。不过有时我还是要用其他方式采取声音文件的,例如一些射击视频,或电影。像RO727就直接从黑鹰坠落里截取它的枪声下来用。
如果不自己搞新的声音,就直接抄原版里的声音吧。


IP属地:广东16楼2021-03-14 21:56
收起回复
    普通的枪械参数就到这里为止,但如果是下挂榴弹发射器的枪械,后面还有一串跟榴弹有关的。
    <Projectile
    bodyTemplate="M203GrenadeBody"
    trailParticles=""
    lightTemplate=""
    soundExplosion="rpg_expl"
    soundOnSpawn="m203_fire"
    soundFollow=""
    minVelocity="50000.0"
    maxVelocity="50000.0"
    acceleration="0.0"
    mass="0.0"
    friendlyFire="true"
    triggerOnImpact="true"
    roundsPerSecond="0.4"
    accuracyPercent="100"
    physicsDetonationForce="20"
    audibleLaunchSoundRadius="2"
    audibleDetonationSoundRadius="20"
    >
    <FX
    particles="FragGrenade"
    entity1="ExplosionLight"
    entity2="explosion_mark"
    randRotation2="true"
    entity3="FX_dust_large"
    anim2D="">
    </FX>
    <EffectRange radiusMeters="2">
    <StunEffect chancePercent="100" innerRangeTimeMSec="1500" outerRangeTimeMSec="1500"/>
    <DamageEffect chancePercent="100" damage="999" damageType="1"/>
    </EffectRange>
    <EffectRange radiusMeters="5">
    <StunEffect chancePercent="100" innerRangeTimeMSec="1000" outerRangeTimeMSec="300"/>
    <ScatterEffect chancePercent="100"/>
    </EffectRange>
    </Projectile>
    其实和上面的那些命令一样,只要略懂英文,或者利用翻译软件,大致里弄明白,然后改几下参数再进入游戏试验一下就大概明白了。有时一些不明白的参数,我会改到超大或超小,极端一些,这样更容易在游戏中看出效果来。榴弹这串不细讲,是因为我自己也没细细研究,因为目前我的MOD所用的都是40mm高低压榴弹,所以根本不需要改参数,直接抄原版的就等了。等哪天有建模师能帮忙做些OICW之类的不同口径不同弹种再来细细研究吧。
    同样的我原本试过想加入一种新手榴弹的,但发现不像枪械一样只要加入参数和UI就能用,修改稿还涉及到战斗界面中的UI设置,所以我暂时放弃了手榴弹的研究。


    IP属地:广东17楼2021-03-14 22:01
    回复
      接下来讲弹药参数的firearm_ammo.xml
      首先我在MP5/10里给它配了两种弹药

      当打开我的MOD里的弹药参数XML时,你会看到
      这就是配套的两种弹药
      Ammo name=就是弹药的名称,就是与枪械参数里的Ammo name=对应的。注意这不能重名,必须是唯一的。所以你研究一下同种口径同种弹药用于不同枪械时,往往要用不同的名称。比如同样是M855弹,你会看到分别有
      556FMJM855_MK18
      556FMJM855_M4
      556FMJM855_M16A4
      等等,因为同一种弹在不同的枪上发射,动能射速什么的都不一样,所以都要分别设置。
      但在名称之下的三行
      tooltip="@ammo_10AUTOFMJ_name"
      description="@ammo_10AUTOFMJ_desc"
      img="data/models/weapons/attachments/10mmfmj_ammo_ui.tga"
      就可以重复了,因为这分别表示武器界面中的名称、说明文字和UI贴图
      所以M855就是M855,无论换到什么枪上都叫M855,而贴图也不会因为装到不同的枪上而变化


      IP属地:广东18楼2021-03-14 22:10
      回复
        下面一行<MobilityModifiers moveSpeedModifierPercent="0" turnSpeedModifierPercent="0"/>是多余的,我从来不调,换个弹怎么就会对机动能力产生变化呢
        下面的才是弹药性能的关键
        <ParamsroundsPerSecond="13.3"
        audibleSoundRadius="60"
        physicsImpactForce="3.8"
        damageType="0"
        silenced="0">
        <Damage start="30" end="25" startDist="0" endDist="100"/>
        <CriticalChancePercent start="45" end="20" startDist="0" endDist="50"/>
        <ArmorPenetration start="4" end="4" startDist="0" endDist="100"/>
        </Params>


        IP属地:广东19楼2021-03-14 22:20
        回复

          audibleSoundRadius=是枪声传播距离,单位是米。消声武器当然就近一些了,其他枪就大一些。
          physicsImpactForce=是冲击力,一般口径大、弹头重、速度高的,会调大一些。大一些的冲击力,在打中敌人时,即使没有立即爆头,也能让他短时间内反应不过来,就是被打懵了,不能立即开枪还击了。你参考着别的枪别的弹来设置就好了。
          damageType=是伤害类型,基本都是0,我也没去测试1或其他数字是什么含义。
          silenced="0"是定义是否有消声效果,这跟传播距离不一样。如果改成1,主武器的话就士兵自动进入宁静模式了。
          Damage后面一串是毁伤数值,起作用的是第一个数,数字越大杀伤力越大。后面的参数好像是不同距离上的衰减,但我没把衰减参数研究透,所以基本只设置第一个数字,后面的参考同类武器来设置。
          CriticalChancePercent是爆破头机率,这个数值其实是百分比,例如CriticalChancePercent start="33",就表示每一他有1/3机会一击致命。
          <ArmorPenetration 是穿甲能力,从目前来看跟防弹衣的防护等级是对应的,因此只有1~6级。比如写成4,就表示可以打穿4级防弹衣。
          今天就写这么些,明天抽空再讲瞄准镜、射击模式等等


          IP属地:广东20楼2021-03-14 22:25
          收起回复
            今天讲瞄准镜,和昨天的弹药一样,在枪械文件中<ScopeTypes>里面的Scope name=就是要到firearm_scopes.xml里面找对应的
            比如<Scope name="M68CCO"/>,就是对应firearm_scopes.xml里的M68CCO这个瞄准镜
            <Scope name="M68CCO" unlockCost="1"
            这个是瞄准镜的名字和解锁星星数,不同瞄准镜的名字不能重复,这个也是一定的
            inventoryBinding="PrimaryWeaponScope"这是表示这瞄准镜装在长枪上,所以我加的手枪用小红点是写SecondaryWeaponScope的。
            下面三行照例是游戏中显示的名称、说明文字和UI贴图,原版是dds格式,我自己画的都是tga
            tooltip="@scope_rangersM68reddot_name"
            description="@scope_rangersM68reddot_desc"
            img="data/models/weapons/attachments/m68_cco_ui.dds"
            接下来这一行就好理解了,瞄准镜的3D模型、3D画面中放在什么位置,材质贴图,然后是对机动力的影响。
            <RenderObject3D model="data/models/weapons/attachments/scope_m68_cco.khm" attachSlot="optics_socket" skipGOSSAO="true" diffuseTex="data/models/weapons/attachments/scope_m68_cco.dds"/>
            <MobilityModifiers moveSpeedModifierPercent="0" turnSpeedModifierPercent="0"/>
            其中attachSlot="optics_socket"不要改,二代跟一代不一样的地方不只是枪械有独立的3D模型,瞄准镜也有独立的3D模型。现在我所加的瞄准镜都没制作3D模型,全是用现有的,还好瞄准镜太小,很容易忽略过去。
            后面的就是瞄准镜本身的加成,不同类型的瞄准镜运用不同的代码,但略懂英文或查一下翻译就明白意思,我就不全讲了。
            例如reloadTime="+80"就表示换弹时间加80毫秒,readyTime="+10"就表示举枪时间加10毫秒。
            <AttackTypeModifier minRange="0" maxRange="7">表示这一段加成是影响0至7米内的目标,<AttackTypeModifier minRange="7" maxRange="15">是影响7至15米内距离。
            minAimTime2="-50"就表示瞄准时间减50毫秒,resetTime="-20"表示每次射击后因为枪支复位时间减少20毫秒,accuracyAdd="+50"表示精度加50。
            具体怎么用多参数几种不同瞄镜就能找到规律。


            IP属地:广东21楼2021-03-15 09:33
            回复
              同样道理,枪支文件中的<AttackTypes>字段里面的参数是对应firearm_attacktypes.xml里面相同名称的射击方式的。前面还说了,要设定作用距离。所以如果你要选择或编写合理的射击模式来用于不同距离。例如近距离的瞄准时间短,远距离的瞄准时间长。
              比如按照<AttackType name="Rangers_SMGAutoFire" rangeMeters="4"/>,我们找到对应的射击模式,内容是:
              <AttackType name="Rangers_SMGAutoFire">
              <ModifiableParams
              minAimTime="350"
              maxAimTime="350"
              roundsPerSecondOverride="0"
              minShots="3"
              maxShots="9"
              resetTime="200"
              accuracyAdd="0"
              followupShotAccuracyAdd="-2"
              critChanceAdd="-8"
              />
              </AttackType>
              第一行是名称,后面是具体的参数
              minAimTime和maxAimTime是瞄准的最小时间和最大时间。同样是毫秒。这两个数可以一样,也可以不一样。
              比如刚才MP5在4米内使用的射击模式最大最小瞄准时间只要350毫秒,而MP5在20至9999米内使用的Rangers_CarbineAimedFire则最小600毫秒,最大900毫秒,表示每次射击时,瞄准时长是随机在这个时间段内的。
              roundsPerSecondOverride=
              这一段是每秒打多少发,注意有两种写法,如果写成是0,则射击时会以前面20楼提到的弹药参数中的射速参数来射击。例如弹药参数中写了每秒12发,那么当射击模式中这个参数写成0,那就是按每秒12发射击。所以一般是点射模式都写成0。
              但如果单发模式,就需要写一个具体数字。例如同样是MP5在12至20米距离内用的Rangers_CarbineAimedFire,它的roundsPerSecondOverride="2",表示半秒打一发。这就是单发的普通射速了。而在20米至9999米上使用的射击设计成roundsPerSecondOverride="1",更是一秒一发地打。我试制的泵动霰弹枪远距离是0.8秒,就是要一秒多才能打一发。
              不过这组参数同样可以用来设置一些有可变射速的武器,例如G11、AN94、BAR2,不过目前没有这些武器的3D模型,所以我仅仅是想想罢了。
              下面的
              minShots="3"
              maxShots="3"
              是设置这种射击方式下,最少打多少发,最多打多少发。两个数都一样时就表示一定坚持打远这个弹数。前者比后者小时,就是最少打完前面的数量,而在打死敌人或打完后面的数量时就停止射击,然后枪支复位、重新瞄准再打一轮,直到打死敌人为止。
              所以三发点射的模式都是设置min和max都是3,我给MP5/10搞了两发点射模式,所以min和max都是2。
              MP5在4米内用的Rangers_SMGAutoFire的min是3、max是9,就表示最少打出3发,如果敌人挂掉就停射,如果打到第5发时敌人挂掉也会停在第5发,如果打至第9发敌人没死,也会停,然后按aimtime重新瞄准再打一轮。
              resetTime="200"是两次射击间的枪支复位时间
              accuracyAdd=是这种射击模式对精度的影响,一般设置成瞄准时间短就减号,瞄准时间长就加号。
              followupShotAccuracyAdd=是从第2发算起对精度的影响,所以连发方式一般都是减号,减越多等于枪口跳动越大。而单发速射或慢射一般是加号。
              critChanceAdd=是对爆破头机率的影响,参照前面弹药的参数设置


              IP属地:广东22楼2021-03-15 09:58
              回复
                以上是制作武器MOD的全部说明,欢迎大家来纠正或完善。有部分地方我也是比较模糊的。如果有问题也可以提问,懂的或有经验的我会补充的。


                IP属地:广东24楼2021-03-15 10:05
                回复
                  厉害!谢谢分享心得!
                  现在真的很希望能出点机器人了,不论是小型的侦察无人机,或者是加上装甲的移动掩体机器人。。。毕竟敌人火力实在猛。我之前还没什么体会,但是当我看到穿上教授mod最高等级护甲的步兵也会被敌人一枪击毙的时候,我真心觉得这敌人太难顶了。。。特别是玩教授整合的那些地图包,有一关很长的横向公路地图,开局左边士兵就被疯狂集火,我怎么拖动视野,都有敌人不会被瞄准,最后往往只能幸存2-3人,向右推进到半路也基本都被冷枪打死了,简直无语。
                  当然这些玩家地图都挺有意思的,很有挑战性。只是希望能有更多侦察和处理敌人的手法


                  IP属地:北京26楼2021-04-20 15:12
                  回复
                    mark一下 大佬说的好详细


                    IP属地:福建来自Android客户端27楼2021-04-24 11:05
                    回复
                      补充一下关于防弹衣的制作。防弹衣数据放在various.xml,另外手榴弹、撬棍等其他装备也是在这个文件中。但其他装备我没认真研究,手榴弹之前尝试过想做一组V40迷你手榴弹进去但失败了,估计是还有其他几个关联文件相关,没研究出来,暂时也放弃了。所以以下只讲防弹衣。
                      在这个文件中,找防弹衣参数,搜索“Armor name”可以很快找到。至1.06版为止它的代码解释如下
                      <Armor name="Rangers SFLCS Level III" inventoryBinding="Armor" unlockCost="0"
                      tooltip="@armor_rangers_basicvest_name"
                      description="@armor_rangers_basicvest_desc"
                      img="data/models/equipment/basic_armor_ui.dds"
                      >
                      第一行第一段也是防弹衣名称,不是游戏中显示的武器,是参数文件中唯一指定的名称,是不能重名的,重名会有问题。
                      然后参照上面的武器代码说明,后面是指定物品类型是防弹衣、解锁星星数是0
                      然后tooltip和description也是分别对应装备选择界面上显示的物品名称和简介,同样是要在localization目录里的game.txt中写说明。
                      img就是选择界面上显示的示图。原版都是DDS文件,但我制作的MOD都是TGA图片。
                      <ClassBinding name="Assault"/>
                      <ClassBinding name="Support"/>
                      <ClassBinding name="Marksman"/>
                      <ClassBinding name="Medic"/>
                      <ClassBinding name="Grenadier"/>
                      这几行是指这种防弹衣分别可用于哪些兵种,不详细解释了
                      <MobilityModifiers moveSpeedModifierPercent="-8" turnSpeedModifierPercent="0"/>
                      这是设定这件防弹对移动速度和转向速度的影响的。
                      <Params protectionInfoText="@equipment_protect2">
                      这行不用管,接下来几行才是关键
                      <ProtectionArc degrees="90" coveragePercent="40" piercingProtectionLevel="5"/>
                      <ProtectionArc degrees="270" coveragePercent="20" piercingProtectionLevel="4"/>
                      <ProtectionArc degrees="360" coveragePercent="40" piercingProtectionLevel="5"/>
                      这3行分别指正面(90)、左右两侧(270)和背面(360)这4个方向上的防护面积和等级。
                      其中 coveragePercent是指防护面积,这个数字是百分比。例如40是指防护面积40%,即在这个方向上有40%的机率子弹会打到防弹衣上。
                      而piercingProtectionLevel是指防护等级,最高级是6,我试过写7是无效的。其实这个是与前面提到子弹的穿透力等级对应的。即6级的防护,可以挡小于等于6级的子弹,5级的防护可以挡小于等于5级的子弹。
                      所以以行1行为例,是指在正面,有40%的机率完全抵挡住5级或以下穿透能力的子弹。
                      举个例子,我做了一件在正面有6级陶瓷板的防弹胸挂,但两侧和背面都没防弹插板,所以我设置的这一组数据是这样的
                      <ProtectionArc degrees="90" coveragePercent="40" piercingProtectionLevel="6"/>
                      <ProtectionArc degrees="270" coveragePercent="0" piercingProtectionLevel="0"/>
                      <ProtectionArc degrees="360" coveragePercent="0" piercingProtectionLevel="0"/>
                      当然了,我设置的这件东西穿上身上对机动力的影响几乎为0。


                      IP属地:广东28楼2021-05-31 17:55
                      收起回复
                        你只需要随便造几堵墙,然后扔进去一堆枪上抹着印度神油的阿拉伯超人就完事了。创意工坊里的图不都这鸟样吗


                        IP属地:江苏来自Android客户端29楼2021-06-01 17:53
                        收起回复
                          火力压制功能出现,所以这里补充一下与它有关的两行代码,分别是
                          suppressArea="1"
                          suppressionScale="1.15"
                          位置见最下面的截图,不过实际上只要写在modifiableparams内,先后顺序什么的都不重要。
                          说一下这两行的作用
                          suppressArea="1"就是说此武器具有火力压制的功能,因此只要没有这一行命令,就默认为布尔值为0。
                          suppressionScale="1.15"是压制射击时的扫射角度,我理解成扫射的扇面角度而不是子弹散布,因为实测发现,这个数值所控制的效果不是子弹的自然散布精度,而是射手有意识地来回转动枪口角度。所以这个数值是设置火力压制时,射手有意识回来扫射的覆盖范围。不过再大也大不过指令划定的范围,所以如果想扫射面大一些,就把那个瞄准区别的圆圈设得近一些,我测试过,它是不会自动打到地面上的。


                          IP属地:广东30楼2021-06-13 09:46
                          回复
                            教授,我想请教一个问题——一代DK做mod该如何替换声音?我尝试用其他的声音文件转换为WAV格式,比特率705,名称与原声音文件一致,但替换后没声音无法播放,究竟哪里出了问题呢?


                            IP属地:日本31楼2021-09-03 22:38
                            收起回复
                              关于0.24版新增消声器切换功能的代码说明
                              首先,不装和装消声器在武器XML中是两个独立的武器个体,甚至可以分别使用不同的UI图和模型。但这两件独立的武器个体有配对的代码使它们之间可以切换。所以我只说明配对的代码是什么。
                              首先,是武器名称那一行,不装消声器的武器是这样写的
                              <Firearm name="QBZ-191" inventoryBinding="PrimaryWeapon" category="rifle" unlockCost="1"
                              而装消声器的武器是这样写的
                              <Firearm name="QBZ-191 Sup" inventoryBinding="PrimaryWeaponMuzzle" category="rifle" unlockCost="1"
                              注意,最大区别不是名称(当然名称必须不同,否则会混乱),而是第二句inventoryBinding里,装消声器的武器要写“PrimaryWeaponMuzzle”。
                              第二组配对的代码在<Params字段内,不装消声器的武器多了一行
                              suppressedSwitch="QBZ-191 Sup"
                              这一行就是切换消声器的触发参数,引号内的参数就是引用了装消声器的武器的名称。所以刚才才说这两件武器名称必须不同。
                              而装消声器的武器则多了两行
                              suppressedSwitch="QBZ-191"
                              suppressedImg="data/models/weapons/attachments/basic_silencer_ui.dds"
                              这里第一行跟刚才一样,参数要写不装消声器武器的名称。而第二行就是引用消声器的UI图。有这行,才能在切换模式中看到消声器的UI。


                              IP属地:广东32楼2021-12-15 23:10
                              收起回复