Mangos的指令處理函式

2021-08-23 13:58:50 字數 2407 閱讀 1247

mangos的指令處理函式(opcodes handlers)

worldsession中總共有300多個指令包處理函式,

以handle開頭, 無返回值, 引數為worldpacket&. 例如:

void handlecharenumopcode(worldpacket& recvpacket);

處理函式按功能分散在多個***handler.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())

其中opcodetable是操作碼表, 每個操作碼對應乙個opcodehandler結構, 目前有1000多個操作碼.

opcodehandler opcodetable[num_msg_types] =

,/*0x001*/ ,

.../*0x4ac*/ ,

};opcodehandler有3個字段: 名字, 狀態, 處理函式:

struct opcodehandler

;名字用於日誌輸出. 狀態有4種, 表示使用者必須處於該狀態才能進入處理函式.

/// player state

enum sessionstatus

;操作碼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

ARM指令協處理器處理指令

arm支援16個協處理器,在程式執行過程中,每個協處理器忽略屬於arm處理器和其他協處理器指令,當乙個協處理器硬體不能執行屬於她的協處理器指令時,就會產生乙個未定義的異常中斷,在異常中斷處理程式中,可以通過軟體模擬該硬體的操作,比如,如果系統不包含向量浮點運算器,則可以選擇浮點運算軟體模擬包來支援向...

ARM指令協處理器處理指令

arm支援16個協處理器,在程式執行過程中,每個協處理器忽略屬於arm處理器和其他協處理器指令,當乙個協處理器硬體不能執行屬於她的協處理器指令時,就會產生乙個未定義的異常中斷,在異常中斷處理程式中,可以通過軟體模擬該硬體的操作,比如,如果系統不包含向量浮點運算器,則可以選擇浮點運算軟體模擬包來支援向...

預處理指令

預處理指令是我們寫在程式 中的給預處理器 preprocessor 的 命令,而不是程式本身的語句。預處理器在我們編譯乙個c 程式時由編譯器自動執行,它負責控制對程式 的第一次驗證和消化。所有這些指令必須寫在單獨的一行中,它們不需要加結尾的分號 在這個教程的開頭我們已經提到了一種預處理指令 defi...