battlebrothers吧 关注:22,496贴子:292,800
  • 12回复贴,共1

总算知道cnut文件怎么破解了——顺带发布下自己做的另一个MOD

取消只看楼主收藏回复

当然也是以传奇MOD十字军开局为主的。
下面为大家讲解如何破解CNUT文件以及如何封装NUT文件
原文网址:http://www.adammil.net/blog/v133_Battle_Brothers_mod_kit.html#load
首先感谢下原文作者通过他自己的努力破解的CNUT文件的奥秘然后还自己写了一套用来解包和封包的工具。
下载地址为http://www.adammil.net/files/133/bbros.zip


IP属地:云南1楼2020-07-12 00:13回复
    下载好压缩包,将压缩包内的两个文件解压在同一个文件夹,然后你可以把从游戏文件中解包出来含有CNUT文件的文件夹或者若干文件放在bin目录下,然后运行massdecompile.bat进行破解,之后程序会批量写出对应文件的NUT文件,而NUT文件的编译语言为C#,然后再你自己写好代码后保存然后删除对应CNUT文件,然后再运行masscompile.bat,将会把对应的NUT文件封包为CNUT文件。


    IP属地:云南2楼2020-07-12 00:17
    收起回复
      下面我以自己做的一个MOD(可以算的上是小修改)为例来进行十字军背景的PERK树的自定义(这里之所以能够自定义的原因是因为传奇MOD十字军开局的PERK树是自定义而非是再动态PERK下的产物),我们从传奇MOD的zip压缩包中的scripts\skills\backgrounds\目录下将legend_crusader_commander_background.cnut文件解压到bin目录下然后运行massdecompile.bat,得到legend_crusader_commander_background.nut文件,之后用记事本直接打开来到 this.m.CustomPerkTree = [字段附近


      IP属地:云南3楼2020-07-12 00:21
      回复
        this.m.CustomPerkTree = [
        [
        this.Const.Perks.PerkDefs.Colossus,
        this.Const.Perks.PerkDefs.CripplingStrikes,
        this.Const.Perks.PerkDefs.NineLives,
        this.Const.Perks.PerkDefs.Student,
        this.Const.Perks.PerkDefs.Recover,
        this.Const.Perks.PerkDefs.Pathfinder,
        this.Const.Perks.PerkDefs.BagsAndBelts,
        this.Const.Perks.PerkDefs.LegendComposure,
        this.Const.Perks.PerkDefs.LegendBackToBasics,
        this.Const.Perks.PerkDefs.Adrenalin,
        this.Const.Perks.PerkDefs.LegendRoster1
        ],
        [
        this.Const.Perks.PerkDefs.CoupDeGrace,
        this.Const.Perks.PerkDefs.Dodge,
        this.Const.Perks.PerkDefs.HoldOut,
        this.Const.Perks.PerkDefs.RallyTheTroops,
        this.Const.Perks.PerkDefs.FortifiedMind,
        this.Const.Perks.PerkDefs.BloodyHarvest,
        this.Const.Perks.PerkDefs.SteelBrow,
        this.Const.Perks.PerkDefs.QuickHands,
        this.Const.Perks.PerkDefs.ShieldBash,
        this.Const.Perks.PerkDefs.LegendTrueBeliever,
        this.Const.Perks.PerkDefs.LegendSmackdown,
        this.Const.Perks.PerkDefs.LegendOnslaught,
        this.Const.Perks.PerkDefs.Steadfast
        ],
        [
        this.Const.Perks.PerkDefs.Brawny,
        this.Const.Perks.PerkDefs.Rotation,
        this.Const.Perks.PerkDefs.Taunt,
        this.Const.Perks.PerkDefs.Feint,
        this.Const.Perks.PerkDefs.Relentless,
        this.Const.Perks.PerkDefs.Rebound,
        this.Const.Perks.PerkDefs.LegendFavouredEnemyZombie,
        this.Const.Perks.PerkDefs.LegendToolsDrawers,
        this.Const.Perks.PerkDefs.LegendSpecialistShieldPush,
        this.Const.Perks.PerkDefs.LegendSecondWind,
        this.Const.Perks.PerkDefs.LegendRoster3
        ],
        [
        this.Const.Perks.PerkDefs.SpecMace,
        this.Const.Perks.PerkDefs.SpecFlail,
        this.Const.Perks.PerkDefs.SpecHammer,
        this.Const.Perks.PerkDefs.LegendSpecGreatSword,
        this.Const.Perks.PerkDefs.SpecSword,
        this.Const.Perks.PerkDefs.SpecPolearm,
        this.Const.Perks.PerkDefs.SpecAxe,
        this.Const.Perks.PerkDefs.SpecThrowing,
        this.Const.Perks.PerkDefs.SpecCrossbow,
        this.Const.Perks.PerkDefs.ShieldExpert,
        this.Const.Perks.PerkDefs.LegendRoster4
        ],
        [
        this.Const.Perks.PerkDefs.Footwork,
        this.Const.Perks.PerkDefs.ReachAdvantage,
        this.Const.Perks.PerkDefs.Overwhelm,
        this.Const.Perks.PerkDefs.LegendBattleheart,
        this.Const.Perks.PerkDefs.LegendForcefulSwing,
        this.Const.Perks.PerkDefs.FullForce,
        this.Const.Perks.PerkDefs.ReturnFavor,
        this.Const.Perks.PerkDefs.LegendFavouredEnemySkeleton,
        this.Const.Perks.PerkDefs.LegendSpecialistShieldSkill,
        this.Const.Perks.PerkDefs.LegendToolsSpares,
        this.Const.Perks.PerkDefs.LegendPrayerOfFaith,
        this.Const.Perks.PerkDefs.LegendRoster5
        ],
        [
        this.Const.Perks.PerkDefs.Berserk,
        this.Const.Perks.PerkDefs.BattleForged,
        this.Const.Perks.PerkDefs.Nimble,
        this.Const.Perks.PerkDefs.KillingFrenzy,
        this.Const.Perks.PerkDefs.LastStand,
        this.Const.Perks.PerkDefs.SunderingStrikes,
        this.Const.Perks.PerkDefs.LegendFavouredEnemyGhoul,
        this.Const.Perks.PerkDefs.LegendPrayerOfLife,
        this.Const.Perks.PerkDefs.InspiringPresence,
        this.Const.Perks.PerkDefs.LegendRoster6
        ],
        [
        this.Const.Perks.PerkDefs.Fearsome,
        this.Const.Perks.PerkDefs.Duelist,
        this.Const.Perks.PerkDefs.Indomitable,
        this.Const.Perks.PerkDefs.Stalwart,
        this.Const.Perks.PerkDefs.BattleFlow,
        this.Const.Perks.PerkDefs.LegendFavouredEnemyHexen,
        this.Const.Perks.PerkDefs.LegendFavouredEnemyVampire,
        this.Const.Perks.PerkDefs.LegendFieldRepairs,
        this.Const.Perks.PerkDefs.LegendHolyFlame,
        this.Const.Perks.PerkDefs.PerfectFocus
        ],
        [],
        [],
        [],
        []
        ];
        }


        IP属地:云南4楼2020-07-12 00:23
        回复
          以上是代表1到7的PERK列表,然后我们所要做的是往上面添加自己喜欢的PERK比如说十字军相比起起其他角色来说少了一个快速适应的PERK这样我们可以在对应第一行的PERK列表中添加以下代码
          this.Const.Perks.PerkDefs.FastAdaption,
          之后第一行的PERK列表会变成这样
          this.Const.Perks.PerkDefs.Colossus,
          this.Const.Perks.PerkDefs.CripplingStrikes,
          this.Const.Perks.PerkDefs.NineLives,
          this.Const.Perks.PerkDefs.Student,
          this.Const.Perks.PerkDefs.Recover,
          this.Const.Perks.PerkDefs.Pathfinder,
          this.Const.Perks.PerkDefs.BagsAndBelts,
          this.Const.Perks.PerkDefs.LegendComposure,
          this.Const.Perks.PerkDefs.LegendBackToBasics,
          this.Const.Perks.PerkDefs.Adrenalin,
          this.Const.Perks.PerkDefs.FastAdaption,
          this.Const.Perks.PerkDefs.LegendRoster1


          IP属地:云南5楼2020-07-12 00:27
          回复
            这里需要注意的是就是战场兄弟的这些PERK都有它各自固定的行列如果你把本该在第一行里的快速适应PERK硬塞到最后一行,那么游戏加载就会出现错误,在开了动态PERK的条件下就会是PERK树的PERK全部随机。


            IP属地:云南6楼2020-07-12 00:31
            回复
              接下来我为大家讲一下如何把反击的状态添加到还以颜色(Return Favour)的技能中


              IP属地:云南7楼2020-07-12 00:32
              收起回复
                首先用压缩包的打开方式打开游戏目录下data\data_001.dat文件,然后在scripts\skills\actives\目录下找到riposte.cnut文件然后解压到bin文件下,然后解包,TXT打开,然后看到函数使用这里
                function onUse( _user, _targetTile )
                {
                if (!this.m.IsSpent)
                {
                this.m.Container.add(this.new("scripts/skills/effects/riposte_effect"));
                this.m.IsSpent = true; if (!_user.isHiddenToPlayer())
                {
                this.Tactical.EventLog.log(this.Const.UI.getColorizedEntityName(_user) + " uses Riposte");
                } return true;
                } return false;
                }
                同时将传奇MODzip压缩包中scripts\skills\actives\目录下的return_favor.cnut也如法炮制成nut文件用TXT打开
                同样也找到函数使用这里
                function onUse( _user, _targetTile )
                {
                if (!this.m.IsSpent)
                {
                this.m.Container.add(this.new("scripts/skills/effects/return_favor_effect"));
                this.m.IsSpent = true;
                return true;
                } return false;
                }


                IP属地:云南9楼2020-07-12 00:41
                收起回复
                  然后从riposte那里复制 this.m.Container.add(this.new("scripts/skills/effects/riposte_effect"));粘贴到return_favour的 this.m.Container.add(this.new("scripts/skills/effects/return_favor_effect"));下面
                  function onUse( _user, _targetTile )
                  {
                  if (!this.m.IsSpent)
                  {
                  this.m.Container.add(this.new("scripts/skills/effects/return_favor_effect"));
                  this.m.Container.add(this.new("scripts/skills/effects/riposte_effect"));
                  this.m.IsSpent = true
                  return true;
                  }
                  return false;
                  }


                  IP属地:云南11楼2020-07-12 00:46
                  回复
                    然后再从riposte那里复制
                    if (!_user.isHiddenToPlayer())
                    {
                    this.Tactical.EventLog.log(this.Const.UI.getColorizedEntityName(_user) + " uses Riposte");
                    }
                    到return_favour的 this.m.IsSpent = true;与return true之间
                    文本就如以下所示
                    function onUse( _user, _targetTile )
                    {
                    if (!this.m.IsSpent)
                    {
                    this.m.Container.add(this.new("scripts/skills/effects/return_favor_effect"));
                    this.m.Container.add(this.new("scripts/skills/effects/riposte_effect"));
                    this.m.IsSpent = true;
                    if (!_user.isHiddenToPlayer())
                    {
                    this.Tactical.EventLog.log(this.Const.UI.getColorizedEntityName(_user) + " uses Riposte");
                    }
                    return true;
                    }
                    return false;
                    }
                    最后再把改好的return_favour.nut文件封包为.cnut文件然后替换传奇MDO压缩包中相同目录下的相同文件就可以了


                    IP属地:云南12楼2020-07-12 00:49
                    收起回复
                      请大家在写代码的时候千万要做好原文件的备份,因为这样封包的代码好像不能再以同样的方法解包


                      IP属地:云南13楼2020-07-12 00:56
                      回复
                        昨夜小楼秋风1HEj-CG
                        南朝多少庙宇FH7Xx-
                        花落人尽南北东y0cZW
                        若殇怀古mVv1g
                        z8ts


                        IP属地:云南16楼2020-07-12 10:31
                        收起回复

                          具体使用范例(看右边的天赋树)


                          IP属地:云南17楼2020-07-12 10:36
                          回复