Re: [討論] 有沒有人在寫bukkit plugin?

看板Minecraft作者 (!H45)時間13年前 (2013/01/07 13:50), 編輯推噓1(106)
留言7則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《vencin1987 (迪納敏斯)》之銘言: : 感謝協助 : 但這看起來只能解決工具 : 武器部分應該EntityDamageByEntityEvent : 可從getEntity拿到player再拿到手上道具處理 : 但裝備部分看起來都是要迭代物品欄,我擔心會對SERVER負擔太重 : 不知道有沒有可能用類似複寫setDurability的方式處理(應該不太行 : 所以最後我選擇裝了RepairRecipe解決 武器的部分,我沒經驗,PASS,只討論下面附魔的部分。 : 另外 : 看到你有寫附魔部分 我目前的理解是 : 就算接了event 但不做任何處理 : (例如接了BlockBreakEvent但public void OnBlockBreak(BlockBreakEvent e){}) : 原本該發生的事應該不會有影響 例如耐久度附魔 : 不知道有沒有誤會 這幾行寫得模糊不清,我感覺你已經懂了,但是文句沒寫對。 附魔的部分並不是接了event(事件)不做任何處理 解釋這件事情必須從「如何提升最大耐久度」說起 一般而言,在遊戲內可以附魔「耐久」讓工具可以用更久 若不去看工具耐久度的變化 可能會誤以為工具可以用得更久是因為最大耐久度提升了 事實上附魔「耐久」的功能並沒有增加最大耐久度,最大耐久度並沒有變化 每次使用工具時,附魔「耐久」是增加一個機率使工具耐久度不變 所以說,如果今天想要開發一個增加工具最大耐久度的Plugin 由於目前還沒有辦法真的增加工具最大耐久度 所以可以從類似附魔「耐久」的方式著手 也就是說,在玩家破壞方塊的時候,增加一個機率讓工具耐久度不發生變化 在程式實作方面,可分兩種方法達成目的: 1. 取消原 BlockBreakEvent 事件,對應的程式碼是 event.setCancelled(true); 這樣craftBukkit就不會對方塊被破壞事件做出任何動作 (在客戶端會看到方塊破壞掉之後,馬上又長回去) 走這條路,要自己撰寫事件處理器,處理所有應發生的事情 如:方塊換成空氣、掉出經驗值、工具耐久度變化……等 (讓客戶端看到方塊確實被破壞掉了) 2. 不取消原 BlockBreakEvent 事件 這方法要注意 事件處理順序是先經過Plugin才傳送到craftBukkit 傳送到craftBukkit的時候,視附魔有無耐久而定,耐久度有一定機率不會變化。 走這條路,只要將耐久度設定減一就可以了 (讓工具變新) 但若有附魔耐久的話,工具有一定機率會愈來愈新,也許最後會變成全新的。(bug?) : ※ 引述《H45 (!H45)》之銘言: : : 事件:BlockBreakEvent 方塊破壞事件 : : 耐久度增減相關類別與方法: : : Player player = blockBreakEvent.getPlayer(); // 取得破壞方塊的玩家 : : ItemStack item = player.getItemInHand(); // 取得玩家手上的物品 : : short durability = item.getDurability(); // 取得物品的耐久度 : : item.setDurability(durability - 1); // 耐久度減一 : : (全新的物品耐久度是零,所以耐久度加一,是讓物品愈來愈舊,加到最後壞掉。) : : 附魔相關: : : if (item.containsEnchantment(Enchantment.DURABILITY)) { // 有無耐久附魔 : : // 取得耐久附魔等級 : : int level = item.getEnchantmentLevel(Enchantment.DURABILITY); : : if (random.nextInt(level + 1) == 0) { // 一定機率扣耐久 : : // TODO 減少耐久度 : : } : : } : : 相關 Plugin 可參考: : : 1. Lumberjack (專案較小): https://github.com/ChinChangYang/Lumberjack : : 2. mcMMO (專案較大): https://github.com/mcMMO-Dev/mcMMO -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.247.22

01/08 00:56, , 1F
我那5行的意思是 就算接聽EVENT 只要沒取消 原本該
01/08 00:56, 1F

01/08 00:56, , 2F
發生的處理都會照常發生
01/08 00:56, 2F

01/08 00:57, , 3F
並不是指留空method會讓原本該發生的stack中斷
01/08 00:57, 3F

01/08 00:57, , 4F
所以我才問java有沒有辦法把原本bukkit的實例蓋掉
01/08 00:57, 4F

01/08 00:59, , 5F
因為我看到第一個範例 有一個地方只繼承 這樣會有效?
01/08 00:59, 5F

01/08 01:06, , 6F
我看還是找個時間來讀讀bukkit 的source會比較快
01/08 01:06, 6F

01/08 01:08, , 7F
只是上班整天都在弄code回家就有點懶..
01/08 01:08, 7F
看不懂上面這段 編輯:之前我推文語氣有點衝,修掉了。 ※ 編輯: H45 來自: 114.33.235.24 (01/08 20:15)
文章代碼(AID): #1Gwc8S4N (Minecraft)
文章代碼(AID): #1Gwc8S4N (Minecraft)