- 91
- 1
- 5
В моей печке можно положить любые предметы во все слоты, хочу чтобы ложилось только в слот для угля, в слот для выхода ложить нельзя.
Код:
import com.hesperus_rus.production.BlockClayFurnace;
import com.hesperus_rus.production.recipes.ClayFurnaceRecipes;
import com.hesperus_rus.production.slots.SlotClayFurnaceFuel;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBoat;
import net.minecraft.item.ItemDoor;
import net.minecraft.item.ItemHoe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;
import net.minecraft.util.datafix.DataFixer;
import net.minecraft.util.datafix.FixTypes;
import net.minecraft.util.datafix.walkers.ItemStackDataLists;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemStackHandler;
public class TileEntityClayFurnace extends TileEntity implements ITickable, ISidedInventory {
private ItemStackHandler handler = new ItemStackHandler(4);
private String customName;
private ItemStack smelting = ItemStack.EMPTY;
private NonNullList<ItemStack> clayFurnaceItemStacks = NonNullList.<ItemStack>withSize(4, ItemStack.EMPTY);
private int burnTime;
private int currentBurnTime;
private int cookTime;
private int totalCookTime = 200;
{
this.markDirty();
}
public static void registerFixesFurnace(DataFixer fixer) {
fixer.registerWalker(FixTypes.BLOCK_ENTITY, new ItemStackDataLists(TileEntityClayFurnace.class, new String[]{"Items"}));
}
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
return true;
}
return super.hasCapability(capability, facing);
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
if(facing == null) {
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(new ItemStackHandler(4));
}
}
return super.getCapability(capability, facing);
}
public boolean hasCustomName() {
return this.customName != null && !this.customName.isEmpty();
}
public void setCustomName(String customName) {
this.customName = customName;
}
@Override
public ITextComponent getDisplayName() {
return this.hasCustomName() ? new TextComponentString(this.customName) : new TextComponentTranslation("container.block_clay_furnace");
}
@Override
public void readFromNBT(NBTTagCompound compound)
{
super.readFromNBT(compound);
this.handler.deserializeNBT(compound.getCompoundTag("Inventory"));
ItemStackHelper.loadAllItems(compound, this.clayFurnaceItemStacks);
this.burnTime = compound.getInteger("BurnTime");
this.cookTime = compound.getInteger("CookTime");
this.totalCookTime = compound.getInteger("CookTimeTotal");
this.currentBurnTime = getItemBurnTime((ItemStack)this.handler.getStackInSlot(2));
if(compound.hasKey("CustomName", 8)) this.setCustomName(compound.getString("CustomName"));
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound)
{
super.writeToNBT(compound);
compound.setInteger("BurnTime", (short)this.burnTime);
compound.setInteger("CookTime", (short)this.cookTime);
compound.setInteger("CookTimeTotal", (short)this.totalCookTime);
ItemStackHelper.saveAllItems(compound, this.clayFurnaceItemStacks);
compound.setTag("Inventory", this.handler.serializeNBT());
if(this.hasCustomName()) compound.setString("CustomName", this.customName);
return compound;
}
public boolean isBurning() {
return this.burnTime > 0;
}
@SideOnly(Side.CLIENT)
public static boolean isBurning(TileEntityClayFurnace te) {
return te.getField(0) > 0;
}
@Override
public void update() {
if(this.isBurning()) {
--this.burnTime;
BlockClayFurnace.setState(true, this.world, this.pos);
}
ItemStack[] inputs = new ItemStack[] {
handler.getStackInSlot(0), handler.getStackInSlot(1)
};
ItemStack fuel = this.handler.getStackInSlot(2);
if(this.isBurning() || !fuel.isEmpty() && !this.handler.getStackInSlot(0).isEmpty() || this.handler.getStackInSlot(1).isEmpty()) {
if(!this.isBurning() && this.canSmelt()) {
this.burnTime = getItemBurnTime(fuel);
this.currentBurnTime = burnTime;
if(this.isBurning() && !fuel.isEmpty()) {
Item item = fuel.getItem();
fuel.shrink(1);
if(fuel.isEmpty()) {
ItemStack item1 = item.getContainerItem(fuel);
this.handler.setStackInSlot(2, item1);
}
}
}
} if(this.isBurning() && this.canSmelt() && cookTime > 0) {
cookTime++;
if(cookTime == totalCookTime) {
if(handler.getStackInSlot(3).getCount() > 0) {
handler.getStackInSlot(3).grow(1);
} else {
handler.insertItem(3, smelting, false);
}
smelting = ItemStack.EMPTY;
cookTime = 0;
return;
}
} else {
if(this.canSmelt() && this.isBurning()) {
ItemStack output = ClayFurnaceRecipes.getInstance().getClayResult(inputs[0], inputs[1]);
if(!output.isEmpty()) {
smelting = output;
cookTime++;
inputs[0].shrink(1);
inputs[1].shrink(1);
handler.setStackInSlot(0, inputs[0]);
handler.setStackInSlot(1, inputs[1]);
}
}
}
}
private boolean canSmelt() {
if(((ItemStack)this.handler.getStackInSlot(0)).isEmpty() || ((ItemStack)this.handler.getStackInSlot(1)).isEmpty()) {
return false;
} else {
ItemStack result = ClayFurnaceRecipes.getInstance().getClayResult((ItemStack)this.handler.getStackInSlot(0), (ItemStack)this.handler.getStackInSlot(1));
if(result.isEmpty()) {
return false;
} else {
ItemStack output = (ItemStack)this.handler.getStackInSlot(3);
if(output.isEmpty()) {
return true;
} if(!output.isItemEqual(result)) {
return false;
} int res = output.getCount() + result.getCount();
return res <= 64 && res <= output.getMaxStackSize();
}
}
}
public static int getItemBurnTime(ItemStack fuel) {
if (fuel.isEmpty()) {
return 0;
} else {
int burnTime = net.minecraftforge.event.ForgeEventFactory.getItemBurnTime(fuel);
if (burnTime >= 0) {
return burnTime;
}
Item item = fuel.getItem();
if (item == Item.getItemFromBlock(Blocks.WOODEN_SLAB)) {
return 150;
} else if (item == Item.getItemFromBlock(Blocks.WOOL)) {
return 100;
} else if (item == Item.getItemFromBlock(Blocks.CARPET)) {
return 67;
} else if (item == Item.getItemFromBlock(Blocks.LADDER)) {
return 300;
} else if (item == Item.getItemFromBlock(Blocks.WOODEN_BUTTON)) {
return 100;
} else if (Block.getBlockFromItem(item).getDefaultState().getMaterial() == Material.WOOD) {
return 300;
} else if (item == Item.getItemFromBlock(Blocks.COAL_BLOCK)) {
return 16000;
} else if (item instanceof ItemTool && "WOOD".equals(((ItemTool)item).getToolMaterialName())) {
return 200;
} else if (item instanceof ItemSword && "WOOD".equals(((ItemSword)item).getToolMaterialName())) {
return 200;
} else if (item instanceof ItemHoe && "WOOD".equals(((ItemHoe)item).getMaterialName())) {
return 200;
} else if (item == Items.STICK) {
return 100;
} else if (item != Items.BOW && item != Items.FISHING_ROD) {
if (item == Items.SIGN) {
return 200;
} else if (item == Items.COAL) {
return 1600;
} else if (item == Items.LAVA_BUCKET) {
return 20000;
} else if (item != Item.getItemFromBlock(Blocks.SAPLING) && item != Items.BOWL) {
if (item == Items.BLAZE_ROD) {
return 2400;
} else if (item instanceof ItemDoor && item != Items.IRON_DOOR) {
return 200;
} else {
return item instanceof ItemBoat ? 400 : 0;
}
} else {
return 100;
}
} else {
return 300;
}
}
}
public int getCookTime(ItemStack fuel) {
return 200;
}
public static boolean isItemFuel(ItemStack fuel) {
return getItemBurnTime(fuel) > 0;
}
public boolean isUsableByPlayer(EntityPlayer player) {
return this.world.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
}
public int getField(int id) {
switch(id) {
case 0:
return this.burnTime;
case 1:
return this.currentBurnTime;
case 2:
return this.cookTime;
case 3:
return this.totalCookTime;
default:
return 0;
}
}
public void setField(int id, int value) {
switch(id) {
case 0:
this.burnTime = value;
break;
case 1:
this.currentBurnTime = value;
break;
case 2:
this.cookTime = value;
break;
case 3:
this.totalCookTime = value;
}
}
@Override
public int getSizeInventory() {
return 4;
}
@Override
public boolean isEmpty() {
for (ItemStack itemstack : this.clayFurnaceItemStacks) {
if (!itemstack.isEmpty()) {
return false;
}
} return true;
}
@Override
public ItemStack getStackInSlot(int index) {
return this.clayFurnaceItemStacks.get(index);
}
@Override
public ItemStack decrStackSize(int index, int count) {
return ItemStackHelper.getAndSplit(this.clayFurnaceItemStacks, index, count);
}
@Override
public ItemStack removeStackFromSlot(int index) {
return ItemStackHelper.getAndRemove(this.clayFurnaceItemStacks, index);
}
@Override
public void setInventorySlotContents(int index, ItemStack stack) {
ItemStack itemstack = this.clayFurnaceItemStacks.get(index);
boolean flag = !stack.isEmpty() && stack.isItemEqual(itemstack) && ItemStack.areItemStackTagsEqual(stack, itemstack);
this.clayFurnaceItemStacks.set(index, stack);
if (stack.getCount() > this.getInventoryStackLimit()) {
stack.setCount(this.getInventoryStackLimit());
} if (index == 0 && !flag) {
this.totalCookTime = this.getCookTime(stack);
this.cookTime = 0;
this.markDirty();
}
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public void openInventory(EntityPlayer player) {}
@Override
public void closeInventory(EntityPlayer player) {}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
if (index == 2) {
return false;
} else if (index != 1) {
return true;
} else {
ItemStack itemstack = this.clayFurnaceItemStacks.get(3);
return isItemFuel(stack) || SlotClayFurnaceFuel.isBucket(stack) && itemstack.getItem() != Items.BUCKET;
}
}
@Override
public int getFieldCount() {
return 4;
}
@Override
public void clear() {
this.clayFurnaceItemStacks.clear();
}
@Override
public int[] getSlotsForFace(EnumFacing side) {
return new int[] {0, 1, 2, 3};
}
@Override
public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) {
return this.isItemValidForSlot(index, itemStackIn);
}
@Override
public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) {
if (direction == EnumFacing.DOWN && index == 1) {
Item item = stack.getItem();
if (item != Items.WATER_BUCKET && item != Items.BUCKET) {
return false;
}
} return true;
}
@Override
public String getName() {
return this.hasCustomName() ? this.customName : "container.block_clay_furnace";
}
}