iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 10
2

https://ithelp.ithome.com.tw/upload/images/20190925/20115823ZiykAeKjQo.png

前幾天我們把豬這個實體轉變成不會動的裝飾品,花了很多時間解釋做法與變更大小。這樣的行為其實有點違背Minecraft的精神 (我們應該自定義一個長得像"豬"的物品來實作)。

而且太過複雜的程式碼似乎會讓想要自行開發模組的人望而卻步?

因此,今天開始我們要來做一些簡單但是不一樣的事件 - 實體的跳躍。

超級彈跳

如果你有玩過一陣子,應該知道在創造模式下的世界是可以飛行的。我們現在自行開發的模組,未來是希望可以分享給其他人一起玩 (如果你是喜愛單機遊戲的請自動忽略這段),因此,在一般的情況下,通常不會開一個創造模式來與其他玩家一起玩。

畢竟,上帝只有一個,不是嗎?

預設一個玩家可以跳1.252個方塊,要跳過一個方塊通常是沒問題,但我們會有情況需要讓玩家可以跳得更高 (比如你意外的往腳底下挖了100公尺深),所以我們需要讓玩家擁有跳的更高的能力。

  1. 我們先在com.ithome.mymod套件下新增一個SuperJump類別,並且加入LivingJumpEvent處理跳躍的事件。

    public class SuperJump {
        @SubscribeEvent
        public void jumpHigher(LivingJumpEvent event) {
    
        }
    }
    
  2. 在新的jumpHigher方法內,判斷實體是否為玩家;若為是,將跳躍(Y軸方向)的高度乘上5 (實際大約可以跳23個方塊高)。

    @SubscribeEvent
    public void jumpHigher(LivingJumpEvent event) {
        if(event.entity instanceof EntityPlayer) {
            event.entity.motionY *= 5;
        }
    }
    
  3. 在主程式內註冊我們新的類別。

    MinecraftForge.EVENT_BUS.register(new SuperJump());
    
  4. 存檔後進入遊戲,這次我們不要使用創造模式,嘗試跳躍看看:
    https://ithelp.ithome.com.tw/upload/images/20190925/20115823Py862K43iA.png

    https://ithelp.ithome.com.tw/upload/images/20190925/20115823YjAddp6OPD.png

  5. 嗯...是可以跳得很高沒錯,但好像落地的時候會受傷,這是因為在Minecraft裡如果從超過3個方塊的地方掉落,我們就會受傷!所以,我們需要處理掉落時的事件LivingFallEvent
    SuperJump類別內,加入新的avoidFallDamage方法,並且判斷當玩家為潛行時,就不會造成受傷。

    @SubscribeEvent
    public void avoidFallDamage(LivingFallEvent event) {
        // 是玩家才進行處理
        if(event.entity instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer) event.entity;
            // 當玩家為潛行狀態時,將此事件取消 (即沒有"掉落"這個狀態,就不會受傷)
            if(player.isSneaking()) {
                event.setCanceled(true);
            }
        }
    }
    
  6. 再次存檔進入遊戲,你應該可以在掉下時按下Shift鍵來避免落地時受傷。到目前為止,我們可以將這個模組做的更好一點:

    • 讓潛行降落時的速度不要這麼快
    • 裝備降落傘
  7. 首先是潛行降落的速度調整。這個可以透過我們調整第一步驟的motionY變數來達到目的。問題是,我們要將這個邏輯放在哪個事件呢?

    • 放在LivingFallEvent : 看起來很直覺,但這個事件已經是"掉落開始後"處理的,掉落速度在這裡設定不會有效果。
    • 放在LivingJumpEvent : 嗯...這應該是來鬧的
    • 放在PlayerTickEvent : 這個是在遊戲的每一刻處理玩家的事件,我們可以在這邊改變潛行時的速度。
  8. 回到SuperJump類別,加入新的equipParachute方法。

    @SubscribeEvent
    public void equipParachute(PlayerTickEvent event) {
        EntityPlayer player = event.player;
        if(player.isSneaking()) {
            player.motionY = -0.05;
        }
    }
    
  9. 然後你就可以進去遊戲裡面試看看潛行時是否會放慢速度了...什麼?你說沒有效?
    這裡其實我們還需要在主程式內的另一個事件巴士上註冊這個SupoerJump事件類別去處理PlayerTickEvent這個事件 (因為這個事件是在net.minecraftforge.fml.common.gameevent套件下):

    FMLCommonHandler.instance().bus().register(new SuperJump());
    

    若有興趣想知道原理的人可以看看這篇,這裡由於篇幅會太長太複雜的關係,就不詳細闡述。

好了,再次回到Minecraft,玩看看我們新的模組,享受頭頂沒有東西(?)卻可以緩慢降落的感覺吧!

關於如何在頭頂上掛上降落傘可以參考這個模組,我們明天將講述如何使用指令。


上一篇
[Day9] Minecraft版的俄羅斯娃娃(下)
下一篇
[Day11] 用指令玩遊戲
系列文
[Minecraft - 當個創世神] 從玩遊戲到設計遊戲30

尚未有邦友留言

立即登入留言