GWYF模组API与模组制作工具包

创作者: iplaynothing
已更新:2026-07-03 22:42:39
139KB

关于此 MOD

现在每个GWYF模组都在运行的共享框架,内置场景检查器(Shift+F7)、完整的模组制作指南,以及通过勾选框即可构建模组的可视化模组设计器。如果某个模组需要GWYF模组API,就是这个。
GWYF模组API
每个GWYF模组背后的共享代码——外加下载包中的实时场景检查器、完整模组制作指南和可视化模组设计器。

这是什么
我制作的每个GWYF模组都建立在 GWYF_ModAPI.dll而不是每个模组都自带一份相同的基础代码,它们都共用这一个库。
它为你处理了BepInEx模组中枯燥但必要的部分:保存和加载配置、注册按键绑定(以及当两个模组占用同一个按键时进行协调)、在玩家之间传递数据而无需你编写任何网络代码、在模组卸载后进行清理,还有一个深色UI主题,让菜单不会显得格格不入。详细说明在下方。如果某个模组是基于它构建的,则需要安装此模组才能运行。
它与模组管理器的兼容性
大多数人什么都没做就已经有了,因为 GWYF模组管理器 将其打包。仅当你想要单独更新框架,或者你运行了一个需要它且不使用管理器的模组时,才从这里下载。副本向后兼容,因此你机器上最新的版本会生效,旧模组仍可继续使用。
安装
  • 安装 BepInEx 5 整合包 到你的游戏文件夹中。
  • 将此压缩包解压到你的游戏根目录,以便 GWYF_ModAPI.dll 落在 BepInEx/plugins/.
  • 启动游戏。

内置场景检查器(Shift+F7)
这不只是依赖。按下 Shift+F7 指向游戏中的任何内容即可实时读取,无需反编译器和调试器。适合喜欢探索的玩家,也是模组作者找到需要修改的精确对象、组件或字段的最快方式。
它读到了什么 无论你志在何方:
  • 名称、完整层级路径及活动状态
  • 其组件、层和标签
  • 变换:位置、旋转和缩放,以及你到它的距离
  • 刚体(若有):运动学与动力学、质量、速度、重力、休眠
  • 网络信息,用颜色区分:网络ID以及谁拥有权限,让你一眼就能看出某个东西是由主机还是客户端控制的
控制
  • Shift+F7 切换检查器,然后瞄准选择
  • F 冻结:释放你的光标,让你可以滚动面板并将其拖到任意位置(它会记住你放置的位置)
  • C 将所选对象的完整详细信息复制到剪贴板,方便粘贴
  • P 固定一个对象,使其在你移动时仍保持在世界中标记显示
  • M 查看对象上的第一个脚本字段
无论是否安装模组管理器均可使用。安装管理器后,该绑定会显示在“绑定”选项卡中,并加入按键绑定冲突自动解决(基础按键可重新绑定;仍需按住 Shift),因此不会与其他模组冲突。模组作者提示:在检查器中找到名称,然后在代码中通过以下方式访问 查找游戏类型(name) + ctx.GetValue / ctx.HarmonyPatch.

你的模组获得的内容
一 模组上下文 把这所有东西都交给你——下面开发者区域中的每一项都用代码做了详细说明。
管道问题,搞定
  • 自清洁生命周期 - Harmony 补丁、生成的物体和协程在卸载/热重载时都会自行解绑
  • 输入配置 自动保存,外加游戏内滑块、开关和下拉菜单
  • 按键绑定 在每个模组之间自动解决冲突
  • 反射与场景搜索 触及类型化 API 未覆盖的任何内容
多人游戏,无需使用Mirror
  • 数值同步 (主机对客户端)且 命名事件 使用字符串负载
  • 同步大厅投票 - 开始一局,所有人投票,你获得计票结果
  • 网络生成与远程过程调用 - 每个客户端都能看到的对象,以及带有回复的模组间消息
  • 模组间服务 这样模组之间就能互相发现并在此基础上继续开发
