3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 侠客前传 | 刺客信条 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 2235|回复: 12

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

[复制链接]

248

主题

2万

帖子

2万

积分

论坛会员

MOD站地址:mod.3dmgame.com

Rank: 6Rank: 6

贡献度
579
金元
262254
积分
28561
精华
2
注册时间
2013-3-4

3DM MOD站(白银)3DM MOD站(黄金)3DM MOD组

QQ
发表于 2019-11-23 10:29 | 显示全部楼层 |阅读模式
前排小广告:
如果您对游戏Mod的制作感兴趣,并且愿意与广大玩家一起分享快乐,欢迎加入我们的3DM MOD组:https://bbs.3dmgame.com/thread-5838764-1-1.html
        Mod组群:258155733(注意:想加入3DM MOD组的请添加这个群)

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

然后昨天看到有大佬已经做出了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

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

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

        文件引用完成完毕之后,添加几个引用:
      
  1. using System.Windows.Forms;
  2. using RDR2;
  3. using RDR2.UI;
  4. using RDR2.Native;
  5. using RDR2.Math;
复制代码


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

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

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

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

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

  35.     }
复制代码



        这样,我们的“超级跳”的功能就实现了,接下来我们再来写一个“修改时间”的功能,先在Script Hook RDR2 SDK 的“natives.h”文件中找到修改时间的代码:
      
  1. 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要修改时间就是
      
  1. Function.Call(Hash.ADD_TO_CLOCK_TIME, 1, 0, 0, true);        //加一小时
  2. Function.Call(Hash.ADD_TO_CLOCK_TIME, -1, 0, 0, true);        //减一小时
复制代码

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


        然后在按键监控的方法OnKeyDown来进行判断是否按下 ↑和↓键:
      
  1. if (e.KeyCode == Keys.Up)
  2.             {
  3.                 changeTime(1);
  4.             }
  5.             if (e.KeyCode == Keys.Down)
  6.             {
  7.                 changeTime(-1);
  8.             }
复制代码


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


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

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

3

查看全部评分

回复

使用道具 举报

158

主题

1591

帖子

5万

积分

版主

Rank: 14Rank: 14Rank: 14Rank: 14

贡献度
721
金元
552639
积分
58148
精华
0
注册时间
2018-3-14

3DM页游玩家3DM页游玩家3DM MOD站(白银)3DM MOD组优秀版主3DM伊甸MOD组

发表于 2019-11-23 10:44 | 显示全部楼层
本帖最后由 doya520 于 2019-11-23 11:48 编辑

回复 支持 反对

使用道具 举报

26

主题

1402

帖子

2133

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
154
金元
15074
积分
2133
精华
1
注册时间
2007-12-3
发表于 2019-11-23 13:19 | 显示全部楼层
不知道能不能开发,所有动物三星,所有赌博游戏筹码无上限,这类功能。
回复 支持 反对

使用道具 举报

3

主题

652

帖子

563

积分

高级玩家

Rank: 4

贡献度
3
金元
5507
积分
563
精华
0
注册时间
2013-4-25
发表于 2019-11-23 13:55 | 显示全部楼层
这教学贴真是强,不过我看的云里雾里的,没有这个天赋呀!
回复 支持 反对

使用道具 举报

124

主题

3452

帖子

2796

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
146
金元
22121
积分
2796
精华
0
注册时间
2011-2-17
发表于 2019-11-23 14:13 | 显示全部楼层
那个大佬干嘛不直接做个成品出来,而是做成一个库,还要写代码调用。。。
回复 支持 反对

使用道具 举报

3

主题

603

帖子

1761

积分

游戏狂人

Rank: 6Rank: 6

贡献度
90
金元
14010
积分
1761
精华
0
注册时间
2017-3-1

3DM MOD站(白银)

QQ
发表于 2019-11-23 14:23 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

248

主题

2万

帖子

2万

积分

论坛会员

MOD站地址:mod.3dmgame.com

Rank: 6Rank: 6

贡献度
579
金元
262254
积分
28561
精华
2
注册时间
2013-3-4

3DM MOD站(白银)3DM MOD站(黄金)3DM MOD组

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

人家做了个成品,就是 NT修改器
回复 支持 反对

使用道具 举报

20

主题

349

帖子

351

积分

高级玩家

Rank: 4

贡献度
0
金元
3513
积分
351
精华
0
注册时间
2019-2-19
发表于 2019-11-23 20:42 | 显示全部楼层
可以改时间了? 不错报吗
回复 支持 反对

使用道具 举报

9

主题

629

帖子

639

积分

超级玩家

Rank: 5Rank: 5

贡献度
2
金元
6306
积分
639
精华
0
注册时间
2012-8-28
发表于 2019-11-24 06:03 | 显示全部楼层
666666666666666666666666666666666
回复 支持 反对

使用道具 举报

190

主题

1811

帖子

2762

积分

游戏达人

让我猜猜,你的甜甜圈被偷了

Rank: 7Rank: 7Rank: 7

贡献度
284
金元
16256
积分
2762
精华
0
注册时间
2009-7-6
发表于 2019-11-26 16:35 | 显示全部楼层
好东西啊   回去研究研究 好久没碰VS了
回复 支持 反对

使用道具 举报

1

主题

56

帖子

118

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1183
积分
118
精华
0
注册时间
2017-8-14
发表于 2019-11-26 18:33 | 显示全部楼层
感谢大佬教学!!!!!!
回复 支持 反对

使用道具 举报

68

主题

1万

帖子

2万

积分

论坛幸运儿

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
86
金元
241251
积分
24469
精华
0
注册时间
2015-12-17

3DMer

发表于 2019-11-27 11:12 | 显示全部楼层
。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

0

主题

148

帖子

204

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2035
积分
204
精华
0
注册时间
2015-3-7
发表于 2019-11-29 01:27 | 显示全部楼层
厉害啊,必须支持。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|咖绿茵|求知网|3DMGAME ( 京ICP备14006952号 沪公网安备31011202006753号

GMT+8, 2019-12-6 14:09 , Processed in 0.138984 second(s), 17 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表