2016年8月13日 星期六

如何製作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],所以當您傳送到世界的重生點時經常會埋進土裡,最好自行重新設定自己的世界重生點,床位的話比較簡單就在面對床的左下角,高度與擺放的位置相同。

2016年7月21日 星期四

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

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

只在控制台上顯示文字是不是不過癮,我們可以更進一步讓玩家感受到,讓玩家登入遊戲時看到我們想表達的訊息。



在這裡我們採用事件(Event)來做觸發點,[PlayerJoinEvent]是一個經常使用到的事件,每個玩家進入遊戲一定會觸發的事件,而我們所做的是歡迎詞跟一些資訊的顯示,[Player]即是代表觸發該事件的玩家,我們可以從API中的方法取得各式各樣的玩家資訊。

服務器版本[Bukkit]內含有大量靜態(Static)的方法,未來我們經常會用到,其中[getBukkitVersion()]可以取的Bukkit的版本,而[getVersion()]則是取得Spigot的建構版本。
服務器玩家人數:基本上人數在登入服務器頁面就可以得知,不過也有部分服務器會隱藏該項訊息,我們採用的方法一樣也是[現有玩家人數/最大玩家數],最大玩家數是服務器的設定值,我們可以由[getMaxPlayers()]來取得,而現有玩家就是Online Players所已取得方式就是[getOnlinePlayers().size()]
玩家IP:既然是玩家IP自然我們要從[Player]內著手,在這裡我們利用[getAddress().getHostName()]取得玩家IP,當然我們也可以順手取得Port再加以完整的顯示。
Ping:在這裡我們無法從API中查獲,所以我們需要打開前下載的Spigot文件夾[Spigot-Server],當然您也可以用反編譯取得這就是NMS(net.minecraft.server)NMS是不穩定的除了版本號變更會需要再寫一次以支援新版外,有可能這個方法在新版就無法使用,所以開發插件我們會盡量避免NMS上的使用。在這裡我們轉型為[CraftPlayer]再由[getHandle().ping]取得該玩家的Ping值。
§?:在[String]內你看到我放入不少「§」符號,遊戲內文字也是有顏色,我們可以採用內建顏色對我們的文字上色,色碼表上對照所需的顏色,我們也可以運用[ChatColor]來作著色,這種方法可以明確的在編碼內告知著色內容問題是文字轉換還是會轉成符號,這樣在比較時很容易發生錯誤。



我們還需要為自己的事件進行註冊,讓服務器執行我們的製作辛()血,記得修改一下前面教學的內容創造自己的風格。




最後觀賞一下自己的作品,感受一下完成之後的喜悅~