工程参考/配置文件/Server/SceneInfo.ini
SceneInfo.ini 是场景登记表。 [system] 的 scenenumber 决定有多少个场景;随后每个场景一节 [scene0] 到 [scene<N-1>],节内给出场景名、场景文件、所属 Server、驱动线程、客户端资源与若干开关。场景 ID 就是节名里的数字,从头到尾连续编号。
这份表决定「Server 起来时要加载哪些场景、交给哪个线程、分到哪个服务器进程」,也决定任务指引里的场景名与副本标记。它不描述场景内的地形与刷怪,那部分在 file 指向的场景文件里。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ./Config/SceneInfo.ini,由 FileDef.h 的 FILE_SCENE_INFO 定义,相对于 Server 工作目录。源码 resources/Server/Config 是样本位置,实际部署可能另有副本。
|
| 读取程序 | Server 游戏进程:Config::LoadSceneInfo_Only 用 Ini ini(FILE_SCENE_INFO) 打开 |
| 生效方法 | 正常保存并停服后,重启读取此文件的 Server。多份运行目录分别核对。当前检索未发现单独重载本文件的可用入口;不需要把本文件复制到玩家客户端。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
加载流程是:读 [system] scenenumber,按它分配场景数组,再循环 i 从 0 到 scenenumber-1,用 sprintf(szSection, "scene%d", i) 拼节名逐节读取。七个键(active、name、file、serverid、type、threadindex、clientres)是必读项:读不到就触发 AssertEx,日志里出现 “read sceneN::键名 failed!!”。其余七个键用 ReadIntIfExist 读取,缺失时保持代码里的默认值,不会中断启动。
| 检查项 | 结论 |
|---|---|
| 读取多少个场景节 | 只读取 0 到 scenenumber-1。样本 scenenumber=723,但文件里一直写到 scene922,多出来的 200 个节不会被读取,也不会报错。 |
| 必读键 | active、name、file、serverid、type、threadindex、clientres 共 7 个,缺一即断言。 |
| 可选键 | commerce、PvpRuler、NoPkPenalty、IsReLive、BeginPlus、EndPlus、_clientres,缺失用默认值。 |
| 场景 ID | 就是节名里的数字,从 0 连续编号;脚本、传送与任务指引都用这个 ID。 |
| type 取值 | SCENE_TYPE 枚举:0 普通游戏逻辑场景、1 副本、2 战场、3 擂台、4 城市、5 庭院、6 房屋内部。样本注释把 4 写作“帮会城市”。 |
| 时间附加项 | BeginPlus / EndPlus 是 YYMMDDHH 编码的整数,由 (年%100)*1000000 + 月*10000 + 日*100 + 时 拼成,命中区间时客户端资源改用 _clientres。
|
文件格式
使用 [节名] 与 Key=Value,节名和键名区分大小写,保持节标题位于行首。用单独一行分号写注释,保留原编码及 CRLF 换行;重复节或键取先匹配项,不依赖后写覆盖。缺项、空值与 0 分别按下表处理。
字段详解
模板 [n] 表示从 0 开始的序号,写入时应展开为实际数字;不是字面键名。
[system]
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
scenenumber正整数,场景总数 |
决定分配多大的场景数组,以及读取 [scene0] 到 [scene<N-1>] 的循环次数。必须大于 0,且不超过 MAX_SCENE。 | 必填。缺失或为 0 会触发 AssertEx;比文件里实际的节数小则后面的节全部被忽略。 |
[scene[n]]
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
active整数,0 或非 0 |
场景是否激活。为 0 时 ThreadManager 直接跳过这个场景,不创建场景线程,玩家也无法进入。 | 必读。0 表示停用,非 0 表示启用。 |
name字符串,场景名 |
场景显示名。任务指引与界面上的场景名来自这里。缓冲为 _MAX_PATH。 | 必读。空字符串虽然能读到,但界面上会显示空白。 |
file字符串,场景文件名 |
场景数据文件(例如 luoyang.scn)。加载时按它拼出地图资源路径。 | 必读。文件名写错会让整个场景加载失败。 |
serverid整数,服务器 ID |
这个场景由哪个 Server 进程驱动。ThreadManager 只处理 serverid 等于本进程 ServerID 的场景,其余跳过。 | 必读。与 ServerInfo.ini 里的 ServerID 对应,填错会让本进程不加载该场景。 |
type整数,SCENE_TYPE |
场景类型:0 普通、1 副本、2 战场、3 擂台、4 城市、5 庭院、6 房屋内部。副本类型还会改变客户端资源与切场景检查的分支。 | 必读。取值来自 Common/GameDefine_Scene.h 的 SCENE_TYPE 枚举。 |
threadindex整数,线程索引 |
驱动该场景的线程池索引。同一索引的场景共用一个线程;索引不存在时新建线程。 | 必读。修改会改变场景的线程归属,影响负载分布。 |
clientres整数,客户端资源号 |
客户端使用的场景资源号,对应客户端 SceneDefine.txt 的首列。 | 必读。 |
_clientres整数,替换用客户端资源号 |
在 BeginPlus 到 EndPlus 的时间区间内,用这个值替换 clientres。副本类型(type=1)不参与这个替换,直接用动态资源。 | 可选。缺失为 INVALID_ID,即不替换。 |
BeginPlus整数,YYMMDDHH |
附加资源生效的起始时刻,编码为 (年%100)*1000000 + 月*10000 + 日*100 + 时。区间判定是 BeginPlus <= 当前 < EndPlus。 | 可选。缺失为 0。 |
EndPlus整数,YYMMDDHH |
附加资源生效的结束时刻,编码同上,区间右开。 | 可选。缺失为 0,此时区间不成立。 |
PvpRuler整数,PK 规则编号 |
该场景使用的 PK 规则,对应 Server/Config/PvpRuler.txt 里的规则。 | 可选。缺失为 0。规则内容在 PvpRuler.txt 那一页。 |
NoPkPenalty整数,0 或 1 |
是否为无 PK 惩罚场景。等于 1 时场景的 IsNoPkPenalty 为真。 | 可选。缺失为 0,即照常惩罚。 |
IsReLive整数,0 或非 0 |
是否允许低等级角色在本场景原地复活。需要同时满足角色等级不超过配置的新手复活等级上限。 | 可选。缺失为 0,即不允许原地复活。 |
commerce整数,商业系数相关 |
读取后存进场景数据的 m_Commerce,缺省为 INVALID_ID。当前检索在 SceneManager、Scene_Core 与 Obj_Human 里都没有找到消费这个字段的代码。 | 可选。样本没有这一项;不要指望改它能改变商业收益。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。
临时停用一个场景(把它标记为未激活)
修改前:
[system] scenenumber=723 [scene5] threadindex=30 clientres=5 name=SampleScene active=1 file=sample.scn serverid=0 type=0
修改后:
[system] scenenumber=723 [scene5] threadindex=30 clientres=5 name=SampleScene active=0 file=sample.scn serverid=0 type=0
把 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/PvpRuler.txt · Public/MonsterAITable.ini
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Common/ServerBase/Ini.cpp:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Ini.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Config.cpp:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Config.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/GameDefine_Scene.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/TimeManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Scene/SceneManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Scene/Scene_Core.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Main/ThreadManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Obj/Obj_Human.cpp:实际加载、解析、字段使用或示例关联依据resources/Server/Config/SceneInfo.ini:实际加载、解析、字段使用或示例关联依据
本页核对源码读取、字段使用与样本格式,未启动游戏、服务端或数据库。解析验证不等于游戏实测;广播、权限、客户端交互等运行结果需要实测。