阅读并操控游戏
  • 玩家、身份与游戏状态 带有变更事件(阶段、天数、楼层、配额)
  • 每游戏钩子 每款赌场游戏
  • 经济、门票与主持人游戏控制 金钱、配额、天数计时器、楼层、世界生成物、玩家操作;由主机控制,因此大厅内所有人都会同步收到
创建你的专属内容
  • 预构建玩法系统 - 可随时加入的库存、制作、货币和升级系统,支持保存/读取
  • 自定义内容 - 注册你自己的挑战、物品、槽位模式、可交互对象和网络预制体
  • 自定义NPC 生成游戏自带的联网NPC并为其编程:移动、跟随、巡逻、视野/追逐、对话、生命值与伤害、外观、事件
穿上工装,再调试代码
  • 界面 - 一个预构建的深色主题,外加窗口、标签页、设置标签页和搜索辅助功能
  • 媒体与世界 - 材质、纹理、音频、音乐、资源包、生成、摄像机控制
  • 实时调试工具包 - 价值观察、世界标记、快照/差异、事件时间线、跨客户端对比

模组开发者
Mod API处理了Unity/BepInEx模组制作中烦人的部分。参考 GWYF_ModAPI.dll,实现 模组,并呼唤 模组管理器接口.获取或创建上下文(此) 在 觉醒() - 无论是否使用Mod管理器,同一代码均可运行。完整的开发者参考文档见下方(点击展开),以及 模组制作指南.html 下载中。
无代码选项: 下载内容还包括 mod_designer.html 一个可视化模组设计器。选择功能(游戏内窗口、按键绑定、配置、主持工具、自定义NPC等),它就会为你生成一个可直接构建的模组供你复制出来。即使之后还要调整,这也是快速搭建框架的好方法。用任意浏览器打开即可;它会直接链接到指南。
剧透:  
显示

══════════ 快速开始 ══════════
使用BepInEx;
using GWYF_ModAPI;
[BepInDependency("com.gwyf.modapi.plugin", BepInDependency.DependencyFlags.SoftDependency)]
[BepInPlugin("com.you.mymod", "我的模组", "1.0.0")]
公共类MyMod:BaseUnityPlugin,IMod
{
    私有 IModContext _ctx;
    公共字符串名称 => “我的模组”;
    public string Version => "1.0.0";
    public string Author => "你";
    公开字符串 描述 => “做很酷的事”;
    醒来
    {
        _ctx = ModManagerAPI.GetOrCreateContext(this);
        _ctx.GetHarmony().PatchAll(); // 两种方式都可行
        _ctx.Log("已加载!"); // 回退到 BepInEx 日志记录器
    }
    public void OnLoad(IModContext ctx) { _ctx = ctx; } // 升级为托管模式
    public void OnUpdate() { } public void OnGUI() { } public void OnFixedUpdate() { }
    public void OnUnload() { } public void OnSceneChanged(string s) { }
}
实现中 模组 是可选的——一个普通的 BepInEx 插件仍然可以正常工作;只是在管理器存在时才会获得额外功能。软 前置依赖 让你的模组加载前先加载API。
══════════ 托管版与独立版 ══════════
你的模组会适配玩家已安装的任何内容。有三种情况:
  • 普通的BepInEx插件 (无 API 参考):你重启游戏以重新加载,自行清理 Harmony / 对象 / 协程,编写你自己的 Mirror 消息,并构建你自己的 GUIStyles。
  • API,无管理器:被追踪的对象、纹理、材质以及作用域内的Harmony会自行清理; 配置 和 存档/读档 工作;同步和事件通过Mirror运作; 服务注册表 是共享的;你将获得完整的暗色 IMGUI 主题。重新加载仍然需要重启游戏,因为该 DLL 位于 BepInEx/plugins 中,并被操作系统锁定。
  • API + 管理器以上所有内容,外加 Ctrl+R 一秒内热重载——但仅当你的DLL是从 模组文件/ 文件夹,而非 BepInEx/plugins——每个模组独立的控制台标签页、面板中的配置滑块/开关、BINDS 标签页、暂停菜单按钮、冲突检测以及实时检查器。
