scenesinfo.xml 配置说明文档
文件概述
scenesinfo.xml 是场景服务器(ScenesServer)的核心配置文件,定义了三方面内容:
- 服务器-地图加载关系 - 每个场景服务器进程启动时加载哪些地图
- 国家信息 - 游戏中国家的基本信息(名称、主城、注册开关)
- 地图详细属性 - 每张地图的全部运行时属性(重生点、功能限制、等级限制、经验加成等)
文件编码: GB2312
对应代码: ScenesServer/SceneManager.cpp 中 SceneManager::init() 函数负责解析
数据结构: SceneManager.h 中定义的 CountryInfo 和 MapInfo 结构体
生效方式: 修改后需重启场景服务器
一、文件整体结构
<?xml version="1.0" encoding="GB2312"?>
<ScenesInfo>
<!-- ====== 第一部分:服务器-国家-地图加载分配 ====== -->
<server id="21">
<country id="6">
<map mapID="134"/>
<map mapID="101"/>
</country>
<country id="8">
<map mapID="101"/>
<map mapID="139"/>
</country>
<country id="12">
<map mapID="101"/>
<map mapID="139"/>
</country>
</server>
<!-- ====== 第二部分:国家信息定义 ====== -->
<countryinfo>
<country id="8" name="汉国" mapID="101" function="0"/>
<country id="12" name="楚国" mapID="101" function="0"/>
<country id="6" name="中立区" function="1"/>
</countryinfo>
<!-- ====== 第三部分:地图详细属性定义 ====== -->
<mapinfo>
<map mapID="101" name="清源村" fileName="qingyuancun-main"
backtocity="101" foreignerbackto="102" function=""
commonuserbackto="134" backtodare="102" pklevel="59"/>
<!-- ... 更多地图 ... -->
</mapinfo>
</ScenesInfo>
二、<server> 节点 - 服务器地图加载配置
作用
定义每个场景服务器进程需要加载哪些国家下的哪些地图。启动时,场景服务器通过 ScenesService::getInstance().getServerID() 获取自身的服务器 ID,然后在所有 <server> 节点中查找 id 匹配的那一个,仅加载该节点下声明的所有地图。
节点结构
<ScenesInfo>
└─ <server id="服务器编号"> ← 第一层:匹配当前场景服务器
└─ <country id="国家编号"> ← 第二层:该服务器上需要加载的国家
└─ <map mapID="地图编号"/> ← 第三层:需要加载的具体地图
参数说明
| 层级 | 标签 | 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|---|---|
| 1 | <server> | id | int | 是 | 场景服务器编号,必须与 config.xml 中配置的 serverID 一致 |
| 2 | <country> | id | int | 是 | 国家编号,对应 <countryinfo> 中定义的国家 ID |
| 3 | <map> | mapID | int | 是 | 地图编号,对应 <mapinfo> 中定义的地图 ID |
配置示例
<!-- 服务器 21 加载:中立区6、汉国8、楚国12 的地图 -->
<server id="21">
<!-- 中立区地图 -->
<country id="6">
<map mapID="134"/> <!-- 皇城 -->
<map mapID="101"/> <!-- 清源村(中立区) -->
<map mapID="1071"/> <!-- 滨海之岛帮会战 -->
<!-- ... -->
</country>
<!-- 汉国地图 -->
<country id="8">
<map mapID="101"/> <!-- 清源村 -->
<map mapID="102"/> <!-- 凤凰城 -->
<map mapID="139"/> <!-- 王城 -->
<!-- ... -->
</country>
<!-- 楚国地图 -->
<country id="12">
<map mapID="101"/> <!-- 清源村 -->
<map mapID="139"/> <!-- 王城 -->
<!-- ... -->
</country>
</server>
注意事项
- 每个场景服务器只能匹配一个
<server>节点,找不到匹配时不会加载任何地图 - 可以配置多个
<server>节点实现地图的分布式部署(不同服务器加载不同地图) - 动态地图(副本实例)不需要在此配置,但副本的模板地图所在的服务器必须已开启
- 同一个地图编号可以在不同国家下重复出现(如 101 清源村在汉国和楚国都存在)
- 注释标签
<!-- -->可用于临时禁用某张地图的加载
三、<countryinfo> 节点 - 国家信息定义
作用
定义游戏中所有国家/阵营的基本信息。国家信息在服务器启动时被加载到 country_info (std::map) 中,全局可用。
参数说明
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
id | DWORD | 是 | - | 国家唯一编号 |
name | string | 是 | - | 国家显示名称 |
mapID | DWORD | 否 | 0 | 该国家的新手出生主城地图编号 |
function | DWORD | 是 | 0 | 注册控制标志 |
各属性详解
id - 国家编号
国家的唯一数字标识。在整个游戏中全局唯一,用于区分不同国家。
代码中的使用方式:
- 地图唯一 ID =
(国家ID << 16) + 地图ID - 玩家的
charbase.country字段存储所属国家 ID - 通过
getCountryNameByCountryID(id)查询国家名 - 通过
getCountryIDByCountryName(name)查询国家 ID
当前已使用的编号:
| 编号 | 国家 | 说明 |
|---|---|---|
| 6 | 中立区 | 公共区域,不属于任何玩家国家,不可注册 |
| 8 | 汉国 | 可选玩家国家 |
| 10 | 赵国 | 已注释禁用 |
| 12 | 楚国 | 可选玩家国家 |
name - 国家名称
显示给玩家的国家名称。
限制: 不能包含特殊字符 "·"。
mapID - 主城地图编号
该国家的新手出生地图编号。新创建的角色将出生在此地图上。
- 中立区(id=6)可以不设置此字段
- 设置的地图编号必须在
<mapinfo>中有对应定义 - 此地图建议标记为主城(function 含 2)
function - 注册控制标志
控制该国家是否允许新玩家注册/创建角色。
| 值 | 说明 | 适用场景 |
|---|---|---|
| 0 | 允许注册 - 新玩家可以选择此国家 | 正常的国家 |
| 1 | 不允许注册 - 不出现在国家选择列表中 | 中立区、特殊区域 |
完整示例
<countryinfo>
<country id="8" name="汉国" mapID="101" function="0"/>
<country id="12" name="楚国" mapID="101" function="0"/>
<country id="6" name="中立区" function="1"/>
<!-- <country id="10" name="赵国" mapID="101" function="0"/> -->
</countryinfo>
四、<mapinfo> 节点 - 地图详细属性定义
作用
定义游戏中每张地图的完整运行时属性,包括地图文件关联、死亡重生逻辑、功能限制、等级限制、经验加成等。场景服务器加载地图时,会根据这些属性初始化 Scene 对象。
参数总览
| 序号 | 属性 | XML 属性名 | 代码字段 | 类型 | 必填 | 默认值 | 分类 |
|---|---|---|---|---|---|---|---|
| 1 | 地图编号 | mapID | id | DWORD | 是 | - | 基础 |
| 2 | 地图名称 | name | name | string | 是 | - | 基础 |
| 3 | 地图文件名 | fileName | filename | string | 是 | - | 基础 |
| 4 | 死亡重生地图 | backto | backto | DWORD | 否 | 0 | 重生 |
| 5 | 回城符目标 | backtocity | backtoCity | DWORD | 否 | 0 | 重生 |
| 6 | 外国人死亡重生点 | foreignerbackto | foreignbackto | DWORD | 否 | 0 | 重生 |
| 7 | 公共国死亡重生点 | commoncountrybackto | commoncountrybackto | DWORD | 否 | 0 | 重生 |
| 8 | 无国籍者死亡重生点 | commonuserbackto | commonuserbackto | DWORD | 否 | 0 | 重生 |
| 9 | 国战死亡重生点 | backtodare | backtodare | DWORD | 否 | 0 | 重生 |
| 10 | 攻方国战复活点 | countrydarebackto | countrydarebackto | DWORD | 否 | 0 | 重生 |
| 11 | 守方国战复活点 | countrydefbackto | countrydefbackto | DWORD | 否 | 0 | 重生 |
| 12 | 功能标志 | function | function | DWORD | 否 | 0 | 功能 |
| 13 | 等级限制 | level | level | BYTE | 否 | 0 | 限制 |
| 14 | PK等级上限 | pklevel | pklevel | DWORD | 否 | 0 | 限制 |
| 15 | 经验加成 | exprate | exprate | BYTE | 否 | 0 | 经济 |
各参数详解
1. mapID - 地图编号
| 项目 | 说明 |
|---|---|
| 类型 | DWORD(无符号 32 位整数) |
| 必填 | 是 |
| 说明 | 地图的唯一数字标识,在 <mapinfo> 节点内不可重复 |
机制说明:
- 系统内部实际的场景唯一 ID 由
(国家ID << 16) + 地图ID组合而成 - 例如:汉国(id=8) 的王城(mapID=139) 的完整场景 ID =
(8 << 16)+ 139 = 524427 - 不同国家可以有相同的 mapID(如 101 清源村同时存在于汉国和楚国)
- 通过
getSceneByID(fullID)可查询场景
代码硬编码占用的地图 ID(不可修改/复用):
以下地图 ID 在代码中有特殊逻辑判断,修改编号会导致对应功能异常:
| 编号 | 当前用途 | 代码中的特殊逻辑 |
|---|---|---|
| 101 | 清源村 | 代码中用于特殊条件判断(清除帮会家族、NPC 争夺战标记) |
| 102 | 凤凰城 | 安全区判断、帮会夺城、NPC 争夺战等 |
| 104 | 凤尾村 | NPC 争夺战标记 |
| 1111 | 1vs1 挑战赛 | 限制最多 2 人进入、PK 不变红名、免费攻防、死亡自动满血复活 |
| 134 | 皇城 | 皇城争夺战(EmperorDare)触发地图 |
| 137 | 边境 | 叛国/转国功能的边界传送判定 |
| 139 | 王城 | 国家正式战/帮会夺城战核心地图、个人商店区域判定 |
| 189 | 牢狱 | 特殊场景 ID 判断 |
| 203 | 监牢 | 特殊场景 ID 判断 |
| 190 | 古墓 | 定时器特殊逻辑 |
| 213-215 | 比武岛(初/中/高级) | 代码中 isPkMap() 硬编码范围判断 |
| 279 | 男温泉 | 特殊区域判定 |
| 280 | 女温泉 | 特殊区域判定 |
| 10001-10401 | 天下第一赛系列地图 | 免费攻防、死亡自动满血复活、任务特殊处理 |
| 330-339 | 副本系统预留 | 配置文件注释声明为系统预留,请勿占用 |
其余地图编号可自由分配,只要不与上述硬编码 ID 冲突即可。
2. name - 地图显示名称
| 项目 | 说明 |
|---|---|
| 类型 | string(最大长度 MAX_NAMESIZE) |
| 必填 | 是 |
| 说明 | 显示给玩家的地图名称,用于系统提示、地图信息展示等 |
限制: 名称中不能包含特殊字符 "·",否则可能导致解析异常。
用途:
- 在
Scene::freshEverySceneField()中,系统会遍历所有已加载的场景,将标记为"练功点"(function 含 4)且与当前主城同国家的野外地图注册为主城的练功点 - 通过
getMapMapNameByMapID()查询
3. fileName - 地图文件名
| 项目 | 说明 |
|---|---|
| 类型 | string(最大长度 MAX_NAMESIZE) |
| 必填 | 是 |
| 说明 | 服务器加载的地图数据文件名(不含扩展名),对应地图文件目录中的地图数据文件 |
限制: 文件名中不能包含特殊字符 "."。
机制:
- 场景初始化时通过
Scene::loadMapFile()加载对应的地图数据文件 - 主城与野外地图之间通过 WayPoint 传送点关联,传送点使用
fileName进行匹配 - 通过
getSceneByFileName()查询
4. backto - 死亡重生地图
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0(不设置) |
| 说明 | 本国玩家在该地图上死亡后的默认重生地图编号 |
机制:
- 仅当
pUser->charbase.country == this->countryID(玩家国籍与地图所属国家一致)时生效 - 生成的完整场景 ID =
(地图所属国家ID << 16) + backto - 重生后,玩家会被传送到目标地图的
ZONE_RELIVE类型区域 - 如果不设置(为 0 或空),则走后续的重生逻辑判断
配置建议:
- 通常设置为同国家的安全区域(主城、王城等)
- 中立区地图通常不设置此项,依赖
foreignerbackto等字段
5. backtocity - 回城符目标城市
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 玩家使用"回城符"道具时传送到的目标地图编号 |
机制:
- 非死亡场景下的回城操作使用此字段(
deathBackto=false分支) - 生成的完整场景 ID =
(国家ID << 16) + backtocity - 如果目标地图不在当前服务器上,会通过 Session 服务器跨服传送
- 跨服时玩家会被放入
wait_gomap_name等待队列
配置建议:
- 通常设置为本国最近的主城或安全城市
- 也可以设置为地图自身(如牢狱 mapID=189,backtocity=189,回城后仍在牢狱)
6. foreignerbackto - 外国人死亡重生点
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 非本国国籍的玩家在该地图上死亡后的重生地图编号 |
机制:
- 当
pUser->charbase.country != this->countryID时生效 - 用于处理外国玩家在敌国地图上死亡的情况
- 是死亡重生逻辑的兜底字段之一
触发条件(按优先级):
- 玩家已有
deathBackToMapID(之前进入地图时已计算) -> 使用deathBackToMapID - 地图为中立区(countryID=6)且有
commoncountrybackto-> 使用commoncountrybackto - 玩家无国籍(country=6)且有
commonuserbackto-> 使用commonuserbackto - 其他情况 -> 使用
foreignerbackto
配置建议:
- 通常设置为本国的王城或主城
- 对于中立区地图,设置为皇城(134)或其他公共安全区域
7. commoncountrybackto - 公共国死亡重生点
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 玩家在中立区(countryID=6)的公共地图上死亡后的重生地图 |
机制:
- 仅当地图为中立区(countryID=6)时生效
- 当
commoncountrybackto有值时,优先使用该值作为重生点 - 当
commoncountrybackto为 0 或空时,回退到使用玩家本国地图(foreignerbackto转换到玩家本国)
代码逻辑:
如果当前地图是中立区(countryID == 6):
如果 commoncountrybackto 有值:
重生地图 = (中立区ID << 16) + commoncountrybackto // 留在中立区
否则:
重生地图 = (玩家国家ID << 16) + foreignerbackto // 回到本国
配置建议:
- 中立区大多数地图设置此值为皇城(134),使各国玩家死亡后统一回到皇城
- 如果希望中立区死亡后回到各自王城,则留空此字段
8. commonuserbackto - 无国籍者死亡重生点
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 没有国籍(country=6)的玩家,在非中立区的外国地图上死亡后的重生地图 |
机制:
- 仅当
pUser->charbase.country == 6(玩家无国籍)时生效 - 生成的完整场景 ID =
(6 << 16) + commonuserbackto,即回到中立区
典型场景:
- 未加入国家的玩家进入某国地图后死亡
- 通常设置回中立区的皇城(134)
9. backtodare - 国战死亡重生点
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 国战期间,玩家在该地图上死亡后的重生地图 |
机制:
- 在国战(国家正式战)期间生效
- 存储 Scene 对象的
backtoDareMapID字段 - 与
countrydarebackto/countrydefbackto是独立的配置
配置建议:
- 设置为本国的安全城市或王城
- 非国战相关地图通常设置为本国常规的重生城市
10. countrydarebackto - 攻方国战复活点
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 国战期间,在该地图上攻方国家的玩家死亡后前往的复活地图 |
机制:
- 国战期间,攻方玩家在配置了此字段的地图上(如王城)死亡时使用
- 仅影响攻方(非地图所属国家)的玩家
- 典型配置:王城 mapID=139 的
countrydarebackto设为 136(东郊),攻方死亡后回到东郊重新集结
典型配置示例:
<!-- 王城:守方死后回南郊,攻方死后回东郊 -->
<map mapID="139" name="王城" countrydarebackto="136" countrydefbackto="135"/>
11. countrydefbackto - 守方国战复活点
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0 |
| 说明 | 国战期间,在该地图上守方国家的玩家死亡后前往的复活地图 |
机制:
- 与
countrydarebackto配对使用 - 守方为地图所属国家的玩家
- 典型配置:王城 mapID=139 的
countrydefbackto设为 135(南郊),守方死亡后回到南郊重新集结
12. function - 地图功能标志(位掩码)
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0(无限制) |
| 说明 | 使用二进制位掩码控制地图的各种功能限制 |
机制:
- 每个二进制位代表一种功能开关,1 表示开启限制,0 表示不限制
- 多个功能通过位或运算组合,写成十进制数
- 代码中通过
function & 0x值检测对应位是否开启
代码中的函数对应:
| 位 | 十六进制 | 十进制 | 代码函数 | 功能名 | 说明 |
|---|---|---|---|---|---|
| 0 | 0x0001 | 1 | canRide() | 不可骑马 | !(function & 0x1) 为 true 才能骑马,即该位为 1 时不可骑马 |
| 1 | 0x0002 | 2 | isMainCity() | 主城标记 | function & 0x2,标记为主城地图 |
| 2 | 0x0004 | 4 | isField() | 练功点 | function & 0x4,标记为野外练功区域 |
| 3 | 0x0008 | 8 | canUserScroll() | 不可使用转轴 | !(function & 0x8) 为 true 才能使用转轴 |
| 4 | 0x0010 | 16 | isNoRedScene() | 不红名地图 | function & 0x10,击杀玩家不增加红名值 |
| 5 | 0x0020 | 32 | isIncScene() | 收费地图 | function & 0x20,进入该地图需要付费 |
| 6 | 0x0040 | 64 | noTeam() | 不可组队 | function & 0x40,禁止组队相关操作 |
| 7 | 0x0080 | 128 | checkCallObj() | 不可使用令牌 | function & 0x80,禁止使用令牌类道具 |
| 8 | 0x0100 | 256 | - | 杀人不增加功勋 | 击杀玩家不获得功勋值 |
| 9 | 0x0200 | 512 | - | 不可使用家族战车 | 禁止在该地图使用家族战车 |
| 10 | 0x0400 | 1024 | - | 不能使用技能 | 禁止使用任何技能 |
| 11 | 0x0800 | 2048 | - | 不能骑训练后的马 | 只能骑普通马,禁止骑训练提升过速度的马 |
| 12 | 0x1000 | 4096 | - | 不可使用轩辕符/玄天符 | 禁止使用轩辕符和玄天符等传送符箓 |
| 13 | 0x2000 | 8192 | - | 不记疲劳值 | 在该地图上不消耗/不累计疲劳值 |
各功能详细说明:
位 0 - 不可骑马(1)
- 玩家进入该地图后自动下马
- 在该地图上不能执行骑乘操作
- 适用场景:室内地图、洞穴、密室等
位 1 - 主城标记(2)
- 标记该地图为主城
- 系统启动时会将同国家、标记为练功点(位 2)的野外地图注册为此主城的练功区域
- 影响
freshEverySceneField()中的主城-野外关联关系
位 2 - 练功点(4)
- 标记该地图为野外练功区域
- 与主城标记配合,系统会自动将练功点注册到最近的主城下
位 3 - 不可使用转轴(8)
- 禁止使用转轴类道具(用于快速传送的消耗品)
位 4 - 不红名地图(16)
- 在该地图上击杀其他玩家,不会增加攻击方的红名值(PK 值)
- 适用场景:比武场、竞技场等合法 PK 区域
位 5 - 收费地图(32)
- 标记为收费地图,进入可能需要消耗游戏货币
位 6 - 不可组队(64)
- 在该地图上禁止发起组队邀请
- 禁止接受组队邀请
- 适用场景:副本、竞技场等
位 7 - 不可使用令牌(128)
- 禁止使用令牌类道具(功能类消耗品)
位 8 - 杀人不增加功勋(256)
- 在该地图上击杀玩家不获得功勋奖励
- 与"不红名"不同,这里只影响功勋,不影响红名值
位 9 - 不可使用家族战车(512)
- 禁止在该地图上部署/使用家族战车
- 适用场景:中立区、帮会战地图
位 10 - 不能使用技能(1024)
- 完全禁止在该地图上使用任何技能
- 适用场景:温泉等纯社交区域
位 11 - 不能骑训练后的马(2048)
- 只能骑普通状态的马
- 禁止骑乘经过训练提升速度的马
位 12 - 不可使用轩辕符/玄天符(4096)
- 禁止使用轩辕符、玄天符等传送类符箓道具
- 防止玩家通过道具快速离开特定地图
位 13 - 不记疲劳值(8192)
- 在该地图上的活动不计入疲劳值系统
- 适用场景:安全区、社交区域
常用组合速查表:
| function | 二进制 | 组合成分 | 含义 | 使用地图 |
|---|---|---|---|---|
0 | 00000000000000 | 无 | 无任何限制 | 普通野外、边境 |
2 | 00000000000010 | 主城 | 主城地图 | 凤凰城(102)、王城(139) |
4 | 00000000000100 | 练功点 | 野外练功区 | 北郊(103)、凤祥镇西郊(124) |
5 | 00000000000101 | 不可骑马+练功点 | 室外练功区 | 白骨洞一层(108)、龙冈山(119-122) |
128 | 0000000010000000 | 不可使用令牌 | 内室限制 | 王城宅屋(218) |
129 | 0000000010000001 | 不可骑马+不可令牌 | 室内地图 | 凤凰城宅子(183)、王城宅子(186)、客栈(185) |
133 | 0000000010000101 | 不可骑马+练功点+不可令牌 | 地下城 | 武夷王墓(156-167)、古墓(190)、蛟龙洞二层(131) |
137 | 0000000010001001 | 不可骑马+主城+不可令牌+不可转轴 | 密室/密道 | 凤凰城密室(1021)、王城密室(1391)、皇宫(219) |
140 | 0000000010001100 | 主城+练功点+不可组队 | 竞技/活动区 | 比武岛(213-215)、VIP地图(475-476)、副本(330-332) |
161 | 0000000010100001 | 不可骑马+不红名+不可令牌 | 安全挂机区 | 武夷王墓(158-168) |
201 | 0000000011001001 | 不可骑马+不红名+不可令牌+不可组队 | 迷宫 | 迷宫(223-247) |
217 | 0000000011011001 | 不可骑马+不红名+不可令牌+不可组队+不可转轴 | 监狱 | 牢狱(189)、看守所(221) |
256 | 0000000100000000 | 杀人不增加功勋 | 功勋限制 | 特殊活动地图 |
261 | 0000000100000101 | 不可骑马+不红名+不可组队+不可令牌+杀人不增功勋 | 高级副本 | 白骨洞深层(109-117)、海选赛(291-293) |
389 | 0000000110000101 | 不可骑马+不红名+不可组队+不可令牌+杀人不增功勋+不可转轴 | 最终层 | 白骨洞十层(117) |
512 | 0000010000000000 | 不可使用家族战车 | 中立区/帮会战 | 皇城帮会战(1721)、万宝宫(10500-10509) |
1536 | 0000011000000000 | 不红名+不可令牌+不记疲劳值+不可家族战车 | 安全社交区 | 世外桃源(278) |
3025 | 0000101111000001 | 不可骑马+不红名+不可令牌+不可家族战车+不可骑训练马+不可技能 | 温泉 | 男温泉(279)、女温泉(280) |
13. level - 等级限制
| 项目 | 说明 |
|---|---|
| 类型 | BYTE(0-255) |
| 必填 | 否 |
| 默认值 | 0(无限制) |
| 说明 | 进入该地图所需的最低角色等级 |
机制:
- 通过
Scene::checkUserLevel(SceneUser *pUser)检查 - 当
this->level > 0且pUser->charbase.level < this->level时,拒绝进入 - GM 使用
//gomap命令时可以通过ignoreUserLevel=true参数忽略等级限制 - 特殊地图 1111(1vs1挑战赛)额外检查人数上限(
countUser() >= 2)
配置示例:
<!-- 需要等级 30 才能进入 -->
<map mapID="139" name="王城" level="30"/>
<!-- 需要等级 80 才能进入 -->
<map mapID="151" name="魔族巢穴一层" level="80"/>
<!-- 需要等级 100 才能进入 -->
<map mapID="151" name="魔族巢穴一层" level="100"/>
<!-- 无等级限制 -->
<map mapID="101" name="清源村" level=""/> <!-- level 为空 = 0 = 无限制 -->
14. pklevel - PK 等级上限
| 项目 | 说明 |
|---|---|
| 类型 | DWORD |
| 必填 | 否 |
| 默认值 | 0(无限制) |
| 说明 | 允许在该地图上互相 PK 的角色最高等级 |
机制:
- 存储 Scene 对象的
pklevel字段 - 玩家等级超过此值时,PK 行为可能受到限制
- 主要用于低等级区域防止高级玩家屠幼
配置示例:
<!-- 59级以下可以PK -->
<map mapID="102" name="凤凰城" pklevel="59"/>
<map mapID="104" name="凤尾村" pklevel="59"/>
<!-- 29级以下可以PK(1vs1挑战赛) -->
<map mapID="1111" name="1vs1挑战赛" pklevel="29"/>
<!-- 无PK等级限制 -->
<map mapID="139" name="王城" pklevel=""/>
15. exprate - 经验加成
| 项目 | 说明 |
|---|---|
| 类型 | BYTE(0-255) |
| 必填 | 否 |
| 默认值 | 0(无加成) |
| 说明 | 该地图上的经验获取加成比率 |
机制:
- 初始化时:
this->exprate = map_iter->second.exprate / 100.0f - 计算经验时:
Scene::sceneExp(DWORD exp)返回(DWORD)(exp * exprate) - 配置值为 0 时,exprate = 0.0,即原倍经验
- 配置值为 10 时,exprate = 0.1,即额外 10% 加成,实际为 1.1 倍
- 配置值为 100 时,exprate = 1.0,即额外 100% 加成,实际为 2.0 倍(双倍经验)
经验倍率对照表:
| 配置值 | 实际 exprate | 最终倍率 | 说明 |
|---|---|---|---|
| 0 或空 | 0.0 | 1.0 倍 | 原倍经验 |
| 10 | 0.1 | 1.1 倍 | +10% 经验 |
| 50 | 0.5 | 1.5 倍 | +50% 经验 |
| 100 | 1.0 | 2.0 倍 | 双倍经验 |
| 150 | 1.5 | 2.5 倍 | 2.5 倍经验 |
| 200 | 2.0 | 3.0 倍 | 三倍经验 |
注意: 此加成仅影响在该地图上通过 sceneExp() 计算的经验,不影响任务奖励经验等其他来源。
五、玩家死亡重生逻辑详解
当玩家在地图上死亡后,系统通过 Scene::changeMap(pUser, deathBackto=true) 决定重生地图。
完整流程(对应代码 Scene.cpp 第 505-555 行)
死亡触发 Scene::changeMap(pUser, deathBackto=true)
│
├─ 判断 1:玩家国籍是否与当前地图所属国家一致?
│ ├─ 【是】→ 前往 backto 指定的地图
│ │ 完整ID = (当前国家ID << 16) + backto
│ │
│ └─ 【否】→ 判断 2:玩家是否已有预设的 deathBackToMapID?
│ (进入地图时由 setDeathBackToMapID() 计算)
│ ├─ 【是】→ 前往 deathBackToMapID
│ │
│ └─ 【否】→ 判断 3:当前地图是否为中立区(countryID==6)?
│ │
│ ├─ 【是中立区】→ 判断 4:是否配置了 commoncountrybackto?
│ │ ├─ 【有值】→ 前往 (中立区6 << 16) + commoncountrybackto
│ │ │ (留在中立区)
│ │ └─ 【无值】→ 前往 (玩家本国ID << 16) + foreignerbackto
│ │ (回到玩家本国)
│ │
│ └─ 【非中立区】→ 判断 5:玩家是否无国籍(country==6)?
│ ├─ 【无国籍】→ 前往 (6 << 16) + commonuserbackto
│ │ (回到中立区)
│ └─ 【有国籍】→ 前往 (玩家本国ID << 16) + foreignerbackto
│ (回到玩家本国)
setDeathBackToMapID() 的计算逻辑
当玩家进入一张新地图时,系统会预先计算死亡后应该去哪里,缓存到 deathBackToMapID:
进入地图时计算 setDeathBackToMapID(scene):
│
├─ 当前地图是中立区(countryID==6)?
│ ├─ 【是】且有 commoncountrybackto?
│ │ → deathBackToMapID = (6 << 16) + commoncountrybackto
│ └─ 【否】
│ → deathBackToMapID = (玩家本国ID << 16) + foreignerbackto
│
└─ 当前地图不是中立区?
├─ 玩家无国籍(country==6)?
│ → deathBackToMapID = (6 << 16) + commonuserbackto
└─ 玩家有国籍?
→ deathBackToMapID = (玩家本国ID << 16) + foreignerbackto
重生后的行为
确定目标地图后:
- 检查目标地图的等级限制(
checkUserLevel),不满足则传送失败 - 在目标地图上寻找
ZONE_RELIVE(安全复活区)类型的区域 - 在复活区域中随机选择一个坐标
- 执行
pUser->changeMap(toscene, newpos)传送玩家
配置建议
| 地图类型 | backto | backtocity | foreignerbackto | commoncountrybackto | commonuserbackto |
|---|---|---|---|---|---|
| 本国城镇 | 本国安全城 | 本国主城 | 本国王城 | - | 134(皇城) |
| 本国野外 | 本国王城 | 本国王城 | 本国王城 | - | 134(皇城) |
| 本国副本 | 134(皇城) | 134(皇城) | 134(皇城) | 134(皇城) | 134(皇城) |
| 中立区地图 | 134(皇城) | 134(皇城) | 134(皇城) | 134(皇城) | 134(皇城) |
| 监狱/牢狱 | 自身(189) | 自身(189) | 自身(189) | 自身(189) | 自身(189) |
| 竞技场 | 134(皇城) | 134(皇城) | 134(皇城) | 134(皇城) | 134(皇城) |
六、地图配置完整示例
示例 1:新手村(基础配置)
<map mapID="101" name="清源村" fileName="qingyuancun-main"
backtocity="101" foreignerbackto="102" function=""
commonuserbackto="134" backtodare="102" pklevel="59"/>
| 属性 | 值 | 说明 |
|---|---|---|
| mapID | 101 | 地图编号 |
| name | 清源村 | 显示名称 |
| fileName | qingyuancun-main | 地图文件名 |
| backtocity | 101 | 回城符回到自身 |
| foreignerbackto | 102 | 外国人死后回凤凰城 |
| function | (空) | 无功能限制 |
| commonuserbackto | 134 | 无国籍者死后回皇城 |
| backtodare | 102 | 国战死后回凤凰城 |
| pklevel | 59 | 59级以下可PK |
| level | (未设) | 无等级限制 |
示例 2:王城(国战相关配置)
<map mapID="139" name="王城" fileName="wushuangcheng-main"
backtocity="139" foreignerbackto="139" function="2"
commonuserbackto="134" backtodare="139"
countrydarebackto="136" countrydefbackto="135" level="30"/>
| 属性 | 值 | 说明 |
|---|---|---|
| function | 2 | 主城标记 |
| countrydarebackto | 136 | 国战攻方死后回东郊 |
| countrydefbackto | 135 | 国战守方死后回南郊 |
| level | 30 | 需要30级才能进入 |
示例 3:中立区副本(完整配置)
<map mapID="151" name="魔族巢穴一层" fileName="shengshou1"
backtocity="134" foreignerbackto="134" backto="134"
function="512" commonuserbackto="134" backtodare="134"
level="80" exprate="10" commoncountrybackto="134"/>
| 属性 | 值 | 说明 |
|---|---|---|
| function | 512 | 不可使用家族战车 |
| level | 80 | 需要80级 |
| exprate | 10 | 1.1倍经验加成 |
| commoncountrybackto | 134 | 中立区统一回皇城 |
| backto | 134 | 死后回皇城 |
示例 4:温泉(高度限制)
<map mapID="279" name="男温泉" fileName="wenquan1"
backtocity="278" foreignerbackto="278" backto="278"
function="3025" commonuserbackto="278" commoncountrybackto="278"
backtodare="278"/>
| 属性 | 值 | 说明 |
|---|---|---|
| function | 3025 | 不可骑马+不红名+不可令牌+不可家族战车+不可骑训练马+不可技能 |
示例 5:牢狱(完全限制)
<map mapID="189" name="牢狱" fileName="jianyu"
backtocity="189" foreignerbackto="189" backto="189"
function="217" commonuserbackto="189" commoncountrybackto="189"
backtodare="189" level="20"/>
| 属性 | 值 | 说明 |
|---|---|---|
| function | 217 | 不可骑马+不红名+不可令牌+不可组队+不可转轴 |
| backto/backtocity/foreignerbackto | 189 | 所有重生点都指向自身(无法离开) |
| commonuserbackto/commoncountrybackto | 189 | 无国籍和中立区玩家也无法离开 |
七、function 位掩码快速计算工具
如何计算组合值
将需要的各个功能位对应的十进制值相加即可:
示例:需要"不可骑马 + 不红名 + 不可组队 + 不可使用令牌"
= 1 + 16 + 64 + 128 = 209
示例:需要"不可骑马 + 练功点 + 不可使用令牌"
= 1 + 4 + 128 = 133
二进制对照表
位: 13 12 11 10 9 8 7 6 5 4 3 2 1 0
值:8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
疲 轩 训 技 战 功 令 队 收 红 转 练 主 骑
劳 乾 练 能 车 勋 牌 队 费 名 轴 功 城 马
值 符 马 不 不 不 不 不 不 不
玄 不 增 使 组 红 使 使 使
天 能 加 用 队 名 用 用 用
符 骑 令 转
传 功 勋 牌 轴
送 勋
验证方法
用 Windows 计算器(程序员模式)或任意二进制转换工具验证:
- 打开计算器,切换到"程序员"模式
- 输入十进制数值
- 查看二进制各位是否正确
八、注意事项
- 字符限制: 地图名称(
name)不能包含 "·",文件名(fileName)不能包含 "." - 地图编号预留: 330-339 为固定副本地图,请勿占用
- 动态地图: 副本实例不需要在
<server>节点配置,但副本模板地图所在服务器必须开启 - 跨国家复用: 同一 mapID 可在不同国家下存在(如 101 清源村),但
<mapinfo>中只需定义一次属性 - 重启生效: 修改此文件后需要重启场景服务器
- function 计算: 位掩码需准确计算十进制值,建议使用程序员计算器验证
- 空值处理:
function=""、level=""、pklevel=""等空字符串等同于 0 - 地图文件:
fileName必须与实际的地图数据文件名一致,否则地图加载失败 - 中立区特殊: 中立区(countryID=6)地图的重生逻辑与其他国家不同,需特别注意
commoncountrybackto的配置 - 国战配置:
countrydarebackto和countrydefbackto只在国战期间生效,平时不使用