Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
RepoMapX
全图标记:所有房间全开(固定俯视视角)+ 怪物/队友/自己/撤离点/贵重物品(含价值)/推车标记
| Date uploaded | a month ago |
| Version | 1.0.0 |
| Download link | YQC-RepoMapX-1.0.0.zip |
| Downloads | 223 |
| Dependency string | YQC-RepoMapX-1.0.0 |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100README
RepoMapX —— R.E.P.O. 全图标记 Mod(从零手写教程 + 完整可编译源码)
这是一个 纯客户端 的 BepInEx 插件,实现你想要的全部效果:
| 你的需求 | 实现方式 | 文件 |
|---|---|---|
| 地图能看到所有房间 | 关卡生成后自动 RoomVolume.SetExplored(),并强制打开游戏内置地图相机 |
MarkerManager.cs |
| 固定视角 | 直接用游戏自带的地图相机(Dirt Finder Map Camera,固定俯视正交视角)渲染画面 | MapOverlay.cs |
| 怪物有清晰标记+是什么怪物 | 红色圆点标记 + 怪物名字标签(enemyName) |
MapOverlay.cs / MarkerManager.cs |
| 队友标记是哪个队友 | 每个队友不同颜色的圆点 + 名字标签 | 同上 |
| 自己的位置 | 白色大圆点 + 名字后面加 "(你)" | 同上 |
| 撤离点位置 | 绿色圆点 + 状态(激活/未激活) | 同上 |
| 贵重物资位置+价值 | 金色圆点 + 物品名 +$价值(dollarValueCurrent) |
同上 |
| 推车位置 | 橙色圆点 + 当前车上价值(haulCurrent) |
同上 |
游戏内按 M 循环切换:关闭 → 角落小地图 → 居中大地图。
所有开关都能在 BepInEx/config/You.RepoMapX.cfg 里改。
一、工作原理(先说清楚,越懂越好改)
R.E.P.O. 是 Unity 游戏,它的 Mod 一般走这条链路:
BepInEx(Mod 加载器)-> 启动时把你编译好的 .dll 注入游戏进程 ->
HarmonyX(函数补丁框架,是 Harmony 的改版)-> 在游戏函数"执行前/后"挂钩子 ->
你的代码读游戏内存里的对象、改 UI、玩游戏自己的 API。
关键知识点(全部来自社区逆向出来的游戏内部类,见文末参考):
- 游戏自带一张"全图":
Dirt Finder Map Camera是一个固定俯视的正交相机, 它把整个关卡渲染到一张RenderTexture上(就是原版"地图工具"的画面)。Map.Instance.ActiveSet(true)可以强制让它工作。 - 地图上的圆点:游戏类
MapCustom(挂在任意物体上,设置sprite``color再调用Add()),地图相机就会把它渲染成一个彩色圆点。 玩家身上、怪物身上都可以挂。 - 房间显示:
RoomVolume.SetExplored()把房间标记为已探索,地图上就全亮。 - 贵重物品:
ValuableObject.discovered = true+Map.Instance.AddValuable(item), 物品就出现在地图上,dollarValueCurrent字段是它的价值。 - 名字/状态/价值:这些原版地图不显示,所以用
OnGUI(Unity 老式 UI 绘制) 在世界坐标 → 地图相机视口坐标 → 屏幕矩形坐标的映射下画文字标签。 推车价值(haulCurrent)和撤离点状态是私有字段,用反射读取(Refl.cs), 字段名变了也不会崩,只是显示不出来,看日志改一行就行。
为什么这样做而不是"猜测并硬编码"?
TheEverythingMap和r.e.p.o-cheat这两个开源项目把上面所有 API 都用过了(编译通过、运行正常), 本项目的写法跟它们完全一致,是经过社区验证的。
二、搭建开发环境
| 工具 | 下载 | 用途 |
|---|---|---|
| .NET SDK 9.0 | https://dotnet.microsoft.com/download/dotnet/9.0 | 编译 C# |
| IDE(任选) | Rider / VS / VS Code + C# 插件 | 写代码 |
| Git(可选但推荐) | https://git-scm.com | 版本管理 |
| 游戏本体 + 一个 Mod 管理器 | Gale(推荐)或 r2modman | 建"开发档"测试 |
- 安装 .NET 9 SDK(装完开新终端验证:
dotnet --version)。 - 千万不要直接往游戏目录塞 Mod:用 Gale 或 r2modman 给 R.E.P.O. 建一个专用 profile(会帮你装好 BepInEx 和依赖)。Mod 管理器按官方 wiki 推荐: Gale / r2modman / Thunderstore Mod Manager。
- 在项目目录(本目录)里建一个
Directory.Repo.props(这是"本机配置",只在你机器上生效):
<Project>
<PropertyGroup>
<!-- 你的游戏安装目录(SDK 也能自动从 Steam 注册表找到,这行可以省略) -->
<GameDirectory>D:\SteamLibrary\steamapps\common\REPO\</GameDirectory>
<!-- 把你建的开发档的 BepInEx 目录填进来,编译完自动部署 -->
<!-- Gale 的路径长这样: -->
<BepInExDirectory>$(UserProfile)\AppData\Roaming\com.kesomannen.gale\repo\profiles\Default\BepInEx\</BepInExDirectory>
<!-- r2modman 的路径长这样(二选一,用哪个填哪个): -->
<!-- <BepInExDirectory>$(UserProfile)\AppData\Roaming\r2modmanPlus-local\REPO\profiles\Default\BepInEx\</BepInExDirectory> -->
<StartArguments>--doorstop-enable true --doorstop-target "$(BepInExDirectory)\core\BepInEx.Preloader.dll"</StartArguments>
</PropertyGroup>
</Project>
三、编译、安装、运行
cd D:\self\repo-mod\RepoMapX
dotnet restore # 第一次会下载 BepInEx/Unity/游戏引用 DLL(需要联网)
dotnet build # 编译,成功后自动把 dll 复制到上面的 BepInEx plugins 目录
然后在 Mod 管理器里用你的开发档启动游戏,进任意关卡看效果:
- 进入关卡后地图右上角出现小地图(默认模式),所有房间全亮;
- 怪物出现立即显示红点 + 名字;队友是彩色点+名字;自己是白色点+名字(你);
- 撤离点绿点、物品金点带
$价值、推车橙点带当前价值; - 按 M 切大地图/关闭;看
BepInEx/log.log有没有报错。
也可以 dotnet run 直接启动游戏调试(SDK 支持)。
想装进 r2modman 或发布到 Thunderstore:看下面 第七节「打包并上传」。
四、代码文件导览
| 文件 | 内容 |
|---|---|
RepoMapX.csproj |
项目文件:引用 BepInEx Core、Unity、游戏公开化程序集(GameLibs,用 Publicize 把游戏类改成可访问),并用 Linkoid 的官方 SDK 自动部署 |
Plugin.cs |
插件入口:注册 BepInEx 插件、打补丁、监听快捷键和场景切换 |
MapPatches.cs |
数据挂钩:关卡生成完成(LevelGenerator.GenerateDone)、怪物生成/消失/死亡、玩家复活/死亡 |
MarkerManager.cs |
核心:维护标记列表(玩家/怪物/物品/撤离点/推车),全开房间,强制地图开启 |
MapOverlay.cs |
屏幕渲染:把地图相机画面画到屏幕,再叠加名字/价值标签和颜色图例 |
MarkerSprites.cs |
程序化生成圆形标记贴图(不用美术资源) |
Refl.cs |
反射工具:读私有字段(推车价值、撤离点状态),字段改名不崩 |
Settings.cs |
BepInEx 配置项(所有开关、颜色、快捷键) |
想做新功能,从这三个文件开始改:
- 想加"队友距离":
MapOverlay.cs的DrawLabels里加Vector3.Distance。 - 想把地图框放大/换角落:改
Settings.cs或MapOverlay.ComputeRect。 - 想加"全图显示装尸袋/箱子":模仿
UpdateExtractionMarkers,找到对应类 (UnityEngine.Object.FindObjectsOfType<Xxx>())挂MapCustom就行。
五、修改配色和标签
颜色在 Settings.cs 顶部(TeamPalette + SelfColor 等常量),
直接把 new Color(r, g, b, a) 换成你喜欢的即可。
想要热键切换某类标记(比如按 F 显示/隐藏怪物),在 Plugin.cs 的
Update 里加 Input.GetKeyDown(...) 并翻转对应 Settings.ShowXxx.Value。
六、常见问题
- 编译报错说找不到某个类/字段:游戏更新改了 API。去
https://github.com/davidewetzel/TheEverythingMap 或
https://github.com/D4rkks/r.e.p.o-cheat 对照最新代码改名字,
或者用 dnSpy 打开
REPO_Data/Managed/Assembly-CSharp.dll搜一下。 - 界面出来了但标记不显示:看
BepInEx/log.log里RepoMapX开头的 Warning,八成是字段名变了,反射已经自动跳过,改Refl.Field的参数列表。 - 队友没名字:
SemiFunc.PlayerGetName在不同版本可能改名,用反射兜底。 - 只在本地生效:这是刻意的。所有标记都是你本机客户端自己画的, 不开网络同步,不影响其他玩家(单机/联机都安全,不会被别人看到你的"外挂视野")。
- 游戏版本:每次游戏大更新后建议重新
dotnet build确认没被 API 变更弄坏。
七、打包并上传(装进 r2modman / 发布到 Thunderstore)
先明确一件事:r2modman 本身不是"上传"平台,它只是 Mod 管理器;R.E.P.O. 的 Mod 都托管在 Thunderstore 上,r2modman 从那里下载。 所以有两条路:
路线 A:本地离线安装(只想自己用,最快)
-
运行打包脚本(编译 + 生成标准的 Thunderstore 包):
cd D:\self\repo-mod powershell -ExecutionPolicy Bypass -File package.ps1输出
dist\RepoMapX-1.0.0.zip,zip 根目录直接是:manifest.json、README.md、icon.png(256x256)、RepoMapX.dll。 -
打开 r2modman -> 选择 R.E.P.O. -> 创建/选中你的 profile:
- 直接把 zip 拖进 r2modman 主窗口(Mods 页面),它会识别为 Thunderstore 包并
自动安装到当前 profile(离线安装)。如果没有拖拽入口,就手动解压到
profile 目录下的
BepInEx\plugins\里(子文件夹无所谓,BepInEx 5 会递归加载)。
- 直接把 zip 拖进 r2modman 主窗口(Mods 页面),它会识别为 Thunderstore 包并
自动安装到当前 profile(离线安装)。如果没有拖拽入口,就手动解压到
profile 目录下的
-
点 r2modman 的 Start Modded 启动,进关卡即可。BepInEx 依赖不用管, r2modman 在安装时会自动装上依赖(这里依赖的是
BepInEx-BepInExPack-5.4.2100)。
路线 B:发布到 Thunderstore(让所有人都能搜到、一键安装)
- 注册/登录 thunderstore.io(Discord / GitHub / Overwolf 账号都行)。
- 右上角头像 -> Teams -> Create Team 建一个发布团队(相当于你的作者名)。 ⚠️ Team 名字 创建后不能改、不能删,想好再取。
- 用路线 A 的
package.ps1生成 zip(这一步会自动带上manifest.json和版本号)。 - 打开 https://thunderstore.io/package/create:
- 拖入 zip;
- Team 选你刚建的;
- Community 选 R.E.P.O.;
- Categories 勾 Tools / Quality of Life 之类(选最贴切的);
- NSFW 选 No;
- Submit。
- 提交前可以先用官方校验工具检查 manifest: https://thunderstore.io/tools/manifest-v1-validator
- 上传后 通常要几小时 才会出现在 r2modman 的在线搜索里(Thunderstore 有缓存), 之后搜 RepoMapX 即可安装;也可以直接在网站上点 Install with mod manager。
包格式要点(自己手动打包时必须遵守)
- zip 不要包外层文件夹:全选文件(manifest.json、README.md、icon.png、dll)再压缩, 根目录直接是这几个文件;
icon.png必须是 256x256 PNG;manifest.json的dependencies写BepInEx-BepInExPack-5.4.2100(REPO 社区 通用 BepInEx 包),mod 管理器会自动帮安装;- 包是不可变的:上传后不能删除或修改,出了 bug 只能改
version_number升版本重传(遵循语义化版本号 1.0.0 -> 1.0.1); - 更新时不要改
manifest.json的 name,改了 Thunderstore 会当新 Mod 而不是更新; - Thunderstore 有社区审核规则(https://wiki.thunderstore.io/moderation/global-rules), 描述里写清楚是"地图信息增强工具"就行,别写作弊/外挂类词汇。
八、参考资源(你后面自己开发全靠这些)
- 官方社区 Wiki:https://repomods.com(/develop 里的两条路线:Unity 工作流 + HarmonyX 工作流;/harmonyx 有完整搭建教程)
- 官方 SDK 模板:https://github.com/linkoid/Repo.Sdks (本项目的 csproj 照抄它的模板)
- TheEverythingMap(图地图、全开房间、玩家/敌人/物品标记的完整实现): https://github.com/davidewetzel/TheEverythingMap (Thunderstore: Nubez-TheEverythingMap)
- r.e.p.o-cheat(怪物/物品/玩家/撤点 ESP、价值读取的完整实现): https://github.com/D4rkks/r.e.p.o-cheat
- REPO_SelfMovingCart(推车类
PhysGrabCart的用法(含 haulCurrent、isSmallCart)): https://github.com/Synt-Axe/REPO_SelfMovingCart - BepInEx 文档:https://docs.bepinex.dev ;Harmony 文档:https://harmony.pardeike.net
- 社区 Discord(REPO Modding,最权威的问题解答): https://discord.gg/vPJtKhYAFe (wiki 侧边栏有入口)
九、提醒
- 这类"全图视野"功能本质上是透视信息增强(ESP),公共房间连麦玩没问题, 但在竞技/速通、需要公平性的场合会被认为是作弊,自己把握使用场合,别拿去卖钱。
- Mod 只影响你自己,性能开销很小(每 2 秒才刷新一次列表,标签绘制是几十个字符串), 比同类 mod 更省。