Java tutorial
package micdoodle8.mods.galacticraft.core.tile; import java.util.Iterator; import java.util.List; import micdoodle8.mods.galacticraft.api.vector.Vector3; import micdoodle8.mods.galacticraft.core.GalacticraftCore; import micdoodle8.mods.galacticraft.core.blocks.GCCoreBlockParachest; import micdoodle8.mods.galacticraft.core.entities.IScaleableFuelLevel; import micdoodle8.mods.galacticraft.core.inventory.GCCoreContainerParachest; import micdoodle8.mods.galacticraft.core.items.GCCoreItems; import micdoodle8.mods.galacticraft.core.network.GCCorePacketHandlerServer.EnumPacketServer; import micdoodle8.mods.galacticraft.core.network.GCCorePacketManager; import micdoodle8.mods.galacticraft.core.network.IPacketReceiver; import micdoodle8.mods.galacticraft.core.util.PacketUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.StatCollector; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import com.google.common.io.ByteArrayDataInput; import cpw.mods.fml.common.network.PacketDispatcher; /** * GCCoreTileEntityParachest.java * * This file is part of the Galacticraft project * * @author micdoodle8 * @license Lesser GNU Public License v3 (http://www.gnu.org/licenses/lgpl.html) * */ public class GCCoreTileEntityParachest extends TileEntity implements IInventory, IPacketReceiver, IScaleableFuelLevel { private final int tankCapacity = 5000; public FluidTank fuelTank = new FluidTank(this.tankCapacity); public ItemStack[] chestContents = new ItemStack[3]; public boolean adjacentChestChecked = false; public float lidAngle; public float prevLidAngle; public int numUsingPlayers; private int ticksSinceSync; @Override public void validate() { super.validate(); if (this.worldObj != null && this.worldObj.isRemote) { PacketDispatcher.sendPacketToServer( PacketUtil.createPacket(GalacticraftCore.CHANNEL, EnumPacketServer.UPDATE_DYNAMIC_TILE_INV, new Object[] { this.xCoord, this.yCoord, this.zCoord })); } } @Override public int getScaledFuelLevel(int i) { final double fuelLevel = this.fuelTank.getFluid() == null ? 0 : this.fuelTank.getFluid().amount; return (int) (fuelLevel * i / this.tankCapacity); } @Override public int getSizeInventory() { return this.chestContents.length; } @Override public ItemStack getStackInSlot(int par1) { return this.chestContents[par1]; } @Override public ItemStack decrStackSize(int par1, int par2) { if (this.chestContents[par1] != null) { ItemStack itemstack; if (this.chestContents[par1].stackSize <= par2) { itemstack = this.chestContents[par1]; this.chestContents[par1] = null; this.onInventoryChanged(); return itemstack; } else { itemstack = this.chestContents[par1].splitStack(par2); if (this.chestContents[par1].stackSize == 0) { this.chestContents[par1] = null; } this.onInventoryChanged(); return itemstack; } } else { return null; } } @Override public ItemStack getStackInSlotOnClosing(int par1) { if (this.chestContents[par1] != null) { ItemStack itemstack = this.chestContents[par1]; this.chestContents[par1] = null; return itemstack; } else { return null; } } @Override public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { this.chestContents[par1] = par2ItemStack; if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit()) { par2ItemStack.stackSize = this.getInventoryStackLimit(); } this.onInventoryChanged(); } @Override public String getInvName() { return StatCollector.translateToLocal("container.parachest.name"); } @Override public boolean isInvNameLocalized() { return true; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList nbttaglist = nbt.getTagList("Items"); this.chestContents = new ItemStack[nbt.getInteger("chestContentLength")]; for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.tagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.chestContents.length) { this.chestContents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); } } if (nbt.hasKey("fuelTank")) { this.fuelTank.readFromNBT(nbt.getCompoundTag("fuelTank")); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("chestContentLength", this.chestContents.length); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.chestContents.length; ++i) { if (this.chestContents[i] != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte) i); this.chestContents[i].writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } } nbt.setTag("Items", nbttaglist); if (this.fuelTank.getFluid() != null) { nbt.setTag("fuelTank", this.fuelTank.writeToNBT(new NBTTagCompound())); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) { return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D) <= 64.0D; } @Override public void updateContainingBlockInfo() { super.updateContainingBlockInfo(); this.adjacentChestChecked = false; } @Override public void updateEntity() { super.updateEntity(); ++this.ticksSinceSync; float f; if (!this.worldObj.isRemote && this.numUsingPlayers != 0 && (this.ticksSinceSync + this.xCoord + this.yCoord + this.zCoord) % 200 == 0) { this.numUsingPlayers = 0; f = 5.0F; List<?> list = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getAABBPool().getAABB(this.xCoord - f, this.yCoord - f, this.zCoord - f, this.xCoord + 1 + f, this.yCoord + 1 + f, this.zCoord + 1 + f)); Iterator<?> iterator = list.iterator(); while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); if (entityplayer.openContainer instanceof GCCoreContainerParachest) { ++this.numUsingPlayers; } } } this.prevLidAngle = this.lidAngle; f = 0.1F; double d0; if (this.numUsingPlayers > 0 && this.lidAngle == 0.0F) { double d1 = this.xCoord + 0.5D; d0 = this.zCoord + 0.5D; this.worldObj.playSoundEffect(d1, this.yCoord + 0.5D, d0, "random.chestopen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } if (this.numUsingPlayers == 0 && this.lidAngle > 0.0F || this.numUsingPlayers > 0 && this.lidAngle < 1.0F) { float f1 = this.lidAngle; if (this.numUsingPlayers > 0) { this.lidAngle += f; } else { this.lidAngle -= f; } if (this.lidAngle > 1.0F) { this.lidAngle = 1.0F; } float f2 = 0.5F; if (this.lidAngle < f2 && f1 >= f2) { d0 = this.xCoord + 0.5D; double d2 = this.zCoord + 0.5D; this.worldObj.playSoundEffect(d0, this.yCoord + 0.5D, d2, "random.chestclosed", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } if (this.lidAngle < 0.0F) { this.lidAngle = 0.0F; } } if (!this.worldObj.isRemote) { final FluidStack liquid = this.fuelTank.getFluid(); if (liquid != null && this.fuelTank.getFluid() != null && this.fuelTank.getFluid().getFluid().getName().equalsIgnoreCase("Fuel")) { if (FluidContainerRegistry.isEmptyContainer(this.chestContents[this.chestContents.length - 1])) { boolean isCanister = this.chestContents[this.chestContents.length - 1].isItemEqual( new ItemStack(GCCoreItems.oilCanister, 1, GCCoreItems.oilCanister.getMaxDamage())); final int amountToFill = Math.min(liquid.amount, isCanister ? GCCoreItems.fuelCanister.getMaxDamage() - 1 : FluidContainerRegistry.BUCKET_VOLUME); if (isCanister) { this.chestContents[this.chestContents.length - 1] = new ItemStack(GCCoreItems.fuelCanister, 1, GCCoreItems.fuelCanister.getMaxDamage() - amountToFill); } else { this.chestContents[this.chestContents.length - 1] = FluidContainerRegistry .fillFluidContainer(liquid, this.chestContents[this.chestContents.length - 1]); } this.fuelTank.drain(amountToFill, true); } } if (this.ticksSinceSync % 3 == 0) { GCCorePacketManager.sendPacketToClients(this.getPacket(), this.worldObj, new Vector3(this), 12); } } } public Packet getPacket() { return GCCorePacketManager.getPacket(GalacticraftCore.CHANNELENTITIES, this, this.fuelTank.getFluid() == null ? 0 : this.fuelTank.getFluidAmount()); } @Override public void handlePacketData(INetworkManager network, int packetType, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput data) { if (this.worldObj.isRemote) { int fuel = data.readInt(); this.fuelTank.setFluid(new FluidStack(GalacticraftCore.fluidFuel, fuel)); } } @Override public boolean receiveClientEvent(int par1, int par2) { if (par1 == 1) { this.numUsingPlayers = par2; return true; } else { return super.receiveClientEvent(par1, par2); } } @Override public void openChest() { if (this.numUsingPlayers < 0) { this.numUsingPlayers = 0; } ++this.numUsingPlayers; this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID, 1, this.numUsingPlayers); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType().blockID); } @Override public void closeChest() { if (this.getBlockType() != null && this.getBlockType() instanceof GCCoreBlockParachest) { --this.numUsingPlayers; this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID, 1, this.numUsingPlayers); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType().blockID); } } @Override public boolean isItemValidForSlot(int par1, ItemStack par2ItemStack) { return true; } @Override public void invalidate() { super.invalidate(); this.updateContainingBlockInfo(); } }