ZingS

Lv.1 初心者
管理成員
管理員
註冊
2022-09-04
文章
1
評分
0
聲望
0
[轉發於棉被家族Npc教學]
前言:
NPC 編寫是楓之谷伺服器中最基礎的一環,
發這篇文章的目的是為了讓大家可以直接學會 NPC 架構

真正要讓楓之谷伺服器開得好的話,還是往 Java 進行發展吧,希望馬論能夠有所突破
教學等級 1:學會建立 / 使用 NPC 編輯工具
首先 所有 NPC 檔案都位於服務端內的 scripts -> npc 資料夾內,
其中檔案架構為:"NPC 代碼.js"

NPC 代碼可以從 String.wz 中的 Npc.img 中找到,
Js 檔案建立完成後 建議使用 Netbeans 進行編寫

原因很簡單 如果發生程式錯誤 例如 { } 未完整包含 或者部分語法問題 可以優先處理
教學等級 2:實作簡單 NPC
先來看看以下簡單兩個 NPC,其中第一種為點選 NPC 後彈出對話框後進行簡單處理後則關閉
對話 (為所有 NPC 中最簡單的一種) 若 NPC 需要處理到第二個對話框時,則需要第二種架構,

包含狀態處理,以下為範例:
JavaScript:
//架構 1 (僅彈出對話框後立即結束對話):
function start() {
    cm.sendOk("您好 我是最簡單的 NPC"); // 開啟對話
    cm.dispose(); // 結束對話
}

//架構 1 (彈出對話框後進行簡單狀態處理後結束對話):
function start() {
    cm.sendOk("您好 我是另一個 NPC"); // 點選後觸發
}

function action(mode, type, selection) { // 進行簡單處理
    cm.warp(100000000, 0); // 傳送
    cm.gainItem(4001126, 1); // 獲得道具
    cm.sendOk("看到了吧 我已經幫你傳送並且給你一個道具了");
    cm.dispose();
}
//架構 2 (有狀態處理之 NPC 大部分 NPC 都為此種架構):
var status;

//NPC 教學總集 [第一章]

function start() {
    status = -1;
    action(1, 0, 0);
}

function action(mode, type, selection) {
    if (mode == 1) {
        status++;
    } else {
        status--;
    }
    if (status == 0) {
        cm.sendNext("按下下一個後將產生第二個對話框"); // 點選 NPC 後觸發
    } else if (status == 1) {
        cm.sendSimple("想要再看看如何調用狀態嗎 ?\r\n#b#L0#是\r\n#L1#否");
    } else if (status == 2) { // 每當跳往下一個對話框時 status 會增加 1
        if (selection == 0) { // 選擇為是 (L0)
            cm.sendOk("您好 這是第三個對話框 也就是狀態 2 的對話框");
            cm.dispose();
        } else if (selection == 1) { // 選擇為否 (L1)
            cm.dispose(); // 直接結束對話
        }
    }
}
教學等級 3:使用註解與其他開發者進行交流
當您完成一個 NPC 腳本開發後,需要發布與他人共同分享或描述其作用方式,最好的方法就
是使用註解,特別是重要部分,具有註解的 NPC 腳本將更容易與他人進行技術交流,以下為

部分註解範例 (補充說明:區段註解開頭 /* 結尾 */):

// 我就是註解 << 這些在以上 NPC 腳本作為說明使用
/* 我是區段註解
此種註解可以新增多行直到結束而不會被編譯器讀取 */
教學等級 4:常用 NPC 語法認識
NPC 教學總集 [第一章]

編寫 NPC 必須要對語法進行認識,否則最後將無法造出任何程式碼,以下提供常用 NPC 語法

.適用於所有端口:

補充說明:其中代碼部分皆能從 WZ 中發現,若不知道代碼是什麼,請先從 WZ 研究起

NPC 文字顏色 / 顯示道具 / 怪物 / 或其他 (用於對話框中):

#b = 藍色字體
#c[道具代碼]# 顯示玩家擁有多少個該道具
#d = 紫色字體
#e = 粗體
#f[IMG 位置]# - 顯示一個位於 WZ 中的圖像
#g = 綠色字體
#h # - 顯示玩家暱稱
#i[道具代碼]# - 顯示該道具圖片
#k = 黑色字體
#l - 選項關閉 (通常可省略)
#m[地圖代碼]# - 顯示地圖名稱
#n = 普通字體 (用於移除粗體)
#o[怪物代碼]# - 顯示怪物名稱
#p[NPC 代碼]# -顯示 NPC 名稱
#q[技能代碼]# - 顯示該技能名稱
#r = 紅色字體
#s[技能代碼]# - 顯示該技能圖片
#t[道具代碼]# - 顯示該道具文字
#v[道具代碼]# - 與 #i 相同 顯示道具圖片
#z[道具代碼]# - 與 #t 相同 顯示道具名稱
#B[百分比]# - 顯示進度條
#L[選項代號]# - 新增一個選項
\r\n - 產生換行
\t = 等同於 Tab (4 個空白)

