diff --git a/src/main/java/api/hbm/entity/IRadiationImmune.java b/src/main/java/api/hbm/entity/IRadiationImmune.java index d7150807e..e89db5347 100644 --- a/src/main/java/api/hbm/entity/IRadiationImmune.java +++ b/src/main/java/api/hbm/entity/IRadiationImmune.java @@ -1,5 +1,3 @@ package api.hbm.entity; -public interface IRadiationImmune { - -} +public interface IRadiationImmune { } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 1c3a11108..051c16ea5 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1018,7 +1018,7 @@ public class ModBlocks { public static Block machine_excavator; public static Block machine_mining_laser; - public static Block barricade; + public static Block barricade; // a sand bag that drops nothing, for automated walling purposes public static final int guiID_mining_laser = 95; public static Block machine_assembler; diff --git a/src/main/java/com/hbm/blocks/machine/BlockRotatable.java b/src/main/java/com/hbm/blocks/machine/BlockRotatable.java index d72913ef2..d3e7d538e 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockRotatable.java +++ b/src/main/java/com/hbm/blocks/machine/BlockRotatable.java @@ -1,7 +1,5 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; @@ -11,7 +9,6 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; @@ -45,70 +42,22 @@ public class BlockRotatable extends Block { public IIcon getIcon(int side, int metadata) { return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); } - - @Override - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return Item.getItemFromBlock(this); - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); - //this.setDefaultDirection(world, x, y, z); - } - - private void setDefaultDirection(World world, int x, int y, int z) { - if(!world.isRemote) - { - Block block1 = world.getBlock(x, y, z - 1); - Block block2 = world.getBlock(x, y, z + 1); - Block block3 = world.getBlock(x - 1, y, z); - Block block4 = world.getBlock(x + 1, y, z); - - byte b0 = 3; - - if(block1.func_149730_j() && !block2.func_149730_j()) - { - b0 = 3; - } - if(block2.func_149730_j() && !block1.func_149730_j()) - { - b0 = 2; - } - if(block3.func_149730_j() && !block4.func_149730_j()) - { - b0 = 5; - } - if(block4.func_149730_j() && !block3.func_149730_j()) - { - b0 = 4; - } - - world.setBlockMetadataWithNotify(x, y, z, b0, 2); - } - } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) - { + + if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); } - if(i == 1) - { + if(i == 1) { world.setBlockMetadataWithNotify(x, y, z, 5, 2); } - if(i == 2) - { + if(i == 2) { world.setBlockMetadataWithNotify(x, y, z, 3, 2); } - if(i == 3) - { + if(i == 3) { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } } - } diff --git a/src/main/java/com/hbm/blocks/network/CraneInserter.java b/src/main/java/com/hbm/blocks/network/CraneInserter.java index 4c9649a6b..cf3917af4 100644 --- a/src/main/java/com/hbm/blocks/network/CraneInserter.java +++ b/src/main/java/com/hbm/blocks/network/CraneInserter.java @@ -62,7 +62,6 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { if(te instanceof ISidedInventory) { ISidedInventory sided = (ISidedInventory) te; - //access = sided.getAccessibleSlotsFromSide(dir.ordinal()); access = masquerade(sided, dir.ordinal()); } @@ -70,47 +69,6 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { IInventory inv = (IInventory) te; addToInventory(inv, access, toAdd, dir.ordinal()); - - /*int limit = inv.getInventoryStackLimit(); - - int size = access == null ? inv.getSizeInventory() : access.length; - - for(int i = 0; i < size; i++) { - int index = access == null ? i : access[i]; - ItemStack stack = inv.getStackInSlot(index); - - if(stack != null && toAdd.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(toAdd, stack) && stack.stackSize < Math.min(stack.getMaxStackSize(), limit)) { - - int stackLimit = Math.min(stack.getMaxStackSize(), limit); - int amount = Math.min(toAdd.stackSize, stackLimit - stack.stackSize); - - stack.stackSize += amount; - toAdd.stackSize -= amount; - - if(toAdd.stackSize == 0) { - return; - } - } - } - - for(int i = 0; i < size; i++) { - int index = access == null ? i : access[i]; - ItemStack stack = inv.getStackInSlot(index); - - if(stack == null && inv.isItemValidForSlot(index, stack)) { - - int amount = Math.min(toAdd.stackSize, limit); - - ItemStack newStack = toAdd.copy(); - newStack.stackSize = amount; - inv.setInventorySlotContents(index, newStack); - toAdd.stackSize -= amount; - - if(toAdd.stackSize == 0) { - return; - } - } - }*/ } if(toAdd != null && toAdd.stackSize > 0) { diff --git a/src/main/java/com/hbm/handler/FuelHandler.java b/src/main/java/com/hbm/handler/FuelHandler.java index cd550d1a5..d435ee678 100644 --- a/src/main/java/com/hbm/handler/FuelHandler.java +++ b/src/main/java/com/hbm/handler/FuelHandler.java @@ -1,11 +1,15 @@ package com.hbm.handler; +import java.util.HashMap; + import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; import cpw.mods.fml.common.IFuelHandler; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; public class FuelHandler implements IFuelHandler { @@ -48,5 +52,20 @@ public class FuelHandler implements IFuelHandler { return 0; } - + + private static HashMap burnCache = new HashMap(); + + public static int getBurnTimeFromCache(ItemStack stack) { + + ComparableStack comp = new ComparableStack(stack).makeSingular(); + + if(burnCache.containsKey(comp)) { + return burnCache.get(comp); + } + + int burnTime = TileEntityFurnace.getItemBurnTime(stack); + burnCache.put(comp, burnTime); + + return burnTime; + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java b/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java index 132fe96df..971f18f43 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java @@ -32,6 +32,9 @@ public class GUIMachineExcavator extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); + + this.drawElectricityInfo(this, x, y, guiLeft + 220, guiTop + 18, 16, 52, drill.getPower(), drill.maxPower); + this.drill.tank.renderTankInfo(this, x, y, guiLeft + 202, guiTop + 18, 16, 52); } @Override @@ -68,7 +71,8 @@ public class GUIMachineExcavator extends GuiInfoContainer { if(drill.enableDrill) { drawTexturedModalRect(guiLeft + 6, guiTop + 42, 209, 114, 20, 40); - drawTexturedModalRect(guiLeft + 11, guiTop + 5, 209, 104, 10, 10); + if(drill.getInstalledDrill() != null) drawTexturedModalRect(guiLeft + 11, guiTop + 5, 209, 104, 10, 10); + else if(System.currentTimeMillis() % 1000 < 500) drawTexturedModalRect(guiLeft + 11, guiTop + 5, 219, 104, 10, 10); } if(drill.enableCrusher) { @@ -83,12 +87,15 @@ public class GUIMachineExcavator extends GuiInfoContainer { if(drill.enableVeinMiner) { drawTexturedModalRect(guiLeft + 78, guiTop + 42, 209, 114, 20, 40); - drawTexturedModalRect(guiLeft + 83, guiTop + 5, 209, 104, 10, 10); + if(drill.canVeinMine()) drawTexturedModalRect(guiLeft + 83, guiTop + 5, 209, 104, 10, 10); + else if(System.currentTimeMillis() % 1000 < 500) drawTexturedModalRect(guiLeft + 83, guiTop + 5, 219, 104, 10, 10); + } if(drill.enableSilkTouch) { drawTexturedModalRect(guiLeft + 102, guiTop + 42, 209, 114, 20, 40); - drawTexturedModalRect(guiLeft + 107, guiTop + 5, 209, 104, 10, 10); + if(drill.canSilkTouch()) drawTexturedModalRect(guiLeft + 107, guiTop + 5, 209, 104, 10, 10); + else if(System.currentTimeMillis() % 1000 < 500) drawTexturedModalRect(guiLeft + 107, guiTop + 5, 219, 104, 10, 10); } } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index dd94dd5dc..29ac63205 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -789,6 +789,7 @@ public class ModItems { public static Item piston_selenium; public static Item piston_set; + public static Item drillbit; //public static Item crystal_energy; //public static Item pellet_coolant; @@ -3248,6 +3249,7 @@ public class ModItems { piston_selenium = new Item().setUnlocalizedName("piston_selenium").setCreativeTab(MainRegistry.controlTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":piston_selenium"); piston_set = new ItemPistons().setUnlocalizedName("piston_set").setCreativeTab(MainRegistry.controlTab).setMaxStackSize(1); + drillbit = new ItemDrillbit().setUnlocalizedName("drillbit").setCreativeTab(MainRegistry.controlTab).setMaxStackSize(1); //crystal_energy = new ItemCustomLore().setUnlocalizedName("crystal_energy").setCreativeTab(MainRegistry.controlTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":crystal_energy"); //pellet_coolant = new ItemCustomLore().setUnlocalizedName("pellet_coolant").setMaxDamage(41400).setCreativeTab(MainRegistry.controlTab).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":pellet_coolant"); @@ -6480,6 +6482,7 @@ public class ModItems { //Engine Pieces GameRegistry.registerItem(piston_selenium, piston_selenium.getUnlocalizedName()); GameRegistry.registerItem(piston_set, piston_set.getUnlocalizedName()); + GameRegistry.registerItem(drillbit, drillbit.getUnlocalizedName()); //Cells GameRegistry.registerItem(cell_empty, cell_empty.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemDrillbit.java b/src/main/java/com/hbm/items/machine/ItemDrillbit.java new file mode 100644 index 000000000..ce7ab09e9 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemDrillbit.java @@ -0,0 +1,70 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.items.ItemEnumMulti; +import com.hbm.util.EnumUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; + +public class ItemDrillbit extends ItemEnumMulti { + + public ItemDrillbit() { + super(EnumDrillType.class, true, true); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + Enum[] enums = theEnum.getEnumConstants(); + this.icons = new IIcon[enums.length]; + + for(int i = 0; i < icons.length; i++) { + Enum num = enums[i]; + this.icons[i] = reg.registerIcon(this.getIconString() + "_" + num.name().toLowerCase()); + } + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + Enum num = EnumUtil.grabEnumSafely(theEnum, stack.getItemDamage()); + return super.getUnlocalizedName() + "_" + num.name().toLowerCase(); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + EnumDrillType type = EnumUtil.grabEnumSafely(theEnum, stack.getItemDamage()); + + list.add(EnumChatFormatting.YELLOW + "Speed: " + ((int) (type.speed * 100)) + "%"); + list.add(EnumChatFormatting.YELLOW + "Tier: " + type.tier); + if(type.vein) list.add(EnumChatFormatting.GREEN + "Vein miner"); + if(type.silk) list.add(EnumChatFormatting.GREEN + "Silk touch"); + } + + public static enum EnumDrillType { + STEEL (1.0D, 1, false, false), + STEEL_DIAMOND (1.0D, 1, false, true), + HSS (1.5D, 2, true, false), + HSS_DIAMOND (1.5D, 2, true, true), + DESH (2.5D, 3, true, true), + DESH_DIAMOND (2.5D, 3, true, true); + + public double speed; + public int tier; + public boolean vein; + public boolean silk; + + private EnumDrillType(double speed, int tier, boolean vein, boolean silk) { + this.speed = speed; + this.tier = tier; + this.vein = vein; + this.silk = silk; + } + } +} diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 24940f0fe..357f120e6 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -512,9 +512,9 @@ public class HbmWorldGen implements IWorldGenerator { } - if (WorldConfig.meteorStructure > 0 && rand.nextInt(WorldConfig.meteorStructure) == 0) { - int x = i + rand.nextInt(16); - int z = j + rand.nextInt(16); + if (WorldConfig.meteorStructure > 0 && rand.nextInt(WorldConfig.meteorStructure) == 0 && biome != BiomeGenBase.ocean && biome != BiomeGenBase.deepOcean) { + int x = i + rand.nextInt(16) + 8; + int z = j + rand.nextInt(16) + 8; CellularDungeonFactory.meteor.generate(world, x, 10, z, rand); diff --git a/src/main/java/com/hbm/module/ModuleBurnTime.java b/src/main/java/com/hbm/module/ModuleBurnTime.java index 2b4ec89cf..7b8db8321 100644 --- a/src/main/java/com/hbm/module/ModuleBurnTime.java +++ b/src/main/java/com/hbm/module/ModuleBurnTime.java @@ -6,12 +6,12 @@ import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.handler.FuelHandler; import com.hbm.items.ModItems; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.util.ItemStackUtil; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.util.EnumChatFormatting; /** @@ -80,7 +80,8 @@ public class ModuleBurnTime { } public int getBurnTime(ItemStack stack) { - int fuel = TileEntityFurnace.getItemBurnTime(stack); + //int fuel = TileEntityFurnace.getItemBurnTime(stack); + int fuel = FuelHandler.getBurnTimeFromCache(stack); if(fuel == 0) return 0; diff --git a/src/main/java/com/hbm/tileentity/IRepairable.java b/src/main/java/com/hbm/tileentity/IRepairable.java index 0d48d868d..7cab18747 100644 --- a/src/main/java/com/hbm/tileentity/IRepairable.java +++ b/src/main/java/com/hbm/tileentity/IRepairable.java @@ -1,12 +1,9 @@ package com.hbm.tileentity; -import java.util.ArrayList; import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.inventory.RecipesCommon.AStack; -import com.hbm.inventory.RecipesCommon.ComparableStack; -import com.hbm.items.ModItems; import com.hbm.items.tool.ItemBlowtorch; import com.hbm.util.InventoryUtil; @@ -45,13 +42,13 @@ public interface IRepairable { TileEntity core = world.getTileEntity(pos[0], pos[1], pos[2]); if(!(core instanceof IRepairable)) return false; - IRepairable tank = (IRepairable) core; + IRepairable repairable = (IRepairable) core; - if(!tank.isDamaged()) return false; + if(!repairable.isDamaged()) return false; - List list = new ArrayList(); - if(InventoryUtil.doesPlayerHaveAStacks(player, list, true)) { - if(!world.isRemote) tank.repair(); + List list = repairable.getRepairMaterials(); + if(list == null || list.isEmpty() || InventoryUtil.doesPlayerHaveAStacks(player, list, true)) { + if(!world.isRemote) repairable.repair(); return true; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index a2bee2dfd..449271ccc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -1,35 +1,69 @@ package com.hbm.tileentity.machine; +import java.util.List; +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.network.CraneInserter; +import com.hbm.entity.item.EntityMovingItem; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerMachineExcavator; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineExcavator; +import com.hbm.items.machine.ItemDrillbit; +import com.hbm.items.machine.ItemDrillbit.EnumDrillType; +import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.EnumUtil; +import api.hbm.conveyor.IConveyorBelt; +import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineExcavator extends TileEntityMachineBase implements IControlReceiver, IGUIProvider { +public class TileEntityMachineExcavator extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IControlReceiver, IGUIProvider { + public static final long maxPower = 1_000_000; + public long power; + public boolean operational = false; + public boolean enableDrill = false; public boolean enableCrusher = false; public boolean enableWalling = false; public boolean enableVeinMiner = false; public boolean enableSilkTouch = false; + + protected int ticksWorked = 0; + protected int targetDepth = 0; //0 is the first block below null position public float drillRotation = 0F; public float prevDrillRotation = 0F; public float drillExtension = 0F; public float prevDrillExtension = 0F; + + public FluidTank tank; public TileEntityMachineExcavator() { super(14); + this.tank = new FluidTank(Fluids.SULFURIC_ACID, 16_000); } @Override @@ -42,20 +76,51 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements if(!worldObj.isRemote) { + this.power = Library.chargeTEFromItems(slots, 0, this.getPower(), this.getMaxPower()); + this.operational = false; + + if(this.enableDrill && this.getInstalledDrill() != null && this.power >= this.getPowerConsumption()) { + + operational = true; + + if(targetDepth < this.yCoord - 4 && tryDrill(5)) { + targetDepth++; + } + } else { + this.targetDepth = 0; + } + NBTTagCompound data = new NBTTagCompound(); - data.setBoolean("drill", enableDrill); - data.setBoolean("crusher", enableCrusher); - data.setBoolean("walling", enableWalling); - data.setBoolean("veinminer", enableVeinMiner); - data.setBoolean("silktouch", enableSilkTouch); + data.setBoolean("d", enableDrill); + data.setBoolean("c", enableCrusher); + data.setBoolean("w", enableWalling); + data.setBoolean("v", enableVeinMiner); + data.setBoolean("s", enableSilkTouch); + data.setBoolean("o", operational); + data.setInteger("t", targetDepth); + data.setLong("p", power); this.networkPack(data, 150); } else { + this.prevDrillExtension = this.drillExtension; - //this.drillExtension += 0.05F; + + if(this.drillExtension != this.targetDepth) { + float diff = Math.abs(this.drillExtension - this.targetDepth); + float speed = Math.max(0.15F, diff / 10F); + + if(diff <= speed) { + this.drillExtension = this.targetDepth; + } else { + float sig = Math.signum(this.drillExtension - this.targetDepth); + this.drillExtension -= sig * speed; + } + } this.prevDrillRotation = this.drillRotation; - this.drillRotation += 15F; + + if(this.operational) + this.drillRotation += 15F; if(this.drillRotation >= 360F) { this.drillRotation -= 360F; @@ -65,11 +130,188 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } public void networkUnpack(NBTTagCompound nbt) { - this.enableDrill = nbt.getBoolean("drill"); - this.enableCrusher = nbt.getBoolean("crusher"); - this.enableWalling = nbt.getBoolean("walling"); - this.enableVeinMiner = nbt.getBoolean("veinminer"); - this.enableSilkTouch = nbt.getBoolean("silktouch"); + this.enableDrill = nbt.getBoolean("d"); + this.enableCrusher = nbt.getBoolean("c"); + this.enableWalling = nbt.getBoolean("w"); + this.enableVeinMiner = nbt.getBoolean("v"); + this.enableSilkTouch = nbt.getBoolean("s"); + this.operational = nbt.getBoolean("o"); + this.targetDepth = nbt.getInteger("t"); + this.power = nbt.getLong("p"); + } + + protected int getY() { + return yCoord - targetDepth - 4; + } + + /** Works outwards and tries to break a ring, returns true if all rings are broken (or ignorable) and the drill should extend. */ + protected boolean tryDrill(int radius) { + int y = getY(); + + if(targetDepth == 0) { + radius = 1; + } + + for(int ring = 1; ring <= radius; ring++) { + + boolean ignoreAll = true; + float combinedHardness = 0F; + + for(int x = xCoord - ring; x <= xCoord + ring; x++) { + for(int z = zCoord - ring; z <= zCoord + ring; z++) { + + /* Process blocks either if we are in the inner ring (1 = 3x3) or if the target block is on the outer edge */ + if(ring == 1 || (x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring)) { + + Block b = worldObj.getBlock(x, y, z); + + if(shouldIgnoreBlock(b, x, y ,z)) continue; + + ignoreAll = false; + + combinedHardness += b.getBlockHardness(worldObj, x, y, z); + } + } + } + + if(!ignoreAll) { + ticksWorked++; + + int ticksToWork = (int) Math.ceil(combinedHardness); + + if(ticksWorked >= ticksToWork) { + breakBlocks(ring); + buildWall(ring + 1, ring == radius && this.enableWalling); + tryCollect(radius); + ticksWorked = 0; + } + + return false; + } + } + + buildWall(radius + 1, this.enableWalling); + ticksWorked = 0; + return true; + } + + /** breaks and drops all blocks in the specified ring */ + protected void breakBlocks(int ring) { + int y = getY(); + + for(int x = xCoord - ring; x <= xCoord + ring; x++) { + for(int z = zCoord - ring; z <= zCoord + ring; z++) { + + if(ring == 1 || (x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring)) { + + Block b = worldObj.getBlock(x, y, z); + + if(!this.shouldIgnoreBlock(b, x, y, z)) { + b.dropBlockAsItem(worldObj, x, y, z, worldObj.getBlockMetadata(x, y, z), 0 /* fortune */); + worldObj.func_147480_a(x, y, z, false); + } + } + } + } + } + + /** builds a wall along the specified ring, replacing fluid blocks. if wallEverything is set, it will also wall off replacable blocks like air or grass */ + protected void buildWall(int ring, boolean wallEverything) { + int y = getY(); + + for(int x = xCoord - ring; x <= xCoord + ring; x++) { + for(int z = zCoord - ring; z <= zCoord + ring; z++) { + + Block b = worldObj.getBlock(x, y, z); + + if(x == xCoord - ring || x == xCoord + ring || z == zCoord - ring || z == zCoord + ring) { + + if(b.isReplaceable(worldObj, x, y, z) && (wallEverything || b.getMaterial().isLiquid())) { + worldObj.setBlock(x, y, z, ModBlocks.barricade); + } + } else { + + if(b.getMaterial().isLiquid()) { + worldObj.setBlockToAir(x, y, z); + continue; + } + } + } + } + } + + /** pulls up an AABB around the drillbit and tries to either conveyor output or buffer collected items */ + protected void tryCollect(int radius) { + int yLevel = getY(); + + List items = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(xCoord - radius, yLevel - 1, zCoord - radius, xCoord + radius + 1, yLevel + 2, zCoord + radius + 1)); + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + + int x = xCoord + dir.offsetX * 4; + int y = yCoord - 3; + int z = zCoord + dir.offsetZ * 4; + + TileEntity tile = worldObj.getTileEntity(x, y, z); + if(tile instanceof IInventory) { + supplyContainer((IInventory) tile, items, dir.getOpposite()); + } + + Block b = worldObj.getBlock(x, y, z); + if(b instanceof IConveyorBelt) { + supplyConveyor((IConveyorBelt) b, items, x, y, z); + } + } + + /** places all items into a connected container, if possible */ + protected void supplyContainer(IInventory inv, List items, ForgeDirection dir) { + + int side = dir.ordinal(); + int[] access = null; + + if(inv instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) inv; + access = CraneInserter.masquerade(sided, dir.ordinal()); + } + + for(EntityItem item : items) { + + if(item.isDead) continue; + + ItemStack stack = CraneInserter.addToInventory(inv, access, item.getEntityItem(), side); + + if(stack == null || stack.stackSize == 0) { + item.setDead(); + } + } + } + + /** moves all items onto a connected conveyor belt */ + protected void supplyConveyor(IConveyorBelt belt, List items, int x, int y, int z) { + + Random rand = worldObj.rand; + + for(EntityItem item : items) { + + if(item.isDead) continue; + + Vec3 base = Vec3.createVectorHelper(x + rand.nextDouble(), y + 0.5, z + rand.nextDouble()); + Vec3 vec = belt.getClosestSnappingPosition(worldObj, x, y, z, base); + + EntityMovingItem moving = new EntityMovingItem(worldObj); + moving.setPosition(base.xCoord, vec.yCoord, base.zCoord); + moving.setItemStack(item.getEntityItem().copy()); + worldObj.spawnEntityInWorld(moving); + item.setDead(); + } + } + + public int getPowerConsumption() { + return 10_000; + } + + public boolean shouldIgnoreBlock(Block block, int x, int y, int z) { + return block.isAir(worldObj, x, y, z) || block.getBlockHardness(worldObj, x, y, z) < 0 || block.getMaterial().isLiquid() || block == Blocks.bedrock; } @Override @@ -82,6 +324,24 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements this.markChanged(); } + + public EnumDrillType getInstalledDrill() { + if(slots[4] != null && slots[4].getItem() instanceof ItemDrillbit) { + return EnumUtil.grabEnumSafely(EnumDrillType.class, slots[4].getItemDamage()); + } + + return null; + } + + public boolean canVeinMine() { + EnumDrillType type = getInstalledDrill(); + return this.enableVeinMiner && type != null && type.vein; + } + + public boolean canSilkTouch() { + EnumDrillType type = getInstalledDrill(); + return this.enableSilkTouch && type != null && type.silk; + } @Override public boolean hasPermission(EntityPlayer player) { @@ -123,4 +383,29 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public long getPower() { + return this.power; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public long getMaxPower() { + return maxPower; + } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] {tank}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] {tank}; + } } diff --git a/src/main/java/com/hbm/util/ContaminationUtil.java b/src/main/java/com/hbm/util/ContaminationUtil.java index a88cd03ec..612d8b23b 100644 --- a/src/main/java/com/hbm/util/ContaminationUtil.java +++ b/src/main/java/com/hbm/util/ContaminationUtil.java @@ -1,5 +1,7 @@ package com.hbm.util; +import java.util.HashSet; + import com.hbm.entity.mob.EntityDuck; import com.hbm.entity.mob.EntityNuclearCreeper; import com.hbm.entity.mob.EntityQuackos; @@ -55,18 +57,32 @@ public class ContaminationUtil { return HbmLivingProps.getRadiation(entity); } + public static HashSet immuneEntities = new HashSet(); + public static boolean isRadImmune(Entity e) { if(e instanceof EntityLivingBase && ((EntityLivingBase)e).isPotionActive(HbmPotion.mutation)) return true; - return e instanceof EntityNuclearCreeper || - e instanceof EntityMooshroom || - e instanceof EntityZombie || - e instanceof EntitySkeleton || - e instanceof EntityQuackos || - e instanceof EntityOcelot || - e instanceof IRadiationImmune; + if(immuneEntities.isEmpty()) { + immuneEntities.add(EntityNuclearCreeper.class); + immuneEntities.add(EntityMooshroom.class); + immuneEntities.add(EntityZombie.class); + immuneEntities.add(EntitySkeleton.class); + immuneEntities.add(EntityQuackos.class); + immuneEntities.add(EntityOcelot.class); + immuneEntities.add(IRadiationImmune.class); + } + + Class entityClass = e.getClass(); + + for(Class clazz : immuneEntities) { + if(clazz.isAssignableFrom(entityClass)) return true; + } + + if("cyano.lootable.entities.EntityLootableBody".equals(entityClass.getName())) return true; + + return false; } /// ASBESTOS /// diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 22fd9df31..c54bf9abd 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -460,7 +460,7 @@ cannery.firebox.4=One such machine is the stirling engine, which will turn heat cannery.foundryChannel=Foundry Channel cannery.foundryChannel.0=Foundry channels are used to transport molten material from a crucible or storage tank into molds. -cannery.foundryChannel.1=Channels can receive material either by pouring from the top - via an outlet or directly form a crucible - or from the side from other channels. +cannery.foundryChannel.1=Channels can receive material either by pouring from the top - via an outlet or directly from a crucible - or from the side from other channels. cannery.foundryChannel.2=When transporting materials, channels will prioritize blocks like outlets and shallow molds. cannery.foundryChannel.3=When it cannot supply an outlet or a mold, the material will then flow into a neighboring channel. cannery.foundryChannel.4=Leftover material can be removed by using a shovel. diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_base.png b/src/main/resources/assets/hbm/textures/items/drillbit_base.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_base.png rename to src/main/resources/assets/hbm/textures/items/drillbit_base.png diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_desh.png b/src/main/resources/assets/hbm/textures/items/drillbit_desh.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_desh.png rename to src/main/resources/assets/hbm/textures/items/drillbit_desh.png diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_desh_diamond.png b/src/main/resources/assets/hbm/textures/items/drillbit_desh_diamond.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_desh_diamond.png rename to src/main/resources/assets/hbm/textures/items/drillbit_desh_diamond.png diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_hss.png b/src/main/resources/assets/hbm/textures/items/drillbit_hss.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_hss.png rename to src/main/resources/assets/hbm/textures/items/drillbit_hss.png diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_hss_diamond.png b/src/main/resources/assets/hbm/textures/items/drillbit_hss_diamond.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_hss_diamond.png rename to src/main/resources/assets/hbm/textures/items/drillbit_hss_diamond.png diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_steel.png b/src/main/resources/assets/hbm/textures/items/drillbit_steel.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_steel.png rename to src/main/resources/assets/hbm/textures/items/drillbit_steel.png diff --git a/src/main/resources/assets/hbm/textures/items/drilbit_steel_diamond.png b/src/main/resources/assets/hbm/textures/items/drillbit_steel_diamond.png similarity index 100% rename from src/main/resources/assets/hbm/textures/items/drilbit_steel_diamond.png rename to src/main/resources/assets/hbm/textures/items/drillbit_steel_diamond.png diff --git a/src/main/resources/assets/hbm/textures/models/machines/test.png b/src/main/resources/assets/hbm/textures/models/machines/test.png new file mode 100644 index 000000000..fca860ce4 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/test.png differ