《Cyberpunk 2077》MOD制作实操:通过script文件替换实现TV可交互

2024-03-05 18:28

本文主要是介绍《Cyberpunk 2077》MOD制作实操:通过script文件替换实现TV可交互,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对《Cyberpunk 2077》MOD机制已经研究了一段时间,不实际演练一番,总觉得有点虚。本来想仿照REDmod的官方视频(油管链接)来做一个,先简单一点,通过script文件替换来实现。但对于Cyberpunk新手玩家来说,视频里的例子很难去验证。于是,在N站找到了这个:All TVs interactive and off。一起来模仿练习一下吧。

MOD实现的功能:让游戏中的所有电视机都可交互,也可以让这些电视默认都关闭。

实现方式:有两种:(1)REDmod方式,即对相关script文件的完整替换;或者(2)Redscript方式,只替换script文件中的某些函数。两个版本都可以从N站下载到。本文只讲解前者。

实现步骤:

1.【前提条件】在Steam上购买《Cyberpunk 2077》,并在PC机下载&安装。然后,再从Steam下载DLC(包含REDmod工具包)。下载完成后,可以在 {install path}\Cyberpunk 2077\tools\redmod 目录下看到3个子目录:bin里是制作工具,scripts里是可供修改的一堆脚本文件,tweaks里是数据库文件。其中,scripts目录里有2000多个脚本文件,是我们的主战场,可以在Visual Studio Code里打开这个目录,需要好好研究这些文件!MOD制作的基本套路:在scripts目录里找到你需要修改的脚本文件,将其拷贝到游戏安装路径下的mod目录,然后修改里面的函数以达到特定的目的。问题是,我们怎么知道“要在哪个脚本文件里修改哪些函数”呢?

2. 为验证方便,先将本机缓存的mod删除干净,即删掉 {install path}\Cyberpunk 2077\r6\cache\modded\ 目录下的所有文件。如果自己开发的mod出了问题,也可以通过这个方法来恢复。

3. 在VS Code中,按照这个路径一层一层浏览 scripts\cyberpunk\devices\homeAppliances\mediaDevices\tvs,找到tv.script和tvController.script这两个文件——电视相关的属性和控制都在这里了,建议走读一遍代码。

4. 在游戏的安装目录 {install path}\Cyberpunk 2077\mods\ 下为我们的mod创建一个子目录,取名为AllTVInteractive。然后在这个子目录下创建info.json文件,内容如下:

{"name": "All TV Interactive","version": "1.0"
}

5. 在AllTVInteractive目录下继续创建scripts子目录,并按照tv.script和tvController.script源文件所在的路径创建各层子目录,即scripts\cyberpunk\devices\homeAppliances\mediaDevices\tvs,然后把tv.script和tvController.script两个源文件拷贝过来。接下来,就可以把这两个副本文件拖进VS Code进行修改了。

6. 对tvController.script的修改。给TVControllerPS类增加了3个函数:MakeTvInteractive、ClearAndInitializeGlobalTV和IsStationValid。其中,MakeTvInteractive函数的实现比较关键,它通过调用SetIsInteractive函数实现了对电视机的“可交互”属性的设置,具体代码如下:

 private function MakeTvInteractive(){var hadCustomChannels : Bool;if( !( IsInteractive() ) && m_amountOfStations > 1 ){hadCustomChannels = HasCustomChannels();if( m_amountOfStations == 9 ){ClearAndInitializeGlobalTV();m_amountOfStations = m_tvSetup.m_channels.Size();if ( m_amountOfStations < m_activeStation ){m_activeStation = m_amountOfStations - 1;}}if( m_amountOfStations == 5 || !( hadCustomChannels ) ){m_previousStation = m_activeStation - 1;SetIsInteractive( true );SetInteractionState( true );}}m_activeChannelName = "";
}

tvController.script文件里,还需要对InitializeTv函数进行修改,即在电视机初始化的时候调用MakeTvInteractive函数,完成对电视机“可交互”属性的自动修改,相关代码如下:

private function InitializeTv()
{if( !( IsGlobalTvOnly() ) && HasBackupedCustomChannels() ){m_tvSetup.m_channels = m_backupCustomChannels;}InitializeGlobalTV();m_amountOfStations = m_tvSetup.m_channels.Size();m_activeChannelName = m_tvSetup.m_channels[ GetActiveStationIndex() ].channelName;SetInteractionState( m_tvSetup.m_isInteractive );MakeTvInteractive();
}

7. 对tv.script的修改。主要在ResolveGameplayState函数里将一些判断条件去掉了(不是很理解意图...),新代码如下:

protected override function ResolveGameplayState()
{super.ResolveGameplayState();ToggleSoundEmmiter( false );if( IsUIdirty() && m_isInsideLogicArea ){RefreshUI();}
}

8. 完成对script文件的修改后,就可以在游戏中验证效果了。不过,上面讲述的代码并不完整,建议还是去N站下载这两个文件后放到游戏安装目录里去😂 在Steam中启动游戏时,记得打开mod开关:

点击“开始游戏”后,可以看到一个MOD代码的编译进度窗口:

如果编译成功,可以在{install path}\Cyberpunk 2077\r6\cache\modded\ 看到有文件生成。进入游戏后,注意观察效果:游戏刚开始,当主角V去詹金斯办公室的路上,经过公司大厅,进入电梯后,电梯两面墙上都挂有电视。在没有MOD的情况下,电视是无法交互的,如下图:

如果加载了我们的mod,在相同的场景下,电视机下方会有一行操作提示:手柄按下X键可以打开/关闭电视,A/B键可以切换频道,如下图:

9. 打完收工!其实MOD制作过程很简单。关键还是要搞清楚:为了实现某个功能,需要去哪个script文件里修改什么函数。这当然离不开对Cyberpunk游戏的深度体验,以及对它的脚本系统的深入理解。

这篇关于《Cyberpunk 2077》MOD制作实操:通过script文件替换实现TV可交互的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777421

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一