所以管理器只是在上面增加了便利功能:热重载、每个模组的控制台、面板中的配置控件、暂停菜单按钮、冲突检测和检查器。你的模组实际行为在两种模式下是一样的。
══════════ 完整工作示例 ══════════
在主菜单上绘制一个标签,可在任一模式下运行:
使用BepInEx;
使用GWYF_ModAPI;
使用UnityEngine;
[BepInPlugin("com.gwyf.mainmenutest", "主菜单测试", "1.0.0")]
公共类主菜单插件:基础Unity插件,模组接口
{
    公共字符串 Name => "主菜单测试";
    public string Version => "1.0.0";
    公共字符串 作者 => "你";
    在主菜单上绘制一个标签。
    private IModContext _ctx;
    私有布尔变量 _onMainMenu;
    void Awake()
    {
        _ctx = ModManagerAPI.GetOrCreateContext(this);
        _ctx.Log("主菜单测试已加载!");
    }
    public void OnLoad(IModContext ctx) { _ctx = ctx; _ctx.Log("已升级为托管模式"); }
    public void OnGUI()
    {
        如果不在主菜单,则返回;
        GUI.Label(new Rect(20, Screen.height - 40, 400, 30), "主菜单测试正在运行!");
    }
    public void OnSceneChanged(string scene) { _onMainMenu = scene.Contains("Menu"); }
    public void OnUpdate() { }
    public void OnFixedUpdate() { }
    public void OnUnload() { _ctx?.Log("正在卸载"); }
}
开发工具: 设置 > 开发者 > 生成模板 创建一个已配置好 .csproj 的即用项目。若要使用热重载,请将生成的 DLL 放入 gwyf_mods/ (非 BepInEx/plugins)- 重建并 Ctrl+R 不到一秒就能识别更改,无需重启。
══════════ 区域参考 ══════════
生命周期、清理与钩子。 IMod钩子的触发方式类似MonoBehaviour。你通过上下文注册的任何内容在卸载时都会自动撤销。
_ctx.GetHarmony().PatchAll(); // 卸载时自动取消补丁
_ctx.TrackObject(myGameObject); // 卸载时自动销毁
_ctx.StartTrackedCoroutine(MyRoutine()); // 卸载时自动停止
5秒后执行(5秒后记录“5秒后”)
_ctx.OnRoundStart(() => _ctx.Log("回合开始"));
_ctx.OnPlayerJoined(p => _ctx.Log(p.Name + " 加入了"));
配置与存档数据。
浮点 速度 = _ctx.配置浮点("速度", 1.5f);
_ctx.添加配置滑块("速度", "speed", 0.5f, 5f, 1.5f);
_ctx.SaveData("highscore", "42");
字符串 hs = _ctx.LoadData("highscore", "0");
按键绑定(冲突自动解决)。
_ctx.BindKey(KeyCode.F8, "切换我的菜单", () => _open = !_open);
多人游戏:同步与事件。
_ctx.SetSyncedValue("rule", "hardcore"); // 房主设置
string rule = _ctx.GetSyncedValue("rule", "normal"); // 客户端读取
_ctx.OnModEvent("ping", payload => _ctx.Log("收到 " + payload));
_ctx.SendModEvent("ping", "hello");
玩家与游戏状态。
对 _ctx.GetAllPlayers() 中的每个玩家 p
    {_ctx.Log($"{p.Name} ({p.SteamId}) local={p.IsLocal}");}
