【地图制作】什么是RES文件以及如何使用Resguy

0 点赞
Sven Co-op
转载

需要随地图传输自定义资源?你需要使用.res文件,下面我将详细教你如何操作。 RES文件解析 RES文件(Resource File的缩写)是一份列出地图中所有自定义资源的清单,例如模型、音频、精灵等。地图中使用或甚至引用的任何自定义资源都会记录在此文件中。 它的作用是什么? RES文件仅用于多人游戏场景,例如《 Sven Co-op》或《半条命 死亡竞赛》。本指南将重点介绍《 Sven Co-op》,但相同原理也适用于《半条命 死亡竞赛》和《反恐精英 1.6》。每张地图都有其独特的RES文件,且文件名与地图相同。当玩家加入运行自定义地图的服务器时,默认情况下,只有地图文件会发送给客户端并进行下载。其他所有内容都被遗漏,这意味着客户端要么无法加入,出现【缺少文件】错误,要么能够加入但无法听到自定义音效、看到自定义模型等。 服务器通过地图的RES文件来确定需要发送给客户端的额外文件。这些文件通过以下方式在服务器和客户端之间进行交叉检查: 1. 首先,服务器检查客户端是否拥有该文件。 2. 如果客户端没有该文件,服务器会将其发送给客户端进行下载。 3. 如果客户端拥有该文件,则会进行交叉检查以确保其与服务器上的文件匹配。可能会出现文件名称相同但内容不同的情况。如果文件匹配,则该文件会被认可并跳过。如果不匹配,客户端会断开连接并显示错误信息【X文件与服务器上的文件不匹配】。服务器不会自动覆盖这些文件,这种情况下,客户端必须手动删除该文件,然后重新连接以下载匹配的文件。 如何创建RES文件?

RES文件本质上是一堆以地址形式编写的引用。以下是我在文本编辑器中打开的来自《 Sven Co-op》地图“Lab Break”的RES文件示例: 如你所见,每个文件引用都是其从根目录开始的地址。该地址不限于单个内容文件夹(例如svencoop、svencoop_addons等),这意味着如果所需文件不在第一个文件夹中,它会自动检查其他文件夹。 你在该文件中会注意到,它既包含自定义内容(如frank wav文件),也包含默认的原版内容(如Opfor.wad)。这就引出了一个重要问题: 不要包含默认文件。处理默认文件只会导致使用自定义皮肤(已替换默认文件)的玩家在加入服务器时遇到问题,这对你的地图没有任何好处。Resguy工具会自动跳过默认文件。你仍然可以强制Resguy包含它们,但我强烈建议不要这样做。 另外,回到不匹配文件可能给客户端带来问题的话题,最好将地图的自定义资源放在独特的文件夹中(例如,将模型放在models/[地图名称]/...中),而不是放在根目录或其他地图使用的文件夹中。 好了,既然我们已经了解了RES文件的相关知识,接下来让我们学习如何使用Resguy制作它们。什么是Resguy 虽然你完全可以手动编写RES文件,但你难免会遗漏一些内容,然后绞尽脑汁去寻找却一无所获。这时Resguy(由w00tguy创建)就派上用场了。需要说明的是,Resguy仅适用于《 Sven Co-op》。如果你想为半条命:死亡竞赛制作RES文件,请使用Resgen。 那么Resguy有什么功能呢?它是一款具备以下功能的应用程序: 1. 找出所有必要的引用并忽略不必要的内容 2. 帮助你排查问题并找到缺失的引用 3. 为你创建RES文件 Resguy如何知道需要哪些文件?它会读取BSP文件,并通过其内部引用(例如实体)列出所有使用的资源。这甚至包括存在但从未被触发的实体。它还会读取实际资源以查看它们是否有任何依赖项。“你说的‘具有自身依赖项的资源’是什么意思?”我听到你问道。其实,像模型这类资源可能会引用音频等其他资源。举个例子,我曾用Crowbar工具反编译了默认的半条命僵尸模型,在其QC文件(用于存储动画等数据的文件)中,我找到了行走动画的相关内容。

