t9540513

服主必學!任務改為腳本控制

發表於 2022-5-18 17:45:42
t9540513 發表於 2022-5-18 17:45:42 | 顯示全部樓層 |閱讀模式
註解 2022-05-18 150230.png

【介紹】
任務一直困擾著每一個服的服主,明明節點都相同,就是會莫名出錯,
主程式百百種,更換一種修一種(單壓?)會直接把人給累死,
加上修復方式只能靠wz修復的話,過程繁瑣,許多服主多半放推了。
而只要改成腳本修復,除了即時性與修復速度可以大大縮減,最主要的是,
自由度大大增高,只要端口有的腳本功能,通通能寫入。

本篇將以"證明身為訓練師的能力"為範例,說明如何修改成腳本控制與修復任務。

【教學】
首先,我們透過導出的"QuestInfo.img"找到這個任務的任務代碼,得知該任務代碼是 4646。
不知道如何查詢的請看 "如何正確找到各種楓之谷物件代碼",
Quest 的基本知識請看  "新手必讀"Quest"任務修復、新增全攻略"

註解 2022-05-18 150230.png


透過編輯軟體,打開 Quest .wz ,這邊使用 HaRepackerResurrected

註解 2022-05-18 153427.png

點選 Check.img 這是判斷任務狀態的節點;找到代碼 4646 並點開。
其中,0 代表觸發這個任務的條件;1 代表任務完成的條件

註解 2022-05-18 153935.png

我們點開 0 查看觸發條件是什麼。點開後可以知道,要觸發這個任務,要找指定 npc 與擁有 pet(寵物)。
以下分享常見的條件節點。
npc = 必要節點,指定該任務是由哪個 npc 負責發佈。
lvmin = 所需最小等級,達到指定等級才可以接取。
lvmax = 所需最大等級,超過指定等級才無法接取。
quest = 所需任務,可以設定接取目前任務需要完成或正在進行何種任務(不懂操作請留言)。
item = 需要的道具,身上擁有什麼道具時才能觸發任務。
interval = 間格時間,如果寫 0 完成後可馬上再接取,重複任務用的,裡面的時間計算方式應該是分鐘。
job = 需要何種職業,填寫指定職業代碼,就可設定擁有該職業才可觸發任務。

註解 2022-05-18 154044.png


我們要在觸發條件 0 中,加入腳本控制 startscript 這個節點。
請先點選 0 這個節點,讓軟體知道你要新增的位置後,按圖中操作,
點選文本類型。

觸發條件會建議寫在WZ中,不建議腳本控制,除非你的任務沒有任何接取條件。

註解 2022-05-18 155307.png

名稱打上 startscript ;值的部分打上 q4646s (紅色字的數字,可以自訂義,但通常會配合該任務原先設定的代碼
方便後期查找與修改),設定好後請按確認。

註解 2022-05-18 155502.png

完成條件 1 我們要新增 endscript 節點,操作方式與新增 startscript  相同。

註解 2022-05-18 160946.png


名稱打上 endscript ;值的部分打上 q4646e

註解 2022-05-18 161930.png

判斷任務完成條件,雖然也可全腳本控制,但會犧牲掉"任務指引"這項功能,
而如果要計算打怪次數,也沒辦法還原,所以要腳本+WZ兩種結合使用,
腳本部份可保證任務能順利結束,WZ則是協助判斷。

像是 4646 這個任務,點開 item 節點能看到,要完成需要代碼 4031921 這個物品 1 份。

註解 2022-05-18 162726.png


完成新增後,我們將修改好的檔案打包存檔,並導入與導出到端口中。

註解 2022-05-18 162957.png


我們打開端口,按照路徑  scripts → quest 進入任務腳本存放位置。

註解 2022-05-18 163207.png

我們直接複製一份現成的任務腳本,這裡複製 1021 這個腳本。

註解 2022-05-18 163252.png


我們將複製好的 1021 修改為 4646 ,並開啟遊戲看看修改效果。
如下圖,可以看到該任務已經改成腳本控制。

註解 2022-05-18 170716.png

接著我們就要編寫說明內容,這邊我們直接參考原版的任務說明 Say.img 編寫內容。
這邊需要一點腳本基礎,我直接將完成品貼給各位,請自行參考。

load('nashorn:mozilla_compat.js');
importPackage(Packages.client);

var status = -1;

function start(mode, type, selection) {
        if (mode == -1) {
                qm.dispose();
        } else {
                if (mode == 1)
                        status++;
                else
                        status--;
                if (status == 0) {
                        qm.sendNext("你想要成為像我一樣優秀的訓練師嗎?像我這種等級的訓練師,是可以輕而易舉地帶領多隻寵物喔!如何?你也想要帶領多隻寵物,對吧?");
                } else if (status == 1) {
                        qm.sendAcceptDecline("考慮的怎麼樣?想不想接取這個任務?");
                } else if (status == 2) {
                        qm.sendPrev("快去拿到 #t4031921# 然後交給我吧");
                } else if (status == 3) {
                        qm.forceStartQuest();
                        qm.dispose();
                } 
        }
}

function end(mode, type, selection) {
        if (mode == -1) {
                qm.dispose();
        } else {
                if (mode == 1)
                        status++;
                else
                        status--;
                if (status == 0) {
                        qm.sendNext("喔喔~你還滿有兩下子嘛!那就由我來傳授這項祕技吧!但我也不能免費教你,小小的謝禮是必要的。這東西在一般商人那裡是買不到的,是訓練寵物必要的特殊商品。");
                } else if (status == 1) {
                        qm.sendNextPrev("請接著通過 訓練師的秘方 這個任務吧,我會把稀有的寵物技能交給你");
                } else if (status == 2) {
                        qm.forceCompleteQuest();
                        qm.dispose();
                } 
        }
}
複製代碼


腳本語法大致上都跟一般腳本相同,差別在於開頭是qm。
這邊介紹比較特別的方法

qm.forceStartQuest(); = 任務開始。
qm.forceCompleteQuest(); = 任務結束
qm.sendAcceptDecline(); = 給予接受或不接受對話框。


完成後任務就基本沒問題,可以順利接續下一部份的任務。

註解 2022-05-18 174439.png


這樣大家學會了嗎?有什麼問題請在留言告知。





瀏覽 7664 回復 6

您需要登錄後才可以回帖 登錄 | 註冊會員

返回頂部