Как убрать флуд звука?

Версия Minecraft
1.7.10
222
5
28
Есть блок, у блока есть переопределённый метод onEntityCollidedWithBlock. Блок представляет собой куст. Я попытался сделать ситуацию, когда игрок касается блока и куст издаёт звук, что через него пролазят. Но проблема в том, что он жёстко флудит этим звуком. Как можно решить проблему? Решения по типу сделать кд на воспроизведения звука конечно работает, но как по мне это жёсткий костыль, хотелось бы сделать нормально.
 
Последнее редактирование:
Решение
Что вы за костыли предлагаете? Ваще поехали...
В энтити есть переменная distanceWalkedModified, которая считает сколько "прошла" сущность.
Делай простую проверку:
distanceWalkedModified != prevDistanceWalkedModified && world.rand.nextFloat() < 0.1
Сравниваем с предыдущим состоянием, чтобы не триггерить звук когда игрок просто стоит в блоке. Рандом же нужен чтобы не воспроизводить звук каждый раз когда игрок сдвинулся, поиграйся там с шансом, я думаю 0.05-0.1 будет в самый раз для твоей задачи.

tox1cozZ

aka Agravaine
8,456
598
2,893
Что вы за костыли предлагаете? Ваще поехали...
В энтити есть переменная distanceWalkedModified, которая считает сколько "прошла" сущность.
Делай простую проверку:
distanceWalkedModified != prevDistanceWalkedModified && world.rand.nextFloat() < 0.1
Сравниваем с предыдущим состоянием, чтобы не триггерить звук когда игрок просто стоит в блоке. Рандом же нужен чтобы не воспроизводить звук каждый раз когда игрок сдвинулся, поиграйся там с шансом, я думаю 0.05-0.1 будет в самый раз для твоей задачи.
 
214
11
59
Как и написал @Ivasik делай флаг, но если знаешь, что метод не вызовется, когда игрок сойдет с блока, то создай стандартный таймер с задачей и дилеем, а в нем проверяй все, что тебе нужно
Java:
new Timer(true).schedule(new TimerTask(
void run() {
if(flag) {
    if(игрок уже вне блока) {
        flag = false;
    }
}
}
), delay);
 
222
5
28
@Agravaine ваше решение мне подходит, спасибо. Ранее уже я уже пытался делать что-то подобное и определял движение игрока таким образом:

Java:
    private static final float POSITIVE_DELTA = 0.0001F;
    private static final float NEGATIVE_DELTA = -0.0001F;  

    @Override
    @SideOnly(Side.CLIENT)
    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
        if (world.isRemote) {
            if (entity.motionX > POSITIVE_DELTA || entity.motionX < NEGATIVE_DELTA) {
                if (entity instanceof EntityPlayer) {
                        Bush bush = Bushes.getBush(world.getBlockMetadata(x, y, z));

                        Minecraft.getMinecraft().getSoundHandler().playSound(new PositionedSoundRecord(
                                new ResourceLocation(bush.getSound()),
                                1.0F,
                                1.0F,
                                x, y, z
                        ));
                    }
            }
        }
    }

Есть ли существенная разница в определение того, идёт ли игрок между вашим способом и моим?
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,456
598
2,893
Кстати, почему ты воспроизводишь звук на клиенте? По логике другие игроки тоже должны слышать как кто-то пролазит через кусты.
На сервере можно вызывать world.playSoundAtEntity.
 
Сверху