字符串 阶段 = _ctx.GetGameState(); // "Lobby","Game","Win","Lose"...
_ctx.OnGameStateChanged(s => _ctx.Log("阶段 -> " + s));
每游戏钩子。
foreach (var name in _ctx.GetCasinoGameTypes()) _ctx.Log(name);
object blackjack = _ctx.FindCasinoGame("二十一点");
经济与门票。
long money = _ctx.GetBalance();
_ctx.AddBalance(500);
_ctx.RemoveBalance(200); // 余额不足时返回 false
主机与游戏控制(仅限主机操作)。 改变比赛结果的判定只对主机生效,在客户端上会返回 false。由于 GWYF 在服务器端解析游戏,主机调用这些判定会决定所有玩家的结果,即使是没有安装模组的玩家也是如此。
_ctx.SetBalance(100000); _ctx.SetQuota(50000); _ctx.MeetQuota();
_ctx.AddDayTime(30f); _ctx.FreezeDayTimer(true); _ctx.ProgressDay();
_ctx.SetCurrentFloor(3); _ctx.RemoveAllNPCs(); _ctx.RefreshGroundLoot();
_ctx.SpawnItem(_ctx.GetSpawnableItems()[0], spawnPos);
将升级授予所有单位
_ctx.SetLobbyPrivate(true);
foreach (var p in _ctx.GetAllPlayers()) // 踢出玩家 / 布娃娃玩家 / 传送玩家也一样
    if (!p.IsLocal) _ctx.FreezePlayer(p.Transform, true);
