向 MOD 新增自定義聲音

此示例顯示如何向 MOD 新增新聲音並播放它們。首先,你需要一個格式為*.ogg 的聲音檔案。Minecraft 應用程式不允許任何其他格式,將被拒絕。

聲音檔案的名稱為:sound1.ogg

將聲音檔案放在以下路徑下:

/YourPath/src/main/resources/assets/MODID/sounds/sound1.ogg

MODID 替換為你為 MOD 定義的識別符號

接下來,你必須使用 UTF-8(標準)編碼建立一個 sounds.json,它定義名稱,資源,…以及其他自定義聲音的內容。此檔案將如下所示:

{
  "sound1": {
    "category" : "player",
    "sounds": [{
        "name": "MODID:sound1",
        "stream": false
      }
    ]
  },
  "sound2": {
    "category" : "ambient",
    "sounds": [{
        "name": "MODID:subfolder/sound2",
        "stream": true
      }
    ]
  }
}

作為這個 sounds.json 的解釋。

定義了 2 個聲音定義,因為我新增了一個示例,你可以調查如何新增乘法聲音。sound1 的類別為 player,第二個類別為 ambient,這意味著聲音的音量受使用者為播放器/環境聲音設定的音量設定的影響。name 是最重要的屬性,因為它指向聲音的資源。MODID 是你的 MOD 的識別符號,並且是必需的,因為應用程式將在你的 mod 的資源中搜尋檔案,否則它將搜尋 Minecraft 資源並且什麼都不會找到。stream 屬性意味著聲音將從檔案系統流式傳輸,只有超過 4 秒的聲音才需要。

你的自定義 sounds.json 檔案必須位於以下路徑:

/YourPath/src/main/resources/assets/MODID/sounds.json

現在,你將能夠將聲音載入到遊戲的登錄檔中。所以你必須建立一個初始化 SoundEvents 並處理註冊的類。

public class SoundRegistrator {
    public static final SoundEvent SOUND_1;
    public static final SoundEvent SOUND_2;

    static {
        SOUND_1 = addSoundsToRegistry("sound1");
        SOUND_2 = addSoundsToRegistry("sound2");
    }

    private static SoundEvent addSoundsToRegistry(String soundId) {
        ResourceLocation shotSoundLocation = new ResourceLocation("MODID", soundId);
        SoundEvent soundEvent = new SoundEvent(shotSoundLocation);
        soundEvent.setRegistryName(shotSoundLocation);
        return soundEvent;
    }           
}

之後你必須建立一個 SoundRegisterListener

public class SoundRegisterListener {
        @SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true)
        public void registerSoundEvents(RegistryEvent.Register<SoundEvent> event) {
           event.getRegistry().registerAll(SoundRegistrator.SOUND_1,SoundRegistrator.SOUND_2);
        }   
}

並將其註冊到 MinecraftForge.EVENT_BUS,如:

MinecraftForge.EVENT_BUS.register(new SoundRegisterListener());

最後你將能夠播放你的聲音:

void playSound(SoundEvent sound) {
    try {
        if (Minecraft.getMinecraft().world.isRemote) {
            EntityPlayerSP player = Minecraft.getMinecraft().player;
            Minecraft.getMinecraft().world.playSound(player, player.getPosition(), sound, SoundCategory.PLAYERS, RandomGenerator.getNextRandomVolumeLoud(), 1.0F);
        }
    } catch (Exception ex) {
       //Error happened
    }
}