工程参考/配置文件/Server/SceneInfo.ini

来自天龙知识库
雪舞留言 | 贡献2026年9月11日 (五) 20:40的版本 (维护配置文件知识库:完整字段、读取范围、手工修改实例与核对状态)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航跳到搜索


首页 · 配置文件索引 · 修改约定

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-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 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:实际加载、解析、字段使用或示例关联依据

本页核对源码读取、字段使用与样本格式,未启动游戏、服务端或数据库。解析验证不等于游戏实测;广播、权限、客户端交互等运行结果需要实测。