woskxn12345 发表于 2010-6-2 19:52

时隔一个多月,手把手教你如何制作属于自己的法术MOD~~6月6日修

时隔一个月,再写一篇关于技能MOD制作的教程吧。
首先说下准备工作和注意事项:
1.本次MOD制作依然涉及到C语言编程编译,如果你是中文系统 ,请打开控制面板, 选择区域与语言 ,选择管理, 然后将非unicode程序语言选择 更换成English(US) ,否则将无法编译。
2.本次制作需要使用Excel,但是注意,请使用Microsoft Office Excel,不要使用金山出品的WPS表格。(我本人是支持国产的,计算机上也是使用的WPS系列产品,但是这次不知道什么原因,使用WPS表格编辑后的XLS文件编译不了。)

关于一些无法使用toolset的问题,最近论坛上已经有很多解决办法了,我就不再重复了。
不说废话了,下面开始制作吧。

1.到Program FilesDragon AgetoolsSource2DA下找到guitypes.xls文件。将它复制到你的桌面上。(你也可以复制到任何地方,但是路径不要有中文。)
2.到Program FilesDragon AgetoolsSource2DArules下找到ABI_base.xls文件。将它复制到你的桌面上。(你也可以复制到任何地方,但是路径不要有中文。)
3.到Program FilesDragon AgetoolsResourceBuildProcessors下找到ExcelProcessor.exe文件。(你也可以复制到任何地方,但是路径不要有中文。)

4.现在,打开ABI_base.xls你应该会看到下图


多是多了点。。没关系。。其实很简单
5.这里我就做个治疗法术吧~~偷懒的方法就是按下Ctrl+f然后输入Heal找到HEAL法术的那一行。如下图。

然后复制这一行,然后直接到表格的最底下一行,粘贴就可以了。
然后为了不与原始法术冲突,我们要把它的ID改了 这里我改成了200000。名字改成HEAL2
这样,这条自定义法术就可以使用了。但这是偷懒的方法,我还是对这些表格的含义一一说明吧。
label此技能在数据库内部的名字,用于编程链接等等,不会在游戏中显示。namestrref此技能在游戏中所显示的名字的编号descstrref此技能在游戏中的描述编号tooltipstrref此技能当鼠标移上去后所显示的详细描述的格式?strid_effect此技能当鼠标移上去后所显示的详细描述icon此技能在游戏中所显示的图标abilitytype能力类型,1 - 天赋, 2 - 法术, 3 - 技能, 4 - 物品效果abilitymode未知,貌似没有影响conditions 标志位,用于决定此技能使用的前提状态。1 - 单手武器, 2 - 盾牌, 4 -远程武器, 8 - 目标背后, 16 - 激活模式, 32 - 类人的?好吧,我也没看懂, 64 - 双持武器, 128 - 双手武器, 256 -狗专用的技能, 512 - 施法者condition_mode 如果上面的conditions 选择的16,则此处填写需要激活的前提状态的ID代码。condition_group当使用此技能时将会关闭此处填写的ID的技能cost 此技能所花费的法力值(耐力)costupkeep 如果此技能是模式类技能,这里的值将决定扣除法力值(耐力)的百分之多少。prereqability此处的代码将决定学习此技能前锁必须学会的前提技能prereqlevel学习此技能的最小等级prereqattribute学习此技能的前提属性要求prereqattvalue上面属性要求的值guitype 这个稍后说,比较麻烦targettype此法术作用的目标,详情点击传送门autotarget激活的话,将自动对有效目标使用range0 近战 (触碰目标), 1 近距离法术 (仅仅比近战稍远点点), 2 中等距离, 3 长距离法术, 4+ 超远距离法术speed 施法速度,0 代表瞬发, 1 将会使人物出现选择性动作. 2+ 将会出现施法条,并将可能被打断. usetype 这个是什么?Whether the ability is a passive, toggle, or instant use. 2 is toggle, 3 is passive, 4 is instant use. spellscript 此处填写的名字将决定此法术的效果程序调用的库文件名字cooldown技能冷却时间conjurevfx 吟唱时的VFX设定,详细信息点击传送门blendtree 未知。。研究中。。conjureanim 吟唱时的动作选择,详情传送门castanim 施法时的动作。相关详情同上。autocancel 自动结束(废话)autodraw 武器在施法时是否抽出。0 will ignore weapon state, 1 will force the weapon to draw before use, and 2 will force a non-staff to sheathe before use. Any spell with a speed higher than 1 should have this set to 2. The sheathing animation occurs during the conjure sequence without slowing it down, and putting away the weapon will prevent clipping.
threat_use勿动aoe_type 群体魔法的类型。1.环形。2.半三角aoe_idx 范围魔法的效果,详情传送门aoe_param1 编辑环形范围的直径或者半三角的角度。fatigue 此法术如果是状态类,此处将决定疲劳等级

