◕小莫◕ 发表于 2019-11-23 10:29

【Mod开发实例】利用 ScriptHook RDR2.NET 用C#为荒野大镖客2 制作脚本Mod 实现“超级跳”和“修改时间”

前排小广告:
如果您对游戏Mod的制作感兴趣,并且愿意与广大玩家一起分享快乐,欢迎加入我们的3DM MOD组:https://mod.blacksheepgame.com/Team

为什么使用C#呢,因为我个人对C++这门语言不是很了解,主要C#接触的比较多,可能是操我作的问题,我用C++写中文,它在游戏里面乱码{:3_92:}

然后昨天看到有大佬已经做出了Community ScriptHook RDR2 .NET,于是简单研究了一下,

虽然部分功能上有些限制,但对于我这种编程小白来说,还是能看懂的一点,至少比C++懂。。。

成品:
源码:https://github.com/3DMXM/TestModForNetAtRDR2
生成后的Mod:



现此贴不设回复可见,用于Mod制作相关问题的讨论

准备工作:
      首先下载Community ScriptHook RDR2 .NET:Mod站 或 GitHub
      Script Hook RDR2 SDK:http://www.dev-c.com/rdr2/scripthookrdr2
      然后下载Visual Studio:https://visualstudio.microsoft.com/zh-hans/
      .NET Framework 4.8或其以上版本:https://dotnet.microsoft.com/download/thank-you/net48-developer-pack
      准备资料 RDR2 NativeDB:https://mod.blacksheepgame.com/NativeDB | alloc8or.re | rdr2mods.com (均可)

要求:
      Visual Studio版本要求2017或以上版本
      .NET Framework 版本要求4.8或以上版本

新建项目:
      打开Visual Studio,新建项目,选择Visual C# ->类库(NET Framework),框架选择.NET Framework 4.8,名称自定义
      
      右键“引用”,选择“添加引用”,将ScriptHook RDR2 .NET里面的“ScriptHookRDRNetAPI.dll”这个文件引用进来
      
      
      
      
      

      文件引用完成完毕之后,添加几个引用:
      using System.Windows.Forms;
using RDR2;
using RDR2.UI;
using RDR2.Native;
using RDR2.Math;

      添加进去之后,我们会发现一个报错
      

      是因为我们创建项目的时候没有引用System.Windows.Forms这个东西,我们手动引用一下:      
      

      现在错误就消失了,接下来我们将自带的“Class1”改成“Main : Script”,这样我们就可以直接使用“ScriptHookRDRNetAPI”的函数了,接下来我们在里面开始写代码:
public class Main : Script
    {
      public Main()   //入口函数
      {
            //KeyDown是ScriptHookRDRNetAPI中自带的函数,用于监听按键的按下事件
            //这句的意思是如果有按键按下则执行函数“OnKeyDown”
            KeyDown += OnKeyDown;

            //Tick是ScriptHookRDRNetAPI中自带的函数,用于勾住游戏
            //这句的意思是将函数“OnTick”注入到游戏中,并且每过“Interval”毫秒进行检测一次
            Tick += OnTick;

            //Interval是检测间隔,单位毫秒
            Interval = 1;
      }
      bool ModOn = false; //给Mod设置一个开关
      private void OnTick(object sender, EventArgs e)
      {
            Player player = Game.Player;    //获取玩家
            if (ModOn)//如果
            {
                //Function.Call是ScriptHookRDRNetAPI中的函数,用于执行动作
                //Hash.SET_SUPER_JUMP_THIS_FRAME中的“SET_SUPER_JUMP_THIS_FRAME”是 Script Hook RDR2 SDK 中的内容
                //具体赋值内容可以参考 Script Hook RDR2 SDK 的“natives.h”文件
                // SET_SUPER_JUMP_THIS_FRAME(Player player) 是Script Hook RDR2 SDK中超级跳的功能,true是启动
                Function.Call(Hash.SET_SUPER_JUMP_THIS_FRAME, player, true);
            }
      }
      private void OnKeyDown(object sender, KeyEventArgs e)
      {
            if (e.KeyCode == Keys.C)    //判断按下的键是否是“C”键,定义启动按键
            {
                ModOn = !ModOn; //给Mod开关赋值一个反值,如果开就关,如果关就开
            }
         
      }

    }


      这样,我们的“超级跳”的功能就实现了,接下来我们再来写一个“修改时间”的功能,先在Script Hook RDR2 SDK 的“natives.h”文件中找到修改时间的代码:
      static void ADD_TO_CLOCK_TIME(int hours, int minutes, int seconds) { invoke<Void>(0xAB7C251C7701D336, hours, minutes, seconds); }
      简单说一下:
                “SET_CLOCK_TIME”是设置时间
                “ADD_TO_CLOCK_TIME”是添加时间,传递的全是整数,可正可负
      
      使用ScriptHook RDR2 .NET要修改时间就是
      Function.Call(Hash.ADD_TO_CLOCK_TIME, 1, 0, 0, true);      //加一小时
