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

Версия Minecraft
1.12.2
31
0
Мне надо, чтобы когда игрок кликал по блоку(iron_dirt), к примеру, 15 раз спец. предметом(ItemWoodenExtractor) выдавался предмет (ItemMiksitDust)
Как это сделать? (буду не против ответа кодом)
 
31
0
Про саму выдачу я знаю, мне интересен сам подсчёт, так как я не знаю как юзать NBT
Попробовал сам что-то сделать, ничего не получилось
Java:
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        if(worldIn.getBlockState(pos).getBlock() instanceof BlockIronDirt) {
            ItemStack item = player.getHeldItem(hand);
            item.damageItem(1, player);
            NBTTagCompound nbt = item.getTagCompound();
            String res = nbt.getString("clicks");
            Integer resint = Integer.valueOf(res);
            if(resint < 15) {
                String ress = res + 1;
                nbt.setString("clicks", ress);
                player.addItemStackToInventory(new ItemStack(Blocks.DIRT));
            } else if(resint == 15) {
                player.addItemStackToInventory(new ItemStack(Items.IRON_NUGGET));
            }
        }
        return EnumActionResult.SUCCESS;
    }
 

Вложения

  • crash-2019-12-19_16.48.10-client.txt
    6.6 KB · Просмотры: 1

Eifel

Модератор
1,624
79
609
Потому что в итемстаке NBTTagCompound по дефолту null, тебе надо чекать, есть ли он там, если нету, значит добавить, иначе взять тот, что есть. И не надо клики хранить в стринге, там есть setInteger. Ну а еще логика не верная. Надо сохранять в НБТ так же позицию блока и проверять сначала, по той же самой позиции ты кликаешь. Если позиция сменилать по сравнению с предыдущей, то тебе уже надо сбросить счетчик и начать считать с нуля, ибо ты кликаешь уже по другому блоку.
 
31
0
. Если позиция сменилать по сравнению с предыдущей, то тебе уже надо сбросить счетчик и начать считать с нуля
Мне не обязательно, чтобы клики были только по блоку на определённых коордах
тебе надо чекать, есть ли он там, если нету, значит добавить
Как это сделать?
 

Eifel

Модератор
1,624
79
609
Java:
if(!item.hasTagCompound()){
    NBTTagCompound nbt = new NBTTagCompound();
    nbt.setInteger("clicks", 1);
    //позиция блока еще, уже сам
    item.setTagCompound(nbt);
}else{
    //пок классике
}
Про названия не уверен, код на коленке написал.
Мне не обязательно, чтобы клики были только по блоку на определённых коордах
Тогда я кликну 5 раз по одному блоку, 10 раз по другому и мне выпадет предмет, что есть не совсем логично
 
31
0
Краш
Java:
@SideOnly(Side.CLIENT)
    public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn)
    {
        NBTTagCompound nbt = stack.getTagCompound();
        Integer lore = nbt.getInteger("clicks");
        tooltip.add(String.valueOf(lore));
    }
 

Вложения

  • crash-2019-12-19_17.31.56-client.txt
    5.2 KB · Просмотры: 0

Eifel

Модератор
1,624
79
609
Опять же,
Потому что в итемстаке NBTTagCompound по дефолту null, тебе надо чекать, есть ли он там, если нету, значит добавить, иначе взять тот, что есть.
И пиши просто int, без всяких Integer и прочего
 
Сверху