Guest User

My Tile Entity

a guest
Nov 10th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.59 KB | None | 0 0
  1. package me.misterfrogger.quintuplinator;
  2.  
  3. import ic2.api.energy.event.EnergyTileLoadEvent;
  4. import ic2.api.energy.event.EnergyTileUnloadEvent;
  5. import ic2.api.energy.tile.IEnergySink;
  6. import ic2.api.tile.IWrenchable;
  7.  
  8. import java.util.HashMap;
  9.  
  10. import net.minecraft.block.Block;
  11. import net.minecraft.client.Minecraft;
  12. import net.minecraft.entity.player.EntityPlayer;
  13. import net.minecraft.inventory.ISidedInventory;
  14. import net.minecraft.item.ItemStack;
  15. import net.minecraft.nbt.NBTTagCompound;
  16. import net.minecraft.nbt.NBTTagList;
  17. import net.minecraft.network.INetworkManager;
  18. import net.minecraft.network.packet.Packet;
  19. import net.minecraft.network.packet.Packet132TileEntityData;
  20. import net.minecraft.tileentity.TileEntity;
  21. import net.minecraftforge.common.ForgeDirection;
  22. import net.minecraftforge.common.MinecraftForge;
  23. import net.minecraftforge.fluids.Fluid;
  24. import net.minecraftforge.fluids.FluidStack;
  25. import net.minecraftforge.fluids.FluidTankInfo;
  26. import net.minecraftforge.fluids.IFluidHandler;
  27. import cpw.mods.fml.common.FMLCommonHandler;
  28.  
  29. public class TileEntityPurificationChamber extends TileEntity implements ISidedInventory, IWrenchable, IFluidHandler, IEnergySink {
  30.     public static final int ticksPerOp = 600;
  31.     public short facingDir;
  32.     private ItemStack[] inventory;
  33.     public boolean working;
  34.     public int progress;
  35.     public int oxygenAmount;
  36.     public double energyAmount;
  37.     public boolean initialized;
  38.     public static HashMap<Integer, ItemStack> recipes;
  39.    
  40.     public TileEntityPurificationChamber(){
  41.         inventory = new ItemStack[2];
  42.         if(recipes == null){
  43.             recipes = new HashMap<Integer, ItemStack>();
  44.             recipes.put(Block.oreIron.blockID, new ItemStack(Quintuplinator.itemClump, 3, 0));
  45.             recipes.put(Block.oreGold.blockID, new ItemStack(Quintuplinator.itemClump, 3, 1));
  46.         }
  47.        
  48.         progress = 0;
  49.     }
  50.    
  51.     @Override
  52.     public void onInventoryChanged(){
  53.         if(worldObj != null) worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
  54.         recalculateWorking();
  55.         super.onInventoryChanged();
  56.     }
  57.    
  58.     public void recalculateWorking(){
  59.         if(worldObj == null || worldObj.isRemote) return;
  60.         ItemStack stack = getStackInSlot(0);
  61.         ItemStack result;
  62.         if(stack != null && (result = recipes.get(stack.itemID)) != null && (getStackInSlot(1) == null || (64 - result.stackSize >= getStackInSlot(1).stackSize && result.itemID == getStackInSlot(1).itemID)) && oxygenAmount >= result.stackSize * 100){
  63.             if(energyAmount >= 64){
  64.                 working = true;
  65.             }else{
  66.                 working = false;
  67.             }
  68.         }else{
  69.             working = false;
  70.             progress = 0;
  71.         }
  72.         if(worldObj != null) worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
  73.     }
  74.    
  75.     @Override
  76.     public void updateEntity(){
  77.         if(worldObj == null) return;
  78.         if(!initialized && !worldObj.isRemote){
  79.             initialized = true;
  80.             MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this));
  81.         }
  82.        
  83.         if(working){
  84.             if(energyAmount < 64.0D){
  85.                 working = false;
  86.                 if(worldObj != null) worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
  87.             }
  88.            
  89.             energyAmount -= 64.0D;
  90.            
  91.             if(progress < ticksPerOp){
  92.                 progress++;
  93.             }else{
  94.                 if(FMLCommonHandler.instance().getEffectiveSide().isServer()){
  95.                     progress = 0;
  96.                     ItemStack result = recipes.get(getStackInSlot(0).itemID);
  97.                    
  98.                     if(getStackInSlot(1) == null){
  99.                         setInventorySlotContents(1, result.copy());
  100.                     }else{
  101.                         getStackInSlot(1).stackSize += result.stackSize;
  102.                     }
  103.                     oxygenAmount -= result.stackSize * 100;
  104.                     decrStackSize(0, 1);
  105.                     worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
  106.                 }
  107.             }
  108.         }
  109.     }
  110.    
  111.     @Override
  112.     public void invalidate(){
  113.         if(!worldObj.isRemote){
  114.             MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this));
  115.         }
  116.     }
  117.    
  118.     @Override
  119.     public int getSizeInventory(){
  120.         return inventory.length;
  121.     }
  122.    
  123.     @Override
  124.     public ItemStack getStackInSlot(int i){
  125.         return inventory[i];
  126.     }
  127.    
  128.     @Override
  129.     public ItemStack decrStackSize(int slot, int count){
  130.         ItemStack stack = getStackInSlot(slot);
  131.         if(stack != null){
  132.             if(stack.stackSize <= count){
  133.                 setInventorySlotContents(slot, null);
  134.             }else{
  135.                 stack = stack.splitStack(count);
  136.                 onInventoryChanged();
  137.             }
  138.         }
  139.         return stack;
  140.     }
  141.    
  142.     @Override
  143.     public ItemStack getStackInSlotOnClosing(int slot){
  144.         ItemStack stack = getStackInSlot(slot);
  145.         setInventorySlotContents(slot, null);
  146.         return stack;
  147.     }
  148.    
  149.     @Override
  150.     public void setInventorySlotContents(int slot, ItemStack stack){
  151.         inventory[slot] = stack;
  152.         if(stack != null && stack.stackSize > getInventoryStackLimit()){
  153.             stack.stackSize = getInventoryStackLimit();
  154.         }
  155.         onInventoryChanged();
  156.     }
  157.    
  158.     @Override
  159.     public String getInvName(){
  160.         return "Purification Chamber";
  161.     }
  162.    
  163.     @Override
  164.     public boolean isInvNameLocalized(){
  165.         return true;
  166.     }
  167.    
  168.     @Override
  169.     public int getInventoryStackLimit(){
  170.         return 64;
  171.     }
  172.    
  173.     @Override
  174.     public boolean isUseableByPlayer(EntityPlayer player){
  175.         return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64;
  176.     }
  177.    
  178.     @Override
  179.     public void openChest(){
  180.        
  181.     }
  182.    
  183.     @Override
  184.     public void closeChest(){
  185.        
  186.     }
  187.    
  188.     @Override
  189.     public boolean isItemValidForSlot(int slot, ItemStack item){
  190.         switch(slot){
  191.         case 0:
  192.             return true;
  193.         case 1:
  194.             return false;
  195.         default:
  196.             return false;
  197.         }
  198.     }
  199.    
  200.     @Override
  201.     public void writeToNBT(NBTTagCompound tag){
  202.         tag.setShort("facing", facingDir);
  203.         tag.setBoolean("working", working);
  204.         tag.setInteger("progress", progress);
  205.         tag.setInteger("oxygenAmount", oxygenAmount);
  206.         tag.setDouble("energyAmount", energyAmount);
  207.        
  208.         NBTTagList list = new NBTTagList();
  209.         for(int i = 0;i < getSizeInventory();i++){
  210.             ItemStack stack = getStackInSlot(i);
  211.             if(stack != null){
  212.                 NBTTagCompound item = new NBTTagCompound();
  213.                 item.setByte("slotNum", (byte) i);
  214.                 stack.writeToNBT(item);
  215.                 list.appendTag(item);
  216.             }
  217.         }
  218.        
  219.         tag.setTag("invContents", list);
  220.         super.writeToNBT(tag);
  221.     }
  222.    
  223.     @Override
  224.     public void readFromNBT(NBTTagCompound tag){
  225.         facingDir = tag.getShort("facing");
  226.         working = tag.getBoolean("working");
  227.         progress = tag.getInteger("progress");
  228.         oxygenAmount = tag.getInteger("oxygenAmount");
  229.         energyAmount = tag.getDouble("energyAmount");
  230.        
  231.         NBTTagList list = tag.getTagList("invContents");
  232.         for(int i = 0;i < list.tagCount();i++){
  233.             NBTTagCompound item = (NBTTagCompound) list.tagAt(i);
  234.             int slot = item.getByte("slotNum");
  235.             if(slot >= 0 && slot < getSizeInventory()){
  236.                 setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item));
  237.             }
  238.         }
  239.        
  240.         super.readFromNBT(tag);
  241.     }
  242.    
  243.     @Override
  244.     public Packet getDescriptionPacket(){
  245.         NBTTagCompound tag = new NBTTagCompound();
  246.         writeToNBT(tag);
  247.         return new Packet132TileEntityData(xCoord, yCoord, zCoord, 1, tag);
  248.     }
  249.    
  250.     @Override
  251.     public void onDataPacket(INetworkManager networkManager, Packet132TileEntityData packet){
  252.         readFromNBT(packet.data);
  253.         Minecraft.getMinecraft().renderGlobal.markBlockForRenderUpdate(xCoord, yCoord, zCoord);
  254.     }
  255.    
  256.     @Override
  257.     public short getFacing(){
  258.         return facingDir;
  259.     }
  260.    
  261.     @Override
  262.     public void setFacing(short facing){
  263.         if(facing < 2) return;
  264.         facingDir = facing;
  265.         worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
  266.     }
  267.    
  268.     @Override
  269.     public boolean wrenchCanSetFacing(EntityPlayer player, int side){
  270.         return side > 1 && side != facingDir;
  271.     }
  272.    
  273.     @Override
  274.     public float getWrenchDropRate(){
  275.         return 0.8F;
  276.     }
  277.    
  278.     @Override
  279.     public ItemStack getWrenchDrop(EntityPlayer player){
  280.         return new ItemStack(Quintuplinator.blockPurificationChamber);
  281.     }
  282.    
  283.     @Override
  284.     public boolean wrenchCanRemove(EntityPlayer player){
  285.         return true;
  286.     }
  287.    
  288.     @Override
  289.     public int[] getAccessibleSlotsFromSide(int side){
  290.         switch(side){
  291.         case 0:
  292.             return new int[0];
  293.         case 1:
  294.             return new int[]{0};
  295.         default:
  296.             return new int[]{1};
  297.         }
  298.     }
  299.    
  300.     @Override
  301.     public boolean canExtractItem(int slot, ItemStack item, int side){
  302.         return true;
  303.     }
  304.    
  305.     @Override
  306.     public boolean canInsertItem(int slot, ItemStack item, int side){
  307.         return slot == 0;
  308.     }
  309.    
  310.     @Override
  311.     public boolean canDrain(ForgeDirection dir, Fluid fluid){
  312.         return false;
  313.     }
  314.    
  315.     @Override
  316.     public boolean canFill(ForgeDirection dir, Fluid fluid){
  317.         return fluid.getBlockID() == Quintuplinator.fluidOxygen.getBlockID();
  318.     }
  319.    
  320.     @Override
  321.     public FluidTankInfo[] getTankInfo(ForgeDirection dir){
  322.         return new FluidTankInfo[] { new FluidTankInfo(new FluidStack(Quintuplinator.fluidOxygen, oxygenAmount), 6000) };
  323.     }
  324.    
  325.     @Override
  326.     public FluidStack drain(ForgeDirection dir, FluidStack max, boolean sim){
  327.         return new FluidStack(Quintuplinator.fluidOxygen, 0);
  328.     }
  329.    
  330.     @Override
  331.     public FluidStack drain(ForgeDirection dir, int maxAmount, boolean sim){
  332.         return new FluidStack(Quintuplinator.fluidOxygen, 0);
  333.     }
  334.    
  335.     @Override
  336.     public int fill(ForgeDirection dir, FluidStack max, boolean doFill){
  337.         if(max.getFluid().getBlockID() != Quintuplinator.fluidOxygen.getBlockID()) return 0;
  338.         int amount = Math.min(6000 - oxygenAmount, max.amount);
  339.         if(doFill) oxygenAmount += amount;
  340.         if(worldObj != null) worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
  341.         recalculateWorking();
  342.         return amount;
  343.     }
  344.  
  345.     @Override
  346.     public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) {
  347.         return true;
  348.     }
  349.  
  350.     @Override
  351.     public double demandedEnergyUnits() {
  352.         return 25600.0D - energyAmount;
  353.     }
  354.  
  355.     @Override
  356.     public double injectEnergyUnits(ForgeDirection directionFrom, double amount) {
  357.         if(energyAmount < 25600.0D){
  358.             energyAmount += amount;
  359.             if(!working) recalculateWorking();
  360.             return 0;
  361.         }else{
  362.             return amount;
  363.         }
  364.     }
  365.  
  366.     @Override
  367.     public int getMaxSafeInput() {
  368.         return 128;
  369.     }
  370. }
Advertisement
Add Comment
Please, Sign In to add comment