創作內容

5 GP

Spigot 插件教學 #5-6

作者:檸檬│2018-12-08 21:53:35│巴幣:10│人氣:1454
第 5 章 - 物品
如果我想要讓玩家在沒有食物時可以輸入指令然後就取得一組牛排,那麼我們該怎麼做呢?
首先我們先按照第 3 章註冊指令以及創建 Class

在 Main#onEnable 中註冊
getCommand("food").setExecutor(new KitCommand());

public class KitCommand implements CommandExecutor {
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 0) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                ItemStack food = new ItemStack(Material.COOKED_BEEF, 64);
                ItemMeta itemMeta = food.getItemMeta();
                itemMeta.setDisplayName("§2美味牛排");
                itemMeta.setLore(new ArrayList<>(
                        Arrays.asList("第一行", "第二行")));
                food.setItemMeta(itemMeta);
                player.getInventory().addItem(food);
                return true;
            }

        }
        return false;
    }
}

以上程式碼的作用是: 當指令執行者是玩家,就會給予玩家 64塊名為"美味牛排" 並有兩行 Lore 的牛排
解釋:
if (sender instanceof Player) {
instanceof 是一個運算子 (常見的有 ==, > , < 等等),他在這裏的作用是比較前者是否後者的類別
如第三章所提到,sender 可以是 Player, ConsoleCommandSender 等

如果指令執行者是玩家,那麼就會進行接下來的動作

Player player = (Player) sender;
這裏我們把 sender 的類型從 CommandSender 轉換到 Player,就可以對執行指令的玩家進行更多動作(例如我們的主要目的 - 給予物品)

ItemStack food = new ItemStack(Material.COOKED_BEEF, 64);
在這裏,我們把 food 定義為一個新的 ItemStack (物品)
在 ItemStack 的建構子 (Constructor) 裏面,Material.COOKED_BEEF 可以替代成任何 Material,大家可以在 Intellij 中輸入 "Material." ,然後就會跳出一大堆物品名字啦~
而後面的數字就是物品的數量

ItemMeta itemMeta = food.getItemMeta();
itemMeta.setDisplayName("§2美味牛排");
itemMeta.setLore(new ArrayList<>(
        Arrays.asList("第一行", "第二行")));
food.setItemMeta(itemMeta);

ItemMeta 即物品的各種資料,例如名稱、Lore、附魔等等
我們這裏的做法是:先提取 food 的物品資料,經過編輯後,再把物品資料放回去

itemMeta.setDisplayName("§2美味牛排");
把物品資料中的名稱更改為 §2美味牛排

itemMeta.setLore(new ArrayList<>(
        Arrays.asList("第一行", "第二行")));
把物品資料中的 Lor e 設定為 "第一行", 第二行"

food.setItemMeta(itemMeta);
把編輯過後的物品資料放回去

player.getInventory().addItem(food);
如果我們要給予玩家物品,我們可以使用 PlayerInventory#addItem 來將物品新增到玩家的背包中
player.getInventory() 可以得到玩家的背包 (PlayerInventory),然後我們再使用 addItem() 來把剛才建構好的 food 新增到玩家的背包中


最後在 plugins.yml 中註冊指令,匯出插件,就可以測試了~
commands:
food:
usage: /food
description: 領取牛排



這樣我們就成功作出自定物品了!


第 6 章 - 設定檔
在第 4 章中,我們創建了一個事件監聽器並在玩家登入時傳送歡迎訊息
但如果我們想要修改歡迎訊息的話就必須修改程式碼並重新匯出插件
Spigot 提供了一個 Config API,讓我們可以輕易的儲存資料到一個名為 config.yml 的檔案中

要創建一個設定檔,我們要先設定預設檔案
在 Main#onEnable 中加入以下程式碼
FileConfiguration config = this.getConfig();
config.addDefault("welcome_message", "歡迎進入 檸檬伺服器!");
config.options().copyDefaults(true);
saveConfig();

以上程式碼就會在 config.yml 未建立時建立預設設定檔

但是 getConfig() 只可以透過 Main.class 存取,所以我們必須在事件監聽器 (EventListener.class) 的建構子中取得 Main.class 的實體 (instance)

Main plugin;

public EventListener(Main instance) {
    plugin = instance;
}

把以上程式碼加到 EventListener.class 中,我們就可以在 EventListener 中存取 getConfig() 了

接下來,再把我們於第 4 章中建立的 EventListener#onJoin 函式中傳送訊息的內容設定為
e.getPlayer().sendMessage(ChatColor.AQUA + plugin.getConfig().getString("welcome_message"));

這樣我們就完成了,匯出插件後測試看看

插件順利設定預設歡迎訊息

如果我們到 plugins/TutorialPlugin/config.yml,可以更改 welcome_message 為任何文字
更改後:

這樣就完成一個可設定的歡迎訊息了~
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4220107
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Minecraft|Spigot|插件

留言共 2 篇留言

血夜OAO
我記得原本不是有一篇更長的
刪掉太可惜了

12-09 20:09

檸檬
對啊被系統吃掉了
又忘記備份,只備份到0-6章12-09 20:11
血夜OAO
原來阿,辛苦了。教學文做的很專業喔

12-10 20:12

我要留言提醒:您尚未登入,請先登入再留言

5喜歡★lhemon412 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:Spigot 插件教學 ... 後一篇:Spigot 插件教學 ...

追蹤私訊切換新版閱覽

作品資料夾

pjfl20180818自己
06/03,03:03,告訴自己要加油!看更多我要大聲說17小時前


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

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