6.因为只是举例,复制的HEAL法术就不做大的调整了,就只把法术冷却改为1秒,把法术法力值消耗改为0.保存,现在暂时用不到了。
7.打开guitypes.xls文件,什么都不要管,直接拉到最底下,然后插入新的一行。
8.ID还是一样随便填,这里我选择了999.label还是名字,这里我选择了3DM Test。如下图




那么这个文件是做什么用的呢?很简单,技能的分类。童鞋们只要仔细看看上面的应该就知道了。
而我做这些,就是希望把我们制作的新法术从原本的创造系法术改成现在的3DM Test系列法术。
9.填了这两个格子就可以了,其他的都可以不予理会。现在保存退出。
10.再次打开ABI_base.xls 找到HEAL2的guitype竖行,这里键入999.那么在游戏中,HEAL2这个法术就是3DM Test系列的法术了,如下图。




保存退出。
11.现在,将制作好的guitypes.xls和ABI_base.xls 文件拖拽到ExcelProcessor.exe上进行编译,然后会生成几个新文件:ABI_Base.GDA ability_data.GDA ability_effects.GDA guitypes.GDA passive_abilities.GDA 保存好这几个文件,现在暂时用不到。
12.接下来打开你的toolset。然后点击左上角的File 选择Manager Moudules.如下图


13.然后点new弹出下图
http://3dmgame.chnren.com/bbs/attachment.aspx?attachmentid=591604
在name中填如你想要的mod名字此名字将会出现在游戏刚进入时的下载管理菜单中~~这里我选择填chen
UID这一栏我在这里填写的是test_mod此名字非常重要关系到mod的连接问题
Extended module这一栏 我们在下拉菜单中选择Single Player意思是此mod是用来扩展单人游戏的
单击OK退出此对话框
然后点击我们刚刚建立的mod chen然后点open打开我们新建立的mod
14.如下图所示

点击右边Palette Windows 面板上的Script按钮。然后打开_Core Includes路径下的2da_Constants_h这个库文件。它包含了龙腾里所有法术的指向。
右键点击这个文件,然后选择Check out,把它从数据库调出来用于编辑。
15.现在单击左边一下然后按下Ctrl+F输入const int ABILITY_SPELL_HEAL 进行查找 (这里是偷懒复制的方法,其实完全可以自己写,只要法术的名字与ID一致就可以了。)
这时就可以查找到龙腾里原始的治疗法术const int ABILITY_SPELL_HEAL = 10104;
16.复制这一条,然后在下面粘贴来添加新的一条。然后改成这样:const int ABILITY_SPELL_HEAL2 = 200000;(这里值得注意的是ABILITY_SPELL_HEAL这个名字可以自己改可以自定义,但是在这后要讲的C语言中记得把名字写成一样的就可以了)
17.然后再次右键单击2da_Constants_h 选择Check in. 来把修改后的库文件写入数据库。这个时候,龙腾的数据库里就有了我们新自定义的法术了。但是现在还使用不了。
18.再次打开ABI_base.XLS 这个时候仔细观察就会发现表格中spellscript竖行中所写的是spell_singletarget.ncs 没错,这个文件就是法术的效果函数程序的所在位置。
19.在右边的Palette Windows 面板中上部分的空白中写入spell_singletarget(这里注意,要把后缀ncs去掉,否则搜索不到。)然后进行搜索,来找到这个文件,然后同样把它用Check Out调用出来。然后可以看见下图。

这里,就要开始使用C语言了~~~好吧,本人也只是个外行,简单讲讲格式吧。。。
20.我现在随便从数据库里面复制出来一个,不过既然是做治疗法术,还是先找到治疗法术的程序位置吧。同前面一样,又是万能的Ctrl+F,然后在Find那输入ABILITY_SPELL_HEAL,就可以看到以下语句:
      case ABILITY_SPELL_HEAL:
      {
            float fHeal = (100.0f + GetCreatureSpellPower(stEvent.oCaster)) * HEAL_HEALTH_FRACTION;
            eEffect = EffectHeal(fHeal);
            eEffect = SetEffectEngineInteger(eEffect, EFFECT_INTEGER_VFX, Ability_GetImpactObjectVfxId(stEvent.nAbility));
            ApplyEffectOnObject(EFFECT_DURATION_TYPE_INSTANT, eEffect, stEvent.oTarget, 0.0f, stEvent.oCaster, stEvent.nAbility);

            break;
      }
