查看“︁工程参考/配置文件/Server/SceneInfo.ini”︁的源代码
来自天龙知识库
←
工程参考/配置文件/Server/SceneInfo.ini
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{DISPLAYTITLE:<span style="font-size:24px;line-height:1.4;overflow-wrap:anywhere;">工程参考/配置文件/Server/SceneInfo.ini</span>}} __NOTOC__ <div class="config-file-reference" style="max-width:1200px;margin:0 auto;line-height:1.8;color:#29343a;font-family:Arial,'Microsoft YaHei',sans-serif;letter-spacing:0;overflow-wrap:anywhere;"> [[首页|首页]] · [[工程参考/配置文件索引|配置文件索引]] · [[工程参考/配置文件修改约定|修改约定]] SceneInfo.ini 是场景登记表。 [system] 的 scenenumber 决定有多少个场景;随后每个场景一节 <code style="white-space:normal;overflow-wrap:anywhere;">[scene0]</code> 到 <code style="white-space:normal;overflow-wrap:anywhere;">[scene<N-1>]</code>,节内给出场景名、场景文件、所属 Server、驱动线程、客户端资源与若干开关。场景 ID 就是节名里的数字,从头到尾连续编号。 这份表决定「Server 起来时要加载哪些场景、交给哪个线程、分到哪个服务器进程」,也决定任务指引里的场景名与副本标记。它不描述场景内的地形与刷怪,那部分在 <code style="white-space:normal;overflow-wrap:anywhere;">file</code> 指向的场景文件里。 [[#文件位置与生效|位置与生效]] · [[#文件格式|文件格式]] · [[#字段详解|字段详解]] · [[#常用修改实例|修改实例]] == 文件位置与生效 == {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 项目 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 说明 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 运行文件 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">./Config/SceneInfo.ini</code>,由 FileDef.h 的 FILE_SCENE_INFO 定义,相对于 Server 工作目录。源码 resources/Server/Config 是样本位置,实际部署可能另有副本。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读取程序 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Server 游戏进程:Config::LoadSceneInfo_Only 用 Ini ini(FILE_SCENE_INFO) 打开 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 生效方法 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 正常保存并停服后,重启读取此文件的 Server。多份运行目录分别核对。当前检索未发现单独重载本文件的可用入口;不需要把本文件复制到玩家客户端。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 样本格式 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">GB18030-compatible</code>,<code style="white-space:normal;overflow-wrap:anywhere;">CRLF</code>。保留原编码;源码读取器不会自动把中文转为 UTF-8。 |} 加载流程是:读 <code style="white-space:normal;overflow-wrap:anywhere;">[system] scenenumber</code>,按它分配场景数组,再循环 i 从 0 到 scenenumber-1,用 <code style="white-space:normal;overflow-wrap:anywhere;">sprintf(szSection, "scene%d", i)</code> 拼节名逐节读取。七个键(active、name、file、serverid、type、threadindex、clientres)是必读项:读不到就触发 AssertEx,日志里出现 “read sceneN::键名 failed!!”。其余七个键用 ReadIntIfExist 读取,缺失时保持代码里的默认值,不会中断启动。 {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 检查项 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 结论 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读取多少个场景节 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 只读取 0 到 scenenumber-1。样本 scenenumber=723,但文件里一直写到 scene922,多出来的 200 个节不会被读取,也不会报错。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读键 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | active、name、file、serverid、type、threadindex、clientres 共 7 个,缺一即断言。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选键 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | commerce、PvpRuler、NoPkPenalty、IsReLive、BeginPlus、EndPlus、_clientres,缺失用默认值。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 场景 ID | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 就是节名里的数字,从 0 连续编号;脚本、传送与任务指引都用这个 ID。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | type 取值 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | SCENE_TYPE 枚举:0 普通游戏逻辑场景、1 副本、2 战场、3 擂台、4 城市、5 庭院、6 房屋内部。样本注释把 4 写作“帮会城市”。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 时间附加项 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">BeginPlus</code> / <code style="white-space:normal;overflow-wrap:anywhere;">EndPlus</code> 是 YYMMDDHH 编码的整数,由 <code style="white-space:normal;overflow-wrap:anywhere;">(年%100)*1000000 + 月*10000 + 日*100 + 时</code> 拼成,命中区间时客户端资源改用 _clientres。 |} == 文件格式 == 使用 [节名] 与 Key=Value,节名和键名区分大小写,保持节标题位于行首。用单独一行分号写注释,保留原编码及 CRLF 换行;重复节或键取先匹配项,不依赖后写覆盖。缺项、空值与 0 分别按下表处理。 == 字段详解 == 模板 [n] 表示从 0 开始的序号,写入时应展开为实际数字;不是字面键名。 === [system] === {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:34%;text-align:left;background:#edf3f2;padding:8px;" | 字段与类型 ! scope="col" style="width:42%;text-align:left;background:#edf3f2;padding:8px;" | 含义与修改要点 ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 缺项或特殊值 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">scenenumber</code><br>正整数,场景总数 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 决定分配多大的场景数组,以及读取 [scene0] 到 [scene<N-1>] 的循环次数。必须大于 0,且不超过 MAX_SCENE。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。缺失或为 0 会触发 AssertEx;比文件里实际的节数小则后面的节全部被忽略。 |} === [scene[n]] === {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:34%;text-align:left;background:#edf3f2;padding:8px;" | 字段与类型 ! scope="col" style="width:42%;text-align:left;background:#edf3f2;padding:8px;" | 含义与修改要点 ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 缺项或特殊值 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">active</code><br>整数,0 或非 0 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 场景是否激活。为 0 时 ThreadManager 直接跳过这个场景,不创建场景线程,玩家也无法进入。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。0 表示停用,非 0 表示启用。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">name</code><br>字符串,场景名 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 场景显示名。任务指引与界面上的场景名来自这里。缓冲为 _MAX_PATH。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。空字符串虽然能读到,但界面上会显示空白。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">file</code><br>字符串,场景文件名 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 场景数据文件(例如 luoyang.scn)。加载时按它拼出地图资源路径。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。文件名写错会让整个场景加载失败。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">serverid</code><br>整数,服务器 ID | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 这个场景由哪个 Server 进程驱动。ThreadManager 只处理 serverid 等于本进程 ServerID 的场景,其余跳过。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。与 ServerInfo.ini 里的 ServerID 对应,填错会让本进程不加载该场景。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">type</code><br>整数,SCENE_TYPE | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 场景类型:0 普通、1 副本、2 战场、3 擂台、4 城市、5 庭院、6 房屋内部。副本类型还会改变客户端资源与切场景检查的分支。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。取值来自 Common/GameDefine_Scene.h 的 SCENE_TYPE 枚举。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">threadindex</code><br>整数,线程索引 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 驱动该场景的线程池索引。同一索引的场景共用一个线程;索引不存在时新建线程。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。修改会改变场景的线程归属,影响负载分布。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">clientres</code><br>整数,客户端资源号 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 客户端使用的场景资源号,对应客户端 SceneDefine.txt 的首列。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必读。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">_clientres</code><br>整数,替换用客户端资源号 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 在 BeginPlus 到 EndPlus 的时间区间内,用这个值替换 clientres。副本类型(type=1)不参与这个替换,直接用动态资源。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。缺失为 INVALID_ID,即不替换。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">BeginPlus</code><br>整数,YYMMDDHH | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 附加资源生效的起始时刻,编码为 (年%100)*1000000 + 月*10000 + 日*100 + 时。区间判定是 BeginPlus <= 当前 < EndPlus。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。缺失为 0。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">EndPlus</code><br>整数,YYMMDDHH | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 附加资源生效的结束时刻,编码同上,区间右开。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。缺失为 0,此时区间不成立。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">PvpRuler</code><br>整数,PK 规则编号 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 该场景使用的 PK 规则,对应 Server/Config/PvpRuler.txt 里的规则。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。缺失为 0。规则内容在 PvpRuler.txt 那一页。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">NoPkPenalty</code><br>整数,0 或 1 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否为无 PK 惩罚场景。等于 1 时场景的 IsNoPkPenalty 为真。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。缺失为 0,即照常惩罚。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">IsReLive</code><br>整数,0 或非 0 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否允许低等级角色在本场景原地复活。需要同时满足角色等级不超过配置的新手复活等级上限。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。缺失为 0,即不允许原地复活。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">commerce</code><br>整数,商业系数相关 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读取后存进场景数据的 m_Commerce,缺省为 INVALID_ID。当前检索在 SceneManager、Scene_Core 与 Obj_Human 里都没有找到消费这个字段的代码。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。样本没有这一项;不要指望改它能改变商业收益。 |} == 常用修改实例 == 示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 === 临时停用一个场景(把它标记为未激活) === 修改前: <pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">[system] scenenumber=723 [scene5] threadindex=30 clientres=5 name=SampleScene active=1 file=sample.scn serverid=0 type=0</pre> 修改后: <pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">[system] scenenumber=723 [scene5] threadindex=30 clientres=5 name=SampleScene active=0 file=sample.scn serverid=0 type=0</pre> 把 scene5 的 active 从 1 改成 0。ThreadManager 在启动时会跳过 active 为 0 的场景,不再为它创建或分配线程,玩家也就无法进入。 注意 scenenumber 仍然是 723:编号没有变,后面的场景编号也没有偏移,这一节依然会被读取(只是被判定为未激活)。要彻底移除一个场景,必须同时减少 scenenumber 并把后面所有节的编号往前挪,否则编号断裂会让整批场景错位。 示例里的场景名与文件名是教学值,操作时保留自己文件里的中文场景名与真实 .scn 文件名。 == 验证与排查 == 重启 Server 后查看启动日志:“Load SceneInfo.ini ...Only OK!” 表示读取完成;必读键缺失会出现 “read sceneN::键名 failed!!” 的断言。再核对:目标场景能否进入、停用的场景是否确实进不去、多 Server 部署下每个进程是否只加载了 serverid 属于自己的场景、任务指引显示的场景名与坐标是否正确。时间附加项需要把系统时间调到区间内外分别验证。失败时恢复备份并重启。 === 只读取前 scenenumber 个场景节 === 样本 scenenumber=723,而文件里有 scene0 到 scene922 共 923 个节。多出来的 200 个节不读、不报错,是纯粹的死配置。判断一个场景是否生效,先确认它的编号小于 scenenumber。 === 七个必读键缺一即断言 === active、name、file、serverid、type、threadindex、clientres 用的是带返回值的 ReadInt/ReadText,读不到就 AssertEx。新增一个场景节必须把这七项写全。 === 移除场景要压紧编号,不能只删节 === 场景 ID 就是节名里的数字,代码中到处按 ID 引用。删除 scene5 而不改 scenenumber、不把 scene6 及之后的节往前挪,会让原本的 scene6 失去配置(因为循环只到 scenenumber-1,且编号 5 的那一节已不存在)。临时停用请优先用 active=0。 === BeginPlus/EndPlus 是七位时间整数 === 样本注释写的是 YYMMDDHH,代码按 (年%100)*1000000 + 月*10000 + 日*100 + 时 拼出当前时刻再做比较。区间是左闭右开,且副本类型不参与替换。 === commerce 目前没有消费方 === 字段会被读取并保存,但当前检索在 SceneManager、Scene_Core 与 Obj_Human 里都没有找到使用它的代码。不要把它当作商业收益开关。 == 关联与依据 == [[工程参考/配置文件/Server/ServerInfo.ini|Server/ServerInfo.ini]] · [[工程参考/配置文件/Server/PvpRuler.txt|Server/PvpRuler.txt]] · [[工程参考/配置文件/Public/MonsterAITable.ini|Public/MonsterAITable.ini]] [[工程参考/配置文件索引|其他配置及整理状态]] · [[工程参考/服务端外网设置|服务端外网设置]] · [[Lua接口/服务端函数索引|Lua 接口索引]] * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/Ini.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/Ini.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/Config.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/Config.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/FileDef.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/GameDefine_Scene.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/TimeManager.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Scene/SceneManager.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Scene/Scene_Core.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Main/ThreadManager.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Obj/Obj_Human.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">resources/Server/Config/SceneInfo.ini</code>:实际加载、解析、字段使用或示例关联依据 本页核对源码读取、字段使用与样本格式,未启动游戏、服务端或数据库。解析验证不等于游戏实测;广播、权限、客户端交互等运行结果需要实测。 </div> [[Category:工程参考]]
返回
工程参考/配置文件/Server/SceneInfo.ini
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
创建账号
登录
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
搜索
工具
链入页面
相关更改
页面信息