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

注册 登录

QQ登录

只需一步,快速开始

查看: 12166|回复: 22
打印 上一主题 下一主题

[分享] 【翻译】MOD制作教程:创建新的锻造配方……作者是做造箭MOD(Arrowsmith)的大大。——————————————————————(字数补丁)

  [复制链接]

312

主题

3905

帖子

2万

积分

版主

zyd232

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

贡献度
714
金元
248601
积分
27726
精华
1
注册时间
2009-2-27

骨灰玩家~

跳转到指定楼层
主题
发表于 2011-12-30 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 _moonshadow_ 于 2011-12-30 14:43 编辑

作者:Samutz
渣翻:_moonshadow_

看到一篇不错的modding教程,可做入门用。我也是没有什么modding经验,既然要看、要学习,就顺便把文章翻译了。如果翻译有所纰漏,还望指出。没怎么润色,大家就凑合着看吧。

希望能够帮助更多的朋友加入modder的行列。


————————————————————————————————————————————————————————————————————
教程:创建新的锻造配方(在CK出来之前)


最近收到很多问题,都是关于我如何在没有CK的情况下制作Arrowsmith(箭的锻造)这个mod的。但我没有时间回应每个人的要求、或是为每个人改变这个mod。

我将在这个教程中解释如何制作一个简单的合成类mod——由铁锭和木柴制作一个伐木斧。希望这个教程可以帮助大家理解如何制作自己的mod、或是修改我的mod。
这个帖子将在以后更新,以报告bug修复以及其他的发现。


目录
· 准备工作
· 步骤1:安装并配置Fall Out Mod Manager
· 步骤2:创建ESP文件
· 步骤3:创建配方表的record
· 步骤5: 结束工作、测试
· (可选) 步骤5:移动配方至另一个菜单项
· 附录 A: Form IDs
· 附录 B: CTDA Subrecords



准备工作
  • 需要对十六进制码有基本的认识。文中所有的整型数均无符号、除非有所标注。
  • 将整型数或ID转化为源数据时需要将字节倒置排列。例如,ID为01234567,转化成源数据为67 45 23 01。
         (只要我把一个数用空格隔开,那么这个数就是一个源数据,就像67 45 23 01)
  • 在Skyrim运行时不要保存esp文件。否则将导致TESsnip崩溃,你将失去之前一次保存后所做的所有改变。



步骤1:安装并配置FOMM
由于目前还没有Skyrim Mod Manager或是CK,我们只好使用最新的FOMM。稍作改变就能让FOMM用于Skyrim。
1.     打开Skyrim根目录,复制TESV.exe并重命名为falloutnv.exe。
2.     下载并安装FOMM: http://sourceforge.net/projects/fomm/
3.     安装完成后,运行FOMM,程序会让你选择一个fallout游戏,选择New Veas。
4.     FOMM会询问游戏目录,选择你的Skyrim所在目录(即falloutnv.exe所在目录)
5.     有时运行FOMM会弹出错误、显示missing an ini file(缺失ini文件)。无视即可。



步骤2:创建ESP文件
1.     FOMM中,在Tools里选择TESsnip。
2.     TESsnip中,在File里选择New。
3.     新的plugin中将默认包含一个record。如果这个record不是TES4,双击它重命名为TES4。
4.     在Edit里选择AddMaster,选择Skyrimesm。
5.     选择TES4 record。选择后,窗口左下方将会列出许多subrecords。
第一个叫做HEDR。双击HEDR,更改文件版本为0.94
record count先放着,我们会在之后修改它。
将第三栏(Unknown)改为2048。
6.     CNAM subrecord是作者的名字。你喜欢的话可以把它改成你的名字。
7.     建议这时候保存plugin作为一个模板留着以后用。



步骤3:创建配方表的record

在继续搞TESsnip之前,你需要找到锻造材料的ID以及所锻造物品的ID。在这个教程中,我们需要铁锭、木柴还有伐木斧。

寻找ID的方法有几种。最简单的方法就是去UESP wiki上找。或者,你可以用TESnip 或 Skyrim Viewer查看Skyrim.esm,这种方法显然麻烦一些。

另外一种刚发是利用游戏的控制台查找ID,命令为query。这个命令将会列出游戏中所有的records。你可以使用PgUp和PgDn键上下滚动列表。

我们需要的ID有:
铁锭:0005ace4
木柴: 0006f993
伐木斧: 0002f2f4

我们有了这些ID后,就可以在FOMM中继续了。