Function.Call(Hash.ADD_TO_CLOCK_TIME, -1, 0, 0, true);      //减一小时

      
      逻辑研究明白之后,我们来想想要怎么操作, 我们就使用键盘的 ↑和↓键来修改时间吧,
      
      我们两个按键,操作的内容是一样的,只有一个值不一样,我们可以将它们写到一个方法里面:
      private void changeTime(int time)
      {
            Function.Call(Hash.ADD_TO_CLOCK_TIME, time, 0, 0, true);
      }

      然后在按键监控的方法OnKeyDown来进行判断是否按下 ↑和↓键:
      if (e.KeyCode == Keys.Up)
            {
                changeTime(1);
            }
            if (e.KeyCode == Keys.Down)
            {
                changeTime(-1);
            }

现在,我们修改时间的功能也已经实现了,将项目生成,


然后,将\bin\Debug\TestModForNet.dll放到游戏目录中的“scripts”文件夹中,没有自己新建一个
别忘了安装原版的ScriptHook RDR2 .NET和Script Hook RDR2

进游戏按C、↑、↓ 键就可以实现我们要的功能了


原来是豆芽 发表于 2019-11-23 10:44

本帖最后由 doya520 于 2019-11-23 11:48 编辑

{:3_126:}{:3_126:}{:3_126:}{:3_126:}{:3_126:}

touch 发表于 2019-11-23 13:19

不知道能不能开发,所有动物三星,所有赌博游戏筹码无上限,这类功能。

rokenkoku 发表于 2019-11-23 13:55

这教学贴真是强,不过我看的云里雾里的,没有这个天赋呀!

悟叶随风 发表于 2019-11-23 14:13

那个大佬干嘛不直接做个成品出来,而是做成一个库,还要写代码调用。。。

long120611 发表于 2019-11-23 14:23

感谢分享

◕小莫◕ 发表于 2019-11-23 14:30

悟叶随风 发表于 2019-11-23 14:13
那个大佬干嘛不直接做个成品出来,而是做成一个库,还要写代码调用。。。 ...

人家做了个成品,就是 NT修改器

foolass78321 发表于 2019-11-23 20:42

可以改时间了? 不错报吗

故都月光1994 发表于 2019-11-24 06:03

666666666666666666666666666666666

莫名其妙被封号 发表于 2019-11-26 16:35

好东西啊   回去研究研究 好久没碰VS了{:3_118:}

Mohillon 发表于 2019-11-26 18:33

感谢大佬教学!!!!!!

3dm438 发表于 2019-11-27 11:12

。。。。。。。。。。。。。。

wszqddr 发表于 2019-11-29 01:27

厉害啊,必须支持。。。

滨翎羽 发表于 2019-12-13 17:05

之前那个LST好像是有个所有动物皮毛三星的,但是我更想要扑克拿到自己想要的牌之类的mod,不知道能不能实现

破老小 发表于 2019-12-13 17:05

关注一下!!http://bbs.blacksheepgame.com.weibosa.com/img/emoji1.jpghttp://bbs.blacksheepgame.com.weibosa.com/img/emoji2.jpghttp://bbs.blacksheepgame.com.weibosa.com/img/emoji3.jpghttp://bbs.blacksheepgame.com.weibosa.com/img/emoji4.jpg

__明 发表于 2019-12-29 08:18

{:2_36:}{:2_36:}

huangshidi 发表于 2019-12-31 16:01

期待老大做出来一个完美皮的mod

downstairs 发表于 2020-1-4 10:54

说出来你可能不信,我竟然在3DM学编程????

aizhishen 发表于 2020-1-21 12:47

这个有点厉害了....

qq1021476868 发表于 2020-1-24 19:57

硬核教程{:3_121:}

sfisverygood 发表于 2020-1-28 22:36

这个好~寓教于乐,玩游戏还能学到东西,建议加大力度

离影健 发表于 2020-1-29 12:49

牛批 mod会越来越多的

奋力向前 发表于 2020-2-7 23:11

touch 发表于 2019-11-23 13:19
不知道能不能开发,所有动物三星,所有赌博游戏筹码无上限,这类功能。

得hook插件里有 没有的话也没有用

南宫小烁 发表于 2020-2-24 21:02

这是类似于修改器呀,大佬能不能教下怎么人物模型之类的

全站最帅 发表于 2020-11-22 16:57

怎么指定目标???

FUGjF6 发表于 2020-12-7 23:03

看看哦{:3_142:}。。。

aukomn 发表于 2020-12-21 21:10

为什么用C#?
因为Unity也用C#啊··············

怀旧丶微殇 发表于 2021-1-27 08:08

666666666666666

a7810520 发表于 2021-3-31 14:56

额。。。只是监听下键盘调用了下SDK的函数吗

a7810520 发表于 2021-3-31 15:31

有没有函数所需参数的文档,我去NativeDB里看了只有函数名说明 没有参数说明- -
页: [1] 2
查看完整版本: 【Mod开发实例】利用 ScriptHook RDR2.NET 用C#为荒野大镖客2 制作脚本Mod 实现“超级跳”和“修改时间”