地图配置文档 — C++硬编码占用ID参考
本文档仅供策划参考,列出C++源码中硬编码占用/保留的地图ID、国家ID及相关ID。 策划新增配置时,请勿使用以下已占用的ID,否则会导致逻辑冲突。
数据来源:
server-code/中.h/.cpp文件,忽略XML配置。
1. 场景ID组成规则
场景唯一ID由国家ID和地图ID组合而成:
SceneID = (CountryID << 16) + MapID
RealMapID = SceneID & 0x0000FFFF // 取低16位即为地图ID
- 代码位置:
ScenesServer/SceneManager.cppbuildMapID() - 策划只需关注 MapID(低16位),国家ID由服务器分配。
2. 硬编码地图ID常量
以下地图ID在C++代码中以常量形式定义,禁止占用:
| 常量名 | MapID | 地图名 | 定义位置 |
|---|---|---|---|
NANJIAO_MAP_ID | 135 | 南郊 | ScenesServer/Scene.h:33 |
DONGJIAO_MAP_ID | 136 | 东郊 | ScenesServer/Scene.h:34 |
BIANJING_MAP_ID | 137 | 边境 | ScenesServer/Scene.h:35 |
WANGCHENG_MAP_ID / KING_CITY_ID | 139 | 王城 | ScenesServer/Scene.h:36, SessionServer/CCityManager.h:19 |
PK_MAP_ID | 213 | PK地图 | ScenesServer/Scene.h:37 |
3. 硬编码地图ID范围(代码逻辑判断占用)
以下ID范围在C++代码中通过范围判断产生特殊逻辑,整段保留:
| ID范围 | 逻辑用途 | 代码位置 |
|---|---|---|
| 193 ~ 202 | 收费/练功地图(isTrainingMap()) | ScenesServer/Scene.h:487 |
| 213 ~ 215 | PK比武岛地图(isPkMap()) | ScenesServer/Scene.h:150 |
| 223 ~ 247 | 迷宫地图(25层) | ScenesServer/Migong.cpp:36 |
| 10001 ~ 10401 | 天下第一比武/副本地图(死亡自动复活、无PK惩罚) | ScenesServer/SceneUser.cpp:9785, ScenePk.cpp:4841, QuestAction.cpp:733 |
| 20500 ~ 20550 | 副本地图(isFubeningMap(),需激活副本状态) | ScenesServer/Scene.h:497 |
| 10500 ~ 10509 | 比武岛地图(20-24点开放,超时自动踢人) | ScenesServer/SceneUser.cpp:9897 |
| > 1000 | 帮会城战地图(union city dare) | ScenesServer/SceneUser.cpp:5267 |
注意:
scenesinfo.xml注释还标注330-339为副本地图、10510-10550为万宝宫、22500-22509为战力副本,但C++代码中均未发现这些ID范围的硬编码判断,属于数据层占用,未列入上表。
4. 单个硬编码地图ID(代码中直接比较)
以下地图ID在C++代码中通过 == / != 直接比较,产生特定逻辑:
| MapID | 地图名 | 硬编码用途 | 涉及文件 |
|---|---|---|---|
| 101 | 清源村 | NPC争夺战限制(仅101/102/104可进行) | SessionClient.cpp:489, SceneUser.cpp:20180 |
| 102 | 凤凰城 | NPC争夺战限制;安全区处理;镖车事件;死亡回城点 | SessionClient.cpp:489, SceneUser.cpp:9336, SceneCountry.cpp:374, TimeTick.cpp:283 |
| 104 | 凤尾村 | NPC争夺战限制 | SessionClient.cpp:491, SceneUser.cpp:20182 |
| 134 | 皇城 | 皇城战逻辑;动态地图下线默认回城点(mapid=134,x=832,y=699);外国人死亡回城;皇帝战 | SceneUser.cpp:5296,8428, SessionClient.cpp:405,1027, CDareEmperor.cpp:52,68, CCountryManager.cpp:4641 |
| 135 | 南郊 | 国战跳转/复活逻辑 | SceneCountry.cpp, SceneNpc.cpp |
| 136 | 东郊 | 国战守方复活地图 | Scene.h, 国战逻辑 |
| 137 | 边境 | 国战接取;国家传送排除 | SceneCountry.cpp:81,105, SceneUserManager.cpp:566 |
| 139 | 王城 | 国战核心地图(大量硬编码);夺城战价格;禁召唤;私仓;宠物;舞蹈 | SceneUser.cpp, SessionClient.cpp, SceneDare.cpp, ScenePk.cpp, CCityManager.h |
| 189 | 牢狱 | 惩罚地图(排除善良值惩罚、PK费用计算) | SessionClient.cpp:1151, ScenePk.cpp:1777,4907 |
| 190 | 古墓 | 定时事件处理 | Scene.cpp:333 |
| 203 | 监牢 | 惩罚地图(同189,排除惩罚逻辑) | SessionClient.cpp:1151, ScenePk.cpp:4907 |
| 279 | 男温泉 | 温泉区逻辑判断 | SceneUser.cpp:7766 |
| 280 | 女温泉 | 温泉区逻辑判断 | SceneUser.cpp:7766 |
| 1111 | 1vs1挑战赛 | 竞技场(人数限制2人;道具1401仅在此地图可用;跨服PK无惩罚) | ScenePk.cpp:1531,1601,4907, Scene.cpp:2638, SceneUser.cpp:7227 |
5. 国家ID硬编码
5.1 特殊国家ID常量
| 常量名 | 值 | 含义 | 定义位置 |
|---|---|---|---|
PUBLIC_COUNTRY | 6 | 中立区/公共国 | base/Command.h:76 |
NEUTRAL_COUNTRY_ID | 6 | 中立国ID(与PUBLIC_COUNTRY同值) | SessionServer/CCountryManager.h:48 |
国家ID=6 在代码中出现20+处,用于:皇城战、皇帝争夺、中立区NPC生成、国战复活等。
5.2 国家ID与国名映射(Chat.cpp硬编码)
| 国家ID | 国名 | 代码位置 |
|---|---|---|
| 2 | 宋国 | Chat.cpp:2172 |
| 3 | 魏国 | Chat.cpp:2175 |
| 4 | 齐国 | Chat.cpp:2178 |
| 5 | 燕国 | Chat.cpp:2181 |
| 7 | 唐国 | Chat.cpp:2184 |
| 8 | 汉国 | Chat.cpp:2187 |
| 9 | 吴国 | Chat.cpp:2190 |
| 10 | 赵国 | Chat.cpp:2193 |
| 11 | 周国 | Chat.cpp:2196 |
| 12 | 楚国 | Chat.cpp:2199 |
注意:ID 1 未使用(留作
COUNTRY_STOCK/COUNTRY_MONEY常量占位),ID 6 = 中立区不可分配。
6. 副本(FuBen)类型硬编码
6.1 FuBenType 枚举
| 枚举值 | 含义 | 定义位置 |
|---|---|---|
FUBEN_TYPE_NONE = 0 | 无 | ScenesServer/Scene.h:41 |
FUBEN_TYPE_SEPT = 1 | 家族地图 | ScenesServer/Scene.h:42 |
FUBEN_TYPE_BANG = 2 | 帮会地图 | ScenesServer/Scene.h:43 |
FUBEN_TYPE_LOONG = 3 | 神龙巢副本 | ScenesServer/Scene.h:44 |
FUBEN_TYPE_CLOSE = 4 | — | ScenesServer/Scene.h:45 |
6.2 副本计数器类型(CounterManager.h)
| 常量 | 值 | 含义 |
|---|---|---|
FUBEN_TEYP_1 ~ FUBEN_TEYP_15 | 6 ~ 20 | 15种副本类型计数器 |
JIAZU_TIME_IN_WANGCHENG | 21 | 家族地图打坐时间计数 |
6.3 家族地图硬编码
- 家族地图
fbType=8硬编码:SceneUser.cpp:1372 - 家族地图传送位置:
pos=31,37(FuBenMgr.cpp:920) - 动态场景名:
"中立区·家族地图" + septid
6.4 云天别墅硬编码
- 动态场景名:
"中立区·云天别墅" + userID - 传送位置:
pos=32,104(FuBenMgr.cpp:510,540,863)
6.5 副本传送硬编码(FuBenMgr.cpp doXinFuBenCmd)
| 副本类型 | 选项 | 传送目标 | 时间限制 |
|---|---|---|---|
| BOSS副本(type=0) | select=1 | 中立区·镇妖塔一层 pos=91,86 | 20:00-21:00 |
| BOSS副本(type=0) | select=2 | 中立区·封龙之地 pos=23,66 | 21:00-22:00 |
| BOSS副本(type=0) | select=3 | 中立区·财神宝地 pos=36,31 | 18:00-24:00 |
| 竞技副本(type=1) | select=1 | 中立区·封龙之地副本 pos=154,136 | 20:00-21:00 |
| 材料副本(type=2) | select=1 | 中立区·附件地图 pos=36,31 | — |
| 材料副本(type=2) | select=2 | 中立区·元神地图 pos=36,31 | — |
| 材料副本(type=2) | select=3 | 中立区·法宝地图 pos=36,31 | — |
| 材料副本(type=2) | select=4 | 中立区·生肖地图 pos=36,31 | — |
7. 国战/帮会战相关硬编码NPC ID
以下NPC ID在C++代码中定义,策划配置NPC时不可重复:
| 常量名 | NPC ID | 含义 | 定义位置 |
|---|---|---|---|
COUNTRY_MAIN_FLAG | 58001 | 国旗 | ScenesServer/SceneNpc.h:63 |
COUNTRY_SEC_FLAG | 58002 | 副旗 | ScenesServer/SceneNpc.h:64 |
COUNTRY_MAIN_GEN | 58200 | 大将军王(一级) | ScenesServer/SceneNpc.h:65 |
COUNTRY_SEC_GEN | 58201 | 禁卫队长 | ScenesServer/SceneNpc.h:66 |
COUNTRY_KING_MAIN_FLAG | 58005 | 国旗(王城) | ScenesServer/SceneNpc.h:67 |
COUNTRY_KING_SEC_FLAG | 58006 | 副旗(王城) | ScenesServer/SceneNpc.h:68 |
COUNTRY_EMPEROR_MAIN_GEN | 58203 | 大将军王(皇城) | ScenesServer/SceneNpc.h:69 |
COUNTRY_EMPEROR_SEC_GEN | 58204 | 禁卫队长(皇城) | ScenesServer/SceneNpc.h:70 |
ALLY_GUARDNPC | 54100 | 盟国镖车 | ScenesServer/SceneNpc.h:71 |
EMPEROR_HORSE_ID | 3202 | 皇帝的马 | ScenesServer/SceneNpc.h:72 |
KING_HORSE_ID | 3204 | 国王的马 | ScenesServer/SceneNpc.h:73 |
SENIOR_LOONG_ALTAR_ID | 5245 | 高级龙坛 | ScenesServer/CountryTech.h:27 |
LOONG_ALTAR_ID | 5246 | 龙坛 | ScenesServer/CountryTech.h:28 |
SHABBY_LOONG_ALTAR_ID | 5247 | 破旧龙坛 | ScenesServer/CountryTech.h:29 |
BASE_LOONG_ALTAR_ID | 5248 | 基础龙坛 | ScenesServer/CountryTech.h:30 |
8. 硬编码物品ID
| 物品ID | 用途 | 代码位置 |
|---|---|---|
| 1401 | 仅在地图1111(1vs1挑战赛)可用 | SceneUser.cpp:7227 |
9. 硬编码NPC实例ID
| NPC ID | 用途 | 代码位置 |
|---|---|---|
| 140003 | 特定NPC判断 | SceneNpc.cpp:967 |
| 144006 | 特定NPC判断(楚国BOSS相关) | SceneNpc.cpp:996 |
10. 场景类型与运行状态
10.1 场景类型(SceneType)
| 值 | 含义 | 说明 |
|---|---|---|
| 0 | SCENE_TYPE_NONE | 无 |
| 1 | STATIC | 静态地图(普通地图) |
| 2 | SCENE_TYPE_DYNAMIC | 动态地图(副本,运行时创建) |
动态地图不需要在
scenesinfo.xml的<server>/<country>节点下配置,但地图的模板必须在mapinfo中有定义。
10.2 场景运行状态
| 值 | 含义 |
|---|---|
| 1 | SCENE_RUN_STATE_NORMAL — 正常运行,可进入 |
| 2 | SCENE_RUN_STATE_READY_CLOSE — 准备关闭,不可进入 |
| 3 | SCENE_RUN_STATE_CLOSE — 场景要关闭 |
| 4 | SCENE_RUN_STATE_UNLOAD — 正在卸载 |
| 5 | SCENE_RUN_STATE_REMOVE — 正式卸载 |
10.3 场景TempID分配
- 每个SceneServer实例分配 49998 个唯一TempID
- 起始值:
10000 + (ServerID % 100) * 50000 - 范围:
[起始值, 起始值 + 49998]
11. 地图功能标记位(function字段二进制位)
scenesinfo.xml 中 function 字段为二进制位标记,C++代码中的判断逻辑:
| 位 | 值 | 含义 | 代码判断 |
|---|---|---|---|
| bit0 | 1 | 不可骑马 | !(function & 0x1) |
| bit1 | 2 | 主城 | function & 0x2 |
| bit2 | 4 | 练功点 | function & 0x4 |
| bit3 | 8 | 转轴不可使用 | !(function & 0x8) |
| bit4 | 16 | 不红名地图 | function & 0x10 |
| bit5 | 32 | 收费地图 | function & 0x20 |
| bit6 | 64 | 不可组队 | function & 0x40 |
| bit7 | 128 | 不可使用令牌 | function & 0x80 |
| bit8 | 256 | 杀人不增加功勋 | — |
| bit9 | 512 | 不可使用家族战车 | — |
| bit10 | 1024 | 不能使用技能地图 | — |
| bit11 | 2048 | 不能骑训练后的马 | — |
| bit12 | 4096 | 不可使用轩辕符和玄天符 | — |
| bit13 | 8192 | 地图不记疲劳值 | — |
12. 区域类型(ZoneTypeDef)硬编码
地图区域类型,用于标记同一地图内不同区域的安全/战斗属性:
| 常量 | 值 | 含义 |
|---|---|---|
| ZONE_NONE | 0 | 一般区 |
| ZONE_PK_SAFE | 1 | PK安全区 |
| ZONE_ABSOLUTE_SAFE | 2 | 绝对安全区 |
| ZONE_RELIVE | 4 | 死亡重生区 |
| ZONE_NEWBIE | 8 | 新手出生区 |
| ZONE_SPORTS | 16 | 竞技区 |
| ZONE_FOREIGN_RELIVE | 32 | 国外死亡重生区 |
| ZONE_PRIVATE_STORE | 128 | 摆摊区 |
| ZONE_PRIVATE_DARE | 256 | 国战跳转区 |
| ZONE_PRIVATE_RELIVE | 512 | 国战复活区 |
| ZONE_PRIVATE_UNION | 1024 | 帮会所属地跳转区 |
| ZONE_COUNTRY_WAR | 2048 | 边境国战跳转区 |
| ZONE_PRIVATE_DARE_UNION | 4096 | 帮会战挑战方跳转区 |
| ZONE_DARE_SAFE | 8192 | 国战时绝对安全区/平时非安全区 |
| ZONE_PRIVATE_THIRD_UNION | 16384 | 帮会所属地第三方跳转区 |
| ZONE_EMPEROR_DEF_RELIVE | 32768 | 皇城战守方复活区 |
| ZONE_EMPEROR_ATT_RELIVE | 65536 | 皇城战攻方复活区 |
| ZONE_SPA_WARM | 2097152 | 普通温泉区 |
| ZONE_SPA_HOT | 4194304 | 热温泉区 |
| ZONE_DANCE | 33554432 | 跳舞区 |
13. 国战/帮会战价格常量
| 常量 | 值 | 含义 |
|---|---|---|
| CREATE_DARE_NEED_PRICE_GOLD | 500 | 发起挑战需要金子 |
| DARE_WINNER_GOLD | 800 | 胜方获得金子 |
| READYTIME | 300秒 | 准备时间 |
| ACTIVETIME | 3600秒 | 活动时间 |
| CREATE_UNION_CITY_DARE_NEED_PRICE_MONEY | 20000(2锭) | 帮会城战发起费 |
| CREATE_UNION_KING_CITY_DARE_NEED_PRICE_MONEY | 50000(5锭) | 王城夺城战发起费 |
| CREATE_UNION_NEUTRAL_CITY_DARE_NEED_PRICE_MONEY | 50000(5锭) | 中立城战发起费 |
14. 动态地图(副本)创建机制
策划需要了解动态地图(副本)的创建机制:
- 模板定义:在
scenesinfo.xml的<mapinfo>中定义地图模板(mapID、地图文件等) - 副本配置:在
Config/FuBenConfig.xml中配置副本类型,关联 mapID 和 countryID - 运行时创建:C++代码调用
SceneManager::openFuBenScene()→loadScene3()或cloneScene3()创建动态实例 - ID生成:动态场景获得唯一TempID,场景名 =
原名 + charid/septid - 下线处理:动态地图中的玩家下线后,强制传送回皇城(mapid=134, x=832, y=699)
15. 新增副本地图完整操作指南
以下以新增一个"龙魂秘境"副本地图为例,演示从零开始配置一个能被C++代码正确处理的副本。
第一步:选取安全的 MapID
参照本文档第2-4节,避开所有已占用的ID和范围。
当前已占用的MapID范围汇总:
- 193~202 (练功地图)
- 213~215 (PK地图)
- 223~247 (迷宫)
- 10001~10401 (比武副本)
- 10500~10509 (比武岛)
- 20500~20550 (副本地图)
- 22500~22509 (战力副本)
以及单个占用:101, 102, 104, 134, 135, 136, 137, 139, 189, 190, 203, 279, 280, 1111 等。
安全选择示例:选取 30010 作为新副本的MapID。
第二步:在 scenesinfo.xml 中定义地图模板
在 <mapinfo> 节点内添加:
<map mapID="30010" name="龙魂秘境" fileName="longhunmijing"
backtocity="134" foreignerbackto="134" backto="134"
function="512" commonuserbackto="134" backtodare="134"
level="80" commoncountrybackto="134" countrydarebackto="134"/>
各字段说明:
| 字段 | 说明 | 示例值含义 |
|---|---|---|
mapID | 地图ID,必须唯一且不在硬编码占用范围内 | 30010 |
name | 地图名称 | 龙魂秘境 |
fileName | 地图文件名(对应地图数据文件,不含扩展名) | longhunmijing |
backtocity | 回城符返回的地图ID | 134=皇城 |
foreignerbackto | 外国人死亡重生地图ID | 134=皇城 |
backto | 死亡后重生地图ID | 134=皇城 |
function | 地图功能标记(二进制位组合) | 512=不可使用家族战车 |
commonuserbackto | 无国籍人国外死亡重生地 | 134=皇城 |
backtodare | 国战期间死亡重生地 | 134=皇城 |
level | 等级限制 | 80 |
commoncountrybackto | 公共国公共地图死亡重生地 | 134=皇城 |
countrydarebackto | 国战攻方复活地图 | 134=皇城 |
exprate | 经验加成倍率(可选) | 如填10表示10倍经验 |
function常用组合参考:
| function值 | 二进制含义 | 适用场景 |
|---|---|---|
| 0 | 无限制 | 普通野外 |
| 2 | 主城 | 新手出生城 |
| 4 | 练功点 | 普通练功区 |
| 129 | 不可骑马+不可使用令牌 | 室内 |
| 133 | 练功点+不可骑马+不可使用令牌 | 洞穴 |
| 137 | 主城+不可骑马+不可使用令牌 | 密室/密道 |
| 140 | 主城+练功点+不可骑马 | 竞技/比武 |
| 512 | 不可使用家族战车 | 副本 |
| 1536 | 不可使用家族战车+不能使用技能+不能骑训练后的马 | 特殊安全区 |
第三步:在 scenesinfo.xml 中将地图挂载到中立区
在 <server id="21"> → <country id="6"> 下添加:
<map mapID="30010"/><!--龙魂秘境-->
为什么挂到 country id="6"(中立区)? 副本地图通常不属于任何国家,挂在国家6(中立区)下,C++代码通过
buildMapID(6, 30010)定位模板场景。FuBenConfig.xml 中的FBCounID必须与此处的 country id 一致。
第四步:在 FuBenConfig.xml 中添加副本配置
<FuBen FBID="10" FBType="10" FBMapID="30010" FBCounID="6" FBName="龙魂秘境"
StartTime="20240401 00:00:00" LastTime="7200"
MaxOpenNumPerDay="3" MaxEnterNumPerDay="3"
MaxUserCount="5" MaxFBCount="40"
IsNeedTeam="1" MinTeamMembNum="2"
UserMinLvLimit="80" UserMaxLvLimit="300"/>
各字段说明:
| 字段 | 类型 | 说明 | 示例值含义 |
|---|---|---|---|
FBID | DWORD | 副本ID(必须与FBType相同!) | 10 |
FBType | DWORD | 副本类型,C++代码通过此值查找配置 | 10 |
FBMapID | DWORD | 副本对应的地图模板MapID(必须与scenesinfo.xml中一致) | 30010 |
FBCounID | DWORD | 副本所属国家ID(必须与scenesinfo.xml中country id一致) | 6=中立区 |
FBName | string | 副本名称(最多8个汉字,32字节) | 龙魂秘境 |
StartTime | time | 开放起始时间 | 20240401 00:00:00 |
LastTime | DWORD | 副本持续时间(秒),默认7200=2小时 | 7200 |
MaxOpenNumPerDay | DWORD | 每天最大开启次数,默认3 | 3 |
MaxEnterNumPerDay | DWORD | 每天最大进入次数,默认3 | 3 |
MaxUserCount | DWORD | 单个副本最大用户数 | 5 |
MaxFBCount | DWORD | 同类型副本同时存在的最大数量,默认40 | 40 |
IsNeedTeam | DWORD | 是否需要组队(0=无需,1=需要) | 1 |
MinTeamMembNum | DWORD | 队伍成员下限 | 2 |
UserMinLvLimit | DWORD | 玩家最低等级限制 | 80 |
UserMaxLvLimit | DWORD | 玩家最高等级限制 | 300 |
⚠️ 关键约束:
- FBID 必须等于 FBType!因为 C++ 代码
fubenCfgList[info.fbID] = info以 FBID 为键存储,但getFBMapID(fbType)用 fbType 查找,如果两者不一致将找不到配置。 - FBMapID 必须与 scenesinfo.xml 中 mapID 一致,否则
openFuBenScene()找不到模板场景,副本创建失败。 - FBCounID 必须与 scenesinfo.xml 中地图所挂的 country id 一致,否则场景ID组合错误。
第五步:C++代码调用(需要程序配合)
副本配置完成后,有两种方式让玩家进入副本:
方式A:通用副本系统(无需改代码,使用 FuBenUserCmd 协议)
客户端发送 ReqOpenFuBenUserCmd / ReqEnterFuBenUserCmd,其中 fbType = 你在 FuBenConfig.xml 中定义的 FBType 值:
客户端 → GatewayServer → SessionServer → ScenesServer
ReqOpenFuBenUserCmd(fbType=10)
→ FuBenMgr::reqOpenFuBen(pUser, 10)
→ getFBMapID(10) → 返回 30010
→ getFBCounID(10) → 返回 6
→ openFuBenScene(charid, 10, isClone)
→ 创建动态场景,场景名 = "龙魂秘境" + charid
进入时同理:ReqEnterFuBenUserCmd(fbType=10) → 查找已创建的副本场景 → 传送。
此方式无需修改C++代码,完全数据驱动。
方式B:副本UI面板传送(doXinFuBenCmd,需改代码)
如果希望通过右上角副本UI面板进入(fubenhdsystem.xml),则需要在 FuBenMgr.cpp 的 doXinFuBenCmd() 中添加新的 type/select 分支,使用 Gm::gomap() 传送:
// 需要程序在 doXinFuBenCmd 中添加代码
else if (type == 3) // 新增分页
{
if (select == 1)
{
Gm::gomap(this, "name=中立区·龙魂秘境 pos=50,50");
return true;
}
}
此方式需要修改C++代码。
第六步:验证清单
配置完成后,逐项检查:
| 检查项 | 要求 |
|---|---|
| ☐ MapID唯一性 | 30010 未被任何其他地图使用 |
| ☐ MapID不在硬编码范围内 | 不在 193-202、213-215、223-247、10001-10401、10500-10509、20500-20550 等范围内 |
| ☐ MapID不在单个硬编码ID中 | 不等于 101/102/104/134/135/136/137/139/189/190/203/279/280/1111 等 |
☐ scenesinfo.xml <mapinfo> 有定义 | mapID=30010 有对应 <map> 节点 |
☐ scenesinfo.xml <country id="6"> 下有挂载 | mapID=30010 有对应 <map> 节点 |
| ☐ FuBenConfig.xml FBID=FBType | 两者值相同 |
| ☐ FuBenConfig.xml FBMapID = scenesinfo中的mapID | 30010 = 30010 |
| ☐ FuBenConfig.xml FBCounID = scenesinfo中的country id | 6 = 6 |
| ☐ 地图数据文件存在 | fileName 对应的地图文件存在于服务器数据目录 |
| ☐ 地图区域配置正确 | 地图文件中需有正确的区域(Zone)配置,至少包含一个重生区(ZONE_RELIVE) |
| ☐ 副本创建测试 | 重启服务器后,客户端发送 fbType=10 的开启请求,确认副本场景能成功创建 |
16. 两种副本系统的区别
当前代码中存在两套并行的副本进入机制,策划需根据需求选择:
| 对比项 | 通用副本系统(FuBenUserCmd) | 副本UI面板(doXinFuBenCmd) |
|---|---|---|
| 入口协议 | REQ_OPEN_FUBEN_PARA / REQ_ENTER_FUBEN_PARA | FUBEN_IN |
| 参数 | fbType(对应FuBenConfig.xml) | type(分页) + select(选项) |
| 是否需改代码 | 否,完全数据驱动 | 是,需在C++中加if/goto分支 |
| 场景创建 | openFuBenScene() 动态创建独立实例 | Gm::gomap() 传送到已存在的静态场景 |
| 副本隔离 | 每人/每队一个独立副本实例 | 所有人进入同一个场景 |
| 适用场景 | 私人副本、组队副本 | 公共活动地图、定时BOSS地图 |
| 时间限制 | FuBenConfig.xml 配置 | C++代码硬编码时间判断 |
| 次数限制 | FuBenConfig.xml 配置 + 计数器 | charbase.fba1~fba5 字段 |
建议:新增私人/组队副本用通用副本系统;新增公共活动地图用副本UI面板。
17. 副本地图特殊处理说明
策划需了解以下C++代码中对副本/动态地图的特殊处理逻辑:
| 行为 | 条件 | 效果 |
|---|---|---|
| 下线回城 | scene->isDynamic() | 强制传送至皇城(134,x=832,y=699) |
| 死亡自动复活 | getRealMapID() >= 10001 && <= 10401 | 在天下第一比武地图中死亡自动复活 |
| 无PK惩罚 | getRealMapID() >= 10001 && <= 10401 | 天下第一比武地图中PK无费用 |
| 阻止任务动作 | getRealMapID() >= 10001 && <= 10401 | 天下第一比武地图中部分任务不可用 |
| 疲劳值不计 | function & 8192 | function第13位为1时不记疲劳 |
| 副本计时 | isFubeningMap() (20500-20550) | 进入时记录fubentime |
| 练功计时 | isTrainingMap() (193-202) | 进入时记录trainTime |
| PK地图经验 | isPkMap() (213-215) | 每15秒加经验 = level²/4 |