UID159057
帖子
精華
主題
積分2305
現金
積極性
威望
違規
熱心
推廣次數
閱讀權限10
註冊時間2009-5-26
在線時間 小時
最後登錄1970-1-1
TA的每日心情 | 開心 2018-12-14 06:21 PM |
---|
簽到天數: 123 天 連續簽到: 2 天 [LV.7]常住居民III
|
改源碼就像寫腳本一樣..
也不知道怎麼教﹋所以就寫下示範希望可以更好理解
首先先找到 玩家密語的 code …
可以從 whisper (npc密語)系統下去找…
收尋 "npc:" 果然… 一下子就找到了…
clif_parse_WisMessage
這邊的程式碼可能有點艱澀…
if( !clif_process_message(sd, 1, &target, &namelen, &message, &messagelen) )
return;
這段大概是在 檢查封包有沒有錯誤… 我也不是很清楚…
而
if (is_atcommand(fd, sd, message, 1) )
return;
是在檢查是否為 指令 …
if (battle_config.min_chat_delay)...
是在做防止發言過快的…
// Chat logging type 'W' / Whisper
是紀錄密語…
再來是 whisper (npc密語)系統 … 和 Main(全伺服器) 聊天系統… 這些都不重要…
重點在
dstsd = map_nick2sd(target);
這邊是把 所密的人名稱… 轉化成SD的地方…
而後面的 if 是在檢查有沒有這個玩家…
所以如果要製作出 密語觸發事件… 就要在後面加入… 事件觸發的函數…
找到了加入的位子… 現在要學加入的方法…
首先… 先隨便找 玩家觸發事件…來收尋…
我所選擇的是… OnPCLoginEvent
所以我收尋 OnPCLoginEvent
在 script.c 裡面的 Script_Config 找到了…
我們在這下面 加入
"OnPCWhisp",
"OnPCwhisp2"
這邊只有定義… 而我們要找到如何執行… 所以我們繼續收尋…
會發現 OnPCLoginEvent 沒有出現在其他的地方…
所以我對 script_config 的型態 Script_Config 做 移至定義 的動作…
在 script.h 裡找到了 Script_Config 的定義… 而後面出現了一堆 char 的定義…
而名稱也有 event .. 所以按照他的寫法… 在加入兩個char..
const char *Whisp_event_name;
const char *Whisp2_event_name;
這是還是沒有找到 觸發的地方… 而剛剛 OnPCLoginEvent 已經收尋過了… 他沒有再出現過了
所以我改收尋 login_event_name
而在 npc_read_event_script 收尋到
但仔細看一下、 這邊其實是 計算事件數量的地方… 恩… 順便把它加上去吧…
但這邊不是觸發的… 所以在繼續收尋…
你會發現… 你什麼也收尋不到…
當時我也卡在這邊卡很久…
聰明的芭樂… 想到了一個方法… 那就是重變數去推…
不管是 killerrid 、 killedrid 都可以
我是收尋 killedrid… 找到了 mob_dead 內的
pc_setglobalreg(mvp_sd,"killedrid",md->class_);
npc_script_event(mvp_sd, NPCE_KILLNPC); // PCKillNPC [Lance]
我們對 NPCE_KILLNPC 做 移至定義 的動作…
跑到了 npce_event … 原來 事件是做一個 index 對位的寫入… 難怪我們剛剛會在 Script_Config 斷頭…
所以我們在這裡加入… NPCE_Whisp 和 NPCE_Whisp2 在 MAX 前面…
這時我們回到剛剛的 dstsd = map_nick2sd(target);
在後面 if 的後面
加入
pc_setglobalreg(sd,"Whispid",dstsd->status.char_id);
pc_setglobalreg(dstsd,"Whispid",sd->status.char_id);
pc_setglobalreg_str(sd,"message$",message);
pc_setglobalreg_str(dstsd,"message$",message);
npc_script_event(sd, NPCE_Whisp);
npc_script_event(dstsd, NPCE_Whisp2);
這樣一來就完成了!! |
評分
-
查看全部評分
|