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...