工程参考/配置文件/Public/LogicSceneAttr.txt

来自天龙知识库
跳到导航跳到搜索


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

LogicSceneAttr.txt 是逻辑场景到真实场景的映射表:第 1 列是表内索引,第 2 列是名称,第 3 列是对应的真实场景 ID,第 4 列是所属商区。样本 219 条数据记录、4 列。注意第 1 列与第 3 列在样本里的列名都写作「场景ID」,但含义完全不同(见下)。

位置与生效 · 文件格式 · 字段详解 · 修改实例

文件位置与生效

项目 说明
运行文件 ../Public/Config/LogicSceneAttr.txt,相对于服务端工作目录;客户端从资源目录读取同名文件。
读取程序 Server 游戏进程:TableInit::InitLogicSceneAttrTable 用 ../Public/Config/LogicSceneAttr.txt 加载;客户端 GMDataBase.cpp 把 DBC_LOGIC_SCENE_ATTR(id 200)注册到同名文件
生效方法 正常保存并停服后,重启读取此文件的 Server;客户端需要随资源更新并重启客户端。当前检索未发现单独重载本文件的可用入口。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

服务端 InitLogicSceneAttrTable 先断言列数不少于 4,再逐行读第 1 列当数组下标(Search_Posistion(i,0))、第 3 列当真实场景 ID(Search_Posistion(i,2))、第 4 列当商区 ID(Search_Posistion(i,3))。第 1 列必须落在 0 到 MAX_SCENE-1 且不重复,第 3 列必须落在 0 到 0xFFFF;任一条件不满足都会打印 “Load LogicSceneAttr.txt ... Failed!”、触发断言并 CleanUp 整表。

第 2 列名称服务端不读,只被客户端 _DBC_LOGIC_SCENE_ATTR.szName 使用。

客户端结构把第 1 列读成 nID、第 3 列读成 nSceneID、第 4 列读成 nCommerceID,与服务端取用的列完全一致,只是多了第 2 列的名称。

文件格式

首行是类型行:INT STRING INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。

字段详解

列号从 1 开始,源码列下标从 0 开始。

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:场景ID(表内下标)
本表的索引号,服务端 InitLogicSceneAttrTable 把它当成 g_LogicSceneAttrTbl 的数组下标(Search_Posistion(i,0)),必须落在 0 到 MAX_SCENE-1 且不能重复。它与第 3 列的真实场景 ID 不是同一个值。 越界或重复会 CleanUp 整表并中止加载。
第 2 列
STRING:Name$1$
逻辑场景名称。客户端 _DBC_LOGIC_SCENE_ATTR.szName 使用;服务端 InitLogicSceneAttrTable 没有读取这一列。 服务端不读,改名只影响客户端。
第 3 列
INT:场景ID(真实场景)
该逻辑场景对应的真实场景 ID,服务端存为 m_SceneID,取值必须落在 0 到 0xFFFF。 超出 0..0xFFFF 会 CleanUp 整表并中止加载。
第 4 列
INT:所属商区
该场景归属的商业区 ID,服务端存为 m_iCommerceID,用于商区(跑商)相关判定。 空为 0。

常用修改实例

示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。

把 0 号逻辑场景(洛阳)的所属商区从 1 改成 2

修改前:

INT	STRING	INT	INT
场景ID	Name$1$	场景ID	所属商区
0	洛阳	0	1

修改后:

INT	STRING	INT	INT
场景ID	Name$1$	场景ID	所属商区
0	洛阳	0	2

按第一列定位 0 号逻辑场景。样本第 4 列所属商区为 1,改为 2。只改第 4 列,保留 4 列。本片段含类型行、列名行与该行,不能覆盖整表。

所属商区参与跑商一类按商区判定的玩法,改完需要重启服务端才会生效。

验证与排查

服务端启动日志里 InitLogicSceneAttrTable 会打印 “Load LogicSceneAttr.txt ... OK!”(失败时是 “Load LogicSceneAttr.txt ... Failed! row=… index=… scene=…”)。改动后重启,走一次跨商区的跑商流程确认归属判定。第 1 列必须唯一且小于 MAX_SCENE,第 3 列必须在 0 到 0xFFFF 之间。失败时恢复备份并重启。

两个「场景ID」不是一回事

样本列名行把第 1 列和第 3 列都写成「场景ID」。第 1 列是表内数组下标(0 到 MAX_SCENE-1,不能重复),第 3 列才是真实场景 ID(0 到 0xFFFF)。改错列会导致查不到场景或整表加载失败。

整表加载失败是硬失败

任一行下标越界、重复或真实场景 ID 超出 0xFFFF,都会 CleanUp 整表,不是跳过该行。新增行后一定要先核对第 1 列与第 3 列范围。

名称列服务端不读

与 SceneAttr.txt 一样,第 2 列只被客户端消费,改名不影响服务端逻辑。

关联与依据

Public/SceneAttr.txt

其他配置及整理状态 · 服务端外网设置 · Lua 接口索引

  • Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Common/TDDBC_Struct.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/DBC/GMDataBase.cpp:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/LogicSceneAttr.txt:实际加载、解析、字段使用或示例关联依据

本页核对 TableInit::InitLogicSceneAttrTable 的加载路径与列索引(第 1、3、4 列)、下标与场景 ID 的合法性检查、_LOGIC_SCENE_ATTR_TBL 结构,以及客户端 TDDBC_Struct.h 的 _DBC_LOGIC_SCENE_ATTR 与 DBC_LOGIC_SCENE_ATTR 注册项;未启动服务端与游戏,商区判定的实际效果需要实测。