跳到主要内容

scenesinfo.xml 配置说明文档

文件概述

scenesinfo.xml 是场景服务器(ScenesServer)的核心配置文件,定义了三方面内容:

  1. 服务器-地图加载关系 - 每个场景服务器进程启动时加载哪些地图
  2. 国家信息 - 游戏中国家的基本信息(名称、主城、注册开关)
  3. 地图详细属性 - 每张地图的全部运行时属性(重生点、功能限制、等级限制、经验加成等)

文件编码: GB2312 对应代码: ScenesServer/SceneManager.cppSceneManager::init() 函数负责解析 数据结构: SceneManager.h 中定义的 CountryInfoMapInfo 结构体 生效方式: 修改后需重启场景服务器

一、文件整体结构

<?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>idint场景服务器编号,必须与 config.xml 中配置的 serverID 一致
2<country>idint国家编号,对应 <countryinfo> 中定义的国家 ID
3<map>mapIDint地图编号,对应 <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) 中,全局可用。

参数说明

属性类型必填默认值说明
idDWORD-国家唯一编号
namestring-国家显示名称
mapIDDWORD0该国家的新手出生主城地图编号
functionDWORD0注册控制标志

各属性详解

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地图编号mapIDidDWORD-基础
2地图名称namenamestring-基础
3地图文件名fileNamefilenamestring-基础
4死亡重生地图backtobacktoDWORD0重生
5回城符目标backtocitybacktoCityDWORD0重生
6外国人死亡重生点foreignerbacktoforeignbacktoDWORD0重生
7公共国死亡重生点commoncountrybacktocommoncountrybacktoDWORD0重生
8无国籍者死亡重生点commonuserbacktocommonuserbacktoDWORD0重生
9国战死亡重生点backtodarebacktodareDWORD0重生
10攻方国战复活点countrydarebacktocountrydarebacktoDWORD0重生
11守方国战复活点countrydefbacktocountrydefbacktoDWORD0重生
12功能标志functionfunctionDWORD0功能
13等级限制levellevelBYTE0限制
14PK等级上限pklevelpklevelDWORD0限制
15经验加成exprateexprateBYTE0经济

各参数详解

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 争夺战标记
11111vs1 挑战赛限制最多 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 时生效
  • 用于处理外国玩家在敌国地图上死亡的情况
  • 是死亡重生逻辑的兜底字段之一

触发条件(按优先级):

  1. 玩家已有 deathBackToMapID(之前进入地图时已计算) -> 使用 deathBackToMapID
  2. 地图为中立区(countryID=6)且有 commoncountrybackto -> 使用 commoncountrybackto
  3. 玩家无国籍(country=6)且有 commonuserbackto -> 使用 commonuserbackto
  4. 其他情况 -> 使用 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值 检测对应位是否开启

代码中的函数对应:

十六进制十进制代码函数功能名说明
00x00011canRide()不可骑马!(function & 0x1) 为 true 才能骑马,即该位为 1 时不可骑马
10x00022isMainCity()主城标记function & 0x2,标记为主城地图
20x00044isField()练功点function & 0x4,标记为野外练功区域
30x00088canUserScroll()不可使用转轴!(function & 0x8) 为 true 才能使用转轴
40x001016isNoRedScene()不红名地图function & 0x10,击杀玩家不增加红名值
50x002032isIncScene()收费地图function & 0x20,进入该地图需要付费
60x004064noTeam()不可组队function & 0x40,禁止组队相关操作
70x0080128checkCallObj()不可使用令牌function & 0x80,禁止使用令牌类道具
80x0100256-杀人不增加功勋击杀玩家不获得功勋值
90x0200512-不可使用家族战车禁止在该地图使用家族战车
100x04001024-不能使用技能禁止使用任何技能
110x08002048-不能骑训练后的马只能骑普通马,禁止骑训练提升过速度的马
120x10004096-不可使用轩辕符/玄天符禁止使用轩辕符和玄天符等传送符箓
130x20008192-不记疲劳值在该地图上不消耗/不累计疲劳值

各功能详细说明:

