From 35e6d6b5cd74dbb30e6103d90473d55d77a42c8a Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 25 Aug 2021 09:36:09 +0200 Subject: [PATCH] more API stuff, ore cluster functionality with auto miners --- .../java/api/hbm/block/IDrillInteraction.java | 42 +++++++ src/main/java/api/hbm/block/IMiningDrill.java | 22 ++++ .../com/hbm/blocks/generic/BlockCluster.java | 19 +++- .../com/hbm/render/anim/HbmAnimations.java | 4 + .../machine/TileEntityMachineMiningDrill.java | 105 +++++++----------- .../machine/TileEntityMachineMiningLaser.java | 100 ++++++----------- 6 files changed, 160 insertions(+), 132 deletions(-) create mode 100644 src/main/java/api/hbm/block/IDrillInteraction.java create mode 100644 src/main/java/api/hbm/block/IMiningDrill.java diff --git a/src/main/java/api/hbm/block/IDrillInteraction.java b/src/main/java/api/hbm/block/IDrillInteraction.java new file mode 100644 index 000000000..7e9c7bffe --- /dev/null +++ b/src/main/java/api/hbm/block/IDrillInteraction.java @@ -0,0 +1,42 @@ +package api.hbm.block; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IDrillInteraction { + + /** + * Whether the breaking of the block should be successful. Will destroy the block and not drop anything from clusters. + * Should use a random function, otherwise the clusters will stay there indefinitely printing free ore. + * @param world + * @param x + * @param y + * @param z + * @param drill Might be a tool, tile entity or anything that breaks blocks + * @return + */ + public boolean canBreak(World world, int x, int y, int z, int meta, IMiningDrill drill); + + /** + * Returns an itemstack, usually when the block is not destroyed. Laser drills may drop this and mechanical drills will add it to their inventories. + * @param world + * @param x + * @param y + * @param z + * @param drill Might be a tool, tile entity or anything that breaks blocks + * @return + */ + public ItemStack extractResource(World world, int x, int y, int z, int meta, IMiningDrill drill); + + /** + * The hardness that should be considered instead of the hardness value of the block itself + * @param world + * @param x + * @param y + * @param z + * @param meta + * @param drill + * @return + */ + public float getRelativeHardness(World world, int x, int y, int z, int meta, IMiningDrill drill); +} diff --git a/src/main/java/api/hbm/block/IMiningDrill.java b/src/main/java/api/hbm/block/IMiningDrill.java new file mode 100644 index 000000000..15d61178b --- /dev/null +++ b/src/main/java/api/hbm/block/IMiningDrill.java @@ -0,0 +1,22 @@ +package api.hbm.block; + +public interface IMiningDrill { + + /** + * What era the drill belongs to, usually for IDrillInteraction to adjust outputs + * @return + */ + public DrillType getDrillTier(); + + /** + * An arbitrary "rating" of the drill. Hand powered pre-industrial drills would be <10, the auto mining drill is 50 and the laser miner is 100. + * @return + */ + public int getDrillRating(); + + public static enum DrillType { + PRIMITIVE, + INDUSTRIAL, + HITECH + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockCluster.java b/src/main/java/com/hbm/blocks/generic/BlockCluster.java index 8571a7616..a6b6250b5 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCluster.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCluster.java @@ -5,6 +5,8 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; +import api.hbm.block.IDrillInteraction; +import api.hbm.block.IMiningDrill; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -14,7 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; -public class BlockCluster extends Block { +public class BlockCluster extends Block implements IDrillInteraction { public BlockCluster(Material mat) { super(mat); @@ -63,4 +65,19 @@ public class BlockCluster extends Block { return null; } + + @Override + public boolean canBreak(World world, int x, int y, int z, int meta, IMiningDrill drill) { + return drill.getDrillRating() <= 70 && world.rand.nextFloat() < 0.05; + } + + @Override + public ItemStack extractResource(World world, int x, int y, int z, int meta, IMiningDrill drill) { + return canBreak(world, x, y, z, meta, drill) ? new ItemStack(getDrop()) : null; + } + + @Override + public float getRelativeHardness(World world, int x, int y, int z, int meta, IMiningDrill drill) { + return this.getBlockHardness(world, x, y, z); + } } diff --git a/src/main/java/com/hbm/render/anim/HbmAnimations.java b/src/main/java/com/hbm/render/anim/HbmAnimations.java index 2c49932ca..ca9e9f986 100644 --- a/src/main/java/com/hbm/render/anim/HbmAnimations.java +++ b/src/main/java/com/hbm/render/anim/HbmAnimations.java @@ -49,6 +49,10 @@ public class HbmAnimations { if(stack == null) return null; + if(slot < 0 || slot > 8) { //for freak of nature hotbars, probably won't work right but at least it doesn't crash + slot = Math.abs(slot) % 9; + } + if(hotbar[slot] == null) return null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningDrill.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningDrill.java index fb80b422f..d99eef3ee 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningDrill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningDrill.java @@ -4,7 +4,10 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IConsumer; +import com.hbm.interfaces.Spaghetti; +import com.hbm.inventory.UpgradeManager; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; import com.hbm.packet.LoopedSoundPacket; @@ -13,6 +16,8 @@ import com.hbm.packet.TEDrillPacket; import com.hbm.sound.SoundLoopMachine; import com.hbm.tileentity.TileEntityMachineBase; +import api.hbm.block.IDrillInteraction; +import api.hbm.block.IMiningDrill; import api.hbm.energy.IBatteryItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -27,7 +32,8 @@ import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineMiningDrill extends TileEntityMachineBase implements IConsumer { +@Spaghetti("if i had a time machine i'd go back to the year 2017 and uppercut myself") +public class TileEntityMachineMiningDrill extends TileEntityMachineBase implements IConsumer, IMiningDrill { public long power; public int warning; @@ -100,69 +106,18 @@ public class TileEntityMachineMiningDrill extends TileEntityMachineBase implemen this.radius = 1; this.fortune = 0; - for(int i = 10; i < 13; i++) { - ItemStack stack = slots[i]; - - if(stack != null) { - if(stack.getItem() == ModItems.upgrade_effect_1) { - this.radius += 1; - this.consumption += 80; - } - if(stack.getItem() == ModItems.upgrade_effect_2) { - this.radius += 2; - this.consumption += 160; - } - if(stack.getItem() == ModItems.upgrade_effect_3) { - this.radius += 3; - this.consumption += 240; - } - if(stack.getItem() == ModItems.upgrade_speed_1) { - this.timer -= 15; - this.consumption += 300; - } - if(stack.getItem() == ModItems.upgrade_speed_2) { - this.timer -= 30; - this.consumption += 600; - } - if(stack.getItem() == ModItems.upgrade_speed_3) { - this.timer -= 45; - this.consumption += 900; - } - if(stack.getItem() == ModItems.upgrade_power_1) { - this.consumption -= 30; - this.timer += 5; - } - if(stack.getItem() == ModItems.upgrade_power_2) { - this.consumption -= 60; - this.timer += 10; - } - if(stack.getItem() == ModItems.upgrade_power_3) { - this.consumption -= 90; - this.timer += 15; - } - if(stack.getItem() == ModItems.upgrade_fortune_1) { - this.fortune += 1; - this.timer += 15; - } - if(stack.getItem() == ModItems.upgrade_fortune_2) { - this.fortune += 2; - this.timer += 30; - } - if(stack.getItem() == ModItems.upgrade_fortune_3) { - this.fortune += 3; - this.timer += 45; - } - } - } + UpgradeManager.eval(slots, 10, 13); + this.radius += Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); + this.consumption += Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3) * 80; - if(timer < 5) - timer = 5; - if(consumption < 40) - consumption = 40; - if(radius > 4) - radius = 4; - if(fortune > 3) - fortune = 3; + this.timer -= Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) * 15; + this.consumption += Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3) * 300; + + this.consumption -= Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3) * 30; + this.timer += Math.min(UpgradeManager.getLevel(UpgradeType.POWER), 3) * 5; + + this.fortune += Math.min(UpgradeManager.getLevel(UpgradeType.FORTUNE), 3); + this.timer += Math.min(UpgradeManager.getLevel(UpgradeType.FORTUNE), 3) * 15; age++; if(age >= timer) @@ -420,6 +375,20 @@ public class TileEntityMachineMiningDrill extends TileEntityMachineBase implemen Block b = worldObj.getBlock(x, y, z); int meta = worldObj.getBlockMetadata(x, y, z); + + if(b instanceof IDrillInteraction) { + IDrillInteraction in = (IDrillInteraction) b; + + ItemStack sta = in.extractResource(worldObj, x, y, z, meta, this); + + if(hasSpace(sta)) { + this.addItemToInventory(sta); + } + + if(!in.canBreak(worldObj, x, y, z, meta, this)) + return true; //true because the block is still there and mining should continue + } + ItemStack stack = new ItemStack(b.getItemDropped(meta, rand, fortune), b.quantityDropped(meta, fortune, rand), b.damageDropped(meta)); //yup that worked @@ -536,4 +505,14 @@ public class TileEntityMachineMiningDrill extends TileEntityMachineBase implemen { return 65536.0D; } + + @Override + public DrillType getDrillTier() { + return DrillType.INDUSTRIAL; + } + + @Override + public int getDrillRating() { + return 50; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index fd5293265..8c570f115 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -22,6 +22,8 @@ import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.InventoryUtil; +import api.hbm.block.IDrillInteraction; +import api.hbm.block.IMiningDrill; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -37,7 +39,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineMiningLaser extends TileEntityMachineBase implements IConsumer, IFluidSource { +public class TileEntityMachineMiningLaser extends TileEntityMachineBase implements IConsumer, IFluidSource, IMiningDrill { public long power; public int age = 0; @@ -227,6 +229,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen Block b = worldObj.getBlock(targetX, targetY, targetZ); int meta = worldObj.getBlockMetadata(targetX, targetY, targetZ); boolean normal = true; + boolean doesBreak = true; if(b == Blocks.lit_redstone_ore) b = Blocks.redstone_ore; @@ -273,9 +276,22 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } } - if(normal) - b.dropBlockAsItem(worldObj, targetX, targetY, targetZ, meta, fortune); - worldObj.func_147480_a(targetX, targetY, targetZ, false); + if(normal && b instanceof IDrillInteraction) { + IDrillInteraction in = (IDrillInteraction) b; + ItemStack drop = in.extractResource(worldObj, targetX, targetY, targetZ, meta, this); + + if(drop != null) { + worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, drop.copy())); + } + + doesBreak = in.canBreak(worldObj, targetX, targetY, targetZ, meta, this); + } + + if(doesBreak) { + if(normal) b.dropBlockAsItem(worldObj, targetX, targetY, targetZ, meta, fortune); + worldObj.func_147480_a(targetX, targetY, targetZ, false); + } + suckDrops(); if(doesScream()) { @@ -292,6 +308,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen Item.getItemFromBlock(Blocks.sand), Item.getItemFromBlock(Blocks.sandstone), Item.getItemFromBlock(Blocks.gravel), + Item.getItemFromBlock(ModBlocks.basalt), Item.getItemFromBlock(ModBlocks.stone_gneiss), Items.flint, Items.snowball, @@ -396,46 +413,6 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen return block != Blocks.air && block.getBlockHardness(worldObj, x, y, z) >= 0 && !block.getMaterial().isLiquid() && block != Blocks.bedrock; } - public int getOverdrive() { - - int speed = 1; - - for(int i = 1; i < 9; i++) { - - if(slots[i] != null) { - - if(slots[i].getItem() == ModItems.upgrade_overdrive_1) - speed += 1; - else if(slots[i].getItem() == ModItems.upgrade_overdrive_2) - speed += 2; - else if(slots[i].getItem() == ModItems.upgrade_overdrive_3) - speed += 3; - } - } - - return Math.min(speed, 4); - } - - public int getSpeed() { - - int speed = 1; - - for(int i = 1; i < 9; i++) { - - if(slots[i] != null) { - - if(slots[i].getItem() == ModItems.upgrade_speed_1) - speed += 2; - else if(slots[i].getItem() == ModItems.upgrade_speed_2) - speed += 4; - else if(slots[i].getItem() == ModItems.upgrade_speed_3) - speed += 6; - } - } - - return Math.min(speed, 13); - } - public int getRange() { int range = 1; @@ -456,26 +433,6 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen return Math.min(range, 25); } - public int getFortune() { - - int fortune = 0; - - for(int i = 1; i < 9; i++) { - - if(slots[i] != null) { - - if(slots[i].getItem() == ModItems.upgrade_fortune_1) - fortune += 1; - else if(slots[i].getItem() == ModItems.upgrade_fortune_2) - fortune += 2; - else if(slots[i].getItem() == ModItems.upgrade_fortune_3) - fortune += 3; - } - } - - return Math.min(fortune, 3); - } - public boolean hasNullifier() { for(int i = 1; i < 9; i++) { @@ -561,10 +518,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } public int getConsumption() { - - int consumption = this.consumption; - - return consumption; + return this.consumption; } public int getWidth() { @@ -713,4 +667,14 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen tank.writeToNBT(nbt, "oil"); nbt.setBoolean("isOn", isOn); } + + @Override + public DrillType getDrillTier() { + return DrillType.HITECH; + } + + @Override + public int getDrillRating() { + return 100; + } }