Converted Centrifuge to scala

This commit is contained in:
Robert S 2014-09-29 15:26:25 -04:00
parent 6deff382af
commit b2a874ba9b
8 changed files with 471 additions and 557 deletions

View file

@ -1,123 +0,0 @@
package resonantinduction.atomic.machine.centrifuge;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotFurnace;
import net.minecraft.item.ItemStack;
import resonant.lib.gui.ContainerBase;
import resonant.lib.prefab.slot.SlotEnergyItem;
import resonantinduction.atomic.Atomic;
/**
* Centrifuge container
*/
public class ContainerCentrifuge extends ContainerBase
{
private static final int slotCount = 4;
private TileCentrifuge tileEntity;
public ContainerCentrifuge(InventoryPlayer par1InventoryPlayer, TileCentrifuge tileEntity)
{
super((IInventory) tileEntity);
this.tileEntity = tileEntity;
// Electric Item
this.addSlotToContainer(new SlotEnergyItem((IInventory) tileEntity, 0, 131, 26));
// Uranium Gas Tank
this.addSlotToContainer(new Slot((IInventory) tileEntity, 1, 25, 50));
// Output Uranium 235
this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, (IInventory) tileEntity, 2, 81, 26));
// Output Uranium 238
this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, (IInventory) tileEntity, 3, 101, 26));
this.addPlayerInventory(par1InventoryPlayer.player);
}
@Override
public void onContainerClosed(EntityPlayer entityplayer)
{
super.onContainerClosed(entityplayer);
//this.tileEntity.getPlayersUsing().remove(entityplayer);
}
@Override
public boolean canInteractWith(EntityPlayer par1EntityPlayer)
{
return this.tileEntity.isUseableByPlayer(par1EntityPlayer);
}
/**
* Called to transfer a stack from one inventory to the other eg. when shift clicking.
*/
@Override
public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par1)
{
ItemStack var2 = null;
Slot var3 = (Slot) this.inventorySlots.get(par1);
if (var3 != null && var3.getHasStack())
{
ItemStack itemStack = var3.getStack();
var2 = itemStack.copy();
if (par1 >= slotCount)
{
if (this.getSlot(0).isItemValid(itemStack))
{
if (!this.mergeItemStack(itemStack, 0, 1, false))
{
return null;
}
}
else if (Atomic.isItemStackUraniumOre(itemStack))
{
if (!this.mergeItemStack(itemStack, 1, 2, false))
{
return null;
}
}
else if (Atomic.isItemStackEmptyCell(itemStack))
{
if (!this.mergeItemStack(itemStack, 3, 4, false))
{
return null;
}
}
else if (par1 < 27 + slotCount)
{
if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false))
{
return null;
}
}
else if (par1 >= 27 + slotCount && par1 < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false))
{
return null;
}
}
else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false))
{
return null;
}
if (itemStack.stackSize == 0)
{
var3.putStack((ItemStack) null);
}
else
{
var3.onSlotChanged();
}
if (itemStack.stackSize == var2.stackSize)
{
return null;
}
var3.onPickupFromSlot(par1EntityPlayer, itemStack);
}
return var2;
}
}

View file

@ -0,0 +1,95 @@
package resonantinduction.atomic.machine.centrifuge
import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer}
import net.minecraft.inventory.{IInventory, Slot, SlotFurnace}
import net.minecraft.item.ItemStack
import resonant.lib.gui.ContainerBase
import resonant.lib.prefab.slot.SlotEnergyItem
import resonantinduction.atomic.Atomic
class ContainerCentrifuge(par1InventoryPlayer: InventoryPlayer, tileEntity: TileCentrifuge) extends ContainerBase(tileEntity)
{
//Constructor
this.addSlotToContainer(new SlotEnergyItem(tileEntity.asInstanceOf[IInventory], 0, 131, 26))
this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 25, 50))
this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity.asInstanceOf[IInventory], 2, 81, 26))
this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity.asInstanceOf[IInventory], 3, 101, 26))
this.addPlayerInventory(par1InventoryPlayer.player)
override def onContainerClosed(entityplayer: EntityPlayer)
{
super.onContainerClosed(entityplayer)
}
override def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean =
{
return this.tileEntity.isUseableByPlayer(par1EntityPlayer)
}
/**
* Called to transfer a stack from one inventory to the other eg. when shift clicking.
*/
override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack =
{
var var2: ItemStack = null
val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot]
if (var3 != null && var3.getHasStack)
{
val itemStack: ItemStack = var3.getStack
var2 = itemStack.copy
if (par1 >= slotCount)
{
if (this.getSlot(0).isItemValid(itemStack))
{
if (!this.mergeItemStack(itemStack, 0, 1, false))
{
return null
}
}
else if (Atomic.isItemStackUraniumOre(itemStack))
{
if (!this.mergeItemStack(itemStack, 1, 2, false))
{
return null
}
}
else if (Atomic.isItemStackEmptyCell(itemStack))
{
if (!this.mergeItemStack(itemStack, 3, 4, false))
{
return null
}
}
else if (par1 < 27 + slotCount)
{
if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false))
{
return null
}
}
else if (par1 >= 27 + slotCount && par1 < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false))
{
return null
}
}
else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false))
{
return null
}
if (itemStack.stackSize == 0)
{
var3.putStack(null.asInstanceOf[ItemStack])
}
else
{
var3.onSlotChanged
}
if (itemStack.stackSize == var2.stackSize)
{
return null
}
var3.onPickupFromSlot(par1EntityPlayer, itemStack)
}
return var2
}
}

