跳到主要内容

地图配置文档 — 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.cpp buildMapID()
  • 策划只需关注 MapID(低16位),国家ID由服务器分配。

2. 硬编码地图ID常量

以下地图ID在C++代码中以常量形式定义,禁止占用

常量名MapID地图名定义位置
NANJIAO_MAP_ID135南郊ScenesServer/Scene.h:33
DONGJIAO_MAP_ID136东郊ScenesServer/Scene.h:34
BIANJING_MAP_ID137边境ScenesServer/Scene.h:35
WANGCHENG_MAP_ID / KING_CITY_ID139王城ScenesServer/Scene.h:36, SessionServer/CCityManager.h:19
PK_MAP_ID213PK地图ScenesServer/Scene.h:37

3. 硬编码地图ID范围(代码逻辑判断占用)

以下ID范围在C++代码中通过范围判断产生特殊逻辑,整段保留

ID范围逻辑用途代码位置
193 ~ 202收费/练功地图(isTrainingMap()ScenesServer/Scene.h:487
213 ~ 215PK比武岛地图(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
11111vs1挑战赛竞技场(人数限制2人;道具1401仅在此地图可用;跨服PK无惩罚)ScenePk.cpp:1531,1601,4907, Scene.cpp:2638, SceneUser.cpp:7227

5. 国家ID硬编码

5.1 特殊国家ID常量

常量名含义定义位置
PUBLIC_COUNTRY6中立区/公共国base/Command.h:76
NEUTRAL_COUNTRY_ID6中立国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 = 0ScenesServer/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 = 4ScenesServer/Scene.h:45

6.2 副本计数器类型(CounterManager.h)

常量含义
FUBEN_TEYP_1 ~ FUBEN_TEYP_156 ~ 2015种副本类型计数器
JIAZU_TIME_IN_WANGCHENG21家族地图打坐时间计数

6.3 家族地图硬编码

  • 家族地图 fbType=8 硬编码:SceneUser.cpp:1372
  • 家族地图传送位置:pos=31,37FuBenMgr.cpp:920
  • 动态场景名:"中立区·家族地图" + septid

6.4 云天别墅硬编码

  • 动态场景名:"中立区·云天别墅" + userID
  • 传送位置:pos=32,104FuBenMgr.cpp:510,540,863

6.5 副本传送硬编码(FuBenMgr.cpp doXinFuBenCmd)

副本类型选项传送目标时间限制
BOSS副本(type=0)select=1中立区·镇妖塔一层 pos=91,8620:00-21:00
BOSS副本(type=0)select=2中立区·封龙之地 pos=23,6621:00-22:00
BOSS副本(type=0)select=3中立区·财神宝地 pos=36,3118:00-24:00
竞技副本(type=1)select=1中立区·封龙之地副本 pos=154,13620: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_FLAG58001国旗ScenesServer/SceneNpc.h:63
COUNTRY_SEC_FLAG58002副旗ScenesServer/SceneNpc.h:64
COUNTRY_MAIN_GEN58200大将军王(一级)ScenesServer/SceneNpc.h:65
COUNTRY_SEC_GEN58201禁卫队长ScenesServer/SceneNpc.h:66
COUNTRY_KING_MAIN_FLAG58005国旗(王城)ScenesServer/SceneNpc.h:67
COUNTRY_KING_SEC_FLAG58006副旗(王城)ScenesServer/SceneNpc.h:68
COUNTRY_EMPEROR_MAIN_GEN58203大将军王(皇城)ScenesServer/SceneNpc.h:69
COUNTRY_EMPEROR_SEC_GEN58204禁卫队长(皇城)ScenesServer/SceneNpc.h:70
ALLY_GUARDNPC54100盟国镖车ScenesServer/SceneNpc.h:71
EMPEROR_HORSE_ID3202皇帝的马ScenesServer/SceneNpc.h:72
KING_HORSE_ID3204国王的马ScenesServer/SceneNpc.h:73
SENIOR_LOONG_ALTAR_ID5245高级龙坛ScenesServer/CountryTech.h:27
LOONG_ALTAR_ID5246龙坛ScenesServer/CountryTech.h:28
SHABBY_LOONG_ALTAR_ID5247破旧龙坛ScenesServer/CountryTech.h:29
BASE_LOONG_ALTAR_ID5248基础龙坛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)

含义说明
0SCENE_TYPE_NONE
1STATIC静态地图(普通地图)
2SCENE_TYPE_DYNAMIC动态地图(副本,运行时创建)

动态地图不需要在 scenesinfo.xml<server>/<country> 节点下配置,但地图的模板必须在 mapinfo 中有定义。

10.2 场景运行状态

含义
1SCENE_RUN_STATE_NORMAL — 正常运行,可进入
2SCENE_RUN_STATE_READY_CLOSE — 准备关闭,不可进入
3SCENE_RUN_STATE_CLOSE — 场景要关闭
4SCENE_RUN_STATE_UNLOAD — 正在卸载
5SCENE_RUN_STATE_REMOVE — 正式卸载

10.3 场景TempID分配

  • 每个SceneServer实例分配 49998 个唯一TempID
  • 起始值:10000 + (ServerID % 100) * 50000
  • 范围:[起始值, 起始值 + 49998]

11. 地图功能标记位(function字段二进制位)

scenesinfo.xmlfunction 字段为二进制位标记,C++代码中的判断逻辑:

含义代码判断
bit01不可骑马!(function & 0x1)
bit12主城function & 0x2
bit24练功点function & 0x4
bit38转轴不可使用!(function & 0x8)
bit416不红名地图function & 0x10
bit532收费地图function & 0x20
bit664不可组队function & 0x40
bit7128不可使用令牌function & 0x80
bit8256杀人不增加功勋
bit9512不可使用家族战车
bit101024不能使用技能地图
bit112048不能骑训练后的马
bit124096不可使用轩辕符和玄天符
bit138192地图不记疲劳值

12. 区域类型(ZoneTypeDef)硬编码

地图区域类型,用于标记同一地图内不同区域的安全/战斗属性:

常量含义
ZONE_NONE0一般区
ZONE_PK_SAFE1PK安全区
ZONE_ABSOLUTE_SAFE2绝对安全区
ZONE_RELIVE4死亡重生区
ZONE_NEWBIE8新手出生区
ZONE_SPORTS16竞技区
ZONE_FOREIGN_RELIVE32国外死亡重生区
ZONE_PRIVATE_STORE128摆摊区
ZONE_PRIVATE_DARE256国战跳转区
ZONE_PRIVATE_RELIVE512国战复活区
ZONE_PRIVATE_UNION1024帮会所属地跳转区
ZONE_COUNTRY_WAR2048边境国战跳转区
ZONE_PRIVATE_DARE_UNION4096帮会战挑战方跳转区
ZONE_DARE_SAFE8192国战时绝对安全区/平时非安全区
ZONE_PRIVATE_THIRD_UNION16384帮会所属地第三方跳转区
ZONE_EMPEROR_DEF_RELIVE32768皇城战守方复活区
ZONE_EMPEROR_ATT_RELIVE65536皇城战攻方复活区
ZONE_SPA_WARM2097152普通温泉区
ZONE_SPA_HOT4194304热温泉区
ZONE_DANCE33554432跳舞区

13. 国战/帮会战价格常量

常量含义
CREATE_DARE_NEED_PRICE_GOLD500发起挑战需要金子
DARE_WINNER_GOLD800胜方获得金子
READYTIME300秒准备时间
ACTIVETIME3600秒活动时间
CREATE_UNION_CITY_DARE_NEED_PRICE_MONEY20000(2锭)帮会城战发起费
CREATE_UNION_KING_CITY_DARE_NEED_PRICE_MONEY50000(5锭)王城夺城战发起费
CREATE_UNION_NEUTRAL_CITY_DARE_NEED_PRICE_MONEY50000(5锭)中立城战发起费

14. 动态地图(副本)创建机制

策划需要了解动态地图(副本)的创建机制:

  1. 模板定义:在 scenesinfo.xml<mapinfo> 中定义地图模板(mapID、地图文件等)
  2. 副本配置:在 Config/FuBenConfig.xml 中配置副本类型,关联 mapID 和 countryID
  3. 运行时创建:C++代码调用 SceneManager::openFuBenScene()loadScene3()cloneScene3() 创建动态实例
  4. ID生成:动态场景获得唯一TempID,场景名 = 原名 + charid/septid
  5. 下线处理:动态地图中的玩家下线后,强制传送回皇城(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回城符返回的地图ID134=皇城
foreignerbackto外国人死亡重生地图ID134=皇城
backto死亡后重生地图ID134=皇城
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"/>

各字段说明

字段类型说明示例值含义
FBIDDWORD副本ID(必须与FBType相同!10
FBTypeDWORD副本类型,C++代码通过此值查找配置10
FBMapIDDWORD副本对应的地图模板MapID(必须与scenesinfo.xml中一致30010
FBCounIDDWORD副本所属国家ID(必须与scenesinfo.xml中country id一致6=中立区
FBNamestring副本名称(最多8个汉字,32字节)龙魂秘境
StartTimetime开放起始时间20240401 00:00:00
LastTimeDWORD副本持续时间(秒),默认7200=2小时7200
MaxOpenNumPerDayDWORD每天最大开启次数,默认33
MaxEnterNumPerDayDWORD每天最大进入次数,默认33
MaxUserCountDWORD单个副本最大用户数5
MaxFBCountDWORD同类型副本同时存在的最大数量,默认4040
IsNeedTeamDWORD是否需要组队(0=无需,1=需要)1
MinTeamMembNumDWORD队伍成员下限2
UserMinLvLimitDWORD玩家最低等级限制80
UserMaxLvLimitDWORD玩家最高等级限制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.cppdoXinFuBenCmd() 中添加新的 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中的mapID30010 = 30010
☐ FuBenConfig.xml FBCounID = scenesinfo中的country id6 = 6
☐ 地图数据文件存在fileName 对应的地图文件存在于服务器数据目录
☐ 地图区域配置正确地图文件中需有正确的区域(Zone)配置,至少包含一个重生区(ZONE_RELIVE)
☐ 副本创建测试重启服务器后,客户端发送 fbType=10 的开启请求,确认副本场景能成功创建

16. 两种副本系统的区别

当前代码中存在两套并行的副本进入机制,策划需根据需求选择:

对比项通用副本系统(FuBenUserCmd)副本UI面板(doXinFuBenCmd)
入口协议REQ_OPEN_FUBEN_PARA / REQ_ENTER_FUBEN_PARAFUBEN_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 & 8192function第13位为1时不记疲劳
副本计时isFubeningMap() (20500-20550)进入时记录fubentime
练功计时isTrainingMap() (193-202)进入时记录trainTime
PK地图经验isPkMap() (213-215)每15秒加经验 = level²/4