201608130206如何製作Spigot Plugin 第二章 第一個插件(三)

如何製作Spigot Plugin 第第一個插件()

 

往後的內容錯綜複雜,需要各種方法相互連結,後面的內容會越來越多,如果有沒介紹到的方法請告知,小弟可以在其他篇章內再做講解。

 

接下來的內容我們要介紹一下指令,問題是遊戲中要是指令太過於繁雜是非常不好的,尤其是指令使用名稱重複會出現許多問題,所以我們會教導各位圖形化介面,基本上有使用過箱子指令後都會覺得簡單又方便,並且讓玩家更能充分的掌握自己所能做的事,而不是呆呆的望著指令說明而不知所措,我們的架構很簡單就是利用箱子介面來完成簡單的傳送方法。

 

 

決定好箱子的內容我們就可以將我們的構想進行數位化,並且在遊戲中呈現出來,基本上是建立9格的箱子(0~8),並且在第一格(第一格為0)與第三格放入道具當作按鍵,道具上指示傳送位置。

Inventory

作出箱子可以使用[Bukkit.createInventory(箱子主人, 箱子格數(9的倍數最大54), 箱子的名稱)]來進行製作,不過箱子可不是指有儲存箱的介面,我們在製作時也可以設定箱子類型(InventoryType)

 

類型

說明

ANVIL

鐵砧介面。

BEACON

烽火台介面。

BREWING

釀造台介面。

CHEST

箱子介面。

CRAFTING

手工藝介面。

CREATIVE

創造模式的道具取得介面。

DISPENSER

發射器介面。

DROPPER

投擲器介面。

ENCHANTING

附魔台介面。

ENDER_CHEST

安德箱子介面。

FURNACE

熔爐介面。

HOPPER

漏斗介面。

MERCHANT

村民交易介面。

PLAYER

玩家的庫存介面。

WORKBENCH

工作台介面。

 

ItemStack

建立一個道具資料,在未放入箱子或人物庫存內都只是一筆資料,剛開始就需要指定道具類型(Material),由於道具類型破百個我們就不一一介紹了,直接建立起來的道具還可以利用參數來改變,例如羊毛的顏色等,參數的使用方法是[new ItemStack(道具類型, 道具數量, 參數(short)],建立起來的道具都是原始型態。

ItemMeta

原始的道具我們要先取出Meta而[ItemMeta]只是取出了基本層次,如書本,旗幟等,有更多近接的Meta可以進階段去修改,不過我們的按鈕只需要基本的顯示就可以了,我們先確認Meta可以為我們做哪些基本設置。

[setDisplayName(道具名稱)]在這裡我們可以修改道具預設的名稱。

[setLore(說明內容(List))]每個道具最好做簡單的敘述與簡介。

[addEnchant(附魔, 等級, 布林)]附魔可以增加道具的屬性,主要是附加在武器、工具、以及盔甲類。

[addItemFlags(ItemFlag)]系統本身還是會針對特殊的道具做說明標籤,使用這個方法可以隱藏這些系統標籤。

 

 

建立指令Class,由於我們不需要其他參數因此參數為0,而指令也只能由玩家開啟所以用[if]加以過濾以上兩種設定,避免由無法打開箱子的對象執行指令造成錯誤,接著我們使用[openInventory(Inventory)]讓執行的玩家開啟箱子介面。

 

 

如果空叫出一個箱子介面是不夠的,玩家們可能會在箱子內放置自己的物品,或者把已經準備好的「按鈕」帶走,當然最重要的是讓玩家觸發按下按鈕時所做的動作。

 

setCancelled(true)

取消點擊後的各種結果都會無效,不過當只限制部分區域時,游標上的道具還是可以放入限制區的空白格子,這部分需要做特殊處理,當然我們是做按鈕界面,限制全部的區域就不需要煩惱這部分。

InventoryAction

在這裡可以取得打開箱子後的部分動作,雖然我們已經截斷玩家所有的動作,但是後續的架構不允許點擊到介面外,加上沒點到按鈕也要加以排除。

 

動作

說明

CLONE_STACK

將點擊的最大數量道具移到游標上。

COLLECT_TO_CURSOR

道具可堆疊的最大數量移到游標上。

DROP_ALL_CURSOR

丟棄游標上所有道具。

DROP_ALL_SLOT

丟棄點擊位置內所有道具。

DROP_ONE_CURSOR

從光標丟棄一個道具。

DROP_ONE_SLOT

從點擊的位置上丟棄一個道具。

HOTBAR_MOVE_

AND_READD

將點擊的到具移到快捷欄,

並且將道具添加到玩家庫存。

HOTBAR_SWAP

點擊的道具和快捷欄進行交換。

MOVE_TO_OTHE_

INVENTORY

如果對向庫存有空間移動道具道該位置。

NOTHING

什麼都不會發生的點擊。

PICKUP_ALL

點擊位置內所有道具被移動到游標上。

PICKUP_HALF

點擊位置內一半道具被移動到游標上。

PICKUP_ONE

點擊位置內一個道具被移動到游標上。

PICKUP_SOME

點擊位置內一些道具被移動到游標上。

PLACE_ALL

游標上所有道具被移動到點擊的位置內。

PLACE_ONE

從游標中移動一個道具到點擊的位置內。

PLACE_SOME

游標上一些道具被移動到點擊的位置內。

SWAP_WITH_

CURSOR

游標上的道具與點擊的道具交換。

UNKNOWN

無法識別的點擊類型。

 

getSlot()

用這個方法可以在箱子、玩家庫存、快捷欄中取得位置(0~53,問題是打開介面也同時開啟這三個部分,所以我們採用[if]來限制區域,免得點到玩家庫存或快捷欄也能處發,如果取得的位置是[null] 會導致系統錯誤,在這之前要先排除玩家點擊在介面以外的地方,而點擊的位置就以道具代表按鈕引導玩家點擊。

teleport(Location)

玩家是[Entity]的一種,我們可以用這個方法瞬間移動實體到我們設定的位置上。

getSpawnLocation()

[World]中取得唯一的重生點位置,傳送玩家需要一個明確的位置,

getBedSpawnLocation()

[Player]中取得玩家放置床的位子,當然要睡過才能取得位置。

 

 

不用說我們還是要在Main Class內進行指令註冊,並加上啟動指令的代碼or名稱。

 

 

記得在插件資訊裡面加入指令訊息,不然是無法使用的,內容我們可以用[/help sp]查詢到,也方便讓使用的人了解指令訊息與操作。

 

 

在遊戲內執行指令,打開我們的箱子傳送介面,並點擊想傳送的位置進行傳送。由於傳送地點是以實質的[Location],所以當您傳送到世界的重生點時經常會埋進土裡,最好自行重新設定自己的世界重生點,床位的話比較簡單就在面對床的左下角,高度與擺放的位置相同。

回應
噗浪
國家
Flag Counter
累積 | 今日
loading......
隨風