在主程序的最顶上其实可以发现这些法术的程序全部都是使用的Switch函数
所以每个法术的程序开始于case
所以每个
case ABILITY_SPELL_XXXX:

就代表了一个新的法术,而每个法术的结尾就是
       break;
      }
这种格式了。
21.既然我们要定义自己的法术那么复制上面那段,然后在下面粘贴,接下来把复制的内容修改成这样
          case ABILITY_SPELL_HEAL2:
      {
            float fHeal = (500.0f + GetCreatureSpellPower(stEvent.oCaster)) * HEAL_HEALTH_FRACTION;
            eEffect = EffectHeal(fHeal);
            eEffect = SetEffectEngineInteger(eEffect, EFFECT_INTEGER_VFX, Ability_GetImpactObjectVfxId(stEvent.nAbility));
            ApplyEffectOnObject(EFFECT_DURATION_TYPE_INSTANT, eEffect, stEvent.oTarget, 0.0f, stEvent.oCaster, stEvent.nAbility);

            break;
      }
这样我们就为我们自己定义的HEAL2法术定义了效果。并且中间的那个100.0f改成了500.0f这个值代表着这个法术的基础值。即现在这个HEAL2的基础治疗效果是+500生命值了。可以看到除了基础值以外,后面还有一句GetCreatureSpellPower这就是游戏中玩家的属性 魔法 所获得的加成。
22.同上面一样,把这些修改后的数据用Check in写入游戏数据库。
23.接下来就是导出文件来使其在游戏中生效了。右键单击spell_singletarget 如下图



选择Generate Module XML以及Generate Manifest XML
24.然后选择之前的a_Constants_h重复上面的步骤。
25.还记得开始制作的ABI_Base.GDA ability_data.GDA ability_effects.GDA guitypes.GDA passive_abilities.GDA这几个文件吗?现在复制它们,然后到DocumentsBioWareDragon AgeAddInstest_modcoreoverride 下粘贴它们。
26.好了~~你的法术可以用了,现在去玩个法师看一看自己的新法术。我上一张我的效果图

可以看到此时的法术是属于3DM Test系列法术
仔细看右上角可以发现此治疗术的冷却时间为1S法力消耗为0
童鞋门肯定会发现我的自定义法术旁边还有个进阶法术吧。
确实,如果不认真改的话是不会出现进阶法术项目的,而是会变成下面这个样子。

27.其实很简单,重复上面的步骤,再制作一个新的法术。然后打开ABI_base.XLS然后选择新做的法术,比如我的就是200001 HEAL3 然后找到此法术的prereqability竖行如下图

然后键入前提法术的ID比如我要这个HEAL3作为HEAL2的进阶法术,那么HEAL3这里就填入HEAL2的ID 200000就可以了 别忘记了把这个新做的法术也归类到3DM Test类型法术中,即guitype竖行的值键入999 然后还是一样的保存 编译复制 粘贴覆盖,就可以了。
28.作为一个自定义法术怎么能没有属于自己的名字呢? 下面,我们就来说说如何自定义名字的问题。
29.打开你的toolset点击File 选择Manage Modules选择你前面制作的MOD 我这里是Chen ,然后点击Properties会看见下图


30.注意到"StringID Begin", "StringID End" 和 "StringID Last Used",   
StringID Begin随便填入一个较大的数字,表示我们这个MOD中编辑的ID的起始编号,这里我选择输入8000000
StringID End    表示结束时的ID编号,随意就可以了但是要比StringID Begin大我这里就选择8100000
StringID Last Used这里是用来显示上次编辑所使用的最后的ID目的是方便下次编辑。这里输入7999999 (图上我的是8000000是因为我已经编辑过一条名字ID了)
输入完毕后选择OK
31.再次点你的MOD (我这里点Chen)选择Open,再次打开我们的MOD ,然后如下图

选择Tool菜单中的 String Editor然后耐心等待程序弹出个新的面版StringEditor
32.出来后会出现下图

