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