第 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 為任何文字
更改後:
這樣就完成一個可設定的歡迎訊息了~