top of page

NPC基本初級教學

已更新:2月2日


各位好,NPC算是要學習楓之谷必備要會的條件之一,這篇文章要來向各位講解關於NPC的基本運作,NPC的腳本也就是所謂很多人常常在講的的JS,通常會放在服務端主目錄的scripts資料夾內。


(一) JS編輯器選用

大眾都是使用NotePad++來編輯JS檔案

優點:可運用的功能多,例如可批量替代字符。



另外我個人是喜歡使用Visual Studio Code

優點:看起來很舒服,可以自動格式化腳本,不用自己編排格式。




(二)NPC的架構

NPC 主要有兩種:需要status的,以及不需要status的。如果NPC 會需要兩個以上的對話就會需要用到status;若不用,那status可能用不太到。請見以下範例:


不須status的NPC 一:

function start() { 
    cm.sendOk("我是一個沒有 status 的 NPC。"); 
    cm.dispose(); 
}

不須status的NPC 二:

function start() { 
    cm.sendOk("這是另一個沒有 status 的 NPC。"); 
} 

function action(mode, type, selection) { 
    cm.warp(100000000, 0); //飛往地圖 100000000
    cm.gainItem(4001126, 1); //發送物品 4001126 * 1
    cm.sendOk("看到了嗎?我不用 status 就能把你傳送走並給你道具。"); 
    cm.dispose(); 
}

須要status的NPC

var status = -1;

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

function action(mode, type, selection) { 
    if (mode == 1) { 
        status++; 
    } else { 
        status--; 
    } 
    if (status == 0) { 
        cm.sendNext("請按下一步,我才能繼續下一個 status。"); 
    } else if (status == 1) { 
        cm.sendSimple("你看到我如何操作 status 了嗎?\r\n #L0# 是 #l \r\n #L1# 否 #l"); 
    } else if (status == 2) { 
        if (selection == 0) { 
            cm.sendOk("我在這!這是另一個 status。如你在腳本中看到的,這個對話窗是在 status 2。"); 
            cm.dispose(); 
        } else if (selection == 1) { 
            cm.sendOk("好吧,這個對話窗也是在 status 2 :)"); 
            cm.dispose(); 
        } 
    } 
}  

(三)NPC內字體與字型的用法

#b = 字體改為藍色

#d = 字體改為紫色

#g = 字體改為綠色

#k = 字體改為黑色

#r = 字體改為紅色

#e = 字體改為粗體

#n = 字體改為正常 (移除粗體)

舉例一個NPC顯示紅色的文字 + 粗體字:

function start() { 
    cm.sendOk("#r這行字會顯示紅色哦!#e這行字會變粗哦!"); 
    cm.dispose(); 
}

(四)NPC其他必備顯示用法

#c[道具ID]# 顯示玩家背包中有多少 [道具ID]

#h # - 顯示玩家名稱

#m[地圖ID]# - 顯示地圖名稱

#o[怪物ID]# - 顯示怪物名稱

#p[NPCID]# - 顯示 NPC 名稱

#q[技能ID]# - 顯示技能名稱

#s[技能ID]# - 顯示技能圖片

#t[道具ID]# - 顯示道具名稱

#i[道具ID]# - 顯示道具圖片

#i[道具ID]:# - 顯示道具圖片+滑鼠移動圖片顯示

#z[道具ID]# - 顯示道具名稱

#v[道具ID]# - 顯示道具圖片

#B[%]# - 顯示進度條

#f[圖片位址]# - 顯示 WZ 檔案中的圖片

#F[圖片位址]# - 顯示 WZ 檔案中的圖片


舉例一個NPC顯示混沌卷軸資料:

function start() { 
    cm.sendOk("渾沌卷軸圖片: #i2049100# 道具名稱: #t2049100#"); 
    cm.dispose(); 
}

(五)NPC選項用法:

如果你的NPC需要給玩家選擇選項,就必須要使用這個用法。

#L[數子]# 選項開始

#l - 選項結束

範例:

var status = -1;

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

function action(mode, type, selection) { 
    if (mode == 1) { 
        status++; 
    } else { 
        status--; 
    } 
   if (status == 0) { 
        cm.sendSimple("你看到我如何操作 status 了嗎?\r\n #L1# 選項1 #l \r\n #L2# 選項2 #l"); 
    } else if (status == 1) { 
        if (selection == 1) { 
            cm.sendOk("你選了選項1!");            
        } else if (selection == 2) { 
          cm.sendOk("你選了選項2!");  
        } 
         cm.dispose(); 
    } 
}  

這邊解釋一下底下的範例 #L# 中間的數字決定下一個status運行所賦予的selection值

例如此NPC點了選項1 那麼再status == 1時 會運行到if (selection == 1) 所判斷的地方 也就是

cm.sendOk("你選了選項1!");


(五)NPC其餘用法:


\r\n - 換行

\r = 確認(回車)

\n = 新行

\t = Tab (4 個空格)

\b = Backwards

// 這是一種註解

/** 這裡是多行註解, 任何被 * 包起來的東西都不會被腳本解釋器解讀。 **/

這些也是寫NPC必備要會的東西之一,就不再舉例 初學者可以按照上面的方式嘗試修改。

另外補充說明cm.dispose(); 這個語句通常會出現在腳本要結束的時候必須添加(OD端)否則遊戲內會跳解卡。


(六)NPC對話用法

-----------------------------------------------

顯示確定對話框 OK 跟 下一個

cm.sendNext();

cm.sendOk();

Type = 0 如果點了停止 - mode = -1 如果點了下一個/確認 - mode = 1

-----------------------------------------------

顯示上一個&下一個

cm.sendNextPrev();

Type = 0 如果點了停止 - mode = -1 如果點了下一個 - mode = 1 如果點了上一個 - mode = 0

-----------------------------------------------

顯示是與否

cm.sendYesNo();

Type = 1 如果點了停止 - mode = -1 如果點了是 - mode = 1 如果點了否 - mode = 0

-----------------------------------------------

顯示要不要接受

cm.sendAcceptDecline();

Type = 12 如果點了停止 - mode = -1 如果點了接受 - mode = 1 如果點了拒絕 - mode = 0

-----------------------------------------------

獲取文字

cm.sendGetText();

沒事兒

-----------------------------------------------

獲取數字

cm.sendGetNumber();

Type = 3 如果點了停止 - mode = 0 如果點了確認 - mode = 1

-----------------------------------------------

cm.sendSimple();

Type = 4 如果點了停止 - mode = 0 如果點了選擇 - mode = 1

-----------------------------------------------

這邊舉例一個cm.sendGetNumber(); 用法

sendGetNumber需要帶入4個參數

cm.sendGetNumber( 文字, 初始定義, 最小值, 最大值);

var status = -1;

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

function action(mode, type, selection) { 
    if (mode == 1) { 
        status++; 
    } else { 
        status--; 
    } 
   if (status == 0) { 
        cm.sendGetNumber("你要輸入數字多少呢?",1,1,100); 
    } else if (status == 1) { 
        cm.sendOk("你輸入了數字" + selection + "!");   
        cm.dispose(); 
    } 
}  






















4,188 次查看0 則留言

最新文章

查看全部
文章: Blog2_Post
bottom of page