Skip to content

Latest commit

 

History

History
105 lines (81 loc) · 13.2 KB

mole2.md

File metadata and controls

105 lines (81 loc) · 13.2 KB

模块 mole2 · 摩尔庄园2 / 跨服(2 代)完整服务端集群

价值:★★★ · 游戏:摩尔庄园(摩尔庄园 2 / 跨服 PK) · 源码量:约 12 万行(122,090 行 cpp/c/h) 📖 深度功能解析(每个部分实际在干什么):deep/mole2.md · 彩蛋见 easter-eggs.md

是什么 / 在整套架构里的角色

mole2/ 是上海淘米(TaoMee, Inc. ShangHai CN)摩尔庄园 第二代(摩尔庄园 2) 的完整后端集群源码。版权头一律为 copyright: TaoMee, Inc. ShangHai CN. All rights reserved.,编译环境 gcc4.1.2 / Linux。最老的协议头 mole2_db/src/proto.h 标注 Created: 2007年11月01日,作者 xcwen (xcwenn@gmail.com);Switch 的 changelog 记录到 2009-04-27,内容配置 XML(任务/服饰/精灵)做到 ~2012-2013。

相比一代 mole,mole2 是一次架构重写 + 玩法升级:引入了独立的回合制宠物对战服(batrserv,内嵌 Lua 5.1 跑怪物 AI)、跨服 PK 集群(mole2_cross + mole2_switch),登录服也重写为 mole2_login_new。它是本仓库摩尔庄园主线里规模最大、最成体系的一套(★★★ 实至名归)。

整套是经典的淘米分进程 + DBProxy + Switch 路由架构,7 个进程角色:

子目录 进程 角色 关键证据
mole2_login_new M2Login 登录服:账号校验/封禁/选服,组播下发服务器列表 readme passwd_fail_time_limited / ban_time / addr_mcast_ip
mole2_switch Mole2Switch 路由总机:把客户端连接分配到某台 online,维护 online_id→ip:port switch.cpp、readme.txt server_num 500 / user_num 14950000
mole2_online m2_online 游戏主逻辑服:地图/服饰/背包/任务/SNS/宠物/战斗入口,最庞大 mole2_online.cpp
mole2_home M2home 家园服(庄园建造/摆设/市场/交易/PVP/GVG) mole2_home.cpp、proto.h
batrserv (Switch 进程名复用) 回合制对战服:发招/换宠/抓宠/药瓶,Lua 驱动怪物 AI bt_online.cpp、proto.h
mole2_cross Mole2Cross 跨服 PK 调度:报名/匹配/自动接受/自动战斗(job dispatcher 模式) cross.cpp、proto.hpp
mole2_db pubser DB 服(DBProxy):所有持久化命令字的落库,MySQL 后端 service.cpp、readme DB_USER root / DB_PASSWD taomee

进程关系(实证自 bind.conf / readme):客户端 → Login(选服,组播 addr_mcast_ip 239.0.0.x)→ Switch(分配到一台 online,online_id 见 online/bind.conf)→ online 处理游戏逻辑,需要持久化时走 dbproxy → mole2_db(dbproxy_port 21001);进对战时 online 把战斗委派给 batrserv;玩家发起跨服 PK 时由 cross 调度,switch 在多台 online 间转发战斗包。

关键子目录与文件(每条 = 可跳转超链接 + 一句话作用)

mole2_online(游戏主逻辑,~4.4MB 最大)

batrserv(回合制对战服)

mole2_db(DB 服)

cross / switch / home / login

协议 / 数据亮点

命令字(实证带行号)

  • 客户端协议(明文易读枚举):cli_proto.h proto_cli_login = 1001、#L43 proto_cli_map_users = 1002、#L82 proto_cli_buy_cloth = 1101(买衣服)。客户端包头是 protocol_t { len, cmd, id, seq, ret, body[] }(见 batrserv/proto.h)。
  • 对战协议:batrserv/src/proto.h proto_bt_challenge_battle = 1300(发起挑战)、proto_bt_battle_attack = 1308(发招)、proto_bt_catch_pet = 1338(抓宠)——每条都有中文注释,极易对照。
  • DB 命令字:mole2_db/src/proto.h mole2_login_cmd = 0x0801、#L40 mole2_user_user_create_role_cmd = 0x0802 | NEED_UPDATE、#L64 mole2_user_pet_add_cmd = 0x080E。注意 NEED_UPDATE = 0x0100(proto.h#L34 附近)按位标记"涉及写库需保存交易报文",rroto_route_field = 0xFE00 用高 7 位做路由。
  • 跨服协议:mole2_cross/proto.hpp CROSS_COMMID_APPLY_PK=1004、CROSS_COMMID_AUTO_FIGHT=1007;系统内部消息从 5500 起(CROSS_COMMID_ONLINE_TIMEOUT=5501)。

