UID194640
帖子
精華
主題
積分16180
現金
積極性
威望
違規
熱心
推廣次數
閱讀權限30
註冊時間2009-9-5
在線時間 小時
最後登錄1970-1-1
TA的每日心情 | 開心 2020-10-27 09:10 PM |
---|
簽到天數: 2555 天 連續簽到: 1 天 [LV.Master]伴壇終老
|
本帖最後由 he01204046 於 2011-6-1 03:46 PM 編輯
注意事項:
1.角色必須持有手推車。
2.必須開啟@autoloot 自動撿取指令。
3.使用方式:@alootidtocart <物品名稱或編號>。
4.當手推車存放數量或重量已滿,將不會自動放進。
5.使用的原碼為:3ceam r[612]
首先,第一步,新增GM指令:
利用搜尋@alootid,找到GM指令中,自動撿取物品掉落的地方,會找到atcommand.c裡面的
PS:因為我有翻成中文,所以你們找到的應該會是英文,另外這邊的搜尋都是使用整個方案下去搜尋。
- /*==========================================
- * @alootid
- *------------------------------------------*/
- ACMD_FUNC(autolootitem)
- {
- struct item_data *item_data = NULL;
- if (!message || !*message) {
- if (sd->state.autoloot==0) {
- sd->state.autolootid = 0;
- clif_displaymessage(fd, "要先打開@autoloot才有辦法使用本指令。");
- } else {
- clif_displaymessage(fd, "請輸入要指定撿取物品名稱或編號。");
- clif_displaymessage(fd, "格式: @alootid <物品名稱或編號>。");
- }
- return -1;
- }
- if ((item_data = itemdb_exists(atoi(message))) == NULL)
- item_data = itemdb_searchname(message);
- if (!item_data) {
- // No items founds in the DB with Id or Name
- clif_displaymessage(fd, "錯誤的物品編號或名稱。"); //顯示訊息
- return -1;
- }
- sd->state.autolootid = item_data->nameid; // Autoloot Activated
- sprintf(atcmd_output, "自動撿取: 「'%s'/'%s' (%d)」。",
- item_data->name, item_data->jname, item_data->nameid);
- clif_displaymessage(fd, atcmd_output); //顯示訊息
- return 0;
- }
複製代碼
將整個函數都複製起來,貼在 - /*==========================================
- * @alootid
- *------------------------------------------*/
複製代碼
的上面,並改為
- /*==========================================
- * @alootidtocart
- *------------------------------------------*/
- ACMD_FUNC(autolootitemtocart)
- {
- struct item_data *item_data = NULL;
- if (!message || !*message) {
- if (sd->state.autoloot==0) {
- sd->state.autolootidtocart = 0;
- clif_displaymessage(fd, "要先打開@autoloot才有辦法使用本指令。");
- } else {
- clif_displaymessage(fd, "請輸入要指定自動撿取並放入手推車的物品名稱或編號。");
- clif_displaymessage(fd, "格式: @alootitocart <物品名稱或編號>。");
- }
- return -1;
- }
- if ((item_data = itemdb_exists(atoi(message))) == NULL)
- item_data = itemdb_searchname(message);
- if (!item_data) {
- // No items founds in the DB with Id or Name
- clif_displaymessage(fd, "錯誤的物品編號或名稱。"); //顯示訊息
- return -1;
- }
- sd->state.autolootidtocart = item_data->nameid; // Autoloot Activated
- sprintf(atcmd_output, "自動撿取並放入手推車: 「'%s'/'%s' (%d)」。",
- item_data->name, item_data->jname, item_data->nameid);
- clif_displaymessage(fd, atcmd_output); //顯示訊息
- return 0;
- }
- /*==========================================
- * @alootid
- *------------------------------------------*/
- ACMD_FUNC(autolootitem)
- {
- struct item_data *item_data = NULL;
- if (!message || !*message) {
- if (sd->state.autoloot==0) {
- sd->state.autolootid = 0;
- clif_displaymessage(fd, "要先打開@autoloot才有辦法使用本指令。");
- } else {
- clif_displaymessage(fd, "請輸入要指定撿取物品名稱或編號。");
- clif_displaymessage(fd, "格式: @alootid <物品名稱或編號>。");
- }
- return -1;
- }
- if ((item_data = itemdb_exists(atoi(message))) == NULL)
- item_data = itemdb_searchname(message);
- if (!item_data) {
- // No items founds in the DB with Id or Name
- clif_displaymessage(fd, "錯誤的物品編號或名稱。"); //顯示訊息
- return -1;
- }
- sd->state.autolootid = item_data->nameid; // Autoloot Activated
- sprintf(atcmd_output, "自動撿取: 「'%s'/'%s' (%d)」。",
- item_data->name, item_data->jname, item_data->nameid);
- clif_displaymessage(fd, atcmd_output); //顯示訊息
- return 0;
- }
複製代碼
然後你會發現sd->state.autolootidtocart這一段報錯,原因很簡單,沒定義。
因此,我們再搜尋autolootid 會找到pc.h裡面的這一段
- unsigned short autolootid; // [Zephyrus]
複製代碼
一樣,複製一份,改成下面這樣,並貼到上方
- unsigned short autolootidtocart; // 配合自動撿取指定物品並放入手推車
- unsigned short autolootid; // [Zephyrus]
複製代碼
這樣一來,報錯的訊息就消失了,然後繼續搜尋autolootitem,會找到。
- { "alootid", 10,10, atcommand_autolootitem },
複製代碼
一樣複製修改並貼到上面
- { "alootidtocart", 10,10, atcommand_autolootitemtocart },
- { "alootid", 10,10, atcommand_autolootitem },
複製代碼
接下來第一步就完成了,記得要到\conf\atcommand_athena.conf裡面新增唷
- // 開啟/關閉自動拾取指定道具到手推車
- alootidtocart: 0,100
複製代碼
第二步,將GM指令實際套用到物品掉落程式中:
要找物品掉落,當然要從autoloot開始搜尋嚕~然後物品掉落是從怪物掉落,所以很快就會找到mob.c裡面的這一段
- if( sd
- && (drop_rate <= sd->state.autoloot || ditem->item_data.nameid == sd->state.autolootid
複製代碼
這還不是我們要的,我們要找到給玩家物品的那一段判斷式,把畫面往下拉,會看到
- ) { //Autoloot.
- if (party_share_loot(party_search(sd->status.party_id),
- sd, &ditem->item_data, sd->status.char_id) == 0
- ) {
- ers_free(item_drop_ers, ditem);
- return;
- }
- }
複製代碼
Bingo~找到了
這一段就是給物品的判斷式,二話不說,直接搜尋這一段party_share_loot(或是反白後點選右鍵,移至定義),會找到
- //Does party loot. first_charid holds the charid of the player who has time priority to take the item.
- int party_share_loot(struct party_data* p, struct map_session_data* sd, struct item* item_data, int first_charid)
- {
複製代碼
恩,又中獎了,往下拉,找到。
- if(log_config.enable_logs&0x8) //Logs items, taken by (P)layers [Lupus]
- log_pick_pc(target, "P", item_data->nameid, item_data->amount, item_data);
複製代碼
這一段是訊息記錄,不用裡他,在他的下面新增
- if(log_config.enable_logs&0x8) //Logs items, taken by (P)layers [Lupus]
- log_pick_pc(target, "P", item_data->nameid, item_data->amount, item_data);
- //用於自動將物品放入手推車
- if (pc_iscarton(sd) && item_data->nameid == sd->state.autolootidtocart){ //判斷物品編號是否是指定物品
- for( i = 0; i < MAX_INVENTORY; i++ ) //取得道具在道具欄位中的位置
- {
- if(sd->status.inventory[i].nameid == item_data->nameid){ //判斷物品編號是否是指定物品
- pc_putitemtocart(sd,i,item_data->amount); //呼叫將物品放入手推車的函數
- break;
- }
- }
- }
複製代碼
完成~接下來就馬上編譯後覆蓋到架設資料夾中,然後啟動到遊戲中測試吧~
首先要輸入"@AUTOLOOT"開啟自動撿取,接下來輸入"@alootidtocart 物品名稱或編號"
舉例,我輸入@AUTOLOOT後再輸入@ALOOTIDTOCART 粘稠液體
然後去租用手推車一台
再去打波利,會發現很神奇的一件事情,就是你打到的黏稠液體,都自動幫你存到手推車中呢了~
以上,完成。
應觀眾要求,附上圖片。
這是手推車上的黏稠液體數量
這是輸入指令後,打怪取得粘稠液體並自動放入手推車(注意取得道具的地方和手推車上的數量以及身上的數量)
|
評分
-
查看全部評分
|