View file

@ -1,77 +0,0 @@
package resonantinduction.atomic.machine.centrifuge;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import resonant.lib.gui.GuiContainerBase;
import universalelectricity.api.UnitDisplay;
public class GuiCentrifuge extends GuiContainerBase
{
private TileCentrifuge tileEntity;
public GuiCentrifuge(InventoryPlayer par1InventoryPlayer, TileCentrifuge tileEntity)
{
super(new ContainerCentrifuge(par1InventoryPlayer, tileEntity));
this.tileEntity = tileEntity;
}
/**
* Draw the foreground layer for the GuiContainer (everything in front of the items)
*/
@Override
public void drawGuiContainerForegroundLayer(int mouseX, int mouseY)
{
this.fontRendererObj.drawString("Centrifuge", 60, 6, 4210752);
String displayText = "";
if (this.tileEntity.timer > 0)
{
displayText = "Processing";
}
else if (this.tileEntity.nengYong())
{
displayText = "Ready";
}
else
{
displayText = "Idle";
}
this.fontRendererObj.drawString("Status: " + displayText, 70, 50, 4210752);
this.renderUniversalDisplay(8, 112, TileCentrifuge.DIAN * 20, mouseX, mouseY, UnitDisplay.Unit.WATT);
this.renderUniversalDisplay(100, 112, this.tileEntity.electricNode().getVoltage(ForgeDirection.UNKNOWN), mouseX, mouseY, UnitDisplay.Unit.VOLTAGE);
this.fontRendererObj.drawString("The centrifuge spins", 8, 75, 4210752);
this.fontRendererObj.drawString("uranium hexafluoride gas into", 8, 85, 4210752);
this.fontRendererObj.drawString("enriched uranium for fission.", 8, 95, 4210752);
this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
//if (this.isPointInRegion(8, 18, this.meterWidth, this.meterHeight, mouseX, mouseY) && this.tileEntity.gasTank.getFluid() != null)
//{
// this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop + 10, this.tileEntity.gasTank.getFluid().getFluid().getLocalizedName(), this.tileEntity.gasTank.getFluid().amount + " L");
//}
}
/**
* Draw the background layer for the GuiContainer (everything behind the items)
*/
@Override
protected void drawGuiContainerBackgroundLayer(float par1, int x, int y)
{
super.drawGuiContainerBackgroundLayer(par1, x, y);
this.drawSlot(80, 25);
this.drawSlot(100, 25);
this.drawSlot(130, 25, SlotType.BATTERY);
this.drawBar(40, 26, (float) this.tileEntity.timer / (float) TileCentrifuge.SHI_JIAN);
// Uranium Gas
this.drawMeter(8, 18, (float) this.tileEntity.gasTank.getFluidAmount() / (float) this.tileEntity.gasTank.getCapacity(), this.tileEntity.gasTank.getFluid());
this.drawSlot(24, 49, SlotType.GAS);
}
}

View file