以“event”开头的行表示僵尸双脚接触地面并发出脚步声的时刻。这些声音在该QC文件中被直接引用。需要在特定时间播放声音的模型,可以通过脚本直接调用(如武器模型),或者使用事件来调用所需的音频文件(就像我们刚刚查看的僵尸模型)。自定义模型也是如此,它们可能使用默认(现有)文件或自定义文件。Resguy会检查所有使用的模型资源并为你找到这些引用。 如何使用Resguy?首先,前往其Github页面,在右侧的Releases部分获取最新版本。下载后,将resguy和resguy_default_content.txt放入一个内容文件夹(例如《 Sven Co-op 》资源文件制作步骤:首先,准备好你的地图文件(可以是svencoop、svencoop_addon中的文件,或你自己制作的文件)。然后,打开resguy.exe程序。程序会首先询问你要为哪个地图制作RES文件,此时输入你的地图文件名即可。例如,若要展示的地图名为“cweps.bsp”,你可以输入“cweps.bsp”,也可以只输入不带格式的“cweps”,两种方式均可。

之后会为你提供9个创建RES文件的选项。你可以勾选或取消勾选其中任何选项。这些选项如下: test = 不生成任何.res文件,仅检查问题。 allrefs = 列出所有缺失文件的引用(通常默认显示3个) printskip = 记录因无效、未使用、可选或在resguy_default_content.txt中列出而被跳过的内容 extra = 将服务器文件写入.res文件(不推荐*) extra2 = 将服务器文件写入单独的.res2文件 missing = 将缺失文件写入.res文件(不推荐**) missing3 = 将缺失文件写入单独的.res3文件 series = 将相同文件写入每个.res文件(包括系列中其他地图的BSP文件) log = 将输出记录到mapname_resguy日志文件中日志 最有用的是第2项,它会列出所有缺失文件的引用。在下图中,我勾选了选项1和选项2。现在,当我按下回车键时,它会为我打印出缺失的文件。(我在这个阶段勾选了选项1,因为我暂时不想生成RES文件)

现在,这就是我提到的依赖项部分。在下方的图片中,你可以看到显示“11个文件缺失”,并且列出了所有缺失的文件。

虽然有很多内容需要查看,但现在请允许我将你的注意力集中在这个缺失的文件上。请查看下方图片。

在图片中可以看到以下内容: 【sound/sound/magic/spellfail.wav】音频文件缺失。它在哪里被引用?该文件在【cweps.bsp】(目标地图)中被引用,该地图包含一个名为【weapon_custom】的实体,该实体引用/使用了一个名为【v_spellcast.mdl】的模型(位于【models/crypt/weapons/】目录下),而该模型在其事件中引用了此音频文件。 确实,当我反编译该模型并检查其QC文件时,发现这个取自【Master Sword: Continued】模组的特定模型在其动画中引用了缺失的音频文件。

这就引出了一个问题:我需要处理每一个被引用的缺失文件吗?幸运的是,答案是否定的。如果这些文件缺失,它们不会导致游戏崩溃或阻止玩家进入游戏。因此,如果某个文件未在RES文件中被引用,该文件就不会发送到客户端,玩家也就不会听到或看到它。如果模型中引用了某个你并不在意的音频文件,这种情况不会影响游戏体验,只会在控制台中显示错误信息。 那么,如何使用Resguy制作RES文件呢?其实你一直都可以这么做。Resguy会在地图所在的位置(无论是在svencoop文件夹、svencoop_addons文件夹还是其他文件夹中)生成RES文件,即便它发现了缺失的引用。只有当你勾选了选项1【不生成任何.res文件,仅检查问题】时,才不会生成RES文件。 编译后检查日志或RES文件,你可能会发现某些内容未被包含,这些内容已被Resgun跳过。若想了解跳过原因,可运行Resguy并在选项菜单中选择选项3,它会显示被跳过的内容及其原因。

已跳过70个文件。通过滚动查看可以了解每个文件被跳过的原因。其中许多文件因属于默认文件而被跳过。【resguy_default_content.txt】文件包含所有默认/原版文件的引用,因此Resguy可以自动跳过这些文件。 至于其他跳过原因,可能是相关引用无效、未使用或为可选内容。前两种原因不言自明,而“可选”则需要说明:Resguy不会包含所有内容。Resguy会查找并处理以下文件,但不会将它们包含在.res文件中。这些文件被排除的原因是客户端不需要它们,而且有些文件无论如何都无法发送给客户端。如果你确实需要,可以使用“-extra”参数来包含以下内容: BSP文件(包含在-extra2中,但不包含在-extra中) MOTD文件 CFG文件(SC不允许将.cfg文件传输给客户端) 包含所有#include的地图脚本文件(.as文件同样不允许传输给客户端) 自定义句子文件 全局模型/声音替换文件 每个怪物的声音替换文件 以上就是关于如何使用Resguy的总结。现在我们来谈谈清理未使用内容的问题。 清理 虽然并非必需,但这是一个良好的习惯,并且可以避免玩家控制台出现错误。通常,当你制作RES文件时,已经处于项目的末尾和发布阶段。这意味着地图已经完成,资源也已设置好,你可以将已使用和未使用的内容区分开来。我建议你复制一份项目文件(jmf/rmf)作为最终版本。接下来,你需要使用Resguy工具检查所有未使用的内容,并从项目中移除它们的引用。像模型依赖项这类内容处理起来比较麻烦,不必过于纠结,但最好清理地图项目文件内的引用。 就这样。 希望这些对你有帮助。如果你有任何问题,随时可以提问。