3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

楼主: woskxn12345
打印 上一主题 下一主题

[原创] 时隔一个多月,手把手教你如何制作属于自己的法术MOD~~6月6日修正一个错误,见36步骤

  [复制链接]

30

主题

6794

帖子

1万

积分

版主

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

贡献度
1881
金元
39057
积分
11480
精华
5
注册时间
2009-7-4
跳转到指定楼层
主题
发表于 2010-6-2 19:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
时隔一个月,再写一篇关于技能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
激活的话,将自动对有效目标使用
range
0 近战 (触碰目标), 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  弹出下图


在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[em24]
童鞋门肯定会发现我的自定义法术旁边还有个进阶法术吧。
确实,如果不认真改的话是不会出现进阶法术项目的,而是会变成下面这个样子。

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  意为  春哥之怒  [em24]  小开下玩笑~~
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发上来玩玩~~~春哥之怒哦~~

[tr][td]
上文字
[/td][td]
下文字
[/td][/tr]

test_mod.zip

403.86 KB, 下载次数: 80

zip

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-5-14 15:17 , Processed in 0.037650 second(s), 18 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表