// 个人 - 客户端
_ctx.SetMoveSpeedMultiplier(1.5f);_ctx.SetNoClip(true);
_ctx.UnlockAllCosmetics(); _ctx.SetPlayerColor(Color.cyan); _ctx.PlayEmote(0);
大厅投票。
int id = _ctx.StartVote("跳到下一层?", 0.6f, passed => _ctx.Log(passed ? "通过" : "失败"));
_ctx.CastVote(id, true);
_ctx.OnVoteStarted(v => _ctx.CastVote(v.Id, true));
反射与场景搜索。
var t = _ctx.FindGameType("MoneyManager");
var all = _ctx.FindAll<MonoBehaviour>();
_ctx.CallMethod(target, "SomeMethod", arg1);
var val = _ctx.GetValue(target, "fieldName");
_ctx.SetValue(target, "fieldName", newValue);
UI:主题、窗口和小组件。
void OnGUI() {
    _rect = _ctx.DrawWindow(9001, "我的模组", _rect, () => {
        _tab = _ctx.Tabs(_tab, new[]{"主界面","设置"});
        如果 (GUILayout.Button("开始", _ctx.Theme.Button)) { }
    });
}
_ctx.RegisterPauseButton("我的模组", () => _open = true);
媒体、生成与镜头。
var mat = _ctx.CreateMaterial(Color.red, metallic: 0.5f);
_ctx.PlaySound(clip, transform.position);
var go = _ctx.SpawnPrimitive(PrimitiveType.Cube, pos, Vector3.one, mat);
如果 (_ctx.RaycastFromCamera(out var hit, out _, 50f)) { }
{_ctx.SmoothMoveCamera(pos, lookAt)}; {_ctx.RestoreCamera()};
实时调试工具包。
_ctx.Watch("balance", () => _ctx.GetBalance());
int pin = _ctx.Pin(player, () => player.name, Color.yellow);
_ctx.Mark("已生成Boss", Color.red);
比较跨客户端("rngSeed", () => _seed)
模组间服务。
_ctx.RegisterService("MyApi", this);
var other = _ctx.GetService<ICoolApi>("OtherModApi");
自定义NPC(主机)。
int[] guards = _ctx.SpawnNpcWave(5, center, 4f);
对每个卫兵g,执行上下文中的NpcSetColor将g设为红色,并调用NpcMakeAttackable使g可被攻击,攻击力25f。
_ctx.OnNpcSeesPlayer(14f, 90f, (h, player) => _ctx.NpcFollow(h, player));
_ctx.OnNpcDeath(h => _ctx.Log("守卫倒下"));
预构建的游戏玩法系统。 现成的背包、制作、货币和升级系统,让模组无需搭建底层框架即可拥有成长体系。每项都会序列化到模组的存档数据中。
var bag = new ModInventory { MaxSlots = 24 };
bag.Add("金锭", 3); bag.Remove("金锭", 1);
_ctx.SaveInventory("bag", bag); _ctx.LoadInventory("bag", bag); // 从存档中填充背包
var econ = new CurrencySystem();
econ.Register("gems", "宝石"); // 定义一种货币
econ.Add("", "gems", 100); // "" = 共享所有者(或 steamId)
bool ok = econ.Spend("", "gems", 30); long gems = econ.GetGlobal("gems");
var craft = new CraftingSystem();
craft.Register("potion", "potion").With("herb", 2); // 2 herb -> 1 potion
如果(craft.可制作("potion", bag))craft.制作("potion", bag);
var lvl = new LevelSystem(); lvl.AddXP(250); int level = lvl.Level;
string drop = new WeightedRandom<string>().Add("common", 80).Add("rare", 20).Pick();
自定义内容与注册。 注册你自己的内容,以便游戏和其他客户端识别。挑战是数据;物品和槽位模式需要游戏资源。
注册挑战(1,“不爆牌”,“在未爆牌的情况下通关一层”,floorIndex: 0,ticketReward: 2);
_ctx.OnChallengeCompleted(ch => _ctx.Log("挑战完成"));
_ctx.RegisterCustomItem(9001, "幸运币", "重掷一次", myPrefab);
_ctx.RegisterSlotPattern(new bool[15], multiplier: 5f);
_ctx.RegisterInteractable(myGameObject, t => Open(), onHover: t => Highlight(t));
_ctx.RegisterSettingsTab("我的模组");
_ctx.RegisterSettingsSlider("我的模组", "vol", "音量", 0f, 1f, 0.8f);
网络生成与远程过程调用。 所有客户端可见的对象,外加模组间消息传递——不含 Mirror 代码。
_ctx.RegisterNetworkedPrefab(chestPrefab, "mychest");
GameObject chest = _ctx.SpawnNetworked("mychest", pos); // 返回该对象;所有客户端都能看到它
_ctx.DespawnNetworked(chest);
_ctx.RegisterRpc("open", arg => _ctx.Log("已打开 " + arg)); // 处理程序为 Action<string>
_ctx.SendRpc("open", "chest#1");
_ctx.RegisterRequestHandler("getScore", arg => (object)_score);
赌场作弊与游戏内部机制(主持人)。 重皮与自定义概率背后的深层机制。由房主控制;服务器权威,因此它决定所有人的回合。
_ctx.SetSlotSymbols(mySpriteAtlas); // 用于转轮的精灵数组
_ctx.SetSeed(12345); int seed = _ctx.GetSeed();
_ctx.ApplyGoldenChipToAllGames(2f); // 赢取倍数
_ctx.SetCatchUpFactor(1.5f);
_ctx.ReplaceGameSprite("DiceGame", "diceFace", mySprite);
_ctx.ForceGameState("Win");
_ctx.SetGameField("Blackjack", "dealerTotal", 17);
物品、经济与玩家操作。
ulong id = _ctx.GetLocalPlayerInfo().SteamId;
_ctx.GiveItem(id, 9001); _ctx.TakePlayerItem(id); _ctx.ThrowPlayerItem(id);
_ctx.SetBetLimits(5f); // 普通上限的5倍;SetBetLimits(1f, removeLimits: true) 可解除上限
长期净胜场 = _ctx.GetLifetimeNet(); // + GetLifetimeWins() / GetLifetimeLosses()
治疗玩家(id);治疗所有玩家();
_ctx.SetPlayerVoiceEffect("PlayerName", VoiceEffect.High);
_ctx.SetOrgan(id, "head", true);
HTTP、音乐、确认与世界标签。
_ctx.HttpGet(url, res => _ctx.Log(res)); _ctx.HttpPost(url, jsonBody, res => {});
AudioSource music = _ctx.PlayMusic(@"C:\path\song.wav", loop: true); _ctx.StopMusic(music);
_ctx.ShowConfirm("重置本次挑战?", () => _ctx.ResetSave());
int labelId = _ctx.WorldLabel(pos, () => "Boss", Color.red); // text is a Func<string>
══════════ 陷阱 ══════════
  • 程序集位置为空 当管理员从内存加载你的DLL时——使用 程序集目录 改为这样。
  • 避免模组状态使用静态变量 - 热重载会加载新程序集,因此旧的静态变量会被遗弃。在 OnUnload() 中清除它们。
  • 清理上下文未跟踪的内容 - 通过 ctx 创建的内容会自动清理;你自己打开的自定义事件订阅或文件句柄需要在 OnUnload() 中手动清理。
  • 调用 ctx.GetHarmony() 而不是你自己的实例,这样补丁就能干净地卸载。
