骑马与砍杀吧 关注:738,330贴子:14,865,575
  • 2回复贴,共1

尝试把真实战斗和火枪装一起

只看楼主收藏回复

RT,LZ最近试着把火枪(CA: Blood and Smoke)和真实战斗(RBM, Realistic Battle Mod)战斗模块装一起,但是遇上了和大部分人一样的问题,即火枪出膛速度只有10导致所有枪的射程都非常低,又不想把战斗模块关掉,所以看了看两个mod的代码想着能不能自己改一改。目前总结下来大概有三种解决方案:
第一种:最简单的方案,通过改火枪mod的xml文件实现。通过观察火枪的xml文件(位于mod文件夹/ModuleData/items/items.xml),这里以某火绳枪为例

可以看得到虽然这里的missile_speed属性被定义为220但是在游戏里初速还是10,因此仅仅改这个数值是没有用的。对比RBM对弩的修改

经过lz的实验,发现RBM对远程武器初速的修改仅适用于item_usage属性为crossbow, crossbow_fast, bow, longbow, stone和throwing的武器(源代码里应该还有个osa的投石索),其余一律弹速为10,而火枪这里有一大堆特殊的item_usage比如上面火绳枪的cla_musket。
因此可以把火枪mod里所有的item_usage属性全部改成crossbow或者crossbow_fast,这样就能把所有枪都当弩用
缺点也很明显,火枪的换弹速度、换弹动作和弹道曲线会跟着弩箭走,由于RBM所有弩在推荐弹药重量下的弹速为49,这样修改可能导致火枪在属性栏的弹速也只有49,用推荐弹药重量(由于火枪用的弹药类型是Bolt, 所以所有弩箭也都能当火枪子弹)达不到直线弹的效果,用默认的数值伤害还不如250磅轻弩,并且步战装火枪速度极快但还要弯腰。如果想要把火枪弹速加快可以在修改item_usage属性的基础上再把前面提到的missile_speed这个属性加大,对应的装弹速度也会变慢,原理后面再说。
第二种方法需要一小点编程基础,需要能看懂逻辑,并且可能违反开源协议。这里主要通过反编译的方法向RBM中计算子弹速度的函数添加火枪mod中对应的武器种类。需要用到dnspy这个.NET反编译软件来修改RBM的dll文件,具体使用方法请自行百度。如果有C#编译器的话也可以直接把RBM源代码拉下来改完自己build,不过Visual Studio占空间比较大,所以lz这里用的反编译。在GitHub上RBM的开源项目文件里我们可以找到计算弹速的函数calculateMissileSpeed()

这里的switch…case条件判断体中五种远程武器分别代表item_usage属性为crossbow, crossbow_fast, bow, long_bow的五种远程,其弹速与drawWeight和powerstroke变量相关,而drawWeight变量由之前提到的xml文件中的missile_speed赋值,powerstroke应该与技能等级相关。火枪的武器类型不在这个判断体中,使用default数据,弹速只有10,因此只需要把每种火枪类型都加入判断,并且给它们一个合适的弹速方程V=f(drawWeight,powerstroke)就能让火枪的弹速回归正常。但是lz不知道对应型号的火枪弹速方程应该怎么列比较好所以直接用笨办法,修改default分支的弹速,比如直接改成drawWeight,这样就能通过xml文件定义射弹初速。用反编译方法,用dnspy打开RBMCombat.dll,找到Utilities类 calculateMissileSpeed函数中的条件判断体,右键编辑方法,把里面的默认值改为drawWeight(或者其他合适值),添加引用(主要是RBM中其他的dll文件和Bannerlord中Taleworld开头的dll文件,位于bin/Win64_shipping_client),之后编译并保存。注意由于dnspy反编译dll是16位机器码反编译过来的,每次反编译的条件判断体形式可能不一样,比如源代码里是switch…case这里变成了if(!(rangedWeaponType)),不过只改最终的10应该不影响,但如果给每种火枪类型加个方程就要注意。


如果想要修改装弹速度,可以在RBMCombat.dll中OverrideRangedSiegeWeapon类下Postfix函数修改,不过float effectiveSkillWithDR = RBMCombat.Utilities.GetEffectiveSkillWithDR这一行如果编译不通过爆了红字可能需要加点东西,变成float effectiveSkillWithDR = RBMCombat.RBMCombat.Utilities.GetEffectiveSkillWithDR
注意装弹速度越大越快越小越慢,下面这些数据是lz随便改的,但个人感觉还可以

相应的火枪mod里的弹速、伤害和弹药重量也可以改一改。注意每次RBM更新都要来改一遍。由于lz没有做过任何有关该方面的研究,并且在github找半天没找到RBM的license,所以文件就不放了。
第三种方法是外部写个patch,但问题在于RBM这里用了静态类,使得用正常方法在外部没法改计算函数,而lz不会C#更不会用Harmony,因此退而求其次给作者发了个issue,如果有大佬愿意写个patch可以试试。
本帖基于M&B Bannerlord v1.1.6测试,仅提供一种可能的修改思路,转载请附原帖链接。
CA Blood and Smoke是The Calradia Awakens Team编写的模组。
Realistic Battle Mod是 Marnah93 和 Philozoraptor 编写的模组。
Mount & Blade II: Bannerlord由TaleWorlds Entertainment开发并发行。
dnspy是由wtfsck等开发并发布在github上的一款开源反编译软件。


IP属地:浙江1楼2023-11-17 12:07回复
    真的巧昨晚刚下了个霰弹枪mod,也是发现用rbm之后射出来的子弹跟尿尿一样xml各种改都没用,今天就看到这个帖子了。写这么多辛苦了可惜发这里可能没什么人看,像我这种刚好需要的看了都是头大不知道怎么下手


    IP属地:广东来自Android客户端2楼2023-11-17 13:28
    回复
      头大+1,无从下手


      IP属地:江苏3楼2024-08-04 09:18
      回复