Как сделать чтобы после n-кликов по определённому блоку специальным предметом выдавался предмет

Версия Minecraft
1.12.2
31
0
Мне надо, чтобы когда игрок кликал по блоку(iron_dirt), к примеру, 15 раз спец. предметом(ItemWoodenExtractor) выдавался предмет (ItemMiksitDust)
Как это сделать? (буду не против ответа кодом)
 

GoogleTan

Картошка :3
1,354
43
310
По 1 блоку? Если нет, то можно отлавливать нажатие на блок, проверять тот ли это блок, +1 к переменной, также проверять не равна ли она 15, если да то выдаешь и обнуляешь переменную, если нет то продолжаешь проверять. Если по 1 то тоже саме но переменная в блоке.
 
31
0

Eifel

Модератор
1,623
78
608
Можно просто в НБТ предмета хванить позицию последнего блока, по которому шел клик и счетчик. Если позиция сменилась - обнуляем счетчик, если нет - увеличиваем. Без всяких капабилити и прочего. Метод можно взять в предмете, onItemUse(или чет такое, слабо помню)
 
7,099
324
1,510
А если я 10 раз кликну по одному блоку, а 5 раз по другому? Если хранить в капе игрока, то засчитается, что выглядит некорректно.
Еще пример: два игрока кликают по одному блоку. Один кликнуть 10 раз, второй 5, в итоге блок не активировался.
Также при хранении количества кликов в игроке или предмете затруднительно делать рендер блока(если он должен зависеть от количества кликов)
Поэтому количество кликов нужно хранить связано с конкретным блоком.
Если блок свой, то можно хранить в стэйте.
Если не свой, то можно хранить в капе мира или капе чанка или в своем отдельном хранилище
 
7,099
324
1,510
Стэйт то дешевле. Хотя ,если помимо количества кликов нужно хранить еще че-то и в стэйт не влезает, то имеет смысл тайл
 

GoogleTan

Картошка :3
1,354
43
310
Я собирался так сделать, но не понял как сделать эту проверку
Java:
Chunk chunk = new Chunk(worldIn, coord.getX(), coord.getZ());
BlockPos coord = playerIn.rayTrace(300, 1).getBlockPos();
            if(chunk.getBlockState(coord).getBlock() instanceof BlockChest){
             
            }
 
Последнее редактирование:
31
0
Что указать вместо чанк? (эклипс ругается)
Java:
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    {
        
        BlockPos coord = playerIn.rayTrace(300, 1).getBlockPos();
        if(chunk.getBlockState(coord).getBlock() instanceof BlockIronDirt){
          
        }
        return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, playerIn.getHeldItem(handIn));
    }
Можно просто в НБТ предмета хранить позицию последнего блока, по которому шел клик и счетчик
Можно пожалуйста код? Я просто не знаю как записывать данные в НБТ и читать их
 
31
0
Не совсем работает.
Я кликаю этим предметом по BlockIronDirt, но ничего не происходит
Java:
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    {
       
   
    BlockPos coord = playerIn.rayTrace(300, 1).getBlockPos();
    Chunk chunk = new Chunk(worldIn, coord.getX(), coord.getZ());
    // BlockIronDirt - класс блока, при клике по которому должна убывать прочность
                if(chunk.getBlockState(coord).getBlock() instanceof BlockIronDirt){
                    playerIn.getHeldItem(handIn).damageItem(1, playerIn);
                }
        return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, playerIn.getHeldItem(handIn));
    }
 
Сверху