Item как блок [1.6.4]

100
0
Нужна помощь 
я сделал Простой предмет Item, как сделать чтобы если я кликаю им по определенному блоку , предмет пропадает и ставится определенный блок
 
1,087
2
@Override
public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) {
p_77659_2_.setBlock(x, y, z, block)
return (ItemStack) null;
}
 

timaxa007

Модератор
5,831
409
672
Код:
@Override
public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {

    switch(side) {
    case 0: --y;break;
    case 1: ++y;break;
    case 2: --z;break;
    case 3: ++z;break;
    case 4: --x;break;
    case 5: ++x;break;
    }

    if (world.isAirBlock(x, y, z)) {
        Block block = Blocks.furnace;//Наш используемый блок
        Item item = Item.getItemFromBlock(block);
        if (item instanceof ItemBlock) {
            ItemBlock ib = (ItemBlock)item;
            ib.onItemUse(is, player, world, x, y, z, side, hitX, hitY, hitZ);
            //В методе onItemUse уже встроено отнимания количесва стака (т.е. --is.stackSize;)
            return true;
        }
    }

    return false;
}
 
100
0
классный код но вот что то я не понял  пару  строчек
Код:
Block block = Blocks.furnace;//Наш используемый блок
        Item item = Item.getItemFromBlock(block);
        if (item instanceof ItemBlock) {
            ItemBlock ib = (ItemBlock)item;
 

timaxa007

Модератор
5,831
409
672
Ой, забыл про то что у тебя 1.6.4.
 

timaxa007

Модератор
5,831
409
672
Вот:
Код:
@Override
public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {

    int
    x2 = x,
    y2 = y,
    z2 = z;

    switch(side) {
    case 0: --y2;break;
    case 1: ++y2;break;
    case 2: --z2;break;
    case 3: ++z2;break;
    case 4: --x2;break;
    case 5: ++x2;break;
    }

    if (world.isAirBlock(x2, y2, z2)) {
        int blockID = Block.furnaceIdle.blockID;//Наш используемый ID блока
        Item item = Item.itemsList[blockID];
        if (item != null && item instanceof ItemBlock) {
            ItemBlock ib = (ItemBlock)item;
            ib.onItemUse(is, player, world, x, y, z, side, hitX, hitY, hitZ);
            //В методе onItemUse уже встроено отнимания количесва стака (т.е. --is.stackSize;)
            return true;
        }
    }

    return false;
}
Работает, но полной проверки не делал на 1.6.4.
 
100
0
Спасибо большое я по твоему коду так сделал посмотри это нормально?
Код:
@Override
 public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {

     switch(side) {
     case 0: --y;break;
     case 1: ++y;break;
     case 2: --z;break;
     case 3: ++z;break;
     case 4: --x;break;
     case 5: ++x;break;
     }

     if (world.isAirBlock(x, y, z)) {
      world.setBlock(x, y, z, Block.blockDiamond.blockID);
       is.stackSize=0;
      return true;
     }

     return false;
 }
[merge_posts_bbcode]Добавлено: 22.02.2016 22:01:00[/merge_posts_bbcode]

Ой вопросик а как настроить item предмет  чтобы максимум в стаке 1 шт была
 

timaxa007

Модератор
5,831
409
672
Зачем размер стака ставить на ноль? Возможно надо:
Код:
--is.stackSize;
if (is.stackSize <= 0) is = null;
[merge_posts_bbcode]Добавлено: 22.02.2016 21:02:01[/merge_posts_bbcode]

В конструктор:
Код:
setMaxStackSize(1);
 
100
0
спасибо большое , слушай а как то реализовать можно чтобы типо блок не моментальна ставился , а к примеру как с едой , с начало юзает предмет а потом блок появляется.
[merge_posts_bbcode]Добавлено: 22.02.2016 22:12:10[/merge_posts_bbcode]

если я  тип дам не просто Item a [font=monospace, sans-serif]ItemFood и буду юзать установку блока, это прокатить?[/font]
 

timaxa007

Модератор
5,831
409
672
Типа так:
Код:
    public ItemStack onEaten(ItemStack is, World world, EntityPlayer player) {
        MovingObjectPosition mop = block(player, 1.0F, 5.0D, true);
        if (mop != null && mop.typeOfHit == EnumMovingObjectType.TILE) {

            int
            x = mop.blockX,
            y = mop.blockY,
            z = mop.blockZ;

            switch(mop.sideHit) {
            case 0:--y;break;
            case 1:++y;break;
            case 2:--z;break;
            case 3:++z;break;
            case 4:--x;break;
            case 5:++x;break;
            }

            if (!player.canPlayerEdit(x, y, z, mop.sideHit, is)) return is;
            if (world.isAirBlock(x, y, z)) {
                int blockID = Block.furnaceIdle.blockID;//Наш используемый блок
                Item item = Item.itemsList[blockID];
                if (item != null && item instanceof ItemBlock) {
                    ItemBlock ib = (ItemBlock)item;
                    ib.onItemUse(is, player, world, mop.blockX, mop.blockY, mop.blockZ, mop.sideHit,
                            (float)mop.hitVec.xCoord - (float)x,
                            (float)mop.hitVec.yCoord - (float)y,
                            (float)mop.hitVec.zCoord - (float)z);
                    //В методе onItemUse уже встроено отнимания количесва стака (т.е. --is.stackSize;)
                }
            }

        }
        return is;
    }

    public int getMaxItemUseDuration(ItemStack is) {
        return 20 * 3;//Сколько тиков будет использоваться, после использования типа поставиться.
    }

    public EnumAction getItemUseAction(ItemStack is) {
        return EnumAction.bow;//Просто для вида
    }

    public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
        if (is != null && is.getItem() == this) {
            player.setItemInUse(is, this.getMaxItemUseDuration(is));
        }
        return is;
    }

    public static MovingObjectPosition block(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
        Vec3 vec3 = Vec3.createVectorHelper(entity_base.posX, entity_base.posY + entity_base.getEyeHeight(), entity_base.posZ);
        Vec3 vec31 = entity_base.getLook(fasc);
        Vec3 vec32 = vec3.addVector(vec31.xCoord * dist, vec31.yCoord * dist, vec31.zCoord * dist);
        MovingObjectPosition mop = entity_base.worldObj.clip(vec3, vec32, interact);
        return mop;
    }
 
100
0
слушай это как натягивает стрелу у тебя а как есть еду чтоб типо эффект что строит
[merge_posts_bbcode]Добавлено: 23.02.2016 20:01:52[/merge_posts_bbcode]

а все разобрался
 
100
0
ну в итоге все нормально получилось , только есть баг , если дергать мыш быстренько то поставится 2 блока чтоб исправить  надо добавить условие в методе
public ItemStack onEaten(ItemStack is, World world, EntityPlayer player) {
 if(!world.isRemote){   //условие выполнение на сервере 
  
  // тот код

 }
 return is;
}
 
Сверху