我是demo 发表于 2023-7-28 21:44

【D2RMM】暗黑2重制版MOD管理器《D2RMM 进阶图文教程》,D2RMM组件制作入门手册

本帖最后由 我是demo 于 2023-8-1 14:31 编辑

以下部分并不要求一定要都能看得懂,毕竟这是面向 MOD 作者的教程,既要照顾萌新能听懂一部分,更多是为了向 MOD 作者演示常见的几种情况里面,D2RMM 里要怎么做。D2RMM 组件数目远远不够,我更希望有能力的同志一起加入进来,难免写得深入一些。如果你是 MOD DIY爱好者,你能看懂你所能看懂即可,不要纠结深入的内容看不懂,放过自己。如果你有兴趣写写 D2RMM 组件,那深入的东西可以写一写,尝试尝试,即使是 D2RMM 作者没有如此详尽的演示过文件修改常见情况该怎么写。


如果你只是一个爱好者,只想知道 D2RMM 组件怎么用的指路==》【D2RMM】暗黑2重制版 MOD管理器《入门图文教程》,D2RMM使用必看手册

【基础工具安装】

1. 工欲善其事必先利其器,笑
2. 为了更快入门,推荐使用国产编辑 notepad-- 进行后续的编辑文件操作,这能避免很多不必要的麻烦
3. 下载链接:[【notepad--】](https://gitee.com/cxasm/notepad- ... lugin-Installer.exe)
4. 这个的安装非常简单就不贴图了,当然你会用 vscode 或是 idea 等更有难度的富文本编辑器那就更好了

【基础设置】

1. 文件扩展名,是要勾选的,当然这个大部分人有开启过



【将 非D2RMM 的 mod 整合到 D2RMM】
【如何利用以前的 mod 简单做一个D2RMM组件】

1. 比如:在3DM论坛里找到一个说明还算完整的组件(侵删),下载[【召唤流数量和时间限制修改】](https://bbs.3dmgame.com/forum.ph ... 5ODE2fDYzMzY2NDM%3D),将它下载下来,原帖子:https://bbs.3dmgame.com/thread-6336643-1-1.html

2. 解压,打开文件夹,在 zhl.mpq 文件夹发现有个 data 文件夹,第一个知识点:所有整合 mod,真正起作用的东西都在 data 文件夹内,【复制这个 data 文件夹】



3. 来到 D2RMM 的安装目录下的 mods 目录,在这里我们建一个叫【(FS)召唤流数量和时间限制修改】的文件夹,F表示这个是一个需要覆盖原有游戏文件的D2RMM 组件,S表示它修改文件的首字母(skill.txt),这能其他玩家很方便的排序和归类

4. 把刚才复制的 data 文件夹粘贴,在这个文件夹底((FS)召唤流数量和时间限制修改)下



5. 在这个文件夹下新建一个叫做 mod.json 脚本,右键用 notepad-- 打开,将底下文本(包括两个花括号)复制进去,格式需要是 utf-8 编码,然后保存!{
   "name": "(FS)召唤流数量和时间限制修改",
   "description": "召唤流数量和时间限制修改"
}





6. 再新建一个叫做 mod.js 脚本,同样使用 notepad-- 打开,将底下文本(包括两个花括号)复制进去,格式需要是 utf-8 编码(如果不是可按下图操作步骤更改过来),然后保存!
D2RMM.copyFile('data', '', true);







7. 然后到 D2RMM 中,点击【刷新列表】,勾选【召唤流数量和时间限制修改】就能将其集成到其他 mod 里头了



8. 点击【安装已选模组】【开始游戏】,就可以愉快游戏了

【小结与答疑】

1. 上述只是一个小小的范例,这种方式制作 D2RMM 组件文件容易相互覆盖,有些功能会没法集成在一起,不过后续我们会讲讲该怎么解决这个问题
2. 还有就是由于原作者发布的文件是很早前的,后续游戏一更新,组件就会不能用,一安装就会闪退报错,后续我们会一同解决这个问题
3. 上述只是一个很小的功能项,那如果是一个包含很多功能的 mod 能用这个方法集成吗,当然可以,这也是做这篇文章最主要的目的
4. 如果是魔改的mod也可以吗,大部分情况是不行,由于魔改作者大部分采用.bin打包,文件被他们加密过,目前没有办法将他们解析回来,只能复制粘贴,不能修改
5. 后续我们将讲讲,创建 mod.js 和 mod.json 两个文件是做什么用的,这能让各位 mod 作者更好的自定义组件



【认识 mod.json】

1. 我们在上一篇幅中使用到 mod.json,并输入了{"name": "(FS)召唤流数量和时间限制修改", "description": "召唤流数量和时间限制修改"}

2. name - 组件的名称,这是最终显示在 D2RMM 中的名字,至于保存这个组件的文件夹叫什么 D2RMM 并不关心

3. description - 描述该组件是做什么用的

4. author - 组件作者名

5. website - 组件发布的网址,可以点击组件排序按钮打开对应网页

6. version - 组件版本

7. file - 组件涉及的文件,这是我自己汉化新增的字段,便于查看哪个组件与其他组件可能的冲突

8. config - 这是 D2RMM 组件能设置的关键,由于json不能注释,请查看图说明



9. 完整示例
{
"name": "(NN)组件的名称",
"description": "组件详细介绍",
"author": "组件作者",
"website": "www.xxx.com(组件发布网址)",
"version": "1.0(组件版本)",
"file": "npc.json、skill.txt...(组件涉及修改的文件)",
"config": [
    {
      "id": "checkbox1",
      "type": "checkbox",
      "name": "单项按钮1",
      "description": "解释单项按钮1的作用",
      "defaultValue": true
    },
    {
      "id": "text1",
      "type": "text",
      "name": "文本框1",
      "description": "解释文本框1的作用",
      "defaultValue": "默认填写这句话"
    },
    {
      "id": "number1",
      "type": "number",
      "name": "数字框1",
      "description": "解释数字框1的作用",
      "defaultValue": 1,
      "minValue": 0,
      "maxValue": 100
    },
    {
      "id": "select1",
      "type": "select",
      "name": "选项框1",
      "description": "解释选项框1的作用",
      "defaultValue": "option1",
      "options": [
      {
          "value": "option1",
          "label": "第一个选项",
          "description": "第一个选项的描述"
      },
      {
          "value": "option2",
          "label": "第二个选项",
          "description": "第二个选项的描述"
      }
      ]
    }
]
}


【小结与注意项】

1. json 后缀的文件,所有你填写的字段都应该用英文双引号框起来,比如"我是一个英文双引号"
2. 例如:"name": "(AA)这是我的第一个组件" 冒号前的字段叫做键,冒号后叫值,他们组成键值对,写一个键值对的时候,需要在后面加逗号,不然会报错



【粗识 mod.js文件】

1. 在上上篇幅我们使用一句很简单的命令 D2RMM.copyFile('data', '', true );,让 D2RMM 去 copyFile(复制文件),将这个组件目录下的 data 文件夹,复制到 D2RMM/D2RMM.mpq/文件夹中,如果冲突了,那就直接覆盖掉,不覆盖就写(false)
D2RMM.copyFile(
   'data', // 将组件文件夹下的 data 文件夹复制到下面的位置
   '', // <游戏安装目录>\mods\D2RMM\D2RMM.mpq\
   true // true 会覆盖所有冲突的文件,不覆盖就写false
   );

2. 上述是 mod.js 最简单的用法,mod.js,后缀名是js,说明它本质是一个 JavaScript 的脚本,并且是 ES6 级别的。这是最难学习的部分,它需要一些编程的基础,不过我还是希望能通过一些简单的复制粘贴 MOD DIY 爱好者能自制一些常用组件

3. JavaScript(简称js) 入门到入土教程 => [【freeCodeCamp】](https://www.freecodecamp.org/chinese/learn/)

4. 开个玩笑,编程学习成本很大,有兴趣倒可以深入学习下,推荐上面的链接,全免费的。编程还是很有趣,特别是它能做游戏脚本的时候

5. 这个教程主要是让你能看得懂,别人写的脚本是在做什么,我们该如何模仿它写自己的东西

6. 不过我发现重点是得先明白为什么要这么改,改的数值是在用什么用的

7. 所以这节先搁置,后续再讲新的内容,先引入一些 mod 制作常见的工具

【小结】

一入编程深似海





【mod 开发常用工具使用】

1. 第二常用的工具一个是我们先前下载的 notepad-- 这是用来编辑 json 文件的

2. 最常用的工具是编辑和查看 txt 文件的[【AFJ Sheet】](https://bbs.3dmgame.com/thread-6174691-1-1.html)工具,先下载这个工具

3. 打开这个工具,找到zhl/zhl.mpq/data/global/exce/skills.txt,就是原先我们下载的小mod,只要一直往下点就可以了,它就只有这么一个有用的文件



4. 打开 skill.txt 我们会看到这是一个类似excel的文件,不过它需要专门的编辑,我选中这个kick 单元格,我们可以称它位置为第3行第D列,这个术语将在后面的介绍修改文件的时候用到。当然你也可以双击直接改里面的内容,不过如果你不熟悉的这个文件的话请不要这么做



5. 查找功能,点击箭头所指图标,打开搜索功能,以查找 kick字段为例,输入 kick 点击搜索/下一个即可找到这个字段。



6. 不过它有个小缺陷,如你所见,它现在选在attack上,它是位于kick之上的,这是搜索是可以搜到 kick,但一旦蓝色底框选在kick下的行,你再去搜索kick是搜不到这个单元格的,这是它很大的设计缺陷,使用的时候请注意。



7. 如上图还有替换为我就不多介绍了,就是替换功能

【小结】

这章节主要介绍 txt 文件编辑器的使用,方便我们后续查看 txt 文件

但是那些 txt 文件,每一列又是什么意思,是做什么用的,你知道吗



【txt文件详解】

如果你英语水平尚可,你可以看这个文件

[【官方英文版】【pdf】暗黑2重制版TXT文件所有列详解=TXT文件修改指南](https://bbs.3dmgame.com/thread-6431558-1-1.html)

那如果你英语像我一样惨不忍睹,请看这个文件,不过它毕竟是中文经验贴,难免没那么详细

[【简体中文】【pdf】学习制作MOD, 暗黑2常用TXT文件列详解/吐槽=TXT文件修改手册(暗黑2重制版可用)](https://bbs.3dmgame.com/thread-6436450-1-1.html)

这两个文件可以作为制作 mod 参考手册

但文字说明怎么改,难免没那么生动,我很希望你能去看看【隔壁大王】的 mod 课,这会让你的在后续的更复杂的教程中,能先系统的了解 mod 的原理和方法

[【隔壁大王 mod 课】](https://space.bilibili.com/31079 ... ondetail?sid=140238)详细且免费,推荐



【认识 D2RMM 接口,需要编程基础】

1. D2RMM.getVersion(),返回 D2RMM 版本,有些组件不适配低版本D2RMM,获取这个版本号能提示组件使用者该升级 D2RMM 了
2. D2RMM.readJson(文件路径),读取JSON文件(忽略注释、空白和D2R在JSON格式中出现的各种错误)会返回一个 js 中的字典
3. D2RMM.writeJson(文件路径,刚才返回的readJson返回的字典)
4. D2RMM.readTsv(文件路径),读取TXT文件并以JSON格式对其进行解析,返回 js 中的数组
5. D2RMM.writeTsv(文件路径),刚才返回的readreadTsv返回的数组)
6. D2RMM.readTxt(文件路径),以纯文本形式读取D2R文件
7. D2RMM.writeTxt(文件路径),纯文本写入数据目录
8. D2RMM.copyFile(从哪复制的路径,到哪去的路径,是否覆盖原有文件),将文件或目录从mod目录复制到数据目录
9. D2RMM.error(给用户报错)

【小结】

接口不多,也很简单(相对)



【自己写一个原创组件】const cubemain = D2RMM.readTsv("global\\excel\\cubemain.txt"); // 读取cubemain.txt 文件把这个文件所有的值都给 cubemain

// 添加一个盒子配方 回城卷轴 + 辨识卷轴 = 赦免徽章
cubemain.rows.push({ // 添加在 cubemain.txt 最后一行
description:
    "Scroll of Town Portal + Scroll of Identify -> Token of Absolution", // 这个配方做什么的
enabled: 1, // 1=启用这个配方 0=禁用(不需要修改)
version: 100,// 0=原版, 100=资料片(不需要修改)
numinputs: 2, // 合成材料的个数
"input 1": "tsc", // 合成材料1 回城卷轴
"input 2": "isc", // 合成材料2 辨识卷轴
output: "toa",// 输出赦免徽章
"*eol\r": 0, // 结束符(不需要修改)
});

// 添加一个配方 2个回城书 = 奶牛关 + 2个回城书
cubemain.rows.push({ // 添加在 cubemain.txt 最后一行
description: "3 Tome of Town Portal -> Cow Portal", // 这个配方做什么的,可为空,中文会显示乱码但不影响使用
enabled: 1, // 1=启用这个配方 0=禁用(不需要修改)
version: 100,// 0=原版, 100=资料片(不需要修改)
numinputs: 2, // 合成材料的个数
"input 1": `"tbk,qty=2"`, // 合成材料1 2个回城书,不能写"input 1":"tbk","input 2":"tbk"
output: "Cow Portal",// 输出奶牛关红门
"output b": "tbk",// 输出回城书,不能写"tbk,qty=2"
"output c": "tbk",// 输出回城书
"*eol\r": 0, // 结束符(不需要修改)
});

// 接着进阶
// 把一些必须用的值,赋值给baseRecipe,避免重复书写
const baseRecipe = {
enabled: 1, // 1=启用这个配方 0=禁用(不需要修改)
version: 100, // 0=原版, 100=资料片(不需要修改)
'*eol\r': 0, // 结束符(不需要修改)
};

// 武器属性附魔给珠宝
cubemain.rows.push({
...baseRecipe, // 引用 baseRecipe 所有的值
description: "1 jewelry + 1 weapon -> 1 Jewelry with Weapon attribute ", // 配方描述
numinputs: 2, // 合成材料的个数
"input 1": "jew", // 合成材料1 珠宝
"input 2": "weap", // 合成材料2 武器
output: "useritem,mod",// 输出input 1物品并加上input 2属性
});

// 修改配方
cubemain.rows.forEach((row) => { // 一个row含有txt文件一行的完整数据
// 让 description 为3个蓝戒指 转化 1个蓝色项链的配方,让它输出为1个暗金项链
if (row.description === "3 Magic Rings -> Magic Amulet") {
      row['output'] = `"amu,uni"`; // amu表示项链,uni表示暗金,组合就是暗金项链
}
// 让所有手工品自带属性满变量
// 此处有些漏洞,仅作演示使用,这几行代码就能将72行所有的手工品自带的属性全满变
// 即使暴雪后续有加手工品,也能让它全满变量,这就是 D2RMM 脚本的优势所在
if (config.manBian) {// 加个控制开关,mod.json id为manBian的开关控制,请自行参考mod.json部分
    if (row.output === `"usetype,crf"`) { // crf 为手工品代码,手工品的output列都为"usetype,crf"
      row["mod 1 min"] = row["mod 1 max"];// 把第一个变量最大值,传给最小值,物品就是满变量
      row["mod 2 min"] = row["mod 2 max"];// 第二个变量
      row["mod 3 min"] = row["mod 3 max"];// ...
      row["mod 4 min"] = row["mod 4 max"];
      row["mod 5 min"] = row["mod 5 max"];// 共5个变量,当然你会js的循环那可以写的更简洁
    }
}
});
D2RMM.writeTsv("global\\excel\\cubemain.txt", cubemain); // 把所有上面改变的值,写入到 cubemain.txt,保留并会其他组件对 cubemain.txt 的修改

【小结】
以上只演示了对 cubemain.txt 增加删除修改文件的操作,但并不意味着这些操作只能改这个文件txt文件规则是一样的,不同的只是在列名称要描述要修改对于大部分 MOD 的修改无非基于以上几种方式的细化,抽象罢了加深对暗黑2 各种文件的理解才能写好 D2RMM 脚本
【结语】

MOD 应该是开放的,可供修改的

MOD 不开放,MOD 作者会越来越少,没人分享组件,MOD 会加密,开始收费

D2RMM 脚本是不加密的,数值是可自定义的,当然它是开放的,所以它是 Free 的

D2R 是一款值得一玩的老游戏,理应有很多 MOD

尝试一下吧 你也可以的~


【贴上最后的演示的脚本】

**** Hidden Message *****






lidajunms 发表于 2023-7-29 03:20

卟离来顶。虽然我看不懂:lol

cmj1982 发表于 2023-7-29 10:13

厉害了 学习一下

onelovetbs 发表于 2023-8-1 13:40

这不比玩游戏好玩

cxs663511 发表于 2023-8-1 14:23

回复是为了浏览隐藏的内容

q1004088749 发表于 2023-8-2 04:41

感谢分享

msz_006 发表于 2023-8-5 06:41

感谢分享

hzht 发表于 2023-8-9 00:16

大牛hghg:)

爲愛¢墮落 发表于 2023-8-12 15:54

感谢楼主分享的内容!感谢楼主分享的内容!

xxywxyuhu 发表于 2023-8-13 11:47

感谢楼主分享的内容!感谢楼主分享的内容!

goodboy8742 发表于 2023-8-21 16:13

这手把手教的,楼主辛苦了

liuyin416 发表于 2023-8-28 15:10

感谢大神分享

tanggangrui 发表于 2023-8-28 15:34

不会编程,只能看看了

jlu_tcl 发表于 2023-8-30 05:05

好东西,拿走了,临走顶个贴感谢一下楼主!感谢论坛,感谢LZ热心分享!

longnyl521 发表于 2023-9-9 01:24

ding xiexie louzhu

盖尔贝勒斯 发表于 2023-9-9 09:12

下来试试吧

qqxzyu 发表于 2023-9-14 12:23

十分感谢的~支持~

MortredL 发表于 2023-9-16 17:40

感谢教学,非常实用

玩玩耍耍 发表于 2023-10-4 15:07

虽然不懂,但是看着高大上

离去的猫 发表于 2023-10-4 20:05

6666666666666666

thomasyyyy 发表于 2023-10-5 02:25

666666666666666666666666666

fadongji 发表于 2023-10-10 13:27

看看隐藏的内容是什么

startline 发表于 2023-10-13 16:02

dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddwd

tutarl 发表于 2023-10-18 15:26

暗黑2里面是提取MPQ文件里面的各种bin文件TXT文件,重制版一直没对应上,老了。

zyljh 发表于 2023-10-22 13:16

慢慢看看看

djxy001 发表于 2023-10-24 21:27

看看看看。。。。。。。。。。。。。。。。。

壞□ 发表于 2023-10-26 03:04

6666666666666666666666666666

slc1234 发表于 2023-10-28 09:58

谢谢分享!!!!

烟花易冷lee 发表于 2023-11-1 12:38

好东西,谢谢楼主!!!!!!!!!!!!!

17594199@qq.com 发表于 2023-11-6 09:36

ddddddddddddddddddddddddd
页: [1] 2 3 4
查看完整版本: 【D2RMM】暗黑2重制版MOD管理器《D2RMM 进阶图文教程》,D2RMM组件制作入门手册