LV. 22
GP 305

【其他】教大家如何寫簡單的RPG MV插件

樓主 快閃小強 mmmm748748
GP18 BP-
 
※文長注意
 
本次教學將會教大家如何寫「簡單」的RPG MV插件,本篇以「反作弊插件」為主來做插件教學,不過因為我是自學的關係,如果我這教學寫得很爛還請大家見諒(掩面)
 
前置準備:
RPG Maker MV遊戲專案(1.5.2以上的版本)
 
 
先安裝Visual Studio Code之後,至於如何切換成繁體中文的這部分
本篇就不教了,你們就直接看梅問題教學網寫好的教學文
 
 
然後新增檔案並另存到你的遊戲專案之下的js/plugins/資料夾下,名字取(插件英文名稱).js,而本篇以「反作弊插件」為主,所以就取「Anti_Cheat.js」,然後這邊要注意的是存檔類型要存成JavaScript(*.js………..
 
 
 
接下來開始寫之前MV的插件編寫架構主要分兩大區塊,分別是「註解參數區塊」和「程式執行區塊」,我們先從註解「註解參數區塊」開始編寫。
 
註解參數區塊主要分成三塊分別是「一般設定」、「幫助」和「參數」
 
從第一行開始寫起,先弄一個插件的標題,並輸入Anti_Cheat.js
//=====================================================================
// Anti_Cheat.js
//=====================================================================
 
接下來標題之後下一行先用/*: …….*/並在裡面分別輸入「@plugindesc」、「@author」、「@help

 
@plugindesc (輸入插件描述或版本更新代號)
@author (輸入作者名稱)
@help
(輸入說明幫助)
 
 
/*:
* @plugindesc RPG MV中的遊戲中防範玩家使用非法的作弊手段
* @author Mirai
* @help
*
*/
 
至於@help的部分,我個人習慣是打這樣的格式
 
*
* ─ 插件簡介
* RPG MV中的遊戲中防範玩家使用非法的作弊手段
*
* ─ 更新履歷
* V1.0 - 初次版本的插件
*
* ─ 使用說明
*#$$%^&&?>>_<||
*
* ─ 插件指令
* 該插件的設置功能描述
* -----------
* --插件指令:Cheat Set [XX] [OO]
* -----------
*
*
 
 
接下來就是設置參數的部分,先給大家看兩張成果圖
 
 


 
然後在下一行加入這段程式碼
* @param BasicGroup
* @text 基本參數
*
* @param AntiChest Switch
* @desc 是否開啟反作弊功能
* @text 反作弊開關
* @parent BasicGroup
* @default true
* @type boolean
* @on 開啟
* @off 關閉
*
* @param AntiChest Group
* @text 反作弊功能參數
*  
* @param AntiChest Gold
* @desc 防範金錢方面的篡改
* @text 金錢方面
* @parent AntiChest Group
* @typestruct<Gold>
* @default
 
參數這邊我是參考國外Github的這個範本
 
 
@param Basic Group →為參數群組/標籤名稱,這點很重要的就是用來串接程式碼的字數數值的標籤
 
@text 基本參數  →為參數名稱,這部分是給使用者看的
 
當然如果還加上其他像是@parent default @type 等等就會從單純的參數群組變為參數值
 
@desc 是否開啟反作弊功能 →為參數說明,這是給使用者看的
@parent Basic Group  →為歸類所在的參數群組,用於分類參數之用途
@default true  →為預設值
@type boolean  →為參數類別,boolean為開啟(true)和關閉(false)的布林值參數類別
@on 開啟 →為開啟的名稱
@off 關閉 →為關閉的名稱
 
接下來這塊用到所謂的結構將類別@type 輸入struct<Gold>,而Gold為等等要串接的參數結構的名稱
* @param AntiChest Gold
* @desc 防範金錢方面的篡改
* @text 金錢方面
* @parent AntiChest Group
* @typestruct<Gold>
* @default
 
 
然後在最後一行 也就是 */ 之後的下一行插入以下程式碼,而這個就是串接Gold的結構參數
 
這邊說明一下這邊所用的@type的部分,除了剛剛用到的開啟(true)和關閉(false)的boolean,還有用於整數值的數值參數number,以及用於文字內容的string這三個,當然想要運用其他的參數類別你們大家就自己摸索看PluginEditorDemo.js給的範本吧
 
/*~struct~Gold:
* @param GoldSwitch
* @desc 是否開啟金錢方面的反作弊功能
* @text 金錢反作弊開關
* @default true
* @type boolean
* @on 開啟
* @off 關閉
*
* @param Gold Num
* @desc 金錢方面的假如超過該數值即為作弊行為
* @text 金錢最大值
* @type number
* @default 9999999
*
* @param Gold Text
* @desc 當檢測到金錢方面的作弊行為時的提示訊息
* @text 金錢作弊提示
* @type string
* @default 檢測到金錢異常
*
*
*/
 
 
接著就是重頭戲要開始打程式碼了,先在*/ 之後的下一行用
(function () {……………. })();然後在function ()的內部加入以下程式碼
 
(function () {
    var Anti_Cheat_SD = {};
    var parameters = PluginManager.parameters('Anti_Cheat');
    var Anti_Chest_Switch = String(parameters['Anti ChestSwitch'] || null);
    var value_1 = PluginManager.parameters('Anti_Cheat')['Anti ChestGold'];
    var realValue_1 = JSON.parse(value_1)
    var Gold_A = String(realValue_1["GoldSwitch"] || null);
    var Gold_B = Number(realValue_1["GoldNum"] || null);
    var Gold_C = String(realValue_1["GoldText"] || null);
})();
 
 
var Anti_Cheat_SD = {}; //建立變數名稱,等等會用到
 
var parameters =PluginManager.parameters('Anti_Cheat');  
//建立一個串接所有參數標籤的變數,然後括弧內就輸入插件的英文名稱,記得要跟插件檔案名稱Anti_Chea.js一致
 
var Anti_Chest_Switch =String(parameters['Anti Chest Switch'] || null);
//建立一個串接「反作弊開關」參數標籤的變數,而String為轉換成字串
 
 
var value_1 =PluginManager.parameters('Anti_Cheat')['Anti Chest Gold'];
//建立一個串接「金錢方面」參數結構的變數
 
var realValue_1 = JSON.parse(value_1);
//建立一個用JSON.parse來串接「金錢方面」參數結構,等等要用於Gold的結構之用途
 
 
var Gold_A = String(realValue_1["GoldSwitch"] || null);
var Gold_B = Number(realValue_1["GoldNum"] || null);
var Gold_C = String(realValue_1["GoldText"] || null);
 
//使用剛剛的realValue_1變數分別串接Gold結構裡的三個變數值,
而Number為轉換成數值
 
接下來在最後一行的})(); 之前加入以下程式碼
 
