向 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
現在,你將能夠將聲音載入到遊戲的登錄檔中。所以你必須建立一個初始化 SoundEvent
s 並處理註冊的類。
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
}
}