══════════ 完整方法速查表 ══════════
  • 获取和谐() / 和谐补丁() / 追踪对象 / 启动追踪协程 / 稍后运行 - 生命周期、跟踪对象、计时器
  • 日志 / 日志警告 / 日志错误 / 通知 - 每模组控制台或 BepInEx 回退
  • 配置 / 整数配置 / 浮点配置 / 布尔配置 / 设置配置 / 添加配置滑块 / 添加配置开关 / 添加配置下拉菜单 / 保存数据 / 加载数据 - 类型化配置 + UI + 存储
  • 绑定按键 / 发送模组事件 / 模组事件触发时 / 设置同步值 / 获取同步值 / 同步值变化时 - 输入 + 多人
  • RegisterService / GetService / FindGameType / CallMethod / GetValue / SetValue / FindAll<T> - 模块间 + 反射
  • 获取所有玩家 / 获取本地玩家信息 / 获取游戏状态 / 获取当前天数 / 获取当前楼层 / 获取当前配额 / 游戏状态变更时 / 配额变更时 - 身份标识 + 运行状态
  • 获取赌场游戏类型 / 查找赌场游戏 - 每游戏钩子
  • 获取余额 / 增加余额 / 扣除余额 / 获取票券 / 增加票券 / 扣除票券 - 货币
  • 设置余额 / 设置配额 / 达成配额 / 增加白天时间 / 冻结白天计时器 / 推进天数 / 设置当前楼层 / 生成物品 / 获取可生成物品 / 移除所有NPC / 刷新地面战利品 / 设置大厅为私人 主持游戏/世界
  • 踢出玩家 / 冻结玩家 / 布娃娃玩家 / 传送玩家 / 授予升级 / 授予所有玩家升级 / 重置升级 / 获取升级类型 / 重置挑战 / 完成挑战 / 设置游戏界面 - 房主 玩家/升级/挑战
  • 设置移动速度倍率 / 设置跳跃倍率 / 设置穿墙模式 / 重置自身修正 / 解锁全部外观 / 设置玩家颜色 / 播放表情动作 - 个人(客户端)
  • 开始投票 / 投票 / 投票开始时 / 投票更新时 - 已同步大厅投票
  • 观看 / 固定 / 快照 / 差异 / 标记 / 跨客户端对比 / 暴露字段 - 实时调试工具包
  • 绘制窗口 / 选项卡 / 搜索栏 / 主题 / 注册暂停按钮 / 注册退出处理器 - IMGUI 主题 + 管理器 UI 钩子
  • 创建材质 / 创建物理材质 / 加载纹理 / 播放音效 / 加载资源包 / 生成基础物体 / 生成触发区域 / 平滑移动相机 / 恢复相机 / 释放光标 / 从对象池获取 / 返回对象池 / 从相机发射射线检测 - 媒体,世界,相机
  • 生成NPC / 生成NPC波次 / NPC移动到 / NPC跟随 / NPC巡逻 / NPC游荡 / NPC逃跑 / NPC传送 / NPC看向 / NPC停止 / NPC设置速度 - NPC生成与移动(主机)
  • NpcSetScale / NpcSetColor / NpcSetCosmeticPreset / NpcSetName / NpcSetHealth / NpcDamage / NpcMakeAttackable / NpcRagdoll / NpcDespawn - NPC外观与战斗(主机)
  • OnNpcTick / OnNpcSeesPlayer / OnNpcNearPlayer / OnNpcHitByPlayer / OnNpcDeath / GetMyNpcs / GetNpc / IsMyNpc / GetNearestPlayer / GetRandomNavPoint - NPC感知、事件与实用功能
  • 预构建系统 - 模组背包 / 制作系统 / 货币系统 / 等级系统 / 加权随机 / 冷却;保存背包 / 加载背包 / 保存货币 / 加载货币 / 保存游戏 / 加载游戏 / 重置存档
  • 自定义内容 注册挑战 / 注册自定义物品 / 注册槽位模式 / 注册可交互对象 / 注册网络预制体 / 注册远程过程调用 / 注册请求处理器 / 替换游戏精灵
  • 网络生成与远程过程调用 生成网络实体 / 销毁网络实体 / 发送远程过程调用 / 注册远程过程调用 / 注册请求处理器 / 是否存在请求处理器 / 请求 / 触发本地事件 / 监听本地事件
  • 赌场操控与内部机制 设置槽位符号 / 设置种子 / 获取种子 / 对所有游戏应用黄金筹码 / 设置追赶系数 / 强制游戏状态 / 触发结局 / 获取游戏场地 / 设置游戏场地 / 设置游戏速度 / 重置游戏速度
  • 物品与经济 给予物品 / 拿走玩家物品 / 投掷玩家物品 / 购买扭蛋 / 获取物品池 / 设置物品池 / 将物品加入卡池 / 获取物品价格 / 获取物品描述 / 设置下注限额 / 重置下注限额 / 设置初始金钱 / 设置票券 / 获取累计胜利次数 / 获取累计失败次数 / 获取累计净胜负
  • 世界 / 天 / 层 (主持人) 设置白天时长 / 设置配额前天数 / 设置白天剩余时间 / 获取白天剩余时间 / 获取剩余天数 / 跳过白天过渡 / 传送所有人至楼层 / 设置楼层光照 / 设置过场动画 / 设置最大玩家数 / 设置开发者模式 / 获取所需配额 / 债务是否已还清
  • 玩家自定义与生命值 设置器官 / 设置玩家器官 / 设置本地自定义 / 设置玩家语音效果 / 应用语音特效 / 获取语音效果 / 重置语音特效 / 设置无口部特效 / 应用增益 / 治疗玩家 / 治疗所有玩家 / 治疗本地玩家 / 设置描边 / 解锁外观 / 外观是否已解锁
  • 玩家(扩展) - 通过Steam ID获取玩家 / 通过Steam ID获取玩家变换 / 获取本地玩家变换 / 获取所有玩家变换 / 获取玩家组件
  • NPC对话与行为 - NpcSay / NpcAddChat / NpcSetDialogue / NpcGetDialogue / NpcNextLine / NpcEnableAutoTalk / NpcSetAutonomous / NpcSetBehavior / NpcUseNearestSocket / NpcWearOutfit / NpcKnockback / NpcPlaySound / NpcIsFacing / NpcGetForward / GetNpcCount / GetNpcHealth / SaveNpcWorld / LoadNpcWorld / ListNpcWorlds
  • 可交互物与新事件 注册可交互对象 / 创建交互区域 / 交互时 / NPC交互时 / 挑战完成时 / 日期变更时 / 金钱变更时 / 票券变更时 / 玩家离开时 / 断开连接时
  • 媒体(扩展) - 创建音频源 / 加载音频片段 / 播放音乐 / 停止音乐 / 循环音效 / 创建颜色纹理 / 加载资源 / 世界标签 / 取消固定
  • 界面(扩展) - 应用界面主题 / 显示确认 / 注册设置选项卡 / 注册设置滑块 / 注册设置开关 / 注册设置下拉菜单
  • 反射(扩展) - 调用方法重载 / 调用静态方法
  • 模组互通与共享状态 - AnnounceMod / IsModPresent / GetPresentMods / GetModVersion / GetGlobal / GetShared / SetShared / HasShared / RemoveShared
  • HTTP 与杂项 - HttpGet / HttpPost / 添加加载引用 / 获取追踪对象数量
  • 生命周期钩子(IMod) - OnLoad / OnUnload / OnUpdate / OnFixedUpdate / OnGUI / OnSceneChanged
  • 独立运行 / 配置路径 / 程序集目录 / 主机 - 状态与路径