@ -0,0 +1,52 @@
package resonantinduction.atomic.machine.centrifuge
import net.minecraft.entity.player.InventoryPlayer
import net.minecraft.util.StatCollector
import resonant.lib.gui.GuiContainerBase
import resonant.lib.gui.GuiContainerBase.SlotType
import universalelectricity.api.UnitDisplay
class GuiCentrifuge(par1InventoryPlayer: InventoryPlayer, tileEntity: TileCentrifuge) extends GuiContainerBase(new ContainerCentrifuge(par1InventoryPlayer, tileEntity))
{
/**
* Draw the foreground layer for the GuiContainer (everything in front of the items)
*/
override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int)
{
this.fontRendererObj.drawString("Centrifuge", 60, 6, 4210752)
var displayText: String = ""
if (this.tileEntity.timer > 0)
{
displayText = "Processing"
}
else if (this.tileEntity.nengYong)
{
displayText = "Ready"
}
else
{
displayText = "Idle"
}
this.fontRendererObj.drawString("Status: " + displayText, 70, 50, 4210752)
this.renderUniversalDisplay(8, 112, TileCentrifuge.DIAN * 20, mouseX, mouseY, UnitDisplay.Unit.WATT)
this.renderUniversalDisplay(100, 112, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE)
this.fontRendererObj.drawString("The centrifuge spins", 8, 75, 4210752)
this.fontRendererObj.drawString("uranium hexafluoride gas into", 8, 85, 4210752)
this.fontRendererObj.drawString("enriched uranium for fission.", 8, 95, 4210752)
this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752)
}
/**
* Draw the background layer for the GuiContainer (everything behind the items)
*/
protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int)
{
super.drawGuiContainerBackgroundLayer(par1, x, y)
this.drawSlot(80, 25)
this.drawSlot(100, 25)
this.drawSlot(130, 25, SlotType.BATTERY)
this.drawBar(40, 26, this.tileEntity.timer.asInstanceOf[Float] / TileCentrifuge.SHI_JIAN.asInstanceOf[Float])
this.drawMeter(8, 18, this.tileEntity.gasTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.gasTank.getCapacity.asInstanceOf[Float], this.tileEntity.gasTank.getFluid)
this.drawSlot(24, 49, SlotType.GAS)
}
}

View file

@ -1,46 +0,0 @@
package resonantinduction.atomic.machine.centrifuge;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;
import org.lwjgl.opengl.GL11;
import resonant.lib.render.RenderUtility;
import resonantinduction.core.Reference;
@SideOnly(Side.CLIENT)
public class RenderCentrifuge extends TileEntitySpecialRenderer
{
public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain(), Reference.modelPath() + "centrifuge.tcn"));
public static final ResourceLocation TEXTURE = new ResourceLocation(Reference.domain(), Reference.modelPath() + "centrifuge.png");
public void render(TileCentrifuge tileEntity, double x, double y, double z, float f)
{
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
if (tileEntity.getWorldObj() != null)
{
RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection());
}
bindTexture(TEXTURE);
GL11.glPushMatrix();
GL11.glRotated(Math.toDegrees(tileEntity.rotation), 0, 1, 0);
MODEL.renderOnly("C", "JROT", "KROT", "LROT", "MROT");
GL11.glPopMatrix();
MODEL.renderAllExcept("C", "JROT", "KROT", "LROT", "MROT");
GL11.glPopMatrix();
}
@Override
public void renderTileEntityAt(TileEntity tileEntity, double var2, double var4, double var6, float var8)
{
this.render((TileCentrifuge) tileEntity, var2, var4, var6, var8);
}
}

View file

@ -0,0 +1,43 @@
package resonantinduction.atomic.machine.centrifuge
import cpw.mods.fml.relauncher.Side
import cpw.mods.fml.relauncher.SideOnly
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.tileentity.TileEntity
import net.minecraft.util.ResourceLocation
import net.minecraftforge.client.model.AdvancedModelLoader
import net.minecraftforge.client.model.IModelCustom
import org.lwjgl.opengl.GL11
import resonant.lib.render.RenderUtility
import resonantinduction.core.Reference
@SideOnly(Side.CLIENT) object RenderCentrifuge
{
final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "centrifuge.tcn"))
final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "centrifuge.png")
}
@SideOnly(Side.CLIENT) class RenderCentrifuge extends TileEntitySpecialRenderer
{
def render(tileEntity: TileCentrifuge, x: Double, y: Double, z: Double, f: Float)
{
GL11.glPushMatrix
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5)
if (tileEntity.getWorldObj != null)
{
RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection)
}
bindTexture(RenderCentrifuge.TEXTURE)
GL11.glPushMatrix
GL11.glRotated(Math.toDegrees(tileEntity.rotation), 0, 1, 0)
RenderCentrifuge.MODEL.renderOnly("C", "JROT", "KROT", "LROT", "MROT")
GL11.glPopMatrix
RenderCentrifuge.MODEL.renderAllExcept("C", "JROT", "KROT", "LROT", "MROT")
GL11.glPopMatrix
}
def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float)
{
this.render(tileEntity.asInstanceOf[TileCentrifuge], var2, var4, var6, var8)
}
}