1.     在FOMM主界面中,右击Skyrim.esm选择TESsnip。读取文件可能需要一段时间。
2.     在Skyrim.esm中找到GRUP (COBJ) record group并选中。
3.     在Edit中选择Copy。
4.     回到你的New plugin窗口,选择plugin的根部(New plugin为默认名称;如果你保存了,就是你所保存的文件名)。
5.     在Edit中选择Paste。
6.     删除GRUP (COBJ) group中所有的records(依然在你的plugin窗口操作)。
(这是我所知道的在TESsnip中创建group的唯一方法如果有人知道如何不使用复制/粘贴创建group,请告诉我。)
7.     选择GRUP (COBJ)并在Edit菜单中选择New Record(新建Record)
8.     双击 NEW_ 并将新的record改为COBJ。
创建一个新的form ID并将它输入到form ID框中(参见底部的附录A:Form IDs)。
在Unknown 2 中填入000e6917。
在Unknown 3中填入00020028。(我不清楚这些是干什么的。我只是参考了已有的配方)。
点击 Save。
9.     选择OCBJ record并在Edit中选择New Subrecord。
10.   双击NEW_ subrecord重命名为EDID。
在大编辑框的右边,输入一个没有被使用过的editor ID。在本教程中我们的editor ID设为RecipeWeaponWoodcutterAxe。
最后在左侧加上00。
点击Save。
11.   新建一个subrecord(见9)。双击并重命名为COCT。
在编辑框的十六进制部分(左侧),输入我们所造配方所需材料的数量,代码为4字节的十六进制码。如果你要以stacks为单位(比如10个铁锭),stackcounts设为1。
本教程我们需要两个材料——木柴和铁锭。所以,输入02 00 00 00。
12.   为每个材料创建一个CNTO subrecord。每个subrecord分为两个4字节段。第一个4字节段是物品的ID,第二个4字节段是我们需要这种材料的数量。
本教程中,我们输入铁锭的id(0005ace4)及其数量(1),于是得到一个CNTO subrecord:E4 AC 05 00 01 00 00 00。
然后是木柴(0006f993),得到第二个CNTO subrecord:93F9 06 00 01 00 00 00。
13.   (可选)如果你想为配方添加所需的技能要求,则需要新建一个CTDAsubrecord。
详见底部 附录B: CTDA Subcrecords。
本教程中不创建这个。
14.   新建一个CNAM subrecord。这个ID表示配方所制造的物品。
本教程中,我们使用伐木斧的ID(0002f2f4),所以需要输入F4 F2 02 00
15.   创建一个BNAM subrecord。这个ID代表配方的种类。
熔炼:CE 5C 0A 00
锻造:05 81 08 00(教程中使用这个)
天空熔炉的锻造:CE 46 0F 00
烹饪:B3 5C 0A 00
皮革制造:6A 86 07 00
16.   创建一个NAM1 subrecord。这个代表制造出来的物品的数量。可以是2字节,也可以是4字节。
本教程中,输入01 00。



步骤4:结束工作、测试

差不多完成了!
回到TES4的HEDR subrecord,将Record Count改为records的总数,records包含GRUPs以及TES4record。
教程中,records的总数为3 ——分别为TES4,GRUP (COBJ)以及COBJ。
将你的plugin保存为esp文件,并在Skyrim中启用(在launcher中启用,或者编辑plugins.txt)
载入游戏、找一个锻造台,你会发现制造伐木斧的配方出现在了MISC(杂项)菜单里。
如果你想要把配方移到别的菜单项中(而不是杂项),就需要进行下面的步骤。



(可选)步骤5:移动配方至另一个菜单项
锻造时,所锻造物品的数据决定了配方在哪里出现,与配方种类无关。
每个物品都包含一些keywords(就像标签或是目录),这些keywords会影响它们在哪些菜单项中出现。
想要把配方移动到其他菜单项,你需要编辑物品的keywords,这意味着你要重写游戏中该物品的record。

1.     使用TESsnip打开Skyrim.esm。找到你要改的物品,把物品以及物品所在group的record复制到你的plugin中。
本教程中,复制WEAP record Axe01(0002f2f4)。
2.     TESsnip的string关联并不正确,导致物品名称在string ID显示错误。修复方法为:将FULL subrecord改为物品的实际名称。在plugin的其他语种翻译中,这些名称便需要翻译。
本教程中,将FULL subrecord设为Woodcutter'sAxe。
3.     KWDA subrecord包含了物品的keywords。就像CNTO subrecord对于COBJ (配方) records,KWDAsubrecord可以囊括多个值。一个keyword ID含有4个字节,多个keyword ID组成一个KYWD record。
通过配方制造的物品需要一个Material keyword,这样锻造时它便会在已有的菜单项中出现。如果没有Material keyword,配方会默认在杂项中出现。
大多数Material keywords无非是WeapMaterial或者ArmorMaterial。这些都可以在KYWD records中找到。
本教程中,我们想要添加WeapMaterialIron keyword,这个keyword的ID为0001e718。
于是我们在KWDA的末尾添加18 E7 01 00。
4.     最后一个需要修改的是KSIZ subrecord。这个subrecord由KWDA中的keywordIDs数量决定。
本教程中,我们的物品指定了两个keywords,所以只需将KSIZ改为02 00 00 00。


好了!更新你的Record Count,保存esp,在游戏中载入并测试吧。现在你应该看到伐木斧出现在了铁器锻造菜单。