GWYF模组套件的一部分
使用GWYF模组API构建
社区基于此框架制作的模组。你也做了一个?留言告诉我,我会把它加到这里。
  • 物品生成与编辑 由bshiro1制作——可生成任何游戏或联网物品,并实时编辑其属性:概率、质量、缩放、弹性等。一款精致、强大的工具,非常值得一试。 在Nexus上查看
模组作者:如果你的模组仅使用框架(配置、按键绑定、同步、UI、游戏钩子),你可以列出轻量级 GWYF模组API 按照你的要求,代替完整模组管理器——为用户提供更小的安装包,功能却完全相同。管理器本来就会捆绑 API,所以已经有管理器的人无需额外安装。

更新日志
剧透:  
显示

v1.5.0 - 玩法系统、自定义内容以及更多可探索领域
  • 预构建玩法系统 空降 模组库存, 制作系统, 货币系统 和 等级系统 (加上加权随机/冷却辅助工具),带有保存/加载功能和一行主题界面(抽取物品栏 网格, 钱包提取, 经验条绘制)
  • 自定义内容注册 - 注册你自己的挑战、物品、槽位模式、可交互物、网络预制体、RPC 和设置选项卡控件。
  • 网络生成与远程过程调用 - SpawnNetworked / DespawnNetworked,以及 SendRpc / RegisterRpc / 请求-响应,无需手写 Mirror 消息。
  • 赌场操控与游戏内幕 - 设置槽位符号、设定随机数种子、强制游戏状态、调整追赶机制、交换精灵图、读写游戏字段。
  • 物品与经济 - 给予/拿取/丢弃玩家物品、抽卡、物品池与价格、每轮下注上限、终身输赢统计。
  • 可交互物与响应事件 注册世界可交互对象,并响应 OnInteract、OnChallengeCompleted、OnDayChanged、OnMoneyChanged、OnTicketsChanged、OnPlayerLeft。
  • 玩家自定义 - 器官、本地定制、玩家专属语音效果、增益、治疗、轮廓、外观解锁检查。
  • 扩展NPC - 对话(说话/台词/自动说话)、自主性与行为预设、插槽、服装、击退、逐NPC音效、保存/加载NPC“世界”。
  • 更多主机/世界控制 每日时长,配额前天数,楼层光照,过场动画,最大玩家数,全体传送至楼层,开发者模式。
  • 媒体、HTTP 与 UI - 音乐(播放/停止/循环)、音频源与音频片段、世界标签、HttpGet/HttpPost、确认对话框以及设置选项卡控件。
  • 一切都是增量式且二进制兼容的——现有模组无需改动即可继续使用。