如上图所示,请注意如果上方的String Table默认不是写的 你的MOP名 Talk Table(我这里是Chen Talk Table)那么则你之前肯定有步骤出错了。
然后如上图所示,在大空白处点击右键,选择Insert Insert String.来插入一个新的ID~~如下图

Table和Owner Module都默认好了不用修改
Type选择GUI   名字要使用GUI格式的编辑
Text 下方的Text就将是在游戏中出现的名字了
Dscription 这就是在toolset编辑中显示的描述,并非游戏中的。
(如果想在游戏中添加描述,只需要再制作一个名字ID,在后在Text中写入描述,然后把此ID写入ABI_base.XLS 中的descstrref竖行就可以了。)
写完之后点击OK就可以了
33.完成之后就可以发现原本空白的地方出现了一条新的名称ID了如下图

我这里填写的技能名字是SpringBrother's Anger意为春哥之怒小开下玩笑~~
34.之后很简单了~~~再次打开ABI_base.XLS然后把HEAL2法术这一行的namestrref竖行的数值修改成8000000就可以了。。。hoho(别忘了新制作的XLS文件要编译然后去覆盖旧的哦~~)
35.现在我们做了自己的MOD了,那我们要分享该怎么办了。我本来打算制作成Dazip傻瓜安装包的。但是失败了,我官方论坛上问了下,老外给的答复是说Toolset本身有点毛病,在DocumentsBioWareDragon AgeAddInstest_modcoreoverride下的那些GDA文件以及一些其他参数文件都不能自动打包。当然我们可以自己添加,不过太麻烦了。就讲种最简单的。
36.现在到DocumentsBioWareDragon AgeAddIns下就可以看到自己建立的MOD文件夹。在这里我的是test_mod文件夹。直接右键单击这个文件夹,选择添加到压缩文件进行压缩,但是还少了相应的C程序库文件,不过我们虽然没有导出库文件,但是在编辑C程序是保存编译的时候,toolset已经自动导出了,我们只需要去DocumentsBioWareDragon Agepackagescoreoverride路径下,把toolsetexport文件夹添加到压缩包里test_modcoreoverride路径下的与同名文件合并就可以了。(注意,别压缩成了RAR格式,压缩成ZIP格式。)然后就可以把压缩包分享了。别人只需要用第三方MOD管理器安装就可以了。



最后特别说明下:
1.并不是所有的法术程序文件都是spell_singletarget.ncs 比如大火球的就是spell_aoe_instant.ncs。所以请童鞋们自行根据ABI_base.XLS文件中的spellscript竖行内容找到相应的C程序库。
2.AOE类法术并不是 只有下面这段程序比如大火球
case ABILITY_SPELL_FIREBALL:
      {
            float fDamage = (100.0f + GetCreatureSpellPower(stEvent.oCaster)) * FIREBALL_DAMAGE_FACTOR;

            // damage over time
            ApplyEffectDamageOverTime(oTarget, stEvent.oCaster, stEvent.nAbility, fDamage, FIREBALL_DURATION, DAMAGE_TYPE_FIRE);

            // impact damage
            eEffect = EffectDamage(fDamage, DAMAGE_TYPE_FIRE);
            ApplyEffectOnObject(EFFECT_DURATION_TYPE_INSTANT, eEffect, oTarget, 0.0f, stEvent.oCaster, stEvent.nAbility);

            // physical resistance
            if (ResistanceCheck(stEvent.oCaster, oTarget, PROPERTY_ATTRIBUTE_SPELLPOWER, RESISTANCE_PHYSICAL) == FALSE)
            {
                // knockdown
                eEffect = EffectKnockdown(oTarget, 0, stEvent.nAbility);
                eEffect = SetEffectEngineInteger(eEffect, EFFECT_INTEGER_USE_INTERPOLATION_ANGLE, 2);
                eEffect = SetEffectEngineVector(eEffect, EFFECT_VECTOR_ORIGIN, GetPositionFromLocation(stEvent.lTarget));
                ApplyEffectOnObject(EFFECT_DURATION_TYPE_TEMPORARY, eEffect, oTarget, RandomFloat(), stEvent.oCaster, stEvent.nAbility);
            }

            break;
      }

除了这段还没完,下面还有一小段
case ABILITY_SPELL_FIREBALL:
            {
                // ignite
                SendComboEventAoE(COMBO_EVENT_IGNITE, SHAPE_SPHERE, stEvent.lTarget, stEvent.oCaster, fRadius);

                break;
            }