cm.[指令] 用於對話方法:

dispose
結束語目前 NPC 對話 (通常末端一定要加入 否則將無法與其他 NPC 產生新對話)
範例:cm.dispose();

sendNext
顯示一個具有 "下個" 的 NPC 對話框 (當按下 "下個" 後 status + 1)
範例:cm.sendNext("您好");

sendPrev
顯示一個具有 "上個" 的 NPC 對話框 (當按下 "上個" 後 status - 1)
範例:cm.sendPrev("您好");

sendNextPrev
同時顯示具有 "上個" 與 "下個" 的 NPC 對話框
範例:cm.sendNextPrev("您好");

sendOk
顯示一個具有 "確認" 的 NPC 對話框 (同理 按下後 status + 1)
範例:cm.sendOk("您好");

sendYesNo
顯示一個具有 "是" 與 "否" 的 NPC 對話框 (若按下是 則 status + 1)
範例:cm.sendYesNo("您好");

sendAcceptDecline
顯示一個具有 "接受" 與 "拒絕" 的 NPC 對話框 (若按下接受 則 status + 1)
範例:cm.sendAcceptDecline("您好");

sendSimple
顯示一個無任何附加按鈕的對話框 (結束對話除外)
範例:cm.sendSimple("您好");

sendStyle
顯示髮型 / 臉型選擇畫面
範例:cm.sendStyle("您好", hair); // 必須先宣告 hair 內容
warp
傳送玩家至指定地圖
架構:cm.warp([地圖代碼], [傳送點位置]); // 若傳送點位置為 0 則表示預設傳送點
範例:cm.warp(100000000, 0);

openShop
開啟商店畫面
架構:cm.openShop([商店代碼]); // 商店代碼請參考資料庫中的 shops
範例:cm.openShop(5000);

haveItem
檢查玩家是否擁有足夠數量的道具
架構:cm.haveItem([道具代碼], [道具數量);
範例:cm.haveItem(2046894, 1);

gainItem
給予玩家指定數量的道具
架構:cm.gainItem([道具代碼], [道具數量]); // 道具數量可為正 (給予) 與 負 (失去)
範例:cm.gainItem(2046894, -1);

changeJob
改變玩家職業
範例:cm.changeJob(222);

getJob
取得玩家職業
範例:cm.getJob();
實作:通常用於條件判斷 if(cm.getJob() == 512) { // 程式區段 }

startQuest
開始一個任務
範例:cm.startQuest(1000);

completeQuest
完成一個任務
範例:cm.completeQuest(1000);
forfeitQuest
放棄一個任務
範例:cm.forfeitQuest(1000);

getMeso
取得玩家擁有的楓幣數量
範例:cm.getMeso();
實作:通常用於條件判斷 if(cm.getMeso() >= 10000000) { // 程式區段 }

gainMeso
給予玩家指定楓幣
架構:cm.gainMeso([楓幣數量]); // 楓幣數量可為 正(獲得) 與 負(失去)
範例:cm.gainMeso(-100000);

gainExp
給予玩家指定經驗值
架構:cm.gainExp([經驗值數量]); // 經驗值數量可為 正(獲得) 與 負(失去)
範例:cm.gainExp(10000);

getLevel
取得玩家等級
範例:cm.getLevel();
實作:通常用於條件判斷 if(cm.getLevel() <= 50) { // 程式區段 }

teachSkill
使玩家學習一個技能
架構:cm.teachSkill([技能代碼], [技能等級], [最大技能等級]);

get[能力值]
取得玩家能力值,能力值可為 HP MP STR INT DEX LUK
架構:cm.get[能力值]();
範例:cm.getSTR();
實作:通常用於條件判斷 if(cm.getSTR() >= 100) { // 程式區段 }
 
最後編輯:

幸運谷8+9

Lv.1 初心者
專屬會員
註冊
2022-09-10
文章
22
評分
0
聲望
0
厲害喔
 

附件

  • 1662753933359.jpg
    1662753933359.jpg
    15.2 KB · 查看: 0