位 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二进制组合成分含义使用地图
000000000000000无任何限制普通野外、边境
200000000000010主城主城地图凤凰城(102)、王城(139)
400000000000100练功点野外练功区北郊(103)、凤祥镇西郊(124)
500000000000101不可骑马+练功点室外练功区白骨洞一层(108)、龙冈山(119-122)
1280000000010000000不可使用令牌内室限制王城宅屋(218)
1290000000010000001不可骑马+不可令牌室内地图凤凰城宅子(183)、王城宅子(186)、客栈(185)
1330000000010000101不可骑马+练功点+不可令牌地下城武夷王墓(156-167)、古墓(190)、蛟龙洞二层(131)
1370000000010001001不可骑马+主城+不可令牌+不可转轴密室/密道凤凰城密室(1021)、王城密室(1391)、皇宫(219)
1400000000010001100主城+练功点+不可组队竞技/活动区比武岛(213-215)、VIP地图(475-476)、副本(330-332)
1610000000010100001不可骑马+不红名+不可令牌安全挂机区武夷王墓(158-168)
2010000000011001001不可骑马+不红名+不可令牌+不可组队迷宫迷宫(223-247)
2170000000011011001不可骑马+不红名+不可令牌+不可组队+不可转轴监狱牢狱(189)、看守所(221)
2560000000100000000杀人不增加功勋功勋限制特殊活动地图
2610000000100000101不可骑马+不红名+不可组队+不可令牌+杀人不增功勋高级副本白骨洞深层(109-117)、海选赛(291-293)
3890000000110000101不可骑马+不红名+不可组队+不可令牌+杀人不增功勋+不可转轴最终层白骨洞十层(117)
5120000010000000000不可使用家族战车中立区/帮会战皇城帮会战(1721)、万宝宫(10500-10509)
15360000011000000000不红名+不可令牌+不记疲劳值+不可家族战车安全社交区世外桃源(278)
30250000101111000001不可骑马+不红名+不可令牌+不可家族战车+不可骑训练马+不可技能温泉男温泉(279)、女温泉(280)

13. level - 等级限制

项目说明
类型BYTE(0-255)
必填
默认值0(无限制)
说明进入该地图所需的最低角色等级

机制:

  • 通过 Scene::checkUserLevel(SceneUser *pUser) 检查
  • this->level > 0pUser->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.01.0 倍原倍经验
100.11.1 倍+10% 经验
500.51.5 倍+50% 经验
1001.02.0 倍双倍经验
1501.52.5 倍2.5 倍经验
2002.03.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

重生后的行为

确定目标地图后:

  1. 检查目标地图的等级限制(checkUserLevel),不满足则传送失败
  2. 在目标地图上寻找 ZONE_RELIVE(安全复活区)类型的区域
  3. 在复活区域中随机选择一个坐标
  4. 执行 pUser->changeMap(toscene, newpos) 传送玩家

配置建议

地图类型backtobacktocityforeignerbacktocommoncountrybacktocommonuserbackto
本国城镇本国安全城本国主城本国王城-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"/>
属性说明
mapID101地图编号
name清源村显示名称
fileNameqingyuancun-main地图文件名
backtocity101回城符回到自身
foreignerbackto102外国人死后回凤凰城
function(空)无功能限制
commonuserbackto134无国籍者死后回皇城
backtodare102国战死后回凤凰城
pklevel5959级以下可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"/>
属性说明
function2主城标记
countrydarebackto136国战攻方死后回东郊
countrydefbackto135国战守方死后回南郊
level30需要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"/>
属性说明
function512不可使用家族战车
level80需要80级
exprate101.1倍经验加成
commoncountrybackto134中立区统一回皇城
backto134死后回皇城

示例 4:温泉(高度限制)

<map mapID="279" name="男温泉" fileName="wenquan1"
backtocity="278" foreignerbackto="278" backto="278"
function="3025" commonuserbackto="278" commoncountrybackto="278"
backtodare="278"/>
属性说明
function3025不可骑马+不红名+不可令牌+不可家族战车+不可骑训练马+不可技能

示例 5:牢狱(完全限制)

<map mapID="189" name="牢狱" fileName="jianyu"
backtocity="189" foreignerbackto="189" backto="189"
function="217" commonuserbackto="189" commoncountrybackto="189"
backtodare="189" level="20"/>
属性说明
function217不可骑马+不红名+不可令牌+不可组队+不可转轴
backto/backtocity/foreignerbackto189所有重生点都指向自身(无法离开)
commonuserbackto/commoncountrybackto189无国籍和中立区玩家也无法离开

七、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 计算器(程序员模式)或任意二进制转换工具验证:

  1. 打开计算器,切换到"程序员"模式
  2. 输入十进制数值
  3. 查看二进制各位是否正确

八、注意事项

  1. 字符限制: 地图名称(name)不能包含 "·",文件名(fileName)不能包含 "."
  2. 地图编号预留: 330-339 为固定副本地图,请勿占用
  3. 动态地图: 副本实例不需要在 <server> 节点配置,但副本模板地图所在服务器必须开启
  4. 跨国家复用: 同一 mapID 可在不同国家下存在(如 101 清源村),但 <mapinfo> 中只需定义一次属性
  5. 重启生效: 修改此文件后需要重启场景服务器
  6. function 计算: 位掩码需准确计算十进制值,建议使用程序员计算器验证
  7. 空值处理: function=""level=""pklevel="" 等空字符串等同于 0
  8. 地图文件: fileName 必须与实际的地图数据文件名一致,否则地图加载失败
  9. 中立区特殊: 中立区(countryID=6)地图的重生逻辑与其他国家不同,需特别注意 commoncountrybackto 的配置
  10. 国战配置: countrydarebacktocountrydefbackto 只在国战期间生效,平时不使用