package blusunrize.immersiveengineering.common.blocks.metal; import blusunrize.immersiveengineering.api.IEEnums.SideConfig; import blusunrize.immersiveengineering.api.energy.immersiveflux.FluxStorage; import blusunrize.immersiveengineering.api.tool.ExcavatorHandler; import blusunrize.immersiveengineering.api.tool.ExcavatorHandler.MineralWorldInfo; import blusunrize.immersiveengineering.common.Config.IEConfig; import blusunrize.immersiveengineering.common.IEContent; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IHasDummyBlocks; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IHasObjProperty; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; import blusunrize.immersiveengineering.common.util.EnergyHelper.IEForgeEnergyWrapper; import blusunrize.immersiveengineering.common.util.EnergyHelper.IIEInternalFluxHandler; import blusunrize.immersiveengineering.common.util.ItemNBTHelper; import com.google.common.collect.Lists; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing.Axis; import net.minecraft.util.EnumHand; import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import java.util.ArrayList; public class TileEntitySampleDrill extends TileEntityIEBase implements ITickable, IIEInternalFluxHandler, IHasDummyBlocks, IPlayerInteraction, IHasObjProperty { public FluxStorage energyStorage = new FluxStorage(8000); public int dummy=0; public int process=0; public boolean active = false; public ItemStack sample; public static boolean _Immovable() { return true; } @Override public void update() { if(dummy!=0 || worldObj.isRemote || worldObj.isAirBlock(getPos().add(0,-1,0)) || sample!=null) return; boolean powered = worldObj.isBlockIndirectlyGettingPowered(getPos())>0; if(!active && powered) active = true; else if(active && !powered && process>= IEConfig.Machines.coredrill_time) active = false; if(active && process< IEConfig.Machines.coredrill_time) if(energyStorage.extractEnergy(IEConfig.Machines.coredrill_consumption, false)== IEConfig.Machines.coredrill_consumption) { process++; if(process>= IEConfig.Machines.coredrill_time) { int cx = getPos().getX()>>4; int cz = getPos().getZ()>>4; MineralWorldInfo info = ExcavatorHandler.getMineralWorldInfo(worldObj, cx, cz); this.sample = createCoreSample(worldObj, (getPos().getX()>>4), (getPos().getZ()>>4), info); } this.markDirty(); this.markContainingBlockForUpdate(null); } } public float getSampleProgress() { return process/(float)IEConfig.Machines.coredrill_time; } public boolean isSamplingFinished() { return process>= IEConfig.Machines.coredrill_time; } public String getVein() { if(sample == null) return ""; return sample.getTagCompound().getString("mineral"); } public int getExpectedVeinYield() { if(sample == null) return -1; return ExcavatorHandler.mineralVeinCapacity - sample.getTagCompound().getInteger("depletion"); } public ItemStack createCoreSample(World world, int chunkX, int chunkZ, MineralWorldInfo info) { ItemStack stack = new ItemStack(IEContent.itemCoresample); ItemNBTHelper.setLong(stack, "timestamp", world.getTotalWorldTime()); ItemNBTHelper.setIntArray(stack, "coords", new int[]{world.provider.getDimension(), chunkX,chunkZ}); if(info.mineralOverride!=null) ItemNBTHelper.setString(stack, "mineral", info.mineralOverride.name); else if(info.mineral!=null) ItemNBTHelper.setString(stack, "mineral", info.mineral.name); else return stack; if(ExcavatorHandler.mineralVeinCapacity<0||info.depletion<0) ItemNBTHelper.setBoolean(stack, "infinite", true); else ItemNBTHelper.setInt(stack, "depletion", info.depletion); return stack; } @Override public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { energyStorage.writeToNBT(nbt); nbt.setInteger("dummy", dummy); nbt.setInteger("process", process); nbt.setBoolean("active", active); if(sample!=null) nbt.setTag("sample", sample.writeToNBT(new NBTTagCompound())); } @Override public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { energyStorage.readFromNBT(nbt); dummy = nbt.getInteger("dummy"); process = nbt.getInteger("process"); active = nbt.getBoolean("active"); if(nbt.hasKey("sample")) sample = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("sample")); } @SideOnly(Side.CLIENT) private AxisAlignedBB renderAABB; @SideOnly(Side.CLIENT) @Override public AxisAlignedBB getRenderBoundingBox() { if(renderAABB==null) if(dummy==0) renderAABB = new AxisAlignedBB(getPos(), getPos().add(1,3,1)); else renderAABB = new AxisAlignedBB(getPos(), getPos()); return renderAABB; } @Nonnull @Override public FluxStorage getFluxStorage() { if(dummy>0) { TileEntity te = worldObj.getTileEntity(getPos().add(0,-dummy,0)); if(te instanceof TileEntitySampleDrill) return ((TileEntitySampleDrill)te).getFluxStorage(); } return energyStorage; } @Nonnull @Override public SideConfig getEnergySideConfig(EnumFacing facing) { return dummy==0&&facing!=null&&facing.getAxis()!=Axis.Y?SideConfig.INPUT:SideConfig.NONE; } IEForgeEnergyWrapper[] wrappers = { new IEForgeEnergyWrapper(this, EnumFacing.NORTH), new IEForgeEnergyWrapper(this, EnumFacing.SOUTH), new IEForgeEnergyWrapper(this, EnumFacing.WEST), new IEForgeEnergyWrapper(this, EnumFacing.EAST) }; @Override public IEForgeEnergyWrapper getCapabilityWrapper(EnumFacing facing) { if(dummy==0&&facing!=null&&facing.getAxis()!=Axis.Y) return wrappers[facing.ordinal()-2]; return null; } @Override public boolean isDummy() { return dummy>0; } @Override public void placeDummies(BlockPos pos, IBlockState state, EnumFacing side, float hitX, float hitY, float hitZ) { for(int i=1; i<=2; i++) { worldObj.setBlockState(pos.add(0,i,0), state); ((TileEntitySampleDrill)worldObj.getTileEntity(pos.add(0,i,0))).dummy = i; } } @Override public void breakDummies(BlockPos pos, IBlockState state) { for(int i=0; i<=2; i++) if(worldObj.getTileEntity(getPos().add(0,-dummy,0).add(0,i,0)) instanceof TileEntitySampleDrill) worldObj.setBlockToAir(getPos().add(0,-dummy,0).add(0,i,0)); } @Override public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ) { if(dummy!=0) { TileEntity te = worldObj.getTileEntity(getPos().add(0,-dummy,0)); if(te instanceof TileEntitySampleDrill) return ((TileEntitySampleDrill)te).interact(side, player, hand, heldItem, hitX, hitY, hitZ); } if(this.sample!=null) { if(!worldObj.isRemote) player.entityDropItem(this.sample.copy(), .5f); this.sample = null; this.active = false; markDirty(); this.markContainingBlockForUpdate(null); return true; } else if(!this.active) { this.active = true; markDirty(); this.markContainingBlockForUpdate(null); return true; } return false; // int off = ((TileEntitySampleDrill)te).pos; // TileEntity te2 = world.getTileEntity(x, y-off, z); // if(!world.isRemote && te2 instanceof TileEntitySampleDrill) // { // TileEntitySampleDrill drill = (TileEntitySampleDrill)te2; // int process = drill.process; // int chunkX = (x>>4); // int chunkZ = (z>>4); // String s0 = (chunkX*16)+", "+(chunkZ*16); // String s1 = (chunkX*16+16)+", "+(chunkZ*16+16); // player.addChatMessage(new ChatComponentTranslation(Lib.CHAT_INFO+"forChunk", s0,s1).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.DARK_GRAY))); // if(process<Config.getInt("coredrill_time")) // { // float f = process/(float)Config.getInt("coredrill_time"); // player.addChatMessage(new ChatComponentTranslation(Lib.CHAT_INFO+"coreDrill.progress",(int)(f*100)+"%").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GRAY))); // } // else // { // ExcavatorHandler.MineralMix mineral = ExcavatorHandler.getRandomMineral(world, chunkX, chunkZ); // if(mineral==null) // player.addChatMessage(new ChatComponentTranslation(Lib.CHAT_INFO+"coreDrill.result.none").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GRAY))); // else // { // String name = Lib.DESC_INFO+"mineral."+mineral.name; // String localizedName = StatCollector.translateToLocal(name); // if(name.equals(localizedName)) // localizedName = mineral.name; // MineralWorldInfo info = ExcavatorHandler.getMineralWorldInfo(world, chunkX, chunkZ); // boolean deplOverride = info.depletion<0; // if(ExcavatorHandler.mineralVeinCapacity<0||deplOverride) // localizedName = StatCollector.translateToLocal(Lib.CHAT_INFO+"coreDrill.infinite")+" "+localizedName; // player.addChatMessage(new ChatComponentTranslation(Lib.CHAT_INFO+"coreDrill.result.mineral",localizedName)); // if(ExcavatorHandler.mineralVeinCapacity>0&&!deplOverride) // { // String f = Utils.formatDouble((Config.getInt("excavator_depletion")-info.depletion)/(float)Config.getInt("excavator_depletion")*100,"0.##")+"%"; // player.addChatMessage(new ChatComponentTranslation(Lib.CHAT_INFO+"coreDrill.result.depl",f)); // } // } // } // } // return true; } static ArrayList<String> displayList = Lists.newArrayList("drill_base"); @Override public ArrayList<String> compileDisplayList() { return displayList; } }