附录A:
如果我说错了什么、尽管指正,只是目前为止这些认识在我这没发现什么问题。
我认为 form IDs 是CK自动生成的。但是在这个例子里我们需要自己编写form IDs。最简单的方法是让你的form IDs从01开始。接着从01到FF中选一个数(16进制)作为第二个字节。然后用余下的字节为你的records编码。比如我的是 0188xxxx。88用来标识我的新records,xxxx可以是0001,0002等等。

00与01 ids的不同:

Form ids的头两个数字称为mod index(index有索引、指针的意思)。Skyrim.esm中所有东西的mod index都是00。新增的esm/esp文件将会根据它们的载入顺序分配mod index。Update.esm在Skyrim.esm后载入,故得到的mod idex为01。后面载入的plugin将会是02,03,04,以此类推。其它plugin中的01 id 或是关联01id的,都会自动改变为游戏为其分配的index id。你只会在游戏中看到这些变化;在plugin文件中,你看不到变化。所以,只需要给你的新records写一个01 开头的id就完事了。使用00 开头的ids可以替换或关联Skyrim.esm中的records。



附录B:CTDA Subrecords
CTDA subrecords指定了配方在锻造菜单中出现的前提条件。它们冗长而复杂。目前我就知道这些。
我在UESP的CTDA_Field找到了这些东西,但并不是所有的东西都与之匹配。

CTDA subrecord长为32字节。
00 00 00 00 00 00 80 3F C0 01 54 00 66 AD 03 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF

  • Operator 和 Flags
         
    该字节包含两个含义。前者是operator。
         可能出现的值:

    • 00 – 等于
    • 20 – 不等于
    • 40 – 大于
    • 60 – 大于等于
    • 80 – 小于
    • A0 – 小于等于


后者是flag(暂且理解为逻辑变量吧),例如:


    • 01 – OR。在使用多个CTDA      subrecords时,希望达到某个技能要求、而不是达到所有要求,则使用此flag。
    • 02 - Run on target。这个的默认功能是关联某个player (比如player.HasPerk)。但我不清楚在处理配方时它的对象是什么。
    • 04 - Use global。目前不知道这是干什么的。


用一个function和任意一个flag组合,便可完成这个字节。
比如62使用了“大于等于”操作以及“run on target”flag。
比如40使用了“大于”操作、无flag。


  • 填充,貌似没啥用。


  • 使用operator操作时需要比较的值。这些值是浮点型变量、而不是整型变量。     使用 这个转化器 转化你的数值。.




  • 还是填充,不过貌似一直都是54 00。


  • 参数1,由前面的函数(Function)调用


  • 参数 2,由前面的函数(Function)调用


  • 又是填充、还和ID关联?
         这是另一个奇怪的部分。Wiki上说这个部分应该是4字节的填充、加上后面4字节与ID关联,总共8字节。但是在目前我所见到的所有CTDA中,这部分长12字节、而不是8字节。所以我没有一个确切的规则来确定哪一部分与ID关联,或者说最后4个字节是其他什么玩意儿。




以我在Arrowsmith中使用的CTDA subrecords为例


这个CTDA subrecord可以检查玩家是否学习了铁器锻造的技能。
00 00 00 00 00 00 80 3F C0 01 54 00 0D B4 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF
00   检查function是否等于1.0(00 00 80 3F)
C0 01 代表了HasPerk这个function。它的ID是4544。减去4092再转化为十六进制得到01c0。
0D B4 0C 00 代表了铁器锻造的技能ID(000cb40d)。



下面这个CTDA subrecord检查玩家是否已有相应的global value、以决定玩家是否可以在天空熔炉锻造古诺德装备或古诺德英雄装备。(由任务解锁)
00 00 00 00 00 00 80 3F 4A 00 54 00 D1 46 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF
00 检查function是否等于1.0(00 00 80 3F)
4A 00 代表了GetGlobalValue这个 function,ID为4170。减去4096后转化为十六进制得到004a。
D1 46 0F 00代表了天空熔炉锻造所需的globalid (000f46d1)



下面的CTDA subrecord用于检查玩家的物品栏中是否存在至少一根乌鸦鬼婆羽毛。制造各种毛皮的配方也使用了类似的subrecords。
比如,如果你没有至少两张狐狸皮,某个用狐狸皮制造毛皮的配方就不会再菜单里出现。这样可以防止在菜单中总是能看到单独的、但是不能使用造皮配方。
60 00 00 00 00 00 80 3F 2F 00 54 00 66 AD 03 00 00 00 00 00 02 00 00 00 14 00 00 00 FF FF FF FF
60 检查function的值是否大于等于1.0 (00 00 80 3F)
2F 00 表示GetItemCount这个function。它的ID是4143。减去4096后转化为十六进制,得到002f。
66 AD 03 00  表示乌鸦鬼婆羽毛的物品ID(0003ad66)。
这个例子的末尾加了一些东西,但是我不知道这些东西是干什么的。






评分

6

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-17 04:20 , Processed in 0.030488 second(s), 18 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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