Предмет создающий блоки.

Версия Minecraft
1.11+
93
1
1
Здравствуйте хочу создать предмет, который будет иметь дюрабилити и при
этом будет спавнить блоки, когда его юзаешь.
 
Решение
Экземпляр блока, который регистрируется, оставь его где-то в доступном месте, например, статическая переменная в главном классе. Потом обращайся к этой переменной(собственно, с паутиной так и сделано)
93
1
1
Смотри как сделан ItemBlock.
Любой блок в инвентаре - это предмет.
Дюрабилити, соответственно бери с инструментов или оружия.


Я понимаю, что мне вроде как нужен этот метод
Java:
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)

{

    IBlockState iblockstate = worldIn.getBlockState(pos);

    Block block = iblockstate.getBlock();



    if (!block.isReplaceable(worldIn, pos))

    {

        pos = pos.offset(facing);

    }



    ItemStack itemstack = player.getHeldItem(hand);



    if (!itemstack.isEmpty() && player.canPlayerEdit(pos, facing, itemstack) && worldIn.mayPlace(this.block, pos, false, facing, (Entity)null))

    {

        int i = this.getMetadata(itemstack.getMetadata());

        IBlockState iblockstate1 = this.block.getStateForPlacement(worldIn, pos, facing, hitX, hitY, hitZ, i, player, hand);



        if (placeBlockAt(itemstack, player, worldIn, pos, facing, hitX, hitY, hitZ, iblockstate1))

        {

            SoundType soundtype = worldIn.getBlockState(pos).getBlock().getSoundType(worldIn.getBlockState(pos), worldIn, pos, player);

            worldIn.playSound(player, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);

            itemstack.shrink(1);

        }



        return EnumActionResult.SUCCESS;

    }

    else

    {

        return EnumActionResult.FAIL;

    }

}
Но я немного тупенький и не понимаю что мне делать, а по поводу дюрабилити вроде как разобрался, что это делается через мотыгу.

как я понимаю вот эта строчка отвечает за то какой блок будет заспавнен:

IBlockState iblockstate1 = this.block.getStateForPlacement(worldIn, pos, facing, hitX, hitY, hitZ, i, player, hand);

но я всё таки немного не понимаю как это работает.
Вроде как расковырял fleentandsteel понял что за что отвечает вроде, пока писать не пробовал, но если объясните что к чему буду очень благодарен.
 
Последнее редактирование:
4,046
63
645
По большей часть тут просто проверки на возможность поставить блок, соответствие стака, сторону с которой нужно поставить этот блок, наличие снега и др. заменяемых блоков.
К слову у предмета плиты этот метод посложнее, ибо там ещё проверяется положение мыши на блоке.

Так что тут ничего объяснять не надо, просто смотри на метод и пытайся понять, что конкретно он делает и что нужно тебе.
Для верности сперва просто скопируй его целиком )))
 
93
1
1
У зажигалки есть функция которая спавнит огонь при нажатии пкм по идее если я возьму этот метод и присвою предмету, а вместо огня впилю какой то свой блок, оно ведь должно заработать по идее..
 
93
1
1
Помогите, мне нужно чтоб мой предмет спавнил по пкм блок который я тоже добавил в игру вот код предмета:
Java:
package ru.vixtor.item;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;


public class ItemTest extends Item {



    public ItemTest()
    {
        this.setRegistryName("item_test");
        this.setUnlocalizedName("itemTest");
        this.maxStackSize = 1;
        this.setMaxDamage(64);
        this.setCreativeTab(CreativeTabs.MATERIALS);
    }

    /**
     * Called when a Block is right-clicked with this Item
     */
    public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        pos = pos.offset(facing);
        ItemStack itemstack = player.getHeldItem(hand);

        if (!player.canPlayerEdit(pos, facing, itemstack))
        {
            return EnumActionResult.FAIL;
        }
        else
        {
            if (worldIn.isAirBlock(pos))
            {
                worldIn.playSound(player, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
                worldIn.setBlockState(pos, Blocks.WEB.getDefaultState(), 11);
            }

            itemstack.damageItem(1, player);
            return EnumActionResult.SUCCESS;
        }
    }



}

Вот код блока:
Код:
package ru.vixtor.Block;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;

public class BlockTest extends Block {

    public BlockTest () {
        super(Material.CARPET);
        this.setRegistryName("block_test");
        this.setUnlocalizedName("blockTest");
        this.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
    }

}

Проблема в том, что вот в этой строчке:
worldIn.setBlockState(pos, Blocks.WEB.getDefaultState(), 11);
WEB это блок который спванится по пкм и вместо WEB я не могу вписать свой блок, потому что он ругается, подскажите как это правильно сделать.
 
7,099
324
1,510
Экземпляр блока, который регистрируется, оставь его где-то в доступном месте, например, статическая переменная в главном классе. Потом обращайся к этой переменной(собственно, с паутиной так и сделано)
 
93
1
1
Просто вместо WEB пишу TESTBLOCK
Java:
public class ItemTest extends Item {



    public ItemTest()
    {
        this.setRegistryName("item_test");
        this.setUnlocalizedName("itemTest");
        this.maxStackSize = 1;
        this.setMaxDamage(64);
        this.setCreativeTab(CreativeTabs.MATERIALS);
    }

    /**
     * Called when a Block is right-clicked with this Item
     */
    public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        pos = pos.offset(facing);
        ItemStack itemstack = player.getHeldItem(hand);

        if (!player.canPlayerEdit(pos, facing, itemstack))
        {
            return EnumActionResult.FAIL;
        }
        else
        {
            if (worldIn.isAirBlock(pos))
            {
                worldIn.playSound(player, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
                worldIn.setBlockState(pos, Blocks.TESTBLOCK.getDefaultState(), 11);
            }

            itemstack.damageItem(1, player);
            return EnumActionResult.SUCCESS;
        }
    }



}
 
7,099
324
1,510
Java:
/**
* Convenience method to update the block on both the client and server
*/
public boolean setBlockState(BlockPos pos, IBlockState state)
{
   return this.setBlockState(pos, state, 3);
}
 
93
1
1
Так прикол в том что он ругается на TESTBLOCK:
1523655453417.png
И предлагает запилить класс TESTBLOCK либо запилить inner class так что я что то делаю не правильно вот в чём прикол то.
Вот мой главный класс:
Java:
@Mod(modid = "testmod", name = "Test Mod", version = "1.0.0")
public class TestMod
{
    public static final BlockTest TESTBLOCK = new BlockTest();

    @SidedProxy(clientSide = "ru.vixtor.proxy.ClientProxy", serverSide = "ru.vixtor.proxy.ServerProxy")
    public static CommonProxy proxy;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        proxy.preInit(event);
        System.out.println("\u001B[32m" + "[Starting Test Mod PRE-INITIALIZATION]" + "\u001B[0m");
    }

    @EventHandler
    public void init(FMLInitializationEvent event) {
        proxy.init(event);
        System.out.println("\u001B[32m" + "[Starting Test Mod INITIALIZATION]" + "\u001B[0m");
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        proxy.postInit(event);
        System.out.println("\u001B[32m" + "[Starting Test Mod POST-INITIALIZATION]" + "\u001B[0m");
    }
}
 
Сверху