[1.6.4] Диспенсер и бросательный item

Здравствуйте.
Хочу сделать предмет, который можно бросить. Насколько я понял, для этого нужно создать Entity и спаунить его в функции onItemRightClick. Я это сделал. Entity спаунится и летит. Но проблема в том, что если положить мой предмет в диспенсер, то диспенсер чихает предметом, а не спаунит Entity.
Как сделать, чтобы диспенсер выплёвывал (спаунил) Entity, а не чихал предметом (как снежок и стрела)?
Если надо, могу выложить исходники.
 
Я так понял, вот эта функция возвращает Entity, который нужно выплюнуть?
Код:
    protected IProjectile getProjectileEntity(World par1World, IPosition par2IPosition)
    {
        return new EntitySnowball(par1World, par2IPosition.getX(), par2IPosition.getY(), par2IPosition.getZ());
    }
Но как применить ее к моему предмету?
Обясните, пожалуйста.
 
2,955
12
В главном классе мода, желательно при ините: BlockDispenser.dispenseBehaviorRegistry.putObject(Bla.BlaItem, new BlaItemBehavior());
Потом создаешь тот самый класс
BlaItemBehavior:
public class BlaItemBehavior extends BehaviorProjectileDispense {

 protected IProjectile getProjectileEntity(World par1World, IPosition par2IPosition)
   {
       return new EntitySnowball(par1World, par2IPosition.getX(), par2IPosition.getY(), par2IPosition.getZ());
   }
}
 
Dragon2488 написал(а):
В главном классе мода, желательно при ините: BlockDispenser.dispenseBehaviorRegistry.putObject(Bla.BlaItem, new BlaItemBehavior());
Да-да, я только что это нагуглил. Но он ругается, что нету такой функции. Что сделать?
тьфу-ты, чёрт :) нашлась. Это я слепой. Сейчас попробую.
Всем спасибо!
 
Dragon2488 написал(а):
Хоть бы плюс поставил. Я же стараюсь :)
Вот вам плюс, но вопрос еще не решен.
Теперь диспенсер вроде плюется, но я не вижу, чтобы из него что-то вылетало. В чем причина?
 
Теперь у меня эта строчка перестала выполняться
Код:
        BlockDispenser.dispenseBehaviorRegistry.putObject(itemFramework, new FW1Behavior());
и дебаггер показывает, что эта функция не выполняется:
Код:
    protected IProjectile getProjectileEntity(World par1World, IPosition par2IPosition)
    {
        Entity1 entity = new Entity1(par1World, par2IPosition.getX(), par2IPosition.getY(), par2IPosition.getZ());
        //EntityArrow entity = new EntityArrow(par1World, par2IPosition.getX(), par2IPosition.getY(), par2IPosition.getZ());
        return entity;
    }
Чё за хрень-то? Час назад оно хотя-бы выполнялось!
поправка: если я ставлю обычный диспенсер, то код НЕ выполняется, а если самодельный (мод) то выполняется. WTF???
P.S. со стрелой работает, а с моим предметом нет.
 
laz2727 написал(а):
Код диспенсера?
Код:
package mods.mod_infinitedispenser;

import java.util.List;
import net.minecraft.block.*;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntityDispenser;
import net.minecraft.util.Icon;
import net.minecraft.world.World;
import net.minecraft.block.material.Material;

public class BlockInfiniteDispenser extends BlockDispenser {
    
//    private Icon icon1;
    
    public BlockInfiniteDispenser(int id)
    {
            super(id);
            this.setCreativeTab(CreativeTabs.tabRedstone);
    }

    @Override
    public void registerIcons(IconRegister reg)
    {
        this.blockIcon = reg.registerIcon("mod_infinitedispenser:side");
        this.furnaceTopIcon = reg.registerIcon("mod_infinitedispenser:side");
        //this.furnaceTopIcon = reg.registerIcon("furnace_top");
        this.furnaceFrontIcon = reg.registerIcon("mod_infinitedispenser:front_top");
        this.field_96473_e = reg.registerIcon("mod_infinitedispenser:front");
    }

    protected void dispense(World par1World, int par2, int par3, int par4)
    {
        BlockSourceImpl blocksourceimpl = new BlockSourceImpl(par1World, par2, par3, par4);
        TileEntityDispenser tileentitydispenser = (TileEntityDispenser)blocksourceimpl.getBlockTileEntity();

        if (tileentitydispenser != null)
        {
            int l = tileentitydispenser.getRandomStackFromInventory();

            if (l < 0)
            {
                par1World.playAuxSFX(1001, par2, par3, par4, 0);
            }
            else
            {
                ItemStack itemstack = tileentitydispenser.getStackInSlot(l);
                IBehaviorDispenseItem ibehaviordispenseitem = this.getBehaviorForItemStack(itemstack);

                if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider)
                {
                    /*if (itemstack.stackSize<64)
                    {
                    ++itemstack.stackSize;
                    }*/
                    ItemStack itemstack1 = ibehaviordispenseitem.dispense(blocksourceimpl, itemstack);
                    itemstack1.stackSize = itemstack1.getMaxStackSize();
                    tileentitydispenser.setInventorySlotContents(l, itemstack1.stackSize == 0 ? null : itemstack1);
                }
            }
        }
    }

    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
        if (par1World.isRemote)
        {
            return true;
        }
        else
        {
            TileEntityDispenser tileentitydispenser = (TileEntityDispenser)par1World.getBlockTileEntity(par2, par3, par4);

            if (tileentitydispenser != null)
            {
                tileentitydispenser.setCustomName("Infinite dispenser");
                par5EntityPlayer.displayGUIDispenser(tileentitydispenser);
            }

            return true;
        }
    }

}
 
905
5
Код:
Block myDisp = new BlockDispenser(){


registerIcons(){register}


}

, например.
 
905
5
Ну, его код - без изменений. Но код объекта будет другой, можно так дописывать же.
 
Сверху