Музыка/Звук по ПКМ

Версия Minecraft
1.16.5
API
Forge
25
5
Хочу сделать гитару, сделал чтоб проигрывалась музыка (код оставлю тут), А вот как сделать чтоб при следующем ПКМ отменялось то что играло, и начинала снова играть? И чтоб если я убрал гитару из руки то музыка не играет?
Java:
 public GuitarItem(Item.Properties builder) {
        super(builder);
    }

    public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn)
    {
        ItemStack itemstack = playerIn.getHeldItem(handIn);
        worldIn.playSound((PlayerEntity) null, playerIn.getPosX(), playerIn.getPosY(), playerIn.getPosZ(),
                SoundEvents.BLOCK_NOTE_BLOCK_GUITAR, SoundCategory.NEUTRAL, 1.0F, 1.0F);

        return ActionResult.resultPass(itemstack);
    }
 
627
72
178
Вообще довольно сложная тема. Если ты хочешь через зажатие пкм делать - переопредели у своего предмета getItemUseDuration и отслеживай два ивента на сервере - LivingEntityUseItemEvent.Start, LivingEntityUseItemEvent.Stop. А как именно включить/выключить музыку я постараюсь разобраться в течении пары дней и отписаться тут, ибо пока не совсем понял
 
25
5
А как именно включить/выключить музыку я постараюсь разобраться в течении пары дней и отписаться тут, ибо пока не совсем понял
Да вот уже рою три дня, в Minecraft не нашёл, но сейчас рассматриваю код проигрывателя(Jukebox). Либо какие-то костыли ставить, чтоб музыка не вызывалась если уже играет. Может вообще выключать метод на время проигрывания музыки, а потом включать?))
Буду многократно благодарен вам.
 
219
12
119
Ох, играл когда то на одном сталкер проекте и там была такая штука, мне она очень нравилась, раньше тоже хотел сделать, но не понимал как, сейчас увидел твой пост и вдохновился опять, за пару часиков настрочил, если нужен пример с 1.7.10 могу скинуть
 
219
12
119
ItemSound:
public class ItemSound extends Item {

    private String soundName;

    public ItemSound(String name, String textures, String sound) {
        this.setTextureName(textures);
        this.setUnlocalizedName(name);
        this.setCreativeTab(CreativeTabs.tabBlock);
        this.soundName = sound;
        GameRegistry.registerItem(this, name);
    }

    public EnumAction getItemUseAction(ItemStack p_77661_1_) {
        return EnumAction.block;
    }

    public void onUpdate(ItemStack item, World world, Entity entity, int p_77663_4_, boolean p_77663_5_) {

    }

    public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer entity, int p_77615_4_) {
        if (!world.isRemote) {
            stopSound(entity);
        }
    }

    public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int p_77648_4_, int p_77648_5_,
            int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) {
        if (!world.isRemote) {

            if (startSound(player, soundName, player.posX, player.posY, player.posZ)) {

            } else {
                stopSound(player);
            }

        }
        player.setItemInUse(item, 99999990);

        return true;
    }

    @SideOnly(Side.SERVER)
    public static boolean stopSound(EntityPlayer player) {
        if (ServerEvent.soundMap.containsKey(player)) {
            SoundPos sound = ServerEvent.soundMap.get(player);
            Main.network.sendToAll(Main.network.createPacket(11, sound.name, sound.x, sound.y, sound.z));// отправляем
                                                                                                            // пакет на
                                                                                                            // клиент на
                                                                                                            // завершение
                                                                                                            // музыки
            ServerEvent.soundMap.remove(player);
            System.out.println("Музыка выключена");
            return true;
        }
        return false;
    }

    @SideOnly(Side.SERVER)
    public static boolean startSound(EntityPlayer player, String name, double x, double y, double z) {
        if (!ServerEvent.soundMap.containsKey(player)) {
            SoundPos sound = new SoundPos(name, x, y, z);
            ServerEvent.soundMap.put(player, sound);
            Main.network.sendToAll(Main.network.createPacket(10, sound.name, sound.x, sound.y, sound.z));// отправляем
                                                                                                            // пакет на
                                                                                                            // клиент на
                                                                                                            // старт
                                                                                                            // музыки
            System.out.println("Музыка включена");
            return true;
        }
        return false;
    }

    public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player) {
        return item;
    }

    public static class SoundPos {
        public final String name;
        public final double x, y, z;

        public SoundPos(String name, double x, double y, double z) {
            this.name = name;
            this.x = x;
            this.y = y;
            this.z = z;

        }

    }

}
ServerEvent:
public static HashMap<EntityPlayer, SoundPos> soundMap = new HashMap<>();

    @SubscribeEvent
    public void playerTick(PlayerTickEvent e) {
        if (e.phase == Phase.START)
            if (!e.player.worldObj.isRemote) {
                if (soundMap.containsKey(e.player)) {// Добавить проверку на то что игрок не двигался, ибо
                                                                // лень писать свою систему звуков, а в майнкрафте звук
                                                                // не может быть привязан к динамическому местоположению
                    ItemStack itemStack = e.player.getCurrentEquippedItem();
                    if (itemStack != null && itemStack.getItem() != Manager_Item_Registry.item) {
                        // придумаем еще что то
                    } else {
                        ItemSound.stopSound(e.player);
                    }

                }
            }
    }

    @SubscribeEvent
    public void playerDisconnect(PlayerLoggedOutEvent e) {

        ItemSound.stopSound(e.player);

    }

    @SubscribeEvent
    public void playerConnect(PlayerLoggedInEvent e) {

        for (SoundPos pos : soundMap.values()) {
            Main.network.sendTo(Main.network.createPacket(10, pos.name, pos.x, pos.y, pos.z),
                    (EntityPlayerMP) e.player);
        }

    }
ClientEvent:
private static Minecraft mc = Minecraft.getMinecraft();
    public static HashMap<SoundPos, ISound> soundMap = new HashMap<>();

    public static void playSound(double x, double y, double z, String name, float p_72980_8_, float p_72980_9_,
            boolean p_72980_10_) {
        SoundPos soundPos = new SoundPos(name, x, y, z);
        if (!soundMap.containsKey(soundPos)) {
            double d3 = mc.renderViewEntity.getDistanceSq(x, y, z);
            PositionedSoundRecord positionedsoundrecord = new PositionedSoundRecord(new ResourceLocation(name),
                    p_72980_8_, p_72980_9_, (float) x, (float) y, (float) z);
            soundMap.put(soundPos, positionedsoundrecord);

            if (p_72980_10_ && d3 > 100.0D) {
                double d4 = Math.sqrt(d3) / 40.0D;
                mc.getSoundHandler().playDelayedSound(positionedsoundrecord, (int) (d4 * 20.0D));
            } else {
                mc.getSoundHandler().playSound(positionedsoundrecord);
            }
        } else {
            stopSound(name, x, y, z);
            playSound(x, y, z, name, p_72980_8_, p_72980_9_, p_72980_10_);
        }
    }

    public static void stopSound(String name, double x, double y, double z) {
        SoundPos pos = new SoundPos(name, x, y, z);
        if (soundMap.containsKey(pos)) {
            ISound sound = soundMap.get(pos);
            if (mc.getSoundHandler().isSoundPlaying(sound)) {
                mc.getSoundHandler().stopSound(sound);
            }
            soundMap.remove(pos);
        }
    }
    
    
    @SubscribeEvent
    public void playerDisconnect(ServerDisconnectionFromClientEvent e) {
        for(ISound sound : soundMap.values()) {
            if(mc.getSoundHandler().isSoundPlaying(sound)) {
                mc.getSoundHandler().stopSound(sound);
            }
        }
        soundMap.clear();
    }

Packet:
public class PacketHandler implements IPacketHandler {

    @SideOnly(Side.CLIENT)
    public void handleClientSide(PacketBuffer buf, byte id, Minecraft mc, WorldClient world,
            EntityClientPlayerMP player) {
        
        
        if(id == 10) {//включаем музыку на клиенте
            
            String name = ByteBufUtils.readUTF8String(buf);
            double x = buf.readDouble();
            double y = buf.readDouble();
            double z = buf.readDouble();
            ClientEvent.playSound(x, y, z, name, 1, 1, false);
            
        }
        if(id == 11) {//отключаем музыку на клиенте
            
            String name = ByteBufUtils.readUTF8String(buf);
            double x = buf.readDouble();
            double y = buf.readDouble();
            double z = buf.readDouble();
            ClientEvent.stopSound(name, x, y, z);
            
        }
        
        
        
    }

    public void handleServerSide(PacketBuffer buf, byte id, WorldServer world, EntityPlayerMP player) {
        
        
        

    }

    public String getChannel() {
        return "test";
    }
}
Не забудь зарегистрировать свои ивенты
Единственное что я не сделал, это проигрывание музыки с определенного времени, что бы синхронизировать музыку для игроков которые только зашли на сервер
 
25
5
Не забудь зарегистрировать свои ивенты
Единственное что я не сделал, это проигрывание музыки с определенного времени, что бы синхронизировать музыку для игроков которые только зашли на сервер
Уфф, спасибо! Сейчас высплюсь,и буду разбираться. Отпишу
 
25
5
Ооо нет я совсем не разбираюсь в работе 1 7 10, тут другие библиотеки и методы, пожалуй наберусь опыта, и вернусь за твой код.
Вот бы можно было написать StopSound ,чтоб остонавливалось то что играло и после включать музыку. И всё это в 2 строки =((
 
Сверху