[1.7.10] Не работает MovingSound при установленном CustomNPCs

Версия Minecraft
1.7.10
API
Forge
39
8
5
Здравствуйте, столкнулся с очень странной проблемой - звук без CustomNPCs работает, а с ним исчезает. В логах пусто, в конфиге CNPC тоже ничего подозрительного не нашёл. Декомпилировал CNPC, очевидных инжектов в ванильный код не вижу. Кто-нибудь сталкивался с подобным? Что могло пойти не так?
Этот ивент срабатывает, playSound() выполняется:
@SubscribeEvent
public void onEntityJoinWorld(EntityJoinWorldEvent event) {
    if (event.entity instanceof EntityPlayer && event.world.isRemote){
        EntityPlayer player = (EntityPlayer)event.entity;
        if (player == Minecraft.getMinecraft().thePlayer) {
            Minecraft.getMinecraft().getSoundHandler().playSound(new MySound(player));
        }
    }
}

Конструктор срабатывает, но update() c CNPC никогда не вызывается:
public class MySound extends MovingSound {
    private EntityPlayer player;


    public MySound(EntityPlayer player) {
        super(new ResourceLocation("modid:noise"));
        this.player = player;
        repeat = true;
        repeatDelay = 0;
        volume = 0.5f;
        pitch = 1f;
    }

    @Override
    public void update() {
        if (player.isDead || player.worldObj == null) {
            donePlaying = true;
            repeat = false;
            return;
        }
        xPosF = (float) player.posX;
        yPosF = (float) player.posY;
        zPosF = (float) player.posZ;
    }
}
 
Решение
Таким вот костылём это обошёл:
Java:
public class MySound extends MovingSound {
    private static MySound playing = null;
    private EntityPlayer player;

    public static void tryRunning(EntityPlayer player){
        SoundHandler sounds = Minecraft.getMinecraft().getSoundHandler();
        if (sounds.isSoundPlaying(playing))
            return;
        playing = new MySound(player);
        sounds.playSound(playing);
    }
  
    //...
}
Java:
@SubscribeEvent
public void playerTick(TickEvent.PlayerTickEvent event){
    if (event.phase != TickEvent.Phase.START)
        return;
    if (event.player.worldObj.isRemote){
        MySound.tryRunning(event.player);
    }
}
39
8
5
Нашёл гада... В первый же тик после подключения игрока к миру CNPC удаляет все работающие звуки.
Java:
public class ClientTickHandler {
  private World prevWorld;
    
  @SubscribeEvent(priority = EventPriority.LOWEST)
  public void onClientTick(TickEvent.ClientTickEvent event) {
    if (event.phase == TickEvent.Phase.END)
      return;
    Minecraft mc = Minecraft.getMinecraft();
    if (this.prevWorld != mc.theWorld) {
      this.prevWorld = mc.theWorld;
      mc.getSoundHandler().stopSounds();
    }
  }
}
 
39
8
5
Таким вот костылём это обошёл:
Java:
public class MySound extends MovingSound {
    private static MySound playing = null;
    private EntityPlayer player;

    public static void tryRunning(EntityPlayer player){
        SoundHandler sounds = Minecraft.getMinecraft().getSoundHandler();
        if (sounds.isSoundPlaying(playing))
            return;
        playing = new MySound(player);
        sounds.playSound(playing);
    }
  
    //...
}
Java:
@SubscribeEvent
public void playerTick(TickEvent.PlayerTickEvent event){
    if (event.phase != TickEvent.Phase.START)
        return;
    if (event.player.worldObj.isRemote){
        MySound.tryRunning(event.player);
    }
}
 
Последнее редактирование:
Сверху