呕心沥血ra3mod教程——手把手教你添加狙击手

[红警2共和国之辉下载www.xtcdj.com| 更新日期:2009年7月7日
想让你的MOD与众不同吗,想让你的MOD更加精彩么?
本篇教程牵涉到的xml文件为:
RA3 MOD SDK\Sagexml\Allied\Units\AlliedAntiInfantryInfantry.xml;  
RA3 MOD SDK\Sagexml\Soviet\Units\SovietAntiInfantryVehicle.xml
RA3 MOD SDK\Sagexml\Globaldata\Weapon.xml;  
RA3 MOD SDK\Sagexml\Globaldata\Logiccommand.xml;
RA3 MOD SDK\Sagexml\Globaldata\Logiccommandset.xml;
RA3 MOD SDK\Sagexml\Globaldata\Locomotor.xml;
RA3 MOD SDK\Audio\Audioassets.xml;
RA3 MOD SDK\Mods\Samplemod\SoundEffect;
以及RA3 MOD SDK\Art\images\SampleUpdatedPackedImages.xml

说明一下本篇教程的目的是让玩家大致了解一下单位的语音、图标、建造列表、技能、行进方式、武器的原理

让我们首先来认识一下我们要“开刀”的单位:维和部队
学名AlliedAntiInfantryInfantry,Allied说明了他的阵营,AntiInfantry说明了他的用途——反步兵,Infantry说明了他的类别——步兵
以此类推,我们可以寻找出规律,比如SovietAntiInfantryVehicle就是镰刀机甲。
用写字板打开xml,这样方便于编辑
<?xml version="1.0" encoding="utf-8"?>
<AssetDeclaration xmlns="uri:ea.com:eala:asset" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude">
<Tags></Tags>
这一段内容很重要,如果没有这段内容,后果很严重——根本就不能编译
<Includes>
  <Include type="all" source="DATA:GlobalData/GlobalDefines.xml" />
  <Include type="all" source="ART:AUAntiInfantryInfantry_SKN.w3x" />
…………………………
这一段注册了维和部队用到的人物模型以及骨骼动画,这里不多做介绍,以后会深入指导。
<GameObject
  id="AlliedAntiInfantryInfantry"
  inheritFrom="BaseInfantry"
  SelectPortrait="Portrait_AlliedAntiInfantryInfantry"
  ButtonImage="Button_AlliedAntiInfantryInfantry_on"

  Side="Allies"
  SubGroupPriority="360"
  EditorSorting="UNIT"
  BuildTime="5"
  CommandSet="AlliedAntiInfantryInfantryCommandSet"
  KindOf="SELECTABLE CAN_ATTACK CAN_CAST_REFLECTIONS INFANTRY SCORE"
  ThreatLevel="10"
  WeaponCategory="GUN"
  VoicePriority="104"
  EditorName="AlliedAntiInfantryInfantry"
  Description="Desc:AlliedAntiInfantryInfantry"
  TypeDescription="Type:AlliedAntiInfantryInfantry"
  UnitTypeIcon="RiflemenIcon"
  HealthBoxHeightOffset="33"
  UnitIntro="Allied_Peacekeeper_UnitIntro">
接下来就是gameObject部分了, id="AlliedAntiInfantryInfantry说明了这个单位的名称,这里我们将其改成Sniper;
inheritFrom表示这个单位的属性是从哪个文件来的;  
SelectPortrait="Portrait_AlliedAntiInfantryInfantry"表示单位的大图标,也就是屏幕右下角的单位图片;  
ButtonImage="Button_AlliedAntiInfantryInfantry_on"则是建造列表中调用的小图标;

图标待会儿我会告诉你们怎么改滴!

  Side="Allies",其实这也没什么用,我改成Japan也可以,当然,别头脑发昏,改成nod了,出错了我不负责 。
SubGroupPriority="360" ,这个也没什么用, EditorSorting="UNIT" 这就不要去动了,如果乱改,会造成编译不能得悲剧后果;
BuildTime="5"说明了建造时间,这里我们改成1就行了   
CommandSet="AlliedAntiInfantryInfantryCommandSet",这里表示了单位的按钮列表,具体就在LogicCommandSet里。  
KindOf="SELECTABLE CAN_ATTACK CAN_CAST_REFLECTIONS INFANTRY SCORE",这个很重要,表示了这个单位的属性,如果我去掉Selectable,那么这个单位就悲剧地不能选择了 ,那么这个今天我们用不着。  ThreatLevel="10"代表了威胁等级,往往越NB的单位等级越高,比如说,一个机甲他威胁等级20,维和部队跟他一起去打,AI往往会先让部队打那个机甲,再比如说工程师,威胁等级就很高,所以你要IFV+工程师,AI第一个打得一定是工程师。这里我们也不必去改。
  WeaponCategory="GUN"
  VoicePriority="104"
这两个没有实质意义……
EditorName="AlliedAntiInfantryInfantry"
  Description="Desc:AlliedAntiInfantryInfantry"
  TypeDescription="Type:AlliedAntiInfantryInfantry"
  UnitTypeIcon="RiflemenIcon"
  HealthBoxHeightOffset="33"
  UnitIntro="Allied_Peacekeeper_UnitIntro
接下来呢,以上的前三项我们把维和的名字都改成AlliedSniper
至于这个UnitTypeIcon我们惊奇地看到了GDI的Rifleman……估计EA偷懒了……这个也不必去改……下面一行。HealthBox,不要误以为他是生命值,这里代表了生命条离单位的高度。UnitIntro则是红警3特有的EVA语音介绍单位,这个以后会讲。

好,我们已经初步认识和修改了一些东西,接下来进入正题,如何把PK变成一个超强的狙击手。
<ObjectResourceInfo>
   <BuildCost Account="=$ACCOUNT_ORE" Amount="200"/>

  </ObjectResourceInfo>
这里就是造价啦,随便改,当然,为了快速起见,我们将其改成2……
  <ArmorSet
   Armor="AlliedAntiInfantryInfantryArmor"
   DamageFX="InfantryDamageFX" />
  <ArmorSet
这里是单位护甲类型,也就是单位的生命值,这个不算很复杂,但我们下节课再讲。
  <LocomotorSet
   Locomotor="TestReactiveLocomotorHUMAN"
   Condition="NORMAL"
   Speed="50" />
看这个很不爽吧,速度才50,挂不得人家说ra3的小兵不是跑的,是散步的……改成100!
  <SkirmishAIInformation
   UnitBuilderStandardCombatUnit="true" />
这就是决定了这个单位能不能在游戏中被建造
  <Draws>…………
这就是绘图部分,我们跳过,以后会详细讲解
<Behaviors>
   <WeaponSetUpdate
    id="ModuleTag_WeaponSetUpdate">
    <WeaponSlotHardpoint
     ID="1">
     <Weapon
      Ordering="PRIMARY_WEAPON"
      Template="AlliedAntiInfantryInfantryShotgun"
      ForbiddenObjectStatus="GENERIC_TOGGLE_STATE"/>
    </WeaponSlotHardpoint>
   </WeaponSetUpdate>
找到上面的内容,从behavior开始,就是这个单位的技能、武器等逻辑性的部分了,我们可以看到,这个武器就是PK所用的散弹枪,强是很强,但我们不需要,我们需要的是更NB的武器,打开Weapon.xml,找到以下内容,(这可是娜塔莎的狙击步枪!)复制并黏贴到xml最后一行</AssetDeclaration>上方
<WeaponTemplate
  id="SovietCommandoPilotSnipeWeapon" ——这就是武器的ID,是专门狙驾驶员用的……我们这里改成SniperRifleX
  AttackRange="500.0"——这是武器的攻击距离,如果想让它长一些,改成5000也无妨……
  WeaponSpeed="999999.0"——这是武器的速度,一般来说,激光武器都是999999的速度=无限,其他的实体武器要低很多,大改因为这里是英雄武器的缘故,所以长了点
  FireSound="SOV_Commando_GunFire"——这是武器的开火音效,我们以后如果想修改的话,我会写一些指导的
  FireFX="FX_SovietPilotSnipeFire"——这是武器开火的动画,牵涉到粒子系统,以后再说= =
  FireVeteranFX="FX_SovietPilotSnipeFire"——同上……
  RadiusDamageAffects="ENEMIES"——这里是片杀伤的过滤,指的是即使片杀伤也不会伤到友军
  ClipSize="0"——这里是弹药数,就是一次开火打出多少子弹,由于这是特殊武器,不必修改
  Flags="ATTACK_NEEDS_LINE_OF_SIGHT"——这里指开火需要视野
  CanFireWhileMoving="false"——能移动攻击么?当然否……要能那还得了……
  AcceptableAimDelta="10d"——攻击角度,如果乱改的话会很难看……
  RequiredAntiMask="ANTI_GROUND ANTI_WATER"——这就是能狙哪些单位,这里是水面单位和陆地单位,如果你想让他反潜或者防空,可以吧一些防空反潜武器的这里的代码复制黏贴
>
  <Nuggets>——这里是武器效果的定义
   <ParalyzeNugget   
    ParalyzeType="UNMANNED"——这就是能干掉驾驶员的代码。注意,以后要是想改中子炮之类的,一定用得到
    ParalyzeFX="FX_SOV_Natasha_PilotSnipe">
    <SpecialObjectFilter
     Rule="ANY"
     Relationship="ENEMIES"
     Include="VEHICLE"
     StatusBitFlagsExclude="UNDER_IRON_CURTAIN"/>      ——以上这段是对于单位的过滤,比如这一行。就表示了铁幕罩着的单位是不能被狙掉驾驶员的
   </ParalyzeNugget>   
  </Nuggets>


</WeaponTemplate>——结束
  
<WeaponTemplate
  id="SovietCommandoSniperRifle"——这里就是娜塔莎狙小兵的武器ID,改成SniperRifle
  AttackRange="300.0"
  WeaponSpeed="999999.0"——同上一个武器
  FireSound="SOV_Commando_GunFire"——同上说明
  FireFX="FX_SovietSniperFire"
  FireVeteranFX="FX_SovietSniperFireHeroic"
  RadiusDamageAffects="ENEMIES"
  ClipSize="1"——这里就是实体武器了,一发子弹,如果你还不爽,500发也无妨
  Flags="ATTACK_NEEDS_LINE_OF_SIGHT"
  CanFireWhileMoving="false"
  AcceptableAimDelta="10d"
  RequiredAntiMask="ANTI_GROUND ANTI_WATER"——以上都已说明
  >
  <PreAttackDelay
   MinSeconds="0.25s"

   MaxSeconds="0.25s" />——这是预备开火动画的时间长度,min代表最小时间,max代表最大时间
  <FiringDuration
   MinSeconds="1.5s"
   MaxSeconds="1.5s" />——开火时动画长度
  <ClipReloadTime
   MinSeconds="0.25s"
   MaxSeconds="0.25s" />——武器装弹时间
  <Nuggets>
  <!--————注意!这是代表这段代码无效的括弧
   <DamageNugget——武器伤害定义
    Damage="1000.0"——这就是为什么娜塔莎能一枪毙命
    Radius="0.0"——杀伤半径……如果不爽,改成一千,你就能一枪杀掉一个大队的小兵……
    DamageType="SNIPER"——伤害类型,这也是属于视觉上的效果
    DamageFXType="SOVIET_SNIPERRIFLE"——粒子效果……
    DeathType="NORMAL" >——被打死的单位是怎么死的,其他的有——被电死的,被激光照死的…… 好黄好暴力!
    <SpecialObjectFilter——又是过滤……
     Rule="ALL"
     Relationship="ENEMIES"
     Exclude="VEHICLE STRUCTURE VALID_TARGET_FOR_C4" />——这里很不爽啊啊,如果我们去掉Vehicle和Structure,我们就能让狙击手一枪打爆一个矿场了
   </DamageNugget>  
  -->讲解完以后我悲剧的发现……有了“<!--…………-->”括起来的代码,都是无效的……
      <LineDamageNugget……有效地在此!!!!这就是为什么娜塔莎能一枪穿多人的原因了!LineDamage——线性杀伤,包括波能、海豚的武器,都是这样滴!
    Damage="1000.0"——同上
    LineWidth="5.0"——杀伤线的宽度,在ra3里,5基本上就是冷冻光线的宽度,也就是一条线,如果我们改成100,那就是一枪死一片了= =


    DamageType="SNIPER"
    DamageFXType="SOVIET_SNIPERRIFLE"
    DeathType="NORMAL"
    UseDynamicLineLength="true"——Dynamic是什么意思呢(= =不是那个官网的老外),是冲击的意思,具体这段代码有什么用处,我还不明白……现在明白了,谢谢微月提醒,这个是关键性的,这就决定了能不能一枪穿多人。
    OverShootDistance="200.0">——就是能穿多少距离,随便改啦
        <SpecialObjectFilter
          Rule="NONE"
          Include="INFANTRY"/>——注意,又是过滤,但这次是Include,而不是刚才的exclude,鸟语好的知道什么意思吧……
      </LineDamageNugget>
  </Nuggets>
</WeaponTemplate>——结束……