本帖最后由 kellywang 于 2024-3-13 20:39 编辑
提示:本教程主要进行功能类mod教学,适用于纯零基础的新手和制作过一段时间mod的作者。由于本人水平有限,所以如有大佬发现写得不合理的地方感谢指出!
教程作者:Kellywang(星星扩展作者)
系统:Windows 10
相关软件:Visual Studio 2022, Visual Studio Code......
前言:其实制作骑砍mod并不是一件多么难的事情,甚至可以说一个完全没学过编程的也能在一个小时内做出一个功能mod,我希望在你看此教程之前不用为你的基础担心,因为本教程不需要你有任何基础,你只需要按照步骤做就行了,很多东西暂时不理解没关系,不用太过去纠结,随着时间的推移慢慢就理解了。当然这里也需要说的是,做mod容易。做好mod难,如果你想按自己的想法做出有趣的新东西,这个通常需要不少时间和耐心。所以本教程能够教你的是如何入门,教程没提到的其他功能都需要你以后自己去探索。废话不多说了,开始吧!
教程大致内容:
本教程一共分为六个部分,内容较多:
第一部分 MOD文件基本结构。这一部分将会告诉你常见的mod里面有哪些文件,分别都起什么作用。
第二部分 创建基本的示例mod。这一部分将会带你从零开始制作一个每天给玩家一定数量的第纳尔的这么一个简单的功能mod。
第三部分 原理讲解。这一部分将会告诉你怎么去实现自己想要的功能,如何去考虑,从何处下手。
第四部分 制作一个改变同伴数量的mod。这一部分将会用另一个写法带你制作一个修改同伴数量上限的mod。
第五部分 怎么分析骑砍原代码。这一部分将会带你一起通过分析骑砍原代码来找到自己想要的功能。
第六部分 其他类型的mod怎么制作。这一部分将会提一下其他类型mod制作相关的内容。
第一部分 MOD文件基本结构
一. MOD文件位置 骑砍二MOD文件主要是放在Modules文件夹下面,在启动时才能被检测到。(当然也有其他位置,如创意工坊安装的mod就不在这个文件夹)
二. MOD文件结构(常见的mod通常会包含下面这种文件夹或者文件)
bin:放置C#代码库的文件夹。几乎任何一个带有功能的mod,都会有这个文件夹。当然也有一部分mod没有这个文件夹,因为它不是必须的。 ModuleData:Mod的主要Xml数据所在的文件夹,如兵种、装备、领主、国家、文化......绝大部分mod都有这个文件夹,当然像某些纯功能性的mod也没有这个文件夹。 SubModule.xml:游戏主体识别mod的必要文件,只有包含这个文件夹,游戏才知道这是一个mod。这个文件就相当于把mod文件与游戏联系起来的中介,所以是必须有的。 Assets:Mod所有打包后的模型文件所在的文件夹,有时候也会是AssetPackages或者EmAssetPackages。总之就是用来放模型文件的,如果一个mod没有模型文件,当然也不需要这个文件夹。 AssetSources:模型源文件所在的文件夹,mod制作完毕之后这个文件夹里面的内容通常用不到了,所以通常是空的,但是这个文件夹大多时候得保留,因为对于没打包的模型,如果没有这个文件夹,模型贴图将会显示异常。 GUI:与用户界面相关的xml文件,通常是做界面相关的内容时才会有的文件夹。 SceneObj:场景、地图存放的文件夹,涉及场景或者地图的mod才会有的文件夹。 SceneEditData:与场景或者地图编辑数据相关的文件夹,使用骑砍编辑器打开场景或者地图时必须有这个文件夹,但是mod发布时,这个文件夹可有可无。mod作者在发布mod时通常会清空此文件夹。 RuntimeDataCache:也是与模型相关的文件夹,如果模型未打包,则该文件夹必须保留,否则模型会显示异常。
第二部分 创建基本的示例mod
第二部分的最终结果是让制作一个每天给玩家一定量的第纳尔的简单mod,其中每天给的第纳尔数量都比前一天多1个。
一. 安装 Visual Studio 骑砍二mod的主要语言是C#和xml。
推荐使用编辑器:Visual Studio Visual Studio(之后简称VS)的主要用途:我们通过VS来编辑C#代码,编辑好之后VS能够帮我们把代码文件编译成二进制的文件,也就是我们熟悉的dll文件。值得注意的是,dll是二进制文件,是没办法通过记事本这类文本编辑器打开的,必须通过反编译工具才能打开,如dnspy,这个工具也是非常常用的,后面会提到。 下载社区版即可,如下图:
安装步骤: 1、下载之后得到一个exe文件,双击运行。 2、等待一会儿之后自动进入Visual Studio installer界面; 3、点击下图中的“可用”;
4、选择工作负荷(就是你想安装哪些相关的组件,只做骑砍mod的话不勾选任何内容也是可以的,不过建议的话把C#相关的勾选也行),单个组件和语言包那两栏不用管,安装位置选择自己想要安装的地方即可,建议不要在C盘。然后点击右下角安装,等待安装完成即可。
软件安装完毕!是的,虽然在实际制作的时候会用到其他很多软件,但是大多数不是必须的,这里暂时不安装那些工具。 二. 创建项目 1、双击打开VS,点击创建新项目:
2、在右侧搜索“类库”,选择下图圈起来的那个类型,全称是:类库(.NET Framework)。注意不要选错了!!
3、给项目命名,选择项目存放的文件夹:
4、创建完成后进入下面的界面就是创建成功了:
三. 写代码: 下面的部分,如果你以前没学过编程或者只是简单了解过,那么你就照着写就行了,先不需要去理解。如果你之前学过编程,知道一些语法,那么你可以尝试根据注释去理解一下,但是请记住,理解不了也没关系,照着写就行了。后面会有原理部分让你去理解写mod的基本思路。1、改类名:如下图,给默认的第一个class1.cs改为SubModule.cs
2、添加引用: 在右侧“引用”二字上面右键,点击添加引用,在弹出来的界面中点击浏览: 根据下面描述选择相应的文件:
①这个路径下的所有T开头的dll文件(注意不要选中这一个:TaleWorlds.Native.dll) ②下面两个路径下的所有dll文件 ③下面路径下的第一个文件(0Harmony.dll),用于写补丁的,虽然这个示例mod里面用不到,但是很常用。 ④如果你后续有做mod选项设置相关的功能,同样的把“Bannerlord.MBOptionScreen”这个mod里面的dll添加一下就行了,但是由于这个是新手教程,这个就先不添加了。 最后点击确定即可。 这里的“添加引用”是什么意思?其实很容易理解,比如我要给一间平房增加一个二楼,这个二楼不可能在平地上建起了对吧,必须以平房为基础往上建,写mod功能也是一样,我们要以原版代码为基础才能写,而这里的添加引用就相当于告诉编辑器,这个项目的基础有哪些。
3、书写SubModule这个类。 在第一个类里面写上如下内容:(看仔细哦,代码不要多也不要少,必须保持一模一样。) 4、我们看到有些代码下面有红色波浪线,这表示这段代码有严重问题,在有红色波浪线的字体上右键:选择“快速操作和重构”,点击“using”开头的选项: 如果没有这个选项,就先留着这个有红色波浪线的地方。
5、操作完上一步,得到下图这样:
6、创建我们自己要添加的事件逻辑: 在右侧“MyMod01”上面右键,点击“添加”,选择“类”。 类名改为“MyBehavior”,如下图,然后点击添加:
7、现在就能看到刚才SubModule.cs里面的“MyBehavior”由白色的字变绿了,但是还是有红色波浪线,我们点开刚才创建的“MyBehavior”这个类,进行如下修改: 先把“internal”关键字改为“public”(注意,截图里面没改,需要你自己改一下) 然后在“MyBehavior”后面加了一个“:CampaignBehaviorBase”,然后再在有红色波浪线的“MyBehavior”上面右键,点击“快速操作与重构”,点击“实现抽象类”。如下图 再把两排“throw”开头的那一串代码删掉。 上面的部分就是我们注册事件的地方,下面的部分就是我们在存档中写入数据的地方。(不理解也没关系,之后会讲)
8、下面我以添加一个游戏内的每日事件为例: 事件的具体内容是每天给玩家给与一定数量的第纳尔,但是每天都比前一天多一块钱。 下面是这个类的完整内容,双斜杠开头的绿色的字是注释,你可以不用写,其他的部分请与截图中的代码保持一致!特别是对于以前未接触过编程的同学。
9、编译项目: 为什么要编译项目:我们上面写的这些代码都只是我们认识的语言,而计算机却不能直接去执行,只有将这些代码转化为101010这种二进制数据,计算机才能够直接运行,而dll文件就是这种二进制格式。将代码由我们写的源代码转化为二进制代码的过程称为编译,而将二进制文件转化为我们认识的代码的过程称之为反编译。
点击页面上的的启动,弹窗后点击确定就完成了项目的编译。
然后就能够在下面的路径找到我们编译好的dll文件。
10、下面我们在游戏里面放mod的Modules文件夹里面创建一个“MyMod01”的空文件夹,然后你可以随便从其他mod或者Native、SandBox等里面将bin文件夹和SubModule.xml这两个东西复制过来。 这里复制的目的是省得自己去写文件里面的基础部分,因为那一部分是每个mod都具有的,这种东西当然直接复制就行了。 然后将刚才的dll文件放入下面的路径(放进去之前先把这个路径的其他文件清空)
11、再用其他编辑器打开SubModule.xml,里面写上这样的内容:(最基础的可以用电脑自带的记事本打开,但不推荐,因为记事本代码高亮显示,很容易搞错。推荐这些编辑器:VSCode、NodePad++、Sublime,这些编辑器都很好安装,在官网下载后直接无脑点下一步即可。当然用我们上面的VS也可以) 记住请与下面截图的代码保持一致,不要多也不要少。你复制过来的代码其实已经有了很多,你只需要删掉多余的,然后再改改即可。
四、实测: 进游戏,勾选“MyMod01_test”,打开新存档,等待一天时间,如果你左下角出现下图这样的,而且右下角的第纳尔数量也增加了,就说明成功了。
到这里这个mod的制作就大功告成了! 这一部分主要讲解写骑砍mod的思路。我把主要的功能分为了以下几个部分(这里的分类仅为个人理解) 包括:给玩家每天添加一定数量的第纳尔、给部队添加士兵、给士兵添加经验、给英雄添加经验、给城镇添加驻军、提升家族等级、创建或者消灭国家等等,非常非常多的事件都可以划分为大地图事件,可以暂时简单的理解成大地图上发生的事件。 游戏里面的许多事情都是有规律来执行的,比如每天结算工资,这些通常都称之为事件。比如我们想要添加一个每天给玩家10第纳尔的事件,那么我们就需要将这个事件添加进游戏中“每天执行的事件”中,就相当于有一个盒子,里面装了一堆每天都要执行一次的事情,如果要添加新的事件,就需要将事件写好,放到盒子里。除了每天执行事件的这个盒子之外,还有每小时、每周、每帧等盒子,都可以加入新的事件,还有一些事件并不是这样按时间来执行,比如家族创建事件盒子,这个盒子里面放的事件都是在每当一个家族被创建时被执行,再比如英雄去世事件盒子,这里面放的事件都是在英雄去世之后被执行,比如要写这样一个功能:玩家同伴去世之后,为了安葬同伴,要扣取玩家500第纳尔,这个时候就在英雄去世的盒子里面添加一个事件(这个事件的具体内容就是判断去世英雄是否为玩家同伴,如果是,则减少玩家500第纳尔)。 添加事件简单总结就是:第一步写事件,第二步把事件放到盒子里。在第二部分的教程中就具体演示了怎么写事件以及把事件添加到盒子里的过程。 通过这个步骤就已经能够实现不少功能了,比如强化AI部队:每天给领主第纳尔、经验,给士兵经验等,当然还有非常多可能,比如我们要写一个当玩家家族每次升级之后,给玩家10个具装骑兵,我们就能够在每天或者每小时执行的事件里面添加检测玩家家族等级是否发生变化的事件,或者添加到每帧执行的事件中,但是一般不这样做,因为这种事件让它每秒执行几十次是不划算的,太耗费性能,每天执行一次也不太好。这个时候就需要添加到“家族等级提升的事件盒子”里了。那哪一句代码决定盒子的种类呢?看下图: 好了,现在知道哪一句是决定“事件盒子”的种类了,那“家族升级事件盒子”具体要写什么呢? 其实很简单,你只需要在把之前的那一句删掉,然后输入一个“Clan”,编辑器自然会将包含Clan关键字的“事件盒子”给你列出来让你选。当然你也可以通过反编译工具去骑砍原代码里面查看具体有哪些,这个第五部分会讲。 好了,现在改好了,但是后面的“DailyTick”却报错了,这个是正常的,你现在需要把这个改成自己想要的名字,比如“ClanEvent”,然后在上面右键,选择“生成方法 ClanEvent”就得到了下图这样: 和之前一样,删掉throw开头的代码,然后写上具体的内容。(就是先判断家族是否为玩家家族,是的话就给玩家部队添加10个具装骑兵就可以了。当然为了防止出现报错和提升代码稳定性,还要加一下非空判断等等)。 当然这里肯定是需要学习C#之后才能够写出来了,但是本篇教程肯定是不可能写C#教程的,因为内容太多了,如果你有需要,而且也不想看B站上的几十个小时的视频的话,你也可以找我给你写一些适用于骑砍的精简C#教程(不过这个不是免费的哈)。 在制作功能mod时,添加事件通常分为这两大类,大地图与场景。场景事件其实很容易理解,比如我们要添加一个功能:玩家在战斗时,每秒恢复1滴血,那么我们就需要在任务场景的每秒执行事件的那一个盒子里面加入我们自己写的事件。当然可能没有每秒执行事件的这个盒子,通常是每帧执行事件比较多,这个时候我们只需要写一个简单的时间判断逻辑就能够实现每秒执行。同样的,事件盒子也有很多,比如我要添加一个,玩家每次击中敌人都会给玩家恢复1点血量,我们只需要先写好事件,然后再将事件添加到“一个代理击中另一个代理后要执行的事件盒子”里面,这里的代理是场景中的所有角色,包括英雄、士兵、坐骑等,我们在事件里面写一个判断攻击代理是否为玩家,是则恢复1点血了即可,当然实际写的时候还会有一些非空判断等逻辑,为的是避免报错和提升代码稳定性。
我相信当你看到这里,说明你已经有一定的C#基础,由于篇幅关系,我就不再截图一一举例了,这些内容你都能够通过分析骑砍原代码或者其他mod的代码得到。后面会讲如何分析。 三、和谐补丁 当你能够灵活地使用上面两种添加事件的方法之后,你已经能够做非常非常多的功能了。但是你考虑一下这些功能可不可以通过上面添加事件的写法来实现: 提升玩家家族同伴上限数量、提升所有国王部队数量上限、修改某一种马的移速使其在战场增加50点而村庄里面不增加、提升国王的伤害为正常伤害的5倍,但是如果受击者的文化与国王相同,则不生效。这些功能中的一部分也许能够通过上面的添加事件的方式实现,但是都相对来说麻烦一点,或者说不够直接。这个时候就需要使用补丁了。 通过补丁直接对原版函数进行修改,使其变成我们想要的形式。而要写这个补丁,就必须以四个前置mod的第一个为基础。第四部分会详细的讲解使用这个方式去给我们上面制作的mod里面添加一个修改同伴数量的功能。
总结:上面三种方式写的代码可以说在许多大型的功能mod里面占据70%-90%。当然肯定还有很多其他的方式,具体的你可以通过分析其他mod或者原版代码去了解,但是相对来说难度也是不低的。熟悉上面的方式之后我相信你想做的绝大部分功能都能够实现了。
这一部分内容需要在第二部分制作的mod的基础上去写,如果你还没制作过第二部分的mod,请先制作完毕之后在看这一部分内容。 还记得上面创建类的方法吗?在右侧“MyMod01”上面右键,点击“添加”,选择“类”。然后创建一个名为“CompaniesNumberPatch”的类。
下图是通过反编译工具查看的骑砍原代码里面的截图:(请对比原函数的截图和补丁类的写法,然后据此尝试对其他函数打补丁。当然刚开始出错是正常的,多尝试自然明了)
三、注册补丁: 补丁类写好之后并不能直接被调用,还需要在SubModule这个类里面注册之后才会生效。具体的写法如下: 注意:下图的写法不是最优的写法,为了避免重复注册补丁,所以使用了一个变量在存储是否加载过补丁,这样能保证在游戏启动之后只注册一次补丁。也可以在其他重写的函数里面注册,可能就不需要这个变量了。如果你不知道前面这句话的意思就直接按照下图的写就行了。 将上图代码写在这个位置: 注意:这样的写法表示注册这个命名空间下的所有补丁,你后续在写其他补丁类的之后,就不再需要写这个注册补丁的代码了。
四、测试: 按照之前的流程,点击启动之后将编译之后的新dll复制到mod里面之前的那个位置替换的旧的dll,然后进游戏查看一下同伴数量上限是否增加。
五、其他: 下图是骑砍mod星星扩展里面屠宰动物给一罐血液的补丁类的截图,希望对你自己写补丁有所帮助。
另外,补丁有两种写法,分别是前置补丁和后置补丁(上面的两个截图都是后置补丁,通常后置补丁的兼容性比前置补丁高,两者都能实现需求的情况下推荐使用后置补丁,也就是“Postfix”),两个写法的适用场景和结果不太一样,具体有什么区别可以自己在网上查阅。因为和谐补丁不仅仅是骑砍里面有,它是一个广泛存在于许多程序中的一个机制。
这一部分主要是讲解怎么在骑砍代码里面找到自己想要的东西。 我们从前面的内容可以看出,要想做自己想要的功能,就必须在骑砍原代码里面去找相关的功能代码。这一过程可以说是制作骑砍大多数mod中最耗时间和精力的部分,特别是想做一个其他mod没有做过的新功能的时候。 从第四部分中也能看到,我们想要对一个函数打补丁,就得先找到这个函数,要找到这个函数,就得从函数的功能入手。 注意:这一块儿内容是本教程中最重要的部分。而我觉得我自己在这一方面也还缺乏技巧,我只能将我自己常用的一些方法告诉大家,这个东西需要自己长时间去尝试才能够找到比较好的办法。 安装软件:安装dnspy这个软件就不说了,网上找到之后无脑点击下一步即可。其次还需要安装一个notepad++,这个用于在某一路径下的所有文件中查找关键词(全局搜索)。 先拿这个最简单的练手,使用notepad++的 搜索->在文件中搜索 的功能:(注意看文件类型和目录,目录通常选Modules这个目录)
在搜出来的结果之后,我们能够看到在骑砍原版的文件中,“军团步兵”并不是直接在写军团步兵的代码里面的,而是通过一个翻译接口,如下图: 然后就顺利找到了帝国军团步兵的代码,是在xml里面。 2、在骑砍代码里面找到“女士,我是你最热忱的倾慕者。”这句话:(假设你现在需要制作一个功能:在男玩家对女领主说“女士,我是你最热忱的倾慕者。”之后与对方关系直接+5,不管后续发生什么。) 然后复制翻译接口,打开dnspy,在选择左上角“打开”,打开之前我们在编写dll时引用的那些文件,当然多打开了其他文件无所谓,但是尽可能不要漏掉。 下一步点击搜索,在下面出现的搜索框中输入翻译接口: 搜索类型里面选择“数字/字符串”或者“Number/String” 然后点击下面的搜索结果,我们从代码里面可以看到,这个接口并没有直接出现在对话里面,而是出现在了另一个函数里面,这个函数是在设置文本变量,而“女士,我是你最热忱的倾慕者。”被设置成了一个文本变量“FLIRTATION_LINE”,我们复制那个文本变量继续搜索:
在搜索结果中点击“AddDialogs”也就是添加对话的意思:(到此我们就找到了这个对话在代码中出现的位置)
下面框中的橙色代码就是点击这个对话之后会执行的函数:
我前面说过,假如现在要让玩家点击这段对话之后,和对方关系提升10点,所以现在知道怎么办了吗? 对的,还记得上面给函数打补丁的方法吗?给这个函数打一个补丁,在补丁里面添加一个和玩家提升关系的代码就OK啦! 这个问题问得非常好!游戏里面和玩家提升关系的标志性事件是什么?那就是屏幕上会出现一行字,你与谁谁谁关系提升了多少。 你现在就用notepad++进行刚才一样的操作,在xml里面搜索这句话的翻译接口,再通过翻译接口在dnspy里面找到这段在屏幕上出现这行字的逻辑,这段逻辑的代码周围100%能找到提升关系的代码, 好了,将提升关系的代码复制到你自己的补丁里面。(注意这其中忽略的很多细节哦,这些细节必须是在你学习C#之后才能够做到的。) 当然这个办法虽然很好,但并不总是奏效,很多时候需要灵活变通和结合其他搜索办法,才能够最终找到自己想要的。 由于篇幅有限,这里不再讲其他搜索办法,我相信你们肯定能想出更多效率更高的搜索办法,如果你对其他办法感兴趣,也可以和我交流交流。 由于我本人的时间精力也有限,所以这里仅仅列一些我知道的。 一、xml添加的内容一(装备、兵种、国家、文化等) 这部分内容在骑砍mod制作里面是相对简单的,本篇教程里面也没有讲,你可以在B站很多教程里面或者中文站的其他帖子里面看到,大部分都不是很难,不需要太多编程的知识。当然xml内容制作起来也很费时间,有的内容甚至比功能mod更麻烦更需要频繁测试,所以这里提一下就是mod之间没有高低贵贱之分,大家做mod都不容易,不要踩一捧一,不管是作为玩家还是mod作者,都应该尽量做到这一点,尽可能的保证圈子的和谐,当然对于违规、盗用这类mod肯定的坚决抵制的。 二、xml添加的内容二(皮肤、头发、音源等) 这部分内容的xml文件是不能写在SubModule.xml里面的,而是通过名叫“project.mbproj”的文件去告诉游戏本体,该mod里面有这个文件。 三、用户界面制作和修改(这一部分我自己也很不擅长) 这部分内容需要xml代码和C#代码结合起来去实现,当然只做简单的修改,比如UI的颜色这些,直接在GUI文件夹里面添加新的文件即可,新的同名文件会覆盖原版的文件。 四、模型 这部分内容需要下载steam里面的骑砍编辑器去编辑和导入模型,可以查看B站和油管上的教程来学习。 五、地图与场景 这部分内容需要下载steam里面的骑砍编辑器去新建和编辑,可以查看B站和油管上的教程来学习。 六、其他内容 如果你想要修改的内容在本教程里面没有提及,这并不代表它实现不了或者难以实现,因为教程篇幅确实有限,而且我知道的也很有限,不可能写太详细,你可以在网上多查一查,或者去分析现有的mod,或者分析原版代码来考虑你的功能的具体实现。 另外就是本教程难免有错别字或者描述偏差等问题,希望各位理解!后续发现问题会尽力去改正。 最后希望大家能早日做出自己想要的mod,同时也要注意休息!
|