如何自定义方块被放置/摧毁时的音效

USS.Shenzhou


版本信息
你使用的IDE:IntelliJ IDEA
你使用的IDE版本:2019.3.4
Forge版本: 28.2.3
Minecraft版本: 1.14.4

情况简述
我制作了一个最基本的方块,然后希望将这个方块被放置/摧毁是发出的声音自定义为游戏中没有的新声音。请问我该怎么做?
我目前是mc mod制作的初学者,主要依赖的教程为 @FledgeXu 在bilibili发布的视频。我在forge论坛和mcwiki上进行了搜索,似乎没有找到有用的内容。


FledgeXu


实际上Forge的文档已经说的挺明白了…


FledgeXu


如果要教程,这里也有。
https://www.bilibili.com/video/BV11g4y1b7vh?p=31


USS.Shenzhou


非常感谢!不过我在实践时遇到了一点问题:(对应视频的03:46秒处)在1.14.4的block文件中似乎不能override getAmbientSound ,可供override 的相关项似乎只有 getSoundtype 一个。请问我该怎么做?


USS.Shenzhou


还有一点,如果我希望在RegistryHandler.java而不是比如MyMod.java中注册声音的话,请问需要怎么做呢?我尝试像注册item和block一样去注册声音,但是失败了。


FledgeXu


  1. 我觉得更合适的方法是修改Block.PropertiesSoundType
  2. 你需要填SoundEvent,事实上所有需要注册的东西都继承了ForgeRegistryEntry

USS.Shenzhou


感谢您的回答!我在第一个问题上做出了尝试,发现如果使用统一的ModSounds.java(我想模仿教程中的ModBlocks.java)会在修改SoundType时更加简单。但是这引出了第二个问题,三楼教程视频中的写法似乎就变得不太适用了。我尝试模仿着之前block的文件:

package com.uss_shenzhou.rainbow6.sounds;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;
public class barricade_break extends SoundEvent {
    public barricade_break(ResourceLocation name) {
        super(name);

        this.setRegistryName("barricade_break");
    }
    ResourceLocation location = new ResourceLocation("rainbow6", "sounds/barricade_break");
    SoundEvent event = new SoundEvent(location);
}

但是我不太清楚在

public barricade_break(ResourceLocation name) {
     super(name);
}

这一段中应该如何修改,以及其余部分是否正确。还望您不吝赐教。


FledgeXu


不用这么麻烦,你可以看一下net.minecraft.util.SoundEvents这个类,原版的所有音效全部定义在这里了,你甚至不需要自己继承一个SoundEvent
最简单的用法是

    @SubscribeEvent
    public static void onContainerRegistry(RegistryEvent.Register<SoundEvent> event){
        event.getRegistry().register(new SoundEvent(new ResourceLocation("路径名")).setRegistryName("注册名"));
    }

当然我比较推荐把

new SoundEvent(new ResourceLocation("路径名")).setRegistryName("注册名")

单独抽出来,变成一个变量,然后再注册。


USS.Shenzhou


非常感谢!我在sounds.json中遇到了一点小问题,不过已经解决。再次谢谢您的帮助!


system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。