在底下,所以在寻找原始库文件中的法术例句的时候多查询下,以免遗漏了程序内容。
至此,教程全部结束,如果有什么疑问,可以PM我。

神圣柯曼帝国?内裤神教荣誉出品


相关物品类MOD制作教程,请参见一个月前的帖子手把手交你如何制作属于自己的mod~~终于攻破toolset


沙发我来放一张最后的效果图吧~~~~哈哈

最后,把我本次用于编写教程所制作的MOD发上来玩玩~~~春哥之怒哦~~

上文字 下文字

woskxn12345 发表于 2010-6-3 13:24

SpringBrother's Anger 春哥之怒效果是大火球,耗蓝为0,冷却为0. 而且点出这个大火球不再像原版一样需要加出属性27点魔法,一级就能学。


我们再来看看威力~~


非常不错~~~~把我自己秒了~~~~


沙发自己坐~~~

wzm999d 发表于 2010-6-3 22:07

我来支持老鼠了。 。

这个可以伸精了。
费了老鼠你很多心血吧。。

bz8212902 发表于 2010-6-3 22:08

小白鼠辛苦了~这么多……额 累了这么长时间等着收货吧哈哈

zhangrz12 发表于 2010-6-3 22:09

好东西啊~~喵耳,我来支持你啊~~~

wzm999d 发表于 2010-6-3 22:09

加亮。。必须加亮。。。

尘世巨蟒 发表于 2010-6-3 22:20

留名~

佐毒 发表于 2010-6-3 22:21

强烈支持。。不过太长了。。

sss333sss 发表于 2010-6-3 22:21

技术贴~~~~~~~~

囧楠 发表于 2010-6-3 22:23

过来支持白老鼠!技术贴!很长!辛苦了!!!!

a422070876 发表于 2010-6-3 22:26

强帖留名

iCold 发表于 2010-6-3 22:35

虽然80%看不懂,但还是支持了。

woskxn12345 发表于 2010-6-3 22:38

嗯。。。技术贴通常都比较悲剧。。唉~~

carry0833 发表于 2010-6-3 22:43

http://image1.766.com/my_attachments/200908/9/2021269_124983703514Xb.jpghttp://image1.766.com/my_attachments/200908/9/2021269_12498370238hL1.gif

好多呀@@ 辛苦了用力支持


http://image1.766.com/my_attachments/200908/9/2021269_124983703514Xb.jpghttp://image1.766.com/my_attachments/200908/9/2021269_12498370238hL1.gif

ckkyz 发表于 2010-6-3 22:52

好贴 辛苦

windwalkxp 发表于 2010-6-3 23:15

MOD帝出现。。。~~~顶之~~~~中文技术贴很有爱,这个比wiki上的还详细

feilt 发表于 2010-6-3 23:19

好邪恶的法术啊!


技术贴膜拜

yxh 发表于 2010-6-3 23:35

不错的技术贴。。。。。。。。。。

蓝色鱼泡泡 发表于 2010-6-3 23:52

这个是必须得支持的,学习了。。

lzc220 发表于 2010-6-4 00:38

强力,强力,非常想自己DIY一 把,但是看到这么多的英文数据,突然觉得自己该读书读的好悲哀。。。。。。。。。。。。

楼主大大能否做个无CD无施法的闪电链来分享下。。。。。。

shashafate 发表于 2010-6-4 00:43

牛,好长好复杂……

sam0001 发表于 2010-6-4 01:32

支持。。神作!!!

zanry 发表于 2010-6-4 03:37

神帖!一定要顶!!!!!!!!!!!!!

siean 发表于 2010-6-4 04:06

我等了很久的toolset贴终于出现了....

可可妮 发表于 2010-6-4 07:55

这个好专业 - -

lihengu110 发表于 2010-6-4 08:20

标记下

ShineVayZeX 发表于 2010-6-4 08:56

深入技术帝..非你莫属了..欣然接受吧

地狱笨笨 发表于 2010-6-4 09:04

迅速膜拜楼主中~学习了~谢谢

justintimsai 发表于 2010-6-4 10:36

技术贴 膜拜...

siweijia 发表于 2010-6-4 10:39

技术贴 留名

春哥之怒威力惊艳...
页: [1] 2 3
查看完整版本: 时隔一个多月,手把手教你如何制作属于自己的法术MOD~~6月6日修正一个错误,见36步骤