View file

@ -1,311 +0,0 @@
package resonantinduction.atomic.machine.centrifuge;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.*;
import resonant.engine.ResonantEngine;
import resonant.lib.content.prefab.java.TileElectricInventory;
import resonant.lib.network.discriminator.PacketTile;
import resonant.lib.network.discriminator.PacketType;
import resonant.lib.network.handle.IPacketReceiver;
import resonantinduction.atomic.Atomic;
import resonantinduction.atomic.AtomicContent;
import resonantinduction.core.Settings;
import universalelectricity.compatibility.Compatibility;
import universalelectricity.core.transform.vector.Vector3;
/**
* Centrifuge TileEntity
*/
public class TileCentrifuge extends TileElectricInventory implements IPacketReceiver, IFluidHandler
{
public static final int SHI_JIAN = 20 * 60;
public static final long DIAN = 500000;
public final FluidTank gasTank = new FluidTank(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE().copy(), FluidContainerRegistry.BUCKET_VOLUME * 5);
public int timer = 0;
public float rotation = 0;
public TileCentrifuge()
{
super(Material.iron);
isOpaqueCube(false);
normalRender(false);
energy().setCapacity(DIAN * 2);
setSizeInventory(4);
}
@Override
public void update()
{
super.update();
if (timer > 0)
{
rotation += 0.45f;
}
if (!this.worldObj.isRemote)
{
/** Look for nearby tanks that contains uranium gas and try to extract it. */
if (this.ticks() % 20 == 0)
{
for (int i = 0; i < 6; i++)
{
ForgeDirection direction = ForgeDirection.getOrientation(i);
TileEntity tileEntity = new Vector3(this).add(direction).getTileEntity(world());
if (tileEntity instanceof IFluidHandler && tileEntity.getClass() != this.getClass())
{
IFluidHandler fluidHandler = ((IFluidHandler) tileEntity);
if (fluidHandler != null)
{
FluidStack requestFluid = AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE().copy();
requestFluid.amount = this.gasTank.getCapacity() - Atomic.getFluidAmount(this.gasTank.getFluid());
FluidStack receiveFluid = fluidHandler.drain(direction.getOpposite(), requestFluid, true);
if (receiveFluid != null)
{
if (receiveFluid.amount > 0)
{
if (this.gasTank.fill(receiveFluid, false) > 0)
{
this.gasTank.fill(receiveFluid, true);
}
}
}
}
}
}
}
if (this.nengYong())
{
this.discharge(getStackInSlot(0));
if (energy().extractEnergy(TileCentrifuge.DIAN, false) >= DIAN)
{
if (this.timer == 0)
{
this.timer = TileCentrifuge.SHI_JIAN;
}
if (this.timer > 0)
{
this.timer--;
if (this.timer < 1)
{
this.yong();
this.timer = 0;
}
}
else
{
this.timer = 0;
}
energy().extractEnergy(DIAN, true);
}
}
else
{
this.timer = 0;
}
if (this.ticks() % 10 == 0)
{
//for (EntityPlayer player : this.getPlayersUsing())
//{
// PacketDispatcher.sendPacketToPlayer(getDescriptionPacket(), (Player) player);
//}
}
}
}
@Override
public boolean use(EntityPlayer player, int side, Vector3 hit)
{
openGui(player, Atomic.INSTANCE());
return true;
}
@Override
public void read(ByteBuf data, EntityPlayer player, PacketType type)
{
try
{
this.timer = data.readInt();
this.gasTank.setFluid(new FluidStack(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE().fluidID, data.readInt()));
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public Packet getDescriptionPacket()
{
return ResonantEngine.instance.packetHandler.toMCPacket(new PacketTile(this, this.timer, Atomic.getFluidAmount(this.gasTank.getFluid())));
}
/**
* @return If the machine can be used.
*/
public boolean nengYong()
{
if (this.gasTank.getFluid() != null)
{
if (this.gasTank.getFluid().amount >= Settings.uraniumHexaflourideRatio())
{
return isItemValidForSlot(2, new ItemStack(AtomicContent.itemUranium())) && isItemValidForSlot(3, new ItemStack(AtomicContent.itemUranium(), 1, 1));
}
}
return false;
}
/**
* Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack
*/
public void yong()
{
if (this.nengYong())
{
this.gasTank.drain(Settings.uraniumHexaflourideRatio(), true);
if (this.worldObj.rand.nextFloat() > 0.6)
{
this.incrStackSize(2, new ItemStack(AtomicContent.itemUranium()));
}
else
{
this.incrStackSize(3, new ItemStack(AtomicContent.itemUranium(), 1, 1));
}
}
}
/**
* Reads a tile entity from NBT.
*/
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
this.timer = nbt.getInteger("smeltingTicks");
NBTTagCompound compound = nbt.getCompoundTag("gas");
this.gasTank.setFluid(FluidStack.loadFluidStackFromNBT(compound));
}
/**
* Writes a tile entity to NBT.
*/
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
nbt.setInteger("smeltingTicks", this.timer);
if (this.gasTank.getFluid() != null)
{
NBTTagCompound compound = new NBTTagCompound();
this.gasTank.getFluid().writeToNBT(compound);
nbt.setTag("gas", compound);
}
}
/**
* Tank Methods
*/
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
if (AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE().isFluidEqual(resource))
{
return this.gasTank.fill(resource, doFill);
}
return 0;
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
{
return null;
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
return null;
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid)
{
return AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE().fluidID == fluid.getID();
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
return false;
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from)
{
return new FluidTankInfo[]
{ this.gasTank.getInfo() };
}
/**
* Inventory
*/
@Override
public int[] getAccessibleSlotsFromSide(int side)
{
return side == 1 ? new int[]
{ 0, 1 } : new int[]
{ 2, 3 };
}
@Override
public boolean canInsertItem(int slotID, ItemStack itemStack, int side)
{
return slotID == 1 && this.isItemValidForSlot(slotID, itemStack);
}
@Override
public boolean canExtractItem(int slotID, ItemStack itemstack, int j)
{
return slotID == 2 || slotID == 3;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack)
{
switch (i)
{
case 0:
return Compatibility.isHandler(itemStack.getItem(), null);
case 1:
return true;
case 2:
return itemStack.getItem() == AtomicContent.itemUranium();
case 3:
return itemStack.getItem() == AtomicContent.itemUranium();
}
return false;
}
}