完整命令字矩阵见 ../protocol.md。各 online 包额外带 online_id,home/batrserv 包头还带 homeid/battle_id_t challenger,用于多服转发定位。

内容配置 XML(conf/,这是真正的"宝藏",可直接读懂玩法数值)

数据表(无 SQL 脚本)

本模块没有 .sql 建表文件;表结构以 C++ 的 Cxxx.cpp/h ORM 类(Cuser/Cpet/Citem/Chome/Crank…)+ field_desc.txt 形式描述。要还原 schema 需从这些类的字段反推。

对我们有什么用(moleworld-server / MoleWorld-offline)

重要前提:摩尔世界(moleworld 项目)复活的是一代摩尔庄园(对应 mole 模块,cocos2d/GLES1.1 客户端)。mole2 是二代,客户端协议(proto_cli_*)与一代不通用,因此整体只能参照而非直接对接一代客户端。

可"直用"(数据/逻辑可整段搬):

  • conf/*.xml 是纯数据,与客户端无关。若做摩尔庄园 2 的离线服或数值研究,clothes/beasts/skills_price/tasks_new/items 等可直接加载,是现成、完整、带中文字段说明的内容库——这是本模块对内容侧最大的直用价值。
  • batrserv 的 Lua AI 脚本框架(beast_ai_api 桥 + lua-5.1)是一套自包含、可复用的"配置驱动 AI"范式,做任何回合制怪物 AI 都能直接借鉴甚至移植。

只能"参照"(设计参考):

  • 七进程 Login/Switch/online/db/home/batrserv/cross 的分服架构是淘米成熟做法,可作为 moleworld-server 设计跨服/多实例时的蓝本(尤其 cross 的 Job 调度 + switch 转发的解耦)。
  • DB 命令字的 NEED_UPDATE / rroto_route_field 位标记设计(读写分流 + 路由)是干净的协议设计参考。
  • 战斗/宠物/任务的字段语义和数值口径(职业、属性、品阶)可用于校准/对照一代的对应系统。

注意 / 坑

  • 代际不匹配:mole2 = 摩尔庄园 2,协议/客户端与一代(mole)不互通。给一代离线服(moleworld-server)接协议时不要照搬 cli_proto.h,要以一代的 proto 为准,mole2 仅作设计参考。
  • 无 SQL 建表脚本:数据库 schema 只能从 mole2_db/src/Cuser.cpp 等 ORM 类 + field_desc.txt 反推,落库时需自己写 DDL。
  • 纯源码、无二进制/无资产:仓库不含客户端、美术、Flash swf,也不含可执行体(M2Login/Mole2Switch/Mole2Cross/M2home 等只是目录占位/发布脚本目标,非真二进制)。
  • 强依赖内部框架:大量 #include <libtaomee/...>、<libtaomee++/...>、<async_serv/...>、statistic_agent/stat_agent 等淘米内部库(见 libtaomee.md、c.md 模块,两个框架 .tar.gz 在仓库根);缺这些无法编译。batrserv 还需要 glib、内嵌 Lua。
  • 配置含真实内网信息:bench.conf/bind.conf/readme 里有硬编码内网 IP(10.1.1.x)、组播地址、DB_USER root / DB_PASSWD taomee 等——历史明文凭据,仅供研究,勿当生产参考。
  • 跨服 proto.hpp 注释乱码:mole2_cross/proto.hpp 中文注释是 GBK 被当 UTF-8 显示成乱码(如"系统内部消息id"),不影响命令字数值。
  • 代码新旧混杂:home 子目录里同名 .c 与 .cpp 并存(如 home.c 与 home.cpp),是 C→C++ 迁移过程残留,以 CMakeLists/.cpp 为准。

返回总入口:../../README.md · 相关:mole.md(一代) · protocol.md · content-data.md · c.md · libtaomee.md