Даже не знаю как назвать. "Баг" кароче

Версия Minecraft
1.12.2
2,932
44
598
Доброго времени суток Земляне и Чужие!
Вот заметил у себя такую "Фичу":
Java:
if (!world.isRemote && world.getBlockState(blockPos).getBlock() == Blocks.SNOW) {
            if(entityPlayer.isSneaking()) {
            world.setBlockState(blockPos, Blocks.SNOW_LAYER.getDefaultState().withProperty(BlockSnow.LAYERS, 7));
            entityPlayer.inventory.addItemStackToInventory(new ItemStack(Items.SNOWBALL));}
            return;
        }
Такое чувство как будто я неправильно установил проверку, и вот эти строчки кода срабатывают два раза:
world.setBlockState(blockPos, Blocks.SNOW_LAYER.getDefaultState().withProperty(BlockSnow.LAYERS, 7)); entityPlayer.inventory.addItemStackToInventory(new ItemStack(Items.SNOWBALL));}

Я опять где-то скобки забыл поставить?
 
Последнее редактирование:
5,018
47
783
Откуда берется blockpos?
Проверку на сервер\клиент надо отдельно лучше проводить
 

Icosider

Kotliner
Администратор
3,603
99
664
Проверку на сервер\клиент надо отдельно лучше проводить
Лол что? Если он сделает так:
Java:
if (!world.isRemote)
{
    if (world.getBlockState(blockPos).getBlock() == Blocks.SNOW)
    {
        if(entityPlayer.isSneaking())
        {
            world.setBlockState(blockPos, Blocks.SNOW_LAYER.getDefaultState().withProperty(BlockSnow.LAYERS, 7));
            entityPlayer.inventory.addItemStackToInventory(new ItemStack(Items.SNOWBALL))
        }
        return;//Эм, зачем?
    }
}
// или так
if (!world.isRemote && world.getBlockState(blockPos).getBlock() == Blocks.SNOW && entityPlayer.isSneaking())
{
    world.setBlockState(blockPos, Blocks.SNOW_LAYER.getDefaultState().withProperty(BlockSnow.LAYERS, 7));
    entityPlayer.inventory.addItemStackToInventory(new ItemStack(Items.SNOWBALL))
}
То ничего ровным счётом не измениться :\
 
5,018
47
783
3,005
192
592
2,932
44
598
:D Это считай и был весь код, что мне ещё было скидывать? Три закрывающие фигурные скобки :D ? (Про скобки я написал в шуточной манере)

И того что у меня получилось, и с чем мне помог @246B2-5G6K4:
Java:
    @SubscribeEvent
    public void PlayerRightClick (PlayerInteractEvent.RightClickBlock event) {

        if (!event.getEntityPlayer().isSneaking())
            return;

        if (event.getWorld().getBlockState(event.getPos()).getBlock() == Blocks.SNOW) {
            if (!event.getWorld().isRemote) {
                
                IBlockState prevState = Blocks.SNOW_LAYER.getDefaultState().withProperty(BlockSnow.LAYERS, 8);
                event.getWorld().setBlockState(event.getPos(), prevState);
                event.getEntityPlayer().inventory.addItemStackToInventory(new ItemStack(Items.SNOWBALL));

            }
            
            event.setUseItem(Result.ALLOW);
            
        } else if (event.getWorld().getBlockState(event.getPos()).getBlock() == Blocks.SNOW_LAYER) {
            
            if (!event.getWorld().isRemote) {
                
                if (event.getWorld().getBlockState(event.getPos()).getValue(BlockSnow.LAYERS) == 1)
                    event.getWorld().destroyBlock(event.getPos(), false);
                
                else {
                    
                    int prevValue = event.getWorld().getBlockState(event.getPos()).getValue(BlockSnow.LAYERS);
                    IBlockState state = Blocks.SNOW_LAYER.getDefaultState().withProperty(BlockSnow.LAYERS, prevValue - 1);
                    event.getWorld().setBlockState(event.getPos(), state);

                }
                
                event.getEntityPlayer().inventory.addItemStackToInventory(new ItemStack(Items.SNOWBALL));
            
            }

            event.setCancellationResult(EnumActionResult.SUCCESS);
            event.setCanceled(true);

        }

    }
Всё бы хорошо, считай всё работает как надо за одним исключением! Как не крути после того как мой оператор ставит на место блока снега, слой снега высотой в 7 слоёв, он тут же переходит к второму оператору! Как мне после того как первый оператор поставил слой снега остановить его?
 
7,099
324
1,510
Не понятно, че ты хочешь

Куллдаун между кликами, чтобы слишком быстро снег не собирало?
 
2,932
44
598
Блин! Сейчас попробую объяснить:
Вот как работает этот код сейчас:
Шифт + ПКМ по блоку снега = Ставить слой снега высотой в 7 слоёв выдать снежный шарик, ставить слой снега с высотой в 6 слоёв выдать снежный шарик.

Видишь, он не останавливается после того как поставил слой снега с высотой в 7 слоёв и выдал снежный шарик. Надо после того как он поставил 7 слоёв снега и выдал снежный шарик остановить его...
 
7,099
324
1,510
Он быстрее обрабатывает пкм, чем ты успеваешь его отжать. Скорее всего
 
7,099
324
1,510
В новых версиях есть кулдаун у предметов. Сетай такой для новоиспеченного снежка
 
Последнее редактирование:
2,932
44
598
Сетай такой для новоиспеченного снежка
Кстати да...
Только вот как его для снежка сетать? (Вот кулдаун: player.getCooldownTracker().setCooldown(this, 5);... Я про эту штуку почти ничего не знаю)
 
7,099
324
1,510
2,932
44
598
player.getCooldownTracker().setCooldown(Items.SNOWBALL, 5)
Спасибо! Сейчас попробую: (Ну с богом!)
1531840398417.png
~~~
Юху!
1531840608774.png
Теперь ставиться ровно 7 слоёв снега! Теперь осталось мне со снежком разобраться, потому что мне вместо одного выдаётся два :| :В
 
2,932
44
598
Ага... Называется решил я значит проблему... Кулдаун не помог! (Я там вместо 7 слоёв снега в коде поставил 8 по этому показалось мне что всё работает как надо, но это не так)...

Вопрос остаётся не решённым!
 
3,005
192
592
Уже есть мод, который делает сбор снега.
Посмотри там пак, который с 4-ся островам..
 
2,932
44
598
Сверху