v1.4.0
  • 内置场景检查器 (Shift+F7):瞄准任意物体即可实时查看其组件、变换、网络权限和字段;冻结后可滚动和移动面板、复制到剪贴板、固定在世界中。无论是否使用模组管理器均可使用。
  • 实时调试工具包 给模组用:带迷你趋势图的值监视器、世界空间图钉与标记、事件时间线,以及跨客户端数值对比。
  • 主机与游戏控制经济、配额、每日计时、楼层、世界生成、地面战利品刷新、玩家行为、升级、每日挑战、大厅隐私和HUD,全部由主机控制。此外还有内置的同步大厅投票和个人表情动作。这些为模组管理器的新工具箱标签页提供支持,并对任何模组开放。
  • 自定义NPC生成并编写游戏自带的网络化、由导航网格驱动的NPC——移动/跟随/巡逻/游荡/逃跑/传送,视线检测与每帧AI钩子,生命值+伤害+死亡,外观(大小、颜色、服装、名字),以及玩家交互(抓住、扔出、布娃娃)。
  • 现已作为独立下载项发布,以便框架能够独立于任何单个模组进行更新。
  • 玩家身份辅助工具、游戏状态辅助工具、单游戏访问权限以及独立按键绑定冲突自动解决。
  • 所有新增内容均为增量式。公共API保持二进制兼容,因此现有模组无需任何改动即可继续使用。
基于BepInEx 5构建。兼容所有GWYF模组。

使用 Xmod 解锁 朋友,梭哈吧 的全部潜力 — 今天就探索这些顶级 MOD!