View file

@ -0,0 +1,281 @@
package resonantinduction.atomic.machine.centrifuge
import io.netty.buffer.ByteBuf
import net.minecraft.block.material.Material
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.IInventory
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.network.Packet
import net.minecraft.tileentity.TileEntity
import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.fluids._
import resonant.engine.ResonantEngine
import resonant.lib.content.prefab.java.TileElectricInventory
import resonant.lib.network.discriminator.{PacketTile, PacketType}
import resonant.lib.network.handle.IPacketReceiver
import resonantinduction.atomic.{Atomic, AtomicContent}
import resonantinduction.core.Settings
import universalelectricity.compatibility.Compatibility
import universalelectricity.core.transform.vector.Vector3
/**
* Centrifuge TileEntity
*/
object TileCentrifuge
{
final val SHI_JIAN: Int = 20 * 60
final val DIAN: Long = 500000
}
class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketReceiver with IFluidHandler with IInventory
{
final val gasTank: FluidTank = new FluidTank(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.copy, FluidContainerRegistry.BUCKET_VOLUME * 5)
var timer: Int = 0
var rotation: Float = 0
//Constructort
isOpaqueCube(false)
normalRender(false)
energy.setCapacity(TileCentrifuge.DIAN * 2)
setSizeInventory(4)
override def update
{
super.update
if (timer > 0)
{
rotation += 0.45f
}
if (!this.worldObj.isRemote)
{
if (this.ticks % 20 == 0)
{
{
var i: Int = 0
while (i < 6)
{
{
val direction: ForgeDirection = ForgeDirection.getOrientation(i)
val tileEntity: TileEntity = new Vector3(this).add(direction).getTileEntity(world)
if (tileEntity.isInstanceOf[IFluidHandler] && tileEntity.getClass != this.getClass)
{
val fluidHandler: IFluidHandler = (tileEntity.asInstanceOf[IFluidHandler])
if (fluidHandler != null)
{
val requestFluid: FluidStack = AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.copy
requestFluid.amount = this.gasTank.getCapacity - Atomic.getFluidAmount(this.gasTank.getFluid)
val receiveFluid: FluidStack = fluidHandler.drain(direction.getOpposite, requestFluid, true)
if (receiveFluid != null)
{
if (receiveFluid.amount > 0)
{
if (this.gasTank.fill(receiveFluid, false) > 0)
{
this.gasTank.fill(receiveFluid, true)
}
}
}
}
}
}
({
i += 1;
i - 1
})
}
}
}
if (this.nengYong)
{
this.discharge(getStackInSlot(0))
if (energy.extractEnergy(TileCentrifuge.DIAN, false) >= TileCentrifuge.DIAN)
{
if (this.timer == 0)
{
this.timer = TileCentrifuge.SHI_JIAN
}
if (this.timer > 0)
{
this.timer -= 1
if (this.timer < 1)
{
this.yong
this.timer = 0
}
}
else
{
this.timer = 0
}
energy.extractEnergy(TileCentrifuge.DIAN, true)
}
}
else
{
this.timer = 0
}
if (this.ticks % 10 == 0)
{
}
}
}
override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean =
{
openGui(player, Atomic.INSTANCE)
return true
}
def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType)
{
try
{
this.timer = data.readInt
this.gasTank.setFluid(new FluidStack(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID, data.readInt))
}
catch
{
case e: Exception =>
{
e.printStackTrace
}
}
}
override def getDescriptionPacket: Packet =
{
return ResonantEngine.instance.packetHandler.toMCPacket(new PacketTile(this, this.timer, Atomic.getFluidAmount(this.gasTank.getFluid)))
}
/**
* @return If the machine can be used.
*/
def nengYong: Boolean =
{
if (this.gasTank.getFluid != null)
{
if (this.gasTank.getFluid.amount >= Settings.uraniumHexaflourideRatio)
{
return isItemValidForSlot(2, new ItemStack(AtomicContent.itemUranium)) && isItemValidForSlot(3, new ItemStack(AtomicContent.itemUranium, 1, 1))
}
}
return false
}
/**
* Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack
*/
def yong
{
if (this.nengYong)
{
this.gasTank.drain(Settings.uraniumHexaflourideRatio, true)
if (this.worldObj.rand.nextFloat > 0.6)
{
this.incrStackSize(2, new ItemStack(AtomicContent.itemUranium))
}
else
{
this.incrStackSize(3, new ItemStack(AtomicContent.itemUranium, 1, 1))
}
}
}
/**
* Reads a tile entity from NBT.
*/
override def readFromNBT(nbt: NBTTagCompound)
{
super.readFromNBT(nbt)
this.timer = nbt.getInteger("smeltingTicks")
val compound: NBTTagCompound = nbt.getCompoundTag("gas")
this.gasTank.setFluid(FluidStack.loadFluidStackFromNBT(compound))
}
/**
* Writes a tile entity to NBT.
*/
override def writeToNBT(nbt: NBTTagCompound)
{
super.writeToNBT(nbt)
nbt.setInteger("smeltingTicks", this.timer)
if (this.gasTank.getFluid != null)
{
val compound: NBTTagCompound = new NBTTagCompound
this.gasTank.getFluid.writeToNBT(compound)
nbt.setTag("gas", compound)
}
}
/**
* Tank Methods
*/
def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int =
{
if (AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.isFluidEqual(resource))
{
return this.gasTank.fill(resource, doFill)
}
return 0
}
def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack =
{
return null
}
def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack =
{
return null
}
def canFill(from: ForgeDirection, fluid: Fluid): Boolean =
{
return AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID == fluid.getID
}
def canDrain(from: ForgeDirection, fluid: Fluid): Boolean =
{
return false
}
def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] =
{
return Array[FluidTankInfo](this.gasTank.getInfo)
}
/**
* Inventory
*/
override def getAccessibleSlotsFromSide(side: Int): Array[Int] =
{
return if (side == 1) Array[Int](0, 1) else Array[Int](2, 3)
}
override def canInsertItem(slotID: Int, itemStack: ItemStack, side: Int): Boolean =
{
return slotID == 1 && this.isItemValidForSlot(slotID, itemStack)
}
override def canExtractItem(slotID: Int, itemstack: ItemStack, j: Int): Boolean =
{
return slotID == 2 || slotID == 3
}
override def isItemValidForSlot(i: Int, itemStack: ItemStack): Boolean =
{
i match
{
case 0 =>
return Compatibility.isHandler(itemStack.getItem, null)
case 1 =>
return true
case 2 =>
return itemStack.getItem eq AtomicContent.itemUranium
case 3 =>
return itemStack.getItem eq AtomicContent.itemUranium
}
return false
}
}