Anti_Cheat_SD._scene_map_update = Scene_Map.prototype.update;
    Scene_Map.prototype.update = function () {
        Anti_Cheat_SD._scene_map_update.call(this);
        if (Anti_Chest_Switch == 'true') {
            if (Gold_A == 'true') {
                if ($gameParty.gold() >= Gold_B) {
                   //$gameTemp.reserveCommonEvent(2);
                   throw new Error(Gold_C);
                }
            }
        }
    }
 
Anti_Cheat_SD._scene_map_update =Scene_Map.prototype.update;
Scene_Map.prototype.update = function () {
Anti_Cheat_SD._scene_map_update.call(this);
//前三行比較難解釋,大致就是用Anti_Cheat_SD的變數來呼叫地圖的運行區塊
 
  if(Anti_Chest_Switch == 'true') {   //判斷當「反作弊開關」為開啟的時候
  if(Gold_A == 'true') {   //判斷當「金錢反作弊開關」為開啟的時候
  if($gameParty.gold() >= Gold_B) {   //判斷當玩家的所持金錢大於等於該數值,至於$gameParty.gold()可以在rpg_objects.js的大概9514行左右可以找到
 
 
 
throw new Error(Gold_C);   //執行指定文字提示的錯誤指令
 
 
 
順便放上完整(?)的程式碼
 
//=============================================================================
// Anti_Cheat.js
//=============================================================================
/*:
* @plugindesc RPG MV中的遊戲中防範玩家使用非法的作弊手段
* @author Mirai
* @help
*
* ─ 插件簡介
* RPG MV中的遊戲中防範玩家使用非法的作弊手段
*
* ─ 更新履歷
* V1.0 - 初次版本的插件
*
* ─ 使用說明
*#$$%^&&?>>_<||
*
*
* @param BasicGroup
* @text 基本參數
*
* @param AntiChest Switch
* @desc 是否開啟反作弊功能
* @text 反作弊開關
* @parent BasicGroup
* @default true
* @type boolean
* @on 開啟
* @off 關閉
*
* @param AntiChest Group
* @text 反作弊功能參數
*  
* @param AntiChest Gold
* @desc 防範金錢方面的篡改
* @text 金錢方面
* @parent AntiChest Group
* @typestruct<Gold>
* @default
*
*/
/*~struct~Gold:
* @param GoldSwitch
* @desc 是否開啟金錢方面的反作弊功能
* @text 金錢反作弊開關
* @default true
* @type boolean
* @on 開啟
* @off 關閉
*
* @param Gold Num
* @desc 金錢方面的假如超過該數值即為作弊行為
* @text 金錢最大值
* @type number
* @default 9999999
*
* @param Gold Text
* @desc 當檢測到金錢方面的作弊行為時的提示訊息
* @text 金錢作弊提示
* @type string
* @default 檢測到金錢異常
*
*
*/
//=============================================================================
// ** PLUGIN PARAMETERS - 插件參數
//=============================================================================
(function () {
    var Anti_Cheat_SD = {};
    var parameters = PluginManager.parameters('Anti_Cheat');
    var Anti_Chest_Switch = String(parameters['Anti ChestSwitch'] || null);
    var value_1 = PluginManager.parameters('Anti_Cheat')['Anti ChestGold'];
    var realValue_1 = JSON.parse(value_1)
    var Gold_A = String(realValue_1["GoldSwitch"] || null);
    var Gold_B = Number(realValue_1["GoldNum"] || null);
    var Gold_C = String(realValue_1["GoldText"] || null);
    Anti_Cheat_SD._scene_map_update = Scene_Map.prototype.update;
    Scene_Map.prototype.update = function () {
        Anti_Cheat_SD._scene_map_update.call(this);
        if (Anti_Chest_Switch == 'true') {
            if (Gold_A == 'true') {
                if ($gameParty.gold() >= Gold_B) {
                   throw new Error(Gold_C);
                }
            }
        }
    }
})();
 
 
以上就是我本人大致上簡易版本的MV插件編寫方式,
說真的我實在很不擅長教別人,如果我這個教學寫得真的很爛還請見諒,只是希望大家看完之後能夠多在R版或其他論壇等等多多發問爬文來吸收一些知識,也祝大家以後能寫出比我還強的MV插件喔XDD

本篇文章同步發佈到我的小屋

18
-
未登入的勇者,要加入討論嗎?
板務人員:

2692 筆精華,03/25 更新
一個月內新增 1
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】