Main Class:
package me.Wilfsadude.MyMod;
import me.Wilfsadude.MyMod.Proxy.CommonProxy;
import me.Wilfsadude.MyMod.Util.Reference;
import me.Wilfsadude.MyMod.World.ModWorldGen;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
@Mod(modid = Reference.MOD_ID, name = Reference.NAME, version = Reference.VERSION)
public class MyMod {
@Instance
public static MyMod instance;
@SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.COMMON_PROXY_CLASS)
public static CommonProxy proxy;
@EventHandler
public static void PreInit(FMLPreInitializationEvent event) {
GameRegistry.registerWorldGenerator(new ModWorldGen(), 3);
}
@EventHandler
public static void init(FMLInitializationEvent event) {
}
@EventHandler
public static void PostInit(FMLPostInitializationEvent event) {
}
}
TileEntityClass
package me.Wilfsadude.MyMod.Blocks.Machines.Sinterer;
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.IInventory;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.item.*;
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.math.MathHelper;
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.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.CapabilityItemHandler;
public class TileEntitySinteringFurnace extends TileEntity implements IInventory, ITickable {
private NonNullList<ItemStack> inventory = NonNullList.<ItemStack>withSize(4, ItemStack.EMPTY);
private String customName;
private int burnTime;
private int currentBurnTime;
private int cookTime;
private int totalCookTime = 200;
@Override
public String getName() {
return this.hasCustomName() ? this.customName : "container.sintering_furnace";
}
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.getName()) : new TextComponentTranslation(this.getName());
}
@Override
public int getSizeInventory() {
return this.inventory.size();
}
@Override
public boolean isEmpty() {
for (ItemStack stack : this.inventory) {
if (!stack.isEmpty()) return false;
}
return true;
}
@Override
public ItemStack getStackInSlot(int index) {
return (ItemStack)this.inventory.get(index);
}
@Override
public ItemStack decrStackSize(int index, int count) {
return ItemStackHelper.getAndSplit(this.inventory, index, count);
}
@Override
public ItemStack removeStackFromSlot(int index) {
return ItemStackHelper.getAndRemove(this.inventory, index);
}
@Override
public void setInventorySlotContents(int index, ItemStack stack) {
ItemStack itemStack = (ItemStack)this.inventory.get(index);
boolean flag = !stack.isEmpty() && stack.isItemEqual(itemStack) && ItemStack.areItemStackTagsEqual(stack, itemStack);
this.inventory.set(index, stack);
if (stack.getCount() > this.getInventoryStackLimit())
stack.setCount(this.getInventoryStackLimit());
if (index == 0 && index + 1 == 1 && !flag) {
ItemStack stack1 = (ItemStack)this.inventory.get(index + 1);
this.totalCookTime = this.getCookTime(stack, stack1);
this.cookTime = 0;
this.markDirty();
}
}
@Override
public void readFromNBT(NBTTagCompound compound)
{
super.readFromNBT(compound);
this.inventory = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
ItemStackHelper.loadAllItems(compound, this.inventory);
this.burnTime = compound.getInteger("BurnTime");
this.cookTime = compound.getInteger("CookTime");
this.totalCookTime = compound.getInteger("CookTimeTotal");
this.currentBurnTime = getItemBurnTime((ItemStack)this.inventory.get(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.inventory);
if(this.hasCustomName()) compound.setString("CustomName", this.customName);
return compound;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
public boolean isBurning()
{
return this.burnTime > 0;
}
@SideOnly(Side.CLIENT)
public static boolean isBurning(IInventory inventory)
{
return inventory.getField(0) > 0;
}
public void update()
{
boolean flag = this.isBurning();
boolean flag1 = false;
if(this.isBurning()) --this.burnTime;
if (!this.world.isRemote) {
ItemStack stack = (ItemStack)this.inventory.get(2);
if (this.isBurning() || !stack.isEmpty() && !((((ItemStack)this.inventory.get(0)).isEmpty()) || ((ItemStack)this.inventory.get(1)).isEmpty())) {
if (!this.isBurning() && this.canSmelt()) {
this.burnTime = getItemBurnTime(stack);
this.currentBurnTime = this.burnTime;
if (this.isBurning()) {
flag1 = true;
if (!stack.isEmpty()) {
Item item = stack.getItem();
stack.shrink(1);
if (stack.isEmpty()) {
ItemStack item1 = item.getContainerItem(stack);
this.inventory.set(2, item1);
}
}
}
}
if (this.isBurning() && this.canSmelt()) {
++this.cookTime;
if (this.cookTime == this.totalCookTime) {
this.cookTime = 0;
this.totalCookTime = this.getCookTime((ItemStack)this.inventory.get(0), (ItemStack)this.inventory.get(1));
this.smeltItem();
flag1 = true;
}
}
else this.cookTime = 0;
}
else if (!this.isBurning() && this.cookTime > 0) {
this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.totalCookTime);
}
if (flag != this.isBurning()) {
flag1 = true;
SinteringFurnace.setState(this.isBurning(), this.world, this.pos);
}
} if (flag1)
this.markDirty();
}
public int getCookTime(ItemStack input1, ItemStack input2) {
return 200;
}
private boolean canSmelt()
{
if(((ItemStack)this.inventory.get(0)).isEmpty() || ((ItemStack)this.inventory.get(1)).isEmpty()) return false;
else
{
ItemStack result = SinteringFurnaceRecipes.getInstance().getSinteringResult((ItemStack)this.inventory.get(0), (ItemStack)this.inventory.get(1));
if(result.isEmpty()) return false;
else
{
ItemStack output = (ItemStack)this.inventory.get(3);
if(output.isEmpty()) return true;
if(!output.isItemEqual(result)) return false;
int res = output.getCount() + result.getCount();
return res <= getInventoryStackLimit() && res <= output.getMaxStackSize();
}
}
}
public void smeltItem() {
if (this.canSmelt()) {
ItemStack input1 = (ItemStack)this.inventory.get(0);
ItemStack input2 = (ItemStack)this.inventory.get(1);
ItemStack result = SinteringFurnaceRecipes.getInstance().getSinteringResult(input1, input2);
ItemStack output = (ItemStack)this.inventory.get(3);
if (output.isEmpty()) this.inventory.set(3, result.copy());
else if (output.getItem() == result.getItem()) output.grow(result.getCount());
input1.shrink(1);
input2.shrink(1);
}
}
public static int getItemBurnTime(ItemStack fuel)
{
if(fuel.isEmpty()) return 0;
else
{
Item item = fuel.getItem();
if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.AIR)
{
Block block = Block.getBlockFromItem(item);
if (block == Blocks.WOODEN_SLAB) return 150;
if (block.getDefaultState().getMaterial() == Material.WOOD) return 300;
if (block == Blocks.COAL_BLOCK) return 16000;
}
if (item instanceof ItemTool && "WOOD".equals(((ItemTool)item).getToolMaterialName())) return 200;
if (item instanceof ItemSword && "WOOD".equals(((ItemSword)item).getToolMaterialName())) return 200;
if (item instanceof ItemHoe && "WOOD".equals(((ItemHoe)item).getMaterialName())) return 200;
if (item == Items.STICK) return 100;
if (item == Items.COAL) return 1600;
if (item == Items.LAVA_BUCKET) return 20000;
if (item == Item.getItemFromBlock(Blocks.SAPLING)) return 100;
if (item == Items.BLAZE_ROD) return 2400;
return GameRegistry.getFuelValue(fuel);
}
}
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;
}
@Override
public void openInventory(EntityPlayer player) {}
@Override
public void closeInventory(EntityPlayer player) {}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
if (index == 3) return false;
else if (index != 2) return true;
else {
return isItemFuel(stack);
}
}
public String getGuiId() {
return "mm:sintering_furnace";
}
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 getFieldCount() {
return 4;
}
@Override
public void clear() {
this.inventory.clear();
}
}
ContainerClass
package me.Wilfsadude.MyMod.Blocks.Machines.Sinterer;
import me.Wilfsadude.MyMod.Blocks.Machines.Sinterer.Slots.SlotSinteringFurnaceFuel;
import me.Wilfsadude.MyMod.Blocks.Machines.Sinterer.Slots.SlotSinteringFurnaceOutput;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IContainerListener;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ContainerSinteringFurnace extends Container {
private final TileEntitySinteringFurnace tileentity;
private int cookTime, totalCookTime, burnTime, currentBurnTime;
public ContainerSinteringFurnace(InventoryPlayer player, TileEntitySinteringFurnace tileentity) {
this.tileentity = tileentity;
this.addSlotToContainer(new Slot(tileentity, 0, 20, 17));
this.addSlotToContainer(new Slot(tileentity, 1, 56, 17));
this.addSlotToContainer(new SlotSinteringFurnaceFuel(tileentity,2, 38,53));
this.addSlotToContainer(new SlotSinteringFurnaceOutput(player.player, tileentity,3,112,31));
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 9; x++) {
this.addSlotToContainer(new Slot(player, x + y * 9 + 9, 8 + x * 18, 84 + y * 18));
}
}
for (int x = 0; x < 9; x++) {
this.addSlotToContainer(new Slot(player, x, 8 + x * 18, 142));
}
}
@Override
public void addListener(IContainerListener listener) {
super.addListener(listener);
listener.sendAllWindowProperties(this, this.tileentity);
}
@Override
public void detectAndSendChanges()
{
super.detectAndSendChanges();
for(int i = 0; i < this.listeners.size(); ++i)
{
IContainerListener listener = (IContainerListener)this.listeners.get(i);
if(this.cookTime != this.tileentity.getField(2)) listener.sendWindowProperty(this, 2, this.tileentity.getField(2));
if(this.burnTime != this.tileentity.getField(0)) listener.sendWindowProperty(this, 0, this.tileentity.getField(0));
if(this.currentBurnTime != this.tileentity.getField(1)) listener.sendWindowProperty(this, 1, this.tileentity.getField(1));
if(this.totalCookTime != this.tileentity.getField(3)) listener.sendWindowProperty(this, 3, this.tileentity.getField(3));
}
this.cookTime = this.tileentity.getField(2);
this.burnTime = this.tileentity.getField(0);
this.currentBurnTime = this.tileentity.getField(1);
this.totalCookTime = this.tileentity.getField(3);
}
@Override
@SideOnly(Side.CLIENT)
public void updateProgressBar(int id, int data)
{
this.tileentity.setField(id, data);
}
@Override
public boolean canInteractWith(EntityPlayer playerIn)
{
return this.tileentity.isUsableByPlayer(playerIn);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int index)
{
ItemStack stack = ItemStack.EMPTY;
Slot slot = (Slot)this.inventorySlots.get(index);
if(slot != null && slot.getHasStack())
{
ItemStack stack1 = slot.getStack();
stack = stack1.copy();
if(index == 3)
{
if(!this.mergeItemStack(stack1, 4, 40, true)) return ItemStack.EMPTY;
slot.onSlotChange(stack1, stack);
}
else if(index != 2 && index != 1 && index != 0)
{
Slot slot1 = (Slot)this.inventorySlots.get(index + 1);
if(!SinteringFurnaceRecipes.getInstance().getSinteringResult(stack1, slot1.getStack()).isEmpty())
{
if(!this.mergeItemStack(stack1, 0, 2, false))
{
return ItemStack.EMPTY;
}
else if(TileEntitySinteringFurnace.isItemFuel(stack1))
{
if(!this.mergeItemStack(stack1, 2, 3, false)) return ItemStack.EMPTY;
}
else if(TileEntitySinteringFurnace.isItemFuel(stack1))
{
if(!this.mergeItemStack(stack1, 2, 3, false)) return ItemStack.EMPTY;
}
else if(TileEntitySinteringFurnace.isItemFuel(stack1))
{
if(!this.mergeItemStack(stack1, 2, 3, false)) return ItemStack.EMPTY;
}
else if(index >= 4 && index < 31)
{
if(!this.mergeItemStack(stack1, 31, 40, false)) return ItemStack.EMPTY;
}
else if(index >= 31 && index < 40 && !this.mergeItemStack(stack1, 4, 31, false))
{
return ItemStack.EMPTY;
}
}
}
else if(!this.mergeItemStack(stack1, 4, 40, false))
{
return ItemStack.EMPTY;
}
if(stack1.isEmpty())
{
slot.putStack(ItemStack.EMPTY);
}
else
{
slot.onSlotChanged();
}
if(stack1.getCount() == stack.getCount()) return ItemStack.EMPTY;
slot.onTake(playerIn, stack1);
}
return stack;
}
}
GuiClass
package me.Wilfsadude.MyMod.Blocks.Machines.Sinterer;
import me.Wilfsadude.MyMod.Util.Reference;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
public class GuiSinteringFurnace extends GuiContainer {
private static final ResourceLocation TEXTURES = new ResourceLocation(Reference.MOD_ID + ":textures/gui/sintering_furnace.png");
private final InventoryPlayer player;
private final TileEntitySinteringFurnace tileentity;
public GuiSinteringFurnace(InventoryPlayer player, TileEntitySinteringFurnace tileentity) {
super(new ContainerSinteringFurnace(player, tileentity));
this.player = player;
this.tileentity = tileentity;
}
@Override
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
String tileName = this.tileentity.getDisplayName().getUnformattedText();
this.fontRenderer.drawString(tileName, (this.xSize / 2 - this.fontRenderer.getStringWidth(tileName) / 2) + 3,8,4210752);
this.fontRenderer.drawString(this.player.getDisplayName().getUnformattedText(), 112, this.ySize - 96 + 2, 4210752);
}
@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
GlStateManager.color(1.0f,1.0f,1.0f);
this.mc.getTextureManager().bindTexture(TEXTURES);
this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
if (TileEntitySinteringFurnace.isBurning(tileentity)) {
int k = this.getBurnLeftScaled(13);
this.drawTexturedModalRect(this.guiLeft + 41, this.guiTop + 38 + 12 - k, 176, 12 - k, 14, k + 1);
}
int l = this.getCookProgressScaled(24);
this.drawTexturedModalRect(this.guiLeft + 80, this.guiTop + 36, 176, 14, l+1, 16);
}
private int getBurnLeftScaled(int pixels) {
int i = this.tileentity.getField(1);
if (i == 0) i = 200;
return this.tileentity.getField(0);
}
private int getCookProgressScaled(int pixels) {
int i = this.tileentity.getField(2);
int j = this.tileentity.getField(3);
return j != 0 && i != 0 ? i * pixels / j : 0;
}
}
GuiHandler
package me.Wilfsadude.MyMod.Util.Handlers;
import me.Wilfsadude.MyMod.Blocks.Machines.Sinterer.ContainerSinteringFurnace;
import me.Wilfsadude.MyMod.Blocks.Machines.Sinterer.GuiSinteringFurnace;
import me.Wilfsadude.MyMod.Blocks.Machines.Sinterer.TileEntitySinteringFurnace;
import me.Wilfsadude.MyMod.Util.Reference;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.network.IGuiHandler;
public class GuiHandler implements IGuiHandler {
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
BlockPos pos = new BlockPos(x,y,z);
TileEntity tileentity = world.getTileEntity(pos);
if (tileentity instanceof TileEntitySinteringFurnace) return new ContainerSinteringFurnace(player.inventory, (TileEntitySinteringFurnace)world.getTileEntity(new BlockPos(x,y,z)));
return null;
}
@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
BlockPos pos = new BlockPos(x,y,z);
TileEntity tileentity = world.getTileEntity(pos);
if (tileentity instanceof TileEntitySinteringFurnace) return new GuiSinteringFurnace(player.inventory, (TileEntitySinteringFurnace)world.getTileEntity(new BlockPos(x,y,z)));
return null;
}
}
RegistryHandler
package me.Wilfsadude.MyMod.Util.Handlers;
import me.Wilfsadude.MyMod.Init.ModBlocks;
import me.Wilfsadude.MyMod.Init.ModItems;
import me.Wilfsadude.MyMod.MyMod;
import me.Wilfsadude.MyMod.Util.IHasModel;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
@Mod.EventBusSubscriber
public class RegistryHandler {
@SubscribeEvent
public static void onItemRegister(RegistryEvent.Register<Item> event) {
event.getRegistry().registerAll(ModItems.ITEMS.toArray(new Item[0]));
}
@SubscribeEvent
public static void onBlockRegister(RegistryEvent.Register<Block> event) {
event.getRegistry().registerAll(ModBlocks.BLOCKS.toArray(new Block[0]));
TileEntityHandler.registerTileEntites();
}
@SubscribeEvent
public static void onModelRegister(ModelRegistryEvent event) {
for (Item item : ModItems.ITEMS) {
if (item instanceof IHasModel) {
((IHasModel)item).registerModels();
}
}
for (Block block : ModBlocks.BLOCKS) {
if (block instanceof IHasModel) {
((IHasModel)block).registerModels();
}
}
}
public static void initRegistries() {
NetworkRegistry.INSTANCE.registerGuiHandler(MyMod.instance, new GuiHandler());
}
}
Please help