`
yesjavame
  • 浏览: 687524 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Mangos的指令处理函数

 
阅读更多

Mangos的指令处理函数(opcodes handlers)


(转载请注明来源于金庆的专栏)


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

分享到:
评论

相关推荐

    Linux MaNGOS-0.14.tar.gz MangOS

    Linux MaNGOS-0.14.tar.gz 是一个专为MangOS游戏服务器构建的开源软件包。MangOS是一款基于Linux操作系统的大型多人在线角色扮演游戏(MMORPG)服务器模拟器,它允许玩家在本地环境中运行自己的魔兽世界服务器,用于...

    mangos分析笔记

    通过阅读这些笔记,读者不仅可以了解Mangos的工作原理,还能学习到游戏服务器开发的相关技术,如数据库设计、网络编程、多线程处理以及游戏逻辑实现。这将对想要参与开源游戏项目或自建游戏服务器的开发者提供宝贵的...

    mangos_0.13_9506_MangOS9506_

    《Mangos 0.13 9506:构建你的魔兽世界模拟服务器》 "Mangos_0.13_9506_MangOS9506_" 是一个针对魔兽世界模拟服务器的软件版本,这个版本是Mangos项目的一个重要里程碑。Mangos是一个开源的、免费的、基于Linux的...

    mangos 0.16

    5. **多线程与性能优化**:mangos 0.16可能包含了多线程优化,以提高服务器处理大量并发玩家的能力,这对于一个大型MMORPG至关重要。 6. **社区支持**:mangos项目有一个活跃的开发者和用户社区,他们共享资源、...

    Mangos_技术资料2.rar

    - **服务器架构**:Mangos基于C++编写,采用多线程、事件驱动的设计,确保高效处理大量的并发连接和游戏逻辑。 - **数据库交互**:Mangos与MySQL数据库紧密集成,用于存储游戏世界的静态和动态数据,如地图、物品...

    mangos开源魔兽世界服务器代码

    通过研究mangos,开发者可以了解到大型在线游戏服务器的设计理念和实现细节,包括网络通信、并发处理、数据同步、性能优化等方面的知识。这对于提升服务器端编程能力,或者开发其他MMORPG(大型多人在线角色扮演游戏...

    mangos源码(游戏服务器端程序框架)

     mangos的技术细节上是这样的,核心部分是个和特定游戏没有关系的核心框架程序,主要是进行进程调度,创造世界,建立心跳机制,处理网络接入等。数据库也是使用的开源数据库软件MySQL,编译器使用的是GCC。至于游戏...

    魔兽世界MANGOS数据库分析.doc

    魔兽世界MANGOS数据库分析

    mangos服务器架构.pdf

    * 可靠性高: Mangos服务器架构使用了游戏服务器的主循环来实现游戏逻辑的处理和游戏世界的更新,确保了游戏服务器的稳定运行。 * 扩展性好: Mangos服务器架构可以适用于各种类型的游戏服务器和其他类型的服务器...

    开源的魔兽世界参考架构——mangos

    ### 开源魔兽世界服务器架构——mangos #### 一、引言 随着网络游戏的兴起和发展,越来越多的人开始关注网络游戏背后的服务器架构和技术实现。暴雪娱乐的《魔兽世界》作为一款全球知名的大型多人在线角色扮演游戏...

    mangos-0.9.0

    《mangos-0.9.0:一个开源的魔兽世界服务器实现》 "mangos-0.9.0" 是一个专为魔兽世界爱好者和开发者提供的开源项目,其核心在于实现了一个完整的游戏服务器环境。这个项目允许用户在本地搭建自己的魔兽世界服务器...

    mangos-0.9.0在vs2010中编译通过

    《在VS2010中成功编译Mangos-0.9.0:一份详尽的指南》 Mangos是一款开源的魔兽世界服务器软件,它允许玩家创建自己的魔兽世界私人服务器。版本0.9.0是Mangos的一个重要里程碑,提供了稳定的游戏体验。在Visual ...

    Go-mangos-纯go实现Nanomsg("ScalableProtocols")包含传输互操作性

    3. **错误处理**:Go-mangos遵循Go的错误处理模式,所有的函数都可能返回错误,这有助于开发者在代码中处理可能出现的问题。 4. **并发安全**:Go-mangos利用Go的goroutine和channel特性,确保在多线程环境下的安全...

    mangos_0.13_9183_MangOS9183_

    这包括但不限于数据库处理、网络通信、游戏逻辑等方面的改进,使得服务器能够更流畅地处理大量玩家的并发操作。 “Upgrade to client version 3.0.3 (build 9183)”这一描述揭示了此次更新的一个关键目标。3.0.3是...

    mangos_0.13_MangOS0.13_Client9_

    1. **性能提升**:通过对代码的重构和优化,提高了服务器的处理能力,能够同时处理更多玩家的在线请求,降低延迟,提高游戏流畅性。 2. **稳定性增强**:修复了多个已知的bug,增强了系统的稳定性,确保服务器在高...

    MANGOS源码-魔兽私服

    mangos不是一个魔兽私服模拟器,它是一个开源的自由软件项目,是用c++和C#编程语言,实现的一个支持大型多人在线角色扮演游戏服务器的程序框架,在这个框架下,它理论上应该支持任何客户端的网络游戏,由于现在很多...

    Mangos数据库.txt

    主数据库:trinitydatabase ============================================= achievement_reward 巫妖王的奖励成就 areatrigger_involvedrelation 传送(区域触发)_包含的任务关系 areatrigger_scripts 区域触发脚本 ...

    mangos_0.13_9506_MangOS9506_源码.zip

    4. **中断处理**:中断是嵌入式系统中的关键部分,MangOS 中的中断处理代码展示了如何快速响应硬件事件,以及如何在中断上下文安全地执行任务。 5. **网络协议栈**:MangOS 包含了一个精简的TCP/IP协议栈,支持基本...

Global site tag (gtag.js) - Google Analytics