Проверка предмета в руке

Версия Minecraft
1.15.2
103
2
2
Как проверить находится ли предмет в руке у игрока, если он выбран в руке, то возпроизводится звук адского портала, если не в руке, то звук перестаёт возпроизводится.
 
1,159
38
544
Метод getHeldItem() у игрока вернет тебе итемстак с предметом, который держит игрок. А дальше просто пишешь логику работы.

Ты ведь хороший мальчик и читал правила форума, верно? Ты же не собирашься, упаси боже :eek:, выпрашивать готовый код?
 
103
2
2
На звук я забил, у меня другая проблема. Я не могу сделать так, чтобы перемещение происходило через 80 тиков. Я в onItemUseFinish пихал System.out.print, воспроизведение звука и ничего. Поэтому я временно запихнул это в onItemRightClick, но мне это не нравится и я постоянно перемещаюсь между измерениями если зажму кнопку.
portable portal:
@Override

public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {

    ItemStack itemstack = playerIn.getHeldItem(handIn);

    if (!worldIn.isRemote) {

        //playerIn.playSound(ModSounds.portal_enter.get(), 1, 1);

        if (playerIn.world.dimension.isNether()) {

            playerIn.setPortal(playerIn.getPosition());

            playerIn.changeDimension(DimensionType.OVERWORLD);

        }else{

            playerIn.setPortal(playerIn.getPosition());

            playerIn.changeDimension(DimensionType.THE_NETHER);

        }

    }

    return ActionResult.resultPass(itemstack);

}



@Override

public int getUseDuration(ItemStack stack) {

    return 80;

}



@Override

public ItemStack onItemUseFinish(ItemStack stack, World worldIn, LivingEntity entityLiving) {

    //Тут должен был юзатся предмет

    return stack;

}
 
103
2
2
Я сделал звук во время того как игрок держит предмет. Но, как проверять, воспроизведён ли сейчас звук? Потому звук начинает воспроизводится каждый тик.
checkPortalInMainHand:
@SubscribeEvent
    public static void checkPortalInMainHand(final LivingEvent.LivingUpdateEvent event)
    {
        if(event.getEntity() instanceof PlayerEntity) {
            PlayerEntity player = (PlayerEntity) event.getEntity();
            ItemStack heldItem = player.getHeldItem(Hand.MAIN_HAND);

            ItemStack portal = new ItemStack(ModItems.PORTABLE_NETHER_PORTAL.get());
            if (heldItem.getItem() == portal.getItem()){
                System.out.print("Item in main hand");
                player.playSound(SoundEvents.BLOCK_PORTAL_AMBIENT, 1, 1);
            }


        }
    }
 
103
2
2
Это помогло, я поставил тики на 65 вместо 20 и звук воспроизводится. Только если я айтем начну юзать и то звук не прекратится. Он же длится 4 секунды и он будет играть пока не закончится. Я рылся в командах playSound и stopSound.
Пытался воспроизводить звуки так:
SPlaySoundPacket:
new SPlaySoundPacket(new ResourceLocation("block.portal.trigger"), SoundCategory.BLOCKS,playerIn.getPositionVec(),1,1);
и останавливать вот так:
SStopSoundPacket:
new SStopSoundPacket(new ResourceLocation("block.portal.trigger"),SoundCategory.BLOCKS);
Но, звук даже не играет таким образом. Думал смогу их так прерывать и в ивенте если айтем используется, то сразу вырубать ембиент.
 
Сверху