向 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
}
}