Mangos的指令处理函数

简介:
WorldSession中总共有300多个指令包处理函数, 
以Handle开头, 无返回值, 参数为WorldPacket&. 例如:
void HandleCharEnumOpcode(WorldPacket& recvPacket);

处理函数按功能分散在多个XXXHandler.cpp中实现. 
例如: ArenaTeamHandler.cpp, AuctionHouseHandler.cpp.
有一个文件名例外: Mail.cpp.

只有4个在WorldSession.cpp中实现, Handle后有下划线表示区别.
这4个都是空操作, 仅有日志记录.

void Handle_NULL(WorldPacket& recvPacket);          // not used
void Handle_EarlyProccess( WorldPacket& recvPacket);// just mark packets processed in WorldSocket::OnRead
void Handle_ServerSide(WorldPacket& recvPacket);    // sever side only, can't be accepted from client
void Handle_Deprecated(WorldPacket& recvPacket);    // never used anymore by client


指令包处理的入口在WorldSession::Update()中:

    while (!_recvQueue.empty())
    {
            WorldPacket *packet = _recvQueue.next();
            OpcodeHandler& opHandle = opcodeTable[packet->GetOpcode()];
            ...
            (this->*opHandle.handler)(*packet);
    }

其中opcodeTable是操作码表, 每个操作码对应一个OpcodeHandler结构, 目前有1000多个操作码.

OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
{
    /*0x000*/ { "MSG_NULL_ACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
    /*0x001*/ { "CMSG_BOOTME", STATUS_NEVER, &WorldSession::Handle_NULL },
    ...
    /*0x4AC*/ { "UMSG_UNKNOWN_1196", STATUS_NEVER, &WorldSession::Handle_NULL },
};

OpcodeHandler有3个字段: 名字, 状态, 处理函数:
struct OpcodeHandler
{
    char const* name;
    SessionStatus status;
    void (WorldSession::*handler)(WorldPacket& recvPacket);
};

名字用于日志输出. 状态有4种, 表示用户必须处于该状态才能进入处理函数.

/// Player state
enum SessionStatus
{
    STATUS_AUTHED = 0,        ///< Player authenticated
    STATUS_LOGGEDIN,          ///< Player in game
    STATUS_TRANSFER_PENDING,  ///< Player transferring to another map
    STATUS_NEVER              ///< Opcode not accepted from client (deprecated or server side only)
};

操作码1000多个, 但实际的处理函数不到400个, 因为大部分是STATUS_NEVER, 
对应的处理函数为上面所述的WorldSession.cpp内实现的4个空操作.

OpcodeHandler.handler是处理函数, 必须是WorldSession的成员函数, 
无返回值, 参数WorldPacket&.


处理函数的实现文件
--------------------
除了Mail.cpp, 处理函数的实现文件名以Handler为后缀.  
除了Mail.h, NpcHandler.h, 所有实现只有.cpp文件, 没有.h文件.

  文件名                    功能        Handler个数
  ------                    ----        -----------
  ArenaTeamHandler.cpp      竞技场队伍  10
  AuctionHouseHandler.cpp   拍卖行      8
  BattleGroundHandler.cpp   战场        12
  CalendarHandler.cpp       副本日程?   15
  ChannelHandler.cpp        聊天频道    19
  CharacterHandler.cpp      角色        22
  ChatHandler.cpp           聊天        4
  CombatHandler.cpp         战斗        3
  DuelHandler.cpp           决斗        2
  GMTicketHandler.cpp       GM求助      6
  GroupHandler.cpp          队伍        24
  GuildHandler.cpp          公会        34
  ItemHandler.cpp           物品        23
  LFGHandler.cpp            寻找队伍    10
  LootHandler.cpp           掉落        6
  Mail.cpp                  邮件        10
  MiscHandler.cpp           杂类        56
  MovementHandler.cpp       移动        15
  NPCHandler.cpp            NPC         15
  PetHandler.cpp            宠物        13
  PetitionsHandler.cpp      申请公会    9
  QueryHandler.cpp          查询        7
  QuestHandler.cpp          任务        16
  SkillHandler.cpp          技能        3
  SpellHandler.cpp          法术        13
  TaxiHandler.cpp           飞机系统    5
  TradeHandler.cpp          交易        10

  VoiceChatHandler.cpp      语音聊天    3                 


本文转自阿汐 51CTO博客,原文链接:http://blog.51cto.com/axiii/150636,如需转载请自行联系原作者


相关文章
|
缓存 网络协议 数据库连接
C/S架构中HTTP错误状态码原因分析及解决办法
HTTP(Hypertext Transfer Protocol)是用于在客户端和服务器之间传输数据的协议。当在浏览器或其他HTTP客户端中访问网页时,可能会发生各种访问报错。我们需要根据网页提供的错误状态码分析错误原因,以找到相对应的解决办法。
1107 0
|
存储 JavaScript
vue sessionStorage存值取值问题
vue sessionStorage存值取值问题
259 1
|
6月前
|
数据采集 存储 机器学习/深度学习
Fuel 爬虫:Scala 中的图片数据采集与分析
Fuel 爬虫:Scala 中的图片数据采集与分析
|
Dart Android开发 iOS开发
比较 Flutter 日期选择器库【Flutter 专题 6】
日期选择器是对 UI 的有用补充,它使您的应用程序用户可以轻松地从日历中选择日期。无论您是在注册表单中添加出生日期字段,还是为用户提供预约时间段,您都可以使用日期选择器库来简化流程。 在本教程中,我们将探索 Flutter 的三个流行日期选择器库 Flutter、Flutter Datetime Picker、Flutter Date Range Picker 和date_time_picker。我们将检查每个库的功能并将每个库安装在一个简单的移动应用程序中。
1177 0
比较 Flutter 日期选择器库【Flutter 专题 6】
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
|
JavaScript 前端开发 C++
vscode编辑器中如何调试nextjs代码
代码可调式的重要性不言而喻。 对于Programer来说,自己编写的程序能够被优雅调试是一件幸福的事情,特别是习惯了后端程序调试的开发者... 在折腾Nextjs项目的日子里,我走了很多弯路才弄明白在vs code中如何优雅的调试代码。
1009 1
vscode编辑器中如何调试nextjs代码
|
测试技术 虚拟化 iOS开发
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
这篇文章是iOS自动化测试方案的第二部分,详细介绍了在Xcode开发者工具中构建WebDriverAgent(WDA)应用到iPhone的全过程,包括环境准备、解决构建过程中可能遇到的错误,以及最终成功安装WDA到设备的方法。
873 0
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
|
数据安全/隐私保护 Python Windows
三种方法,Python轻松提取PDF中全部图片
三种方法,Python轻松提取PDF中全部图片
440 3
|
存储 关系型数据库 分布式数据库
实时数仓 Hologres产品使用合集之对于大量数据的写入,该如何优化
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
消息中间件 存储 大数据
简易教程:ClickHouse 的数据备份与恢复(二)
数据备份是IT运营中不可或缺的重要部分。在“大数据”部署(例如分析数据库)中,它们最具挑战性。本文将探讨备份ClickHouse所涉及的管道,并介绍用于自动化过程的Clickhouse备份工具。
1419 0

热门文章

最新文章