From 46a45a7f24c8a01175c22b7171b7cacd8b0f2dce Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 8 Jan 2023 21:36:15 +0100 Subject: [PATCH] bedrock ore processing speedrun (any%) --- .../hbm/blocks/generic/BlockBedrockOreTE.java | 6 + .../com/hbm/blocks/generic/BlockLayering.java | 1 - .../hbm/blocks/machine/MachineExcavator.java | 10 +- .../hbm/blocks/machine/MachineFluidTank.java | 5 +- .../com/hbm/blocks/machine/ReactorZirnox.java | 1 + src/main/java/com/hbm/config/WorldConfig.java | 6 + .../hbm/entity/effect/EntityFalloutRain.java | 2 +- .../com/hbm/inventory/OreDictManager.java | 6 + .../inventory/gui/GUIMachineExcavator.java | 2 + .../inventory/recipes/AssemblerRecipes.java | 44 ++++- .../inventory/recipes/CentrifugeRecipes.java | 23 +++ .../recipes/CrystallizerRecipes.java | 8 + .../inventory/recipes/ShredderRecipes.java | 10 ++ src/main/java/com/hbm/items/ModItems.java | 22 +++ .../com/hbm/items/special/ItemBedrockOre.java | 65 ++++++++ .../java/com/hbm/items/tool/ItemWandD.java | 3 + src/main/java/com/hbm/lib/HbmWorldGen.java | 4 + src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 6 + .../machine/TileEntityMachineExcavator.java | 152 ++++++++++++++++-- .../machine/rbmk/TileEntityRBMKControl.java | 9 ++ .../machine/rbmk/TileEntityRBMKRod.java | 9 ++ .../com/hbm/world/feature/BedrockOre.java | 43 +++++ .../hbm/world/generator/DungeonToolbox.java | 10 ++ src/main/resources/assets/hbm/lang/de_DE.lang | 20 +++ src/main/resources/assets/hbm/lang/en_US.lang | 20 +++ .../assets/hbm/textures/blocks/toaster.png | Bin 0 -> 201 bytes .../hbm/textures/blocks/toaster_iron.png | Bin 0 -> 283 bytes .../hbm/textures/blocks/toaster_steel.png | Bin 0 -> 289 bytes .../hbm/textures/blocks/toaster_wood.png | Bin 0 -> 399 bytes .../assets/hbm/textures/items/ore_bedrock.png | Bin 0 -> 404 bytes .../hbm/textures/items/ore_centrifuged.png | Bin 0 -> 392 bytes .../assets/hbm/textures/items/ore_cleaned.png | Bin 0 -> 389 bytes .../hbm/textures/items/ore_cluster_bg.png | Bin 259 -> 0 bytes .../hbm/textures/items/ore_cluster_fg.png | Bin 261 -> 0 bytes .../hbm/textures/items/ore_cluster_tikite.png | Bin 433 -> 0 bytes .../textures/items/ore_cluster_tikite_alt.png | Bin 409 -> 0 bytes .../hbm/textures/items/ore_enriched.png | Bin 0 -> 389 bytes .../assets/hbm/textures/items/ore_overlay.png | Bin 0 -> 151 bytes .../hbm/textures/items/ore_purified.png | Bin 0 -> 481 bytes .../hbm/textures/items/ore_separated.png | Bin 0 -> 453 bytes .../textures/models/machines/mining_drill.png | Bin 4662 -> 9112 bytes src/main/resources/mcmod.info | 2 +- 43 files changed, 472 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/hbm/items/special/ItemBedrockOre.java create mode 100644 src/main/java/com/hbm/world/feature/BedrockOre.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/toaster.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/toaster_iron.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/toaster_steel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/toaster_wood.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_bedrock.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_centrifuged.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_cleaned.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ore_cluster_bg.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ore_cluster_fg.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ore_cluster_tikite.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ore_cluster_tikite_alt.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_enriched.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_overlay.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_purified.png create mode 100644 src/main/resources/assets/hbm/textures/items/ore_separated.png diff --git a/src/main/java/com/hbm/blocks/generic/BlockBedrockOreTE.java b/src/main/java/com/hbm/blocks/generic/BlockBedrockOreTE.java index 82e2209fb..25e430822 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBedrockOreTE.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBedrockOreTE.java @@ -39,6 +39,7 @@ public class BlockBedrockOreTE extends BlockContainer implements ILookOverlay, I super(Material.rock); this.setBlockTextureName("bedrock"); this.setBlockUnbreakable(); + this.setResistance(1_000_000); } @Override @@ -140,6 +141,8 @@ public class BlockBedrockOreTE extends BlockContainer implements ILookOverlay, I text.add(ore.resource.getDisplayName()); } + text.add("Tier: " + ore.tier); + if(ore.acidRequirement != null) { text.add("Requires: " + ore.acidRequirement.fill + "mB " + I18nUtil.resolveKey(ore.acidRequirement.type.getUnlocalizedName())); } @@ -151,6 +154,7 @@ public class BlockBedrockOreTE extends BlockContainer implements ILookOverlay, I public ItemStack resource; public FluidStack acidRequirement; + public int tier; public int color; public int shape; @@ -179,6 +183,7 @@ public class BlockBedrockOreTE extends BlockContainer implements ILookOverlay, I this.acidRequirement = new FluidStack(type, nbt.getInteger("amount")); } + this.tier = nbt.getInteger("tier"); this.color = nbt.getInteger("color"); this.shape = nbt.getInteger("shape"); } @@ -198,6 +203,7 @@ public class BlockBedrockOreTE extends BlockContainer implements ILookOverlay, I nbt.setInteger("amount", this.acidRequirement.fill); } + nbt.setInteger("tier", this.tier); nbt.setInteger("color", this.color); nbt.setInteger("shape", this.shape); } diff --git a/src/main/java/com/hbm/blocks/generic/BlockLayering.java b/src/main/java/com/hbm/blocks/generic/BlockLayering.java index e648823ee..7b45bbe3a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockLayering.java +++ b/src/main/java/com/hbm/blocks/generic/BlockLayering.java @@ -13,7 +13,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/blocks/machine/MachineExcavator.java b/src/main/java/com/hbm/blocks/machine/MachineExcavator.java index 84246b1fa..0d27866a6 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineExcavator.java +++ b/src/main/java/com/hbm/blocks/machine/MachineExcavator.java @@ -2,6 +2,7 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineExcavator; import net.minecraft.block.material.Material; @@ -18,8 +19,9 @@ public class MachineExcavator extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { - + if(meta >= 12) return new TileEntityMachineExcavator(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); return null; } @@ -62,5 +64,11 @@ public class MachineExcavator extends BlockDummyable { MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {-1, 3, 3, -2, 3, -2}, this, dir); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {-1, 3, 3, -2, -2, 3}, this, dir); MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] {-1, 3, -2, 3, 3, 3}, this, dir); + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + this.makeExtra(world, x + dir.offsetX * 3 + rot.offsetX, y + 1, z + dir.offsetZ * 3 + rot.offsetZ); + this.makeExtra(world, x + dir.offsetX * 3 - rot.offsetX, y + 1, z + dir.offsetZ * 3 - rot.offsetZ); + this.makeExtra(world, x + rot.offsetX * 3, y + 1, z + rot.offsetZ * 3); + this.makeExtra(world, x - rot.offsetX * 3, y + 1, z - rot.offsetZ * 3); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java index b92341628..60d086a66 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java @@ -18,6 +18,8 @@ import com.hbm.util.I18nUtil; import api.hbm.block.IToolable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; @@ -143,10 +145,11 @@ public class MachineFluidTank extends BlockDummyable implements IPersistentInfoP public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { if(tool != ToolType.TORCH) return false; - return IRepairable.tryRepairMultiblock(world, x, y, z, this, Minecraft.getMinecraft().thePlayer); + return IRepairable.tryRepairMultiblock(world, x, y, z, this, player); } @Override + @SideOnly(Side.CLIENT) public void printHook(Pre event, World world, int x, int y, int z) { List materials = IRepairable.getRepairMaterials(world, x, y, z, this, Minecraft.getMinecraft().thePlayer); diff --git a/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java b/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java index 39c65cc59..275e0a36c 100644 --- a/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java +++ b/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java @@ -63,6 +63,7 @@ public class ReactorZirnox extends BlockDummyable { return 2; } + @Override protected void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 91ba31a22..48b2ae6c9 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -33,6 +33,9 @@ public class WorldConfig { public static int bedrockOilSpawn = 200; public static int meteoriteSpawn = 500; + public static int bedrockIronSpawn = 200; + public static int bedrockCopperSpawn = 200; + public static int ironClusterSpawn = 4; public static int titaniumClusterSpawn = 2; public static int aluminiumClusterSpawn = 3; @@ -124,6 +127,9 @@ public class WorldConfig { bedrockOilSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.22_bedrockOilSpawnRate", "Spawns a bedrock oil node every nTH chunk", 200); meteoriteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.23_meteoriteSpawnRate", "Spawns a fallen meteorite every nTH chunk", 200); + bedrockIronSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B00_bedrockIronSpawn", "Spawns a bedrock iron deposit every nTH chunk", 200); + bedrockCopperSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B01_bedrockCopperSpawn", "Spawns a bedrock copper deposit every nTH chunk", 200); + ironClusterSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.C00_ironClusterSpawn", "Amount of iron cluster veins per chunk", 4); titaniumClusterSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.C01_titaniumClusterSpawn", "Amount of titanium cluster veins per chunk", 2); aluminiumClusterSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.C02_aluminiumClusterSpawn", "Amount of aluminium cluster veins per chunk", 3); diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index de26d22ce..079e2ab2c 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -171,7 +171,7 @@ public class EntityFalloutRain extends Entity { } float hardness = b.getBlockHardness(worldObj, x, y, z); - if(dist < 65 && hardness <= Blocks.stonebrick.getExplosionResistance(null) && hardness >= 0) { + if(dist < 65 && hardness <= Blocks.stonebrick.getExplosionResistance(null) && hardness >= 0/* && !b.hasTileEntity(worldObj.getBlockMetadata(x, y, z))*/) { Block bl = worldObj.getBlock(x, y - 1, z); if(bl == Blocks.air) { diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index e5c5185f0..df00c0ced 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -19,9 +19,11 @@ import com.hbm.hazard.HazardEntry; import com.hbm.hazard.HazardRegistry; import com.hbm.hazard.HazardSystem; import com.hbm.inventory.material.MaterialShapes; +import com.hbm.items.ModItems; import com.hbm.items.ItemEnums.EnumBriquetteType; import com.hbm.items.ItemEnums.EnumCokeType; import com.hbm.items.ItemEnums.EnumTarType; +import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -447,6 +449,10 @@ public class OreDictManager { OreDictionary.registerOre(KEY_CIRCUIT_BISMUTH, circuit_bismuth); OreDictionary.registerOre(KEY_CIRCUIT_BISMUTH, circuit_arsenic); + + for(EnumBedrockOre ore : EnumBedrockOre.values()) { + OreDictionary.registerOre("ore" + ore.oreName, new ItemStack(ModItems.ore_enriched, 1, ore.ordinal())); + } OreDictionary.registerOre("itemRubber", ingot_rubber); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java b/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java index 61244f87a..0197e0409 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineExcavator.java @@ -108,5 +108,7 @@ public class GUIMachineExcavator extends GuiInfoContainer { 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); } + + drill.tank.renderTank(guiLeft + 202, guiTop + 70, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index efa9781f1..653294ec1 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -28,6 +28,7 @@ import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; +import com.hbm.items.machine.ItemDrillbit.EnumDrillType; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.main.MainRegistry; @@ -196,8 +197,8 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModItems.warhead_thermo_endo, 1), new AStack[] {new ComparableStack(ModBlocks.therm_endo, 2), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 6), },300); makeRecipe(new ComparableStack(ModItems.warhead_thermo_exo, 1), new AStack[] {new ComparableStack(ModBlocks.therm_exo, 2), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 6), },300); makeRecipe(new ComparableStack(ModItems.fuel_tank_small, 1), new AStack[] {new ComparableStack(ModItems.canister_full, 6, Fluids.ETHANOL.getID()), new OreDictStack(TI.plate(), 6), new OreDictStack(STEEL.plate(), 2), },100); - makeRecipe(new ComparableStack(ModItems.fuel_tank_medium, 1), new AStack[] {new ComparableStack(ModItems.canister_full, 12, Fluids.KEROSENE.getID()), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 4), },150); - makeRecipe(new ComparableStack(ModItems.fuel_tank_large, 1), new AStack[] {new ComparableStack(ModItems.canister_full, 36, Fluids.KEROSENE.getID()), new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 8), },200); + makeRecipe(new ComparableStack(ModItems.fuel_tank_medium, 1), new AStack[] {new ComparableStack(ModItems.canister_full, 8, Fluids.KEROSENE.getID()), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 4), },150); + makeRecipe(new ComparableStack(ModItems.fuel_tank_large, 1), new AStack[] {new ComparableStack(ModItems.canister_full, 12, Fluids.KEROSENE.getID()), new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 8), },200); makeRecipe(new ComparableStack(ModItems.thruster_small, 1), new AStack[] {new OreDictStack(STEEL.plate(), 4), new OreDictStack(W.ingot(), 4), new ComparableStack(ModItems.wire_aluminium, 4), },100); makeRecipe(new ComparableStack(ModItems.thruster_medium, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new OreDictStack(W.ingot(), 8), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.wire_copper, 16), },150); makeRecipe(new ComparableStack(ModItems.thruster_large, 1), new AStack[] {new OreDictStack(DURA.ingot(), 16), new OreDictStack(W.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.wire_gold, 32), new ComparableStack(ModItems.circuit_red_copper, 1), },200); @@ -498,6 +499,45 @@ public class AssemblerRecipes { new OreDictStack(NB.ingot(), 16), new ComparableStack(ModItems.bolt_compound, 16) }, 200); + + makeRecipe(new ComparableStack(ModBlocks.machine_excavator, 1), new AStack[] { + new ComparableStack(Blocks.stonebrick, 8), + new OreDictStack(STEEL.ingot(), 16), + new OreDictStack(IRON.ingot(), 16), + new ComparableStack(ModBlocks.steel_scaffold, 16), + new ComparableStack(ModItems.motor, 2), + new ComparableStack(ModItems.tank_steel, 1), + new ComparableStack(ModItems.circuit_red_copper, 1) + }, 300); + makeRecipe(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal()), new AStack[] { + new OreDictStack(STEEL.ingot(), 12), + new OreDictStack(W.ingot(), 4) + }, 200); + makeRecipe(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.STEEL_DIAMOND.ordinal()), new AStack[] { + new ComparableStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal()), + new OreDictStack(DIAMOND.dust(), 16) + }, 100); + + makeRecipe(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal()), new AStack[] { + new OreDictStack(DURA.ingot(), 12), + new OreDictStack(ANY_PLASTIC.ingot(), 12), + new OreDictStack(TI.ingot(), 8) + }, 200); + makeRecipe(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.HSS_DIAMOND.ordinal()), new AStack[] { + new ComparableStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal()), + new OreDictStack(DIAMOND.dust(), 24) + }, 100); + + makeRecipe(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal()), new AStack[] { + new OreDictStack(DESH.ingot(), 16), + new OreDictStack(RUBBER.ingot(), 12), + new OreDictStack(NB.ingot(), 4) + }, 200); + makeRecipe(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.DESH_DIAMOND.ordinal()), new AStack[] { + new ComparableStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal()), + new OreDictStack(DIAMOND.dust(), 32) + }, 100); + makeRecipe(new ComparableStack(ModBlocks.machine_large_turbine, 1), new AStack[] { new OreDictStack(STEEL.plate(), 12), new OreDictStack(RUBBER.ingot(), 4), diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 643c8c58d..bdf747ca5 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -18,6 +18,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.main.MainRegistry; import net.minecraft.init.Blocks; @@ -298,6 +299,28 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(Items.dye, 1, 15), //temp new ItemStack(ModItems.dust) }); + for(EnumBedrockOre ore : EnumBedrockOre.values()) { + int i = ore.ordinal(); + + recipes.put(new ComparableStack(ModItems.ore_bedrock, 1, i), new ItemStack[] { + new ItemStack(ModItems.ore_centrifuged, 1, i), + new ItemStack(ModItems.ore_centrifuged, 1, i), + new ItemStack(ModItems.ore_centrifuged, 1, i), + new ItemStack(ModItems.ore_centrifuged, 1, i) }); + + recipes.put(new ComparableStack(ModItems.ore_cleaned, 1, i), new ItemStack[] { + new ItemStack(ModItems.ore_separated, 1, i), + new ItemStack(ModItems.ore_separated, 1, i), + new ItemStack(ModItems.ore_separated, 1, i), + new ItemStack(ModItems.ore_separated, 1, i) }); + + recipes.put(new ComparableStack(ModItems.ore_purified, 1, i), new ItemStack[] { + new ItemStack(ModItems.ore_enriched, 1, i), + new ItemStack(ModItems.ore_enriched, 1, i), + new ItemStack(ModItems.ore_enriched, 1, i), + new ItemStack(ModItems.ore_enriched, 1, i) }); + } + List quartz = OreDictionary.getOres("crystalCertusQuartz"); if(quartz != null && !quartz.isEmpty()) { diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index ae462ead1..00d78ba9c 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -10,6 +10,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.handler.imc.IMCCrystallizer; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; +import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.main.MainRegistry; @@ -85,6 +86,13 @@ public class CrystallizerRecipes { recipes.put(new ComparableStack(ModItems.scrap_plastic, 1, i), new ItemStack(ModItems.circuit_star_piece, 1, i)); } + for(EnumBedrockOre ore : EnumBedrockOre.values()) { + int i = ore.ordinal(); + + recipes.put(new ComparableStack(ModItems.ore_centrifuged, 1, i), new ItemStack(ModItems.ore_cleaned, 1, i)); + recipes.put(new ComparableStack(ModItems.ore_separated, 1, i), new ItemStack(ModItems.ore_purified, 1, i)); + } + List quartz = OreDictionary.getOres("crystalCertusQuartz"); if(quartz != null && !quartz.isEmpty()) { diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index 18169762c..04f8243dd 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -15,6 +15,7 @@ import com.hbm.interfaces.Untested; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.main.MainRegistry; import com.hbm.util.Compat; @@ -213,6 +214,15 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(Blocks.sand, new ItemStack(ModItems.dust, 2)); } + for(EnumBedrockOre ore : EnumBedrockOre.values()) { + int i = ore.ordinal(); + ShredderRecipes.setRecipe(new ItemStack(ModItems.ore_bedrock, 1, i), new ItemStack(ModItems.ore_enriched, 1, i)); + ShredderRecipes.setRecipe(new ItemStack(ModItems.ore_centrifuged, 1, i), new ItemStack(ModItems.ore_enriched, 1, i)); + ShredderRecipes.setRecipe(new ItemStack(ModItems.ore_cleaned, 1, i), new ItemStack(ModItems.ore_enriched, 1, i)); + ShredderRecipes.setRecipe(new ItemStack(ModItems.ore_separated, 1, i), new ItemStack(ModItems.ore_enriched, 1, i)); + ShredderRecipes.setRecipe(new ItemStack(ModItems.ore_purified, 1, i), new ItemStack(ModItems.ore_enriched, 1, i)); + } + for(int i = 0; i < 5; i++) ShredderRecipes.setRecipe(new ItemStack(Items.skull, 1, i), new ItemStack(ModItems.biomass, 4)); /* Crystal processing */ diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index dac46f323..32c22a1bb 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -186,6 +186,13 @@ public class ModItems { public static Item ingot_mercury; //It's to prevent any ambiguity, as it was treated as a full ingot in the past anyway public static Item bottle_mercury; + public static Item ore_bedrock; + public static Item ore_centrifuged; + public static Item ore_cleaned; + public static Item ore_separated; + public static Item ore_purified; + public static Item ore_enriched; + public static Item billet_uranium; public static Item billet_u233; public static Item billet_u235; @@ -2799,6 +2806,13 @@ public class ModItems { ingot_mercury = new ItemCustomLore().setUnlocalizedName("nugget_mercury").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":nugget_mercury"); bottle_mercury = new ItemCustomLore().setUnlocalizedName("bottle_mercury").setContainerItem(Items.glass_bottle).setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bottle_mercury"); + ore_bedrock = new ItemBedrockOre().setUnlocalizedName("ore_bedrock").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_bedrock"); + ore_centrifuged = new ItemBedrockOre().setUnlocalizedName("ore_centrifuged").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_centrifuged"); + ore_cleaned = new ItemBedrockOre().setUnlocalizedName("ore_cleaned").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_cleaned"); + ore_separated = new ItemBedrockOre().setUnlocalizedName("ore_separated").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_separated"); + ore_purified = new ItemBedrockOre().setUnlocalizedName("ore_purified").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_purified"); + ore_enriched = new ItemBedrockOre().setUnlocalizedName("ore_enriched").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ore_enriched"); + ingot_lanthanium = new ItemCustomLore().setUnlocalizedName("ingot_lanthanium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_lanthanium"); ingot_actinium = new ItemCustomLore().setUnlocalizedName("ingot_actinium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_actinium"); @@ -6065,6 +6079,14 @@ public class ModItems { GameRegistry.registerItem(ball_tnt, ball_tnt.getUnlocalizedName()); GameRegistry.registerItem(ball_fireclay, ball_fireclay.getUnlocalizedName()); + //Ores + GameRegistry.registerItem(ore_bedrock, ore_bedrock.getUnlocalizedName()); + GameRegistry.registerItem(ore_centrifuged, ore_centrifuged.getUnlocalizedName()); + GameRegistry.registerItem(ore_cleaned, ore_cleaned.getUnlocalizedName()); + GameRegistry.registerItem(ore_separated, ore_separated.getUnlocalizedName()); + GameRegistry.registerItem(ore_purified, ore_purified.getUnlocalizedName()); + GameRegistry.registerItem(ore_enriched, ore_enriched.getUnlocalizedName()); + //Crystals GameRegistry.registerItem(crystal_coal, crystal_coal.getUnlocalizedName()); GameRegistry.registerItem(crystal_iron, crystal_iron.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemBedrockOre.java b/src/main/java/com/hbm/items/special/ItemBedrockOre.java new file mode 100644 index 000000000..cdba5a466 --- /dev/null +++ b/src/main/java/com/hbm/items/special/ItemBedrockOre.java @@ -0,0 +1,65 @@ +package com.hbm.items.special; + +import com.hbm.items.ItemEnumMulti; +import com.hbm.lib.RefStrings; +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.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItemBedrockOre extends ItemEnumMulti { + + protected IIcon overlayIcon; + + public ItemBedrockOre() { + super(EnumBedrockOre.class, true, false); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister p_94581_1_) { + super.registerIcons(p_94581_1_); + + this.overlayIcon = p_94581_1_.registerIcon(RefStrings.MODID + ":ore_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int meta, int pass) { + return pass == 1 ? this.overlayIcon : super.getIconFromDamageForRenderPass(meta, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int pass) { + + if(pass == 1) { + EnumBedrockOre ore = EnumUtil.grabEnumSafely(EnumBedrockOre.class, stack.getItemDamage()); + return ore.color; + } + + return 0xffffff; + } + + public static enum EnumBedrockOre { + IRON("Iron", 0xE2C0AA), + COPPER("Copper", 0xFDCA88); + + public String oreName; + public int color; + + private EnumBedrockOre(String name, int color) { + this.oreName = name; + this.color = color; + } + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index eb128f666..010561a30 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -8,6 +8,8 @@ import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.entity.logic.EntityTomBlast; import com.hbm.entity.mob.siege.EntitySiegeTunneler; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.special.ItemBookLore; import com.hbm.items.special.ItemBookLore.BookLoreType; @@ -98,6 +100,7 @@ public class ItemWandD extends Item { ore.resource = new ItemStack(ModBlocks.stone_resource, 1, 2); ore.color = 0xCF6722; ore.shape = type; + ore.acidRequirement = new FluidStack(Fluids.SULFURIC_ACID, 1000); world.markBlockForUpdate(ix, 0, iz); world.markTileEntityChunkModified(ix, 0, iz, ore); } diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 357f120e6..0d39cecea 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -9,6 +9,7 @@ import com.hbm.blocks.generic.BlockNTMFlower.EnumFlowerType; import com.hbm.config.GeneralConfig; import com.hbm.config.WorldConfig; import com.hbm.items.ModItems; +import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.main.MainRegistry; import com.hbm.saveddata.TomSaveData; import com.hbm.tileentity.machine.storage.TileEntitySafe; @@ -152,6 +153,9 @@ public class HbmWorldGen implements IWorldGenerator { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.hematiteSpawn, 10, 4, 80, ModBlocks.stone_resource, EnumStoneType.HEMATITE.ordinal()); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.malachiteSpawn, 10, 4, 40, ModBlocks.stone_resource, EnumStoneType.MALACHITE.ordinal()); + + if(WorldConfig.bedrockIronSpawn > 0 && rand.nextInt(WorldConfig.bedrockIronSpawn) == 0) DungeonToolbox.generateBedrockOre(world, rand, i, j, EnumBedrockOre.IRON); + if(WorldConfig.bedrockCopperSpawn > 0 && rand.nextInt(WorldConfig.bedrockCopperSpawn) == 0) DungeonToolbox.generateBedrockOre(world, rand, i, j, EnumBedrockOre.COPPER); for(int k = 0; k < WorldConfig.randomSpawn; k++) { BlockMotherOfAllOres.shuffleOverride(rand); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index dade4e19c..95c796e06 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4445)"; + public static final String VERSION = "1.0.27 BETA (4473)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 40b557300..5e1b46faa 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -462,6 +462,12 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.chain), 8), new Object[] { "S", "S", "S", 'S', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 4), new Object[] { "SS", "SS", 'S', ModBlocks.steel_beam }); + + addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 0), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeGray" }); + addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 1), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeRed" }); + addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 2), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeWhite" }); + addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 3), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeYellow" }); + reg2(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index ec55f818e..c870d46fe 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -6,7 +6,9 @@ import java.util.HashSet; import java.util.List; import java.util.Random; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockBedrockOreTE.TileEntityBedrockOre; import com.hbm.blocks.network.CraneInserter; import com.hbm.entity.item.EntityMovingItem; import com.hbm.interfaces.IControlReceiver; @@ -23,9 +25,11 @@ import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.Compat; import com.hbm.util.EnumUtil; import com.hbm.util.ItemStackUtil; import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.conveyor.IConveyorBelt; import api.hbm.energy.IEnergyUser; @@ -64,6 +68,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements protected int ticksWorked = 0; protected int targetDepth = 0; //0 is the first block below null position + protected boolean bedrockDrilling = false; public float drillRotation = 0F; public float prevDrillRotation = 0F; @@ -102,8 +107,15 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements if(!worldObj.isRemote) { + this.tank.setType(1, slots); + if(worldObj.getTotalWorldTime() % 20 == 0) { tryEjectBuffer(); + + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } } if(chuteTimer > 0) chuteTimer--; @@ -121,10 +133,12 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements this.speed = type.speed; this.speed *= (1 + speedLevel / 2D); - if(targetDepth < this.yCoord - 4 && tryDrill(1 + radiusLevel * 2)) { + int maxDepth = this.yCoord - 4; + + if((bedrockDrilling || targetDepth <= maxDepth) && tryDrill(1 + radiusLevel * 2)) { targetDepth++; - if(targetDepth >= this.yCoord - 4) { + if(targetDepth > maxDepth) { this.enableDrill = false; } } @@ -142,6 +156,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements data.setInteger("t", targetDepth); data.setInteger("g", chuteTimer); data.setLong("p", power); + tank.writeToNBT(data, "tank"); this.networkPack(data, 150); } else { @@ -183,6 +198,18 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements } } + protected DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + return new DirPos[] { + new DirPos(xCoord + dir.offsetX * 4 + rot.offsetX, yCoord + 1, zCoord + dir.offsetZ * 4 + rot.offsetZ, dir), + new DirPos(xCoord + dir.offsetX * 4 - rot.offsetX, yCoord + 1, zCoord + dir.offsetZ * 4 - rot.offsetZ, dir), + new DirPos(xCoord + rot.offsetX * 4, yCoord + 1, zCoord + rot.offsetZ * 4, rot), + new DirPos(xCoord - rot.offsetX * 4, yCoord + 1, zCoord - rot.offsetZ * 4, rot.getOpposite()) + }; + } + public void networkUnpack(NBTTagCompound nbt) { this.enableDrill = nbt.getBoolean("d"); this.enableCrusher = nbt.getBoolean("c"); @@ -193,6 +220,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements this.targetDepth = nbt.getInteger("t"); this.chuteTimer = nbt.getInteger("g"); this.power = nbt.getLong("p"); + this.tank.readFromNBT(nbt, "tank"); } protected int getY() { @@ -202,8 +230,8 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements /** 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) { + + if(targetDepth == 0 || y == 0) { radius = 1; } @@ -212,6 +240,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements boolean ignoreAll = true; float combinedHardness = 0F; BlockPos bedrockOre = null; + bedrockDrilling = false; for(int x = xCoord - ring; x <= xCoord + ring; x++) { for(int z = zCoord - ring; z <= zCoord + ring; z++) { @@ -221,16 +250,19 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements Block b = worldObj.getBlock(x, y, z); - if(shouldIgnoreBlock(b, x, y ,z)) continue; - - ignoreAll = false; - if(b == ModBlocks.ore_bedrock) { combinedHardness = 60 * 20; bedrockOre = new BlockPos(x, y, z); + bedrockDrilling = true; + enableCrusher = false; + ignoreAll = false; break; } + if(shouldIgnoreBlock(b, x, y ,z)) continue; + + ignoreAll = false; + combinedHardness += b.getBlockHardness(worldObj, x, y, z); } } @@ -243,12 +275,12 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements if(ticksWorked >= ticksToWork) { - if(bedrockOre != null) { + if(bedrockOre == null) { breakBlocks(ring); buildWall(ring + 1, ring == radius && this.enableWalling); tryCollect(radius); } else { - //collectBedrock(bedrockOre); + collectBedrock(bedrockOre); } ticksWorked = 0; } @@ -262,6 +294,76 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements return true; } + protected void collectBedrock(BlockPos pos) { + TileEntity oreTile = Compat.getTileStandard(worldObj, pos.getX(), pos.getY(), pos.getZ()); + + if(oreTile instanceof TileEntityBedrockOre) { + TileEntityBedrockOre ore = (TileEntityBedrockOre) oreTile; + + if(ore.resource == null) return; + if(ore.tier > this.getInstalledDrill().tier) return; + if(ore.acidRequirement != null) { + + if(ore.acidRequirement.type != tank.getTankType() || ore.acidRequirement.fill > tank.getFill()) return; + + tank.setFill(tank.getFill() - ore.acidRequirement.fill); + } + + ItemStack stack = ore.resource.copy(); + List stacks = new ArrayList(); + stacks.add(stack); + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + + int x = xCoord + dir.offsetX * 4; + int y = yCoord - 3; + int z = zCoord + dir.offsetZ * 4; + + /* try to insert into a valid container */ + TileEntity tile = worldObj.getTileEntity(x, y, z); + if(tile instanceof IInventory) { + supplyContainer((IInventory) tile, stacks, dir.getOpposite()); + } + + if(stack.stackSize <= 0) return; + + /* try to place on conveyor belt */ + Block b = worldObj.getBlock(x, y, z); + if(b instanceof IConveyorBelt) { + supplyConveyor((IConveyorBelt) b, stacks, x, y, z); + } + + if(stack.stackSize <= 0) return; + + for(int i = 5; i < 14; i++) { + + if(slots[i] != null && slots[i].stackSize < slots[i].getMaxStackSize() && stack.isItemEqual(slots[i]) && ItemStack.areItemStackTagsEqual(stack, slots[i])) { + int toAdd = Math.min(slots[i].getMaxStackSize() - slots[i].stackSize, stack.stackSize); + slots[i].stackSize += toAdd; + stack.stackSize -= toAdd; + + chuteTimer = 40; + + if(stack.stackSize <= 0) { + return; + } + } + } + + /* add leftovers to empty slots */ + for(int i = 5; i < 14; i++) { + + if(slots[i] == null) { + + chuteTimer = 40; + + slots[i] = stack.copy(); + return; + } + } + } + } + /** breaks and drops all blocks in the specified ring */ protected void breakBlocks(int ring) { int y = getY(); @@ -477,7 +579,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements List stacks = new ArrayList(); items.forEach(i -> stacks.add(i.getEntityItem())); - /* try to insert into a valid coontainer */ + /* try to insert into a valid container */ TileEntity tile = worldObj.getTileEntity(x, y, z); if(tile instanceof IInventory) { supplyContainer((IInventory) tile, stacks, dir.getOpposite()); @@ -614,6 +716,34 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements EnumDrillType type = getInstalledDrill(); return this.enableSilkTouch && type != null && type.silk; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + 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.targetDepth = nbt.getInteger("t"); + this.power = nbt.getLong("p"); + this.tank.readFromNBT(nbt, "tank"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setBoolean("d", enableDrill); + nbt.setBoolean("c", enableCrusher); + nbt.setBoolean("w", enableWalling); + nbt.setBoolean("v", enableVeinMiner); + nbt.setBoolean("s", enableSilkTouch); + nbt.setInteger("t", targetDepth); + nbt.setLong("p", power); + tank.writeToNBT(nbt, "tank"); + } @Override public boolean hasPermission(EntityPlayer player) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java index 0dd5ff3b6..59772c142 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControl.java @@ -97,6 +97,15 @@ public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase im @Override public void onMelt(int reduce) { + if(this.isModerated()) { + + int count = 2 + worldObj.rand.nextInt(2); + + for(int i = 0; i < count; i++) { + spawnDebris(DebrisType.GRAPHITE); + } + } + int count = 2 + worldObj.rand.nextInt(2); for(int i = 0; i < count; i++) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 4997dc3a5..23cfc21ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -309,6 +309,15 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM spawnDebris(DebrisType.ELEMENT); + if(this.isModerated()) { + + int count = 2 + worldObj.rand.nextInt(2); + + for(int i = 0; i < count; i++) { + spawnDebris(DebrisType.GRAPHITE); + } + } + if(this.getBlockMetadata() == RBMKBase.DIR_NORMAL_LID.ordinal() + RBMKBase.offset) spawnDebris(DebrisType.LID); } diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java new file mode 100644 index 000000000..362f1cfc2 --- /dev/null +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -0,0 +1,43 @@ +package com.hbm.world.feature; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockBedrockOreTE.TileEntityBedrockOre; +import com.hbm.inventory.FluidStack; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class BedrockOre { + + public static void generate(World world, int x, int z, ItemStack stack, FluidStack acid, int color) { + + for(int ix = x - 1; ix <= x + 1; ix++) { + for(int iz = z - 1; iz <= z + 1; iz++) { + + if((ix == x && iz == z) || world.rand.nextBoolean()) { + + world.setBlock(ix, 0, iz, ModBlocks.ore_bedrock); + TileEntityBedrockOre ore = (TileEntityBedrockOre) world.getTileEntity(ix, 0, iz); + ore.resource = stack; + ore.color = color; + ore.shape = world.rand.nextInt(10); + ore.acidRequirement = acid; + world.markBlockForUpdate(ix, 0, iz); + world.markTileEntityChunkModified(ix, 0, iz, ore); + } + } + } + + for(int ix = x - 3; ix <= x + 3; ix++) { + for(int iz = z - 3; iz <= z + 3; iz++) { + + for(int iy = 1; iy < 7; iy++) { + if(world.getBlock(ix, iy, iz) == Blocks.bedrock) { + world.setBlock(ix, iy, iz, ModBlocks.stone_depth); + } + } + } + } + } +} diff --git a/src/main/java/com/hbm/world/generator/DungeonToolbox.java b/src/main/java/com/hbm/world/generator/DungeonToolbox.java index f22c451ab..be8766a1c 100644 --- a/src/main/java/com/hbm/world/generator/DungeonToolbox.java +++ b/src/main/java/com/hbm/world/generator/DungeonToolbox.java @@ -4,9 +4,13 @@ import java.util.List; import java.util.Random; import com.hbm.inventory.RecipesCommon.MetaBlock; +import com.hbm.items.ModItems; +import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; +import com.hbm.world.feature.BedrockOre; import net.minecraft.block.Block; import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenFlowers; @@ -88,6 +92,12 @@ public class DungeonToolbox { (new WorldGenMinable(ore, meta, amount, target)).generate(world, rand, x, y, z); } } + + public static void generateBedrockOre(World world, Random rand, int chunkX, int chunkZ, EnumBedrockOre ore) { + int randPosX = chunkX + rand.nextInt(16); + int randPosZ = chunkZ + rand.nextInt(16); + BedrockOre.generate(world, randPosX, randPosZ, new ItemStack(ModItems.ore_bedrock, 1, ore.ordinal()), null, ore.color); + } private static WorldGenFlowers genFlowers = new WorldGenFlowers(null); public static void generateFlowers(World world, Random rand, int chunkX, int chunkZ, Block flower, int meta) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 656aa2291..e6b0b299d 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1522,6 +1522,12 @@ item.dosimeter.name=Dosimeter item.drax.name=Terra-Bohrer item.drax_mk2.name=Gehärteter Terra-Bohrer item.drax_mk3.name=Schrabidischer Terra-Bohrer +item.drillbit_desh.name=Desh-Bohrspitze +item.drillbit_desh_diamond.name=Desh-Bohrspitze (Diamantbeschichtung) +item.drillbit_hss.name=Schnellarbeitsstahl-Bohrspitze +item.drillbit_hss_diamond.name=Schnellarbeitsstahl-Bohrspitze (Diamantbeschichtung) +item.drillbit_steel.name=Stahl-Bohrspitze +item.drillbit_steel_diamond.name=Stahl-Bohrspitze (Diamantbeschichtung) item.drill_titanium.name=Titanbohrer item.ducttape.name=Klebeband item.dust.name=Staub @@ -2324,6 +2330,18 @@ item.oil_tar.name=Ölteer item.oil_tar.crude.name=Erdölteer item.oil_tar.crack.name=Crackölteer item.oil_tar.wood.name=Holzteer +item.ore_bedrock.copper.name=Bedrock-Kupfererz +item.ore_bedrock.iron.name=Bedrock-Eisenerz +item.ore_centrifuged.copper.name=Zentrifugiertes Kupfererz +item.ore_centrifuged.iron.name=Zentrifugiertes Eisenerz +item.ore_cleaned.copper.name=Gereinigtes Kupfererz +item.ore_cleaned.iron.name=Gereinigtes Eisenerz +item.ore_enriched.copper.name=Reiches Kupfererz +item.ore_enriched.iron.name=Reiches Eisenerz +item.ore_purified.copper.name=Pures Kupfererz +item.ore_purified.iron.name=Pures Eisenerz +item.ore_separated.copper.name=Separiertes Kupfererz +item.ore_separated.iron.name=Separiertes Eisenerz item.overfuse.name=Singularitätsschraubenzieher item.oxy_mask.name=Sauerstoffmaske item.paa_boots.name=PaA-"olle Latschen" @@ -3694,6 +3712,7 @@ tile.machine_drill.name=Automatischer Minenbohrer tile.machine_electric_furnace_off.name=Elektrischer Ofen tile.machine_electric_furnace_on.name=Elektrischer Ofen tile.machine_epress.name=Hydraulische Presse +tile.machine_excavator.name=Großer Minenbohrer tile.machine_fel.name=FEL tile.machine_fensu.name=FEnSU tile.machine_flare.name=Abfackelturm @@ -3810,6 +3829,7 @@ tile.ore_alexandrite.name=Alexandriterz tile.ore_aluminium.name=Aluminiumerz tile.ore_asbestos.name=Asbesterz tile.ore_australium.name=Australisches Erz +tile.ore_bedrock.name=Bedrock-Erz tile.ore_bedrock_coltan.name=Bedrock-Coltanerz tile.ore_bedrock_oil.name=Bedrock-Ölvorkommen tile.ore_beryllium.name=Berylliumerz diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 76c43990b..c5fdbb831 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1903,6 +1903,12 @@ item.door_bunker.name=Bunker Door item.door_metal.name=Metal Door item.door_office.name=Office Door item.dosimeter.name=Dosimeter +item.drillbit_desh.name=Desh Drillbit +item.drillbit_desh_diamond.name=Desh Drillbit (Diamond-Tipped) +item.drillbit_hss.name=High-Speed Steel Drillbit +item.drillbit_hss_diamond.name=High-Speed Steel Drillbit (Diamond-Tipped) +item.drillbit_steel.name=Steel Drillbit +item.drillbit_steel_diamond.name=Steel Drillbit (Diamond-Tipped) item.drill_titanium.name=Titanium Drill item.drax.name=Terra Drill item.drax_mk2.name=Hardened Terra Drill @@ -2762,6 +2768,18 @@ item.oil_tar.coal.name=Coal Tar item.oil_tar.crude.name=Oil Tar item.oil_tar.crack.name=Crack Oil Tar item.oil_tar.wood.name=Wood Tar +item.ore_bedrock.copper.name=Copper Bedrock Ore +item.ore_bedrock.iron.name=Iron Bedrock Ore +item.ore_centrifuged.copper.name=Centrifuged Copper Ore +item.ore_centrifuged.iron.name=Centrifuged Iron Ore +item.ore_cleaned.copper.name=Cleaned Copper Ore +item.ore_cleaned.iron.name=Cleaned Iron Ore +item.ore_enriched.copper.name=Enriched Copper Ore +item.ore_enriched.iron.name=Enriched Iron Ore +item.ore_purified.copper.name=Purified Copper Ore +item.ore_purified.iron.name=Purified Iron Ore +item.ore_separated.copper.name=Separated Copper Ore +item.ore_separated.iron.name=Separated Iron Ore item.overfuse.name=Singularity Screwdriver item.overfuse.desc=Say what? item.oxy_mask.name=Oxygen Mask @@ -4272,6 +4290,7 @@ tile.machine_drill.name=Automatic Mining Drill tile.machine_electric_furnace_off.name=Electric Furnace tile.machine_electric_furnace_on.name=Electric Furnace tile.machine_epress.name=Electric Press +tile.machine_excavator.name=Large Mining Drill tile.machine_fel.name=FEL tile.machine_fensu.name=FEnSU tile.machine_flare.name=Flare Stack @@ -4391,6 +4410,7 @@ tile.ore_alexandrite.name=Alexandrite Ore tile.ore_aluminium.name=Aluminium Ore tile.ore_asbestos.name=Asbestos Ore tile.ore_australium.name=Australian Ore +tile.ore_bedrock.name=Bedrock Ore tile.ore_bedrock_coltan.name=Bedrock Coltan Ore tile.ore_bedrock_oil.name=Bedrock Oil Deposit tile.ore_beryllium.name=Beryllium Ore diff --git a/src/main/resources/assets/hbm/textures/blocks/toaster.png b/src/main/resources/assets/hbm/textures/blocks/toaster.png new file mode 100644 index 0000000000000000000000000000000000000000..03835ffdfa49668271c12fa9a7754fcb45b3ee9d GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vff55JS=6t_NEyK)tW zqRFfdg{3LqejCk7usblRW!1e|DvCHmu8zb#PfV?LOC>#^QCe zA`VRHXL~S*IVSz%+jmYoN(GWtS_)3gR^C77xB-v-Y@vzi?20TwUfV^zj2!NNue`nO zzUiv0(&tJ^UK1zr$je>Yq_ZX0`+BLx^9|P~6{{^R*-{|q>-$7dQ#Isk#zXyzGx_&I fnIw*XTzW!$Qdr>~8OA`6rx`q5{an^LB{Ts5oDyR2m)yCvR>dOYI9?olbV$Q6kmor?QDBTgYt6Q8h{!&J<7iSMj}Q@@ nb9)Ql;E|ub`w5_~>syh3Wd(R+ErwjF00000NkvXXu0mjf{zi3$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/toaster_wood.png b/src/main/resources/assets/hbm/textures/blocks/toaster_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..fda413984fe6d7181e0535fe9f9dee48213eea2d GIT binary patch literal 399 zcmV;A0dW3_P)UEg^ul#lz@XTK`}8ry2PQp$4gsr_QHdEF1&N@Ib8Vn)k~(67GRdlxxYR|Yt7Tk zf{U{wLO{io z17k%>&n4<@z1Yc0L1)Mxze47MfZ%YS?<&)6FpFo5O+sEn|$;THD`loV=xoSP`*FlHfQFB4Uj( zxu6e#*4hR^K&@5-pxJD4xm<7@hrBd}*C7l;tCS*+V@9J9x7&^7a*6A@BuPT0QsMc0 zGMmi`xd0Kd-=AN#*=(rS>y%0*&gV0S!{HNPjIoQwg7J9FWHLc11;FF+pwsD)rYXnc z5#RS&tyWoz3?L%b^E`^hV)nVwXfT~l>GgV~X-XW&A1SgD!!XQ@!{LyAzt4WZ2VlG1 z(r&jI3b;eu-LZd%xdNN>MJC0cf>a0LU_oAlPUl*7^U1wY^195X3}d951FA zW~&YQd~Un&PIoWoe4M!h|F`ly_gR+tpFH8emh<`C11uH`M1;|3zeI$`v!R#R;!iI^Bm_KB0?O;01O5LcDo(M7_7Cd*Xus_=Na%E z01y#G1c32)jMn<|4T_@hlgWhR@%RF9&f%QH7{l#$W4T-c`0o}yKtwp5PJK`*MI6Wd z+_o)MRbj2=d_KQ7xL&VBQH0i-G)+m81Y-`UBN5jSfKZ6ArB0MBI z6k&loR9LvJ+O_H}*1ftry&s1EUB(!n=ehrB=IuLhKA(Gl$z(!VmN@5pnx?E)tCwF7 z3BY}3iO}E=6%Q67G|L|t6j9tCVO9zvy+bx?an0DT@OKV?*XFE%m?KpA_Bi`QWn6Ws~UJyot#@3_XuI z4(wVt_vHc=t)E(7Bo?O1I=E;}T*j;`GSTPSRgoQK*Y}*;>8@_hICt&2T`k3W+_J|f z%HRKU>hz{3@yi3ZFp%4m5F%*yk1^7q-bl{u@StRV{veNp5 z@MoUKz^@{uWFlhU>b6z0s-pM)UNPrvDWylnPc(y|wKj_9!2p&tW5977K~?Oqlu~Ya06>hyh#<8R^uN_@5{mc6Tq00000 LNkvXXu0mjfNRe;Y diff --git a/src/main/resources/assets/hbm/textures/items/ore_cluster_tikite.png b/src/main/resources/assets/hbm/textures/items/ore_cluster_tikite.png deleted file mode 100644 index 635bc7b321d9909a1d6a9355df37791a8891735f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmV;i0Z#sjP)`U-4Q8!HwG_l1tt~<-5F(-4 znhGw>31ZW=Kms8mAqUssEWsTv33aw>i>D#ZK~rgpp6Lwd`Fh_M{tB+^>QpMFfBP37 zMwU{dlp>6LE0P>r5<`{p`Mh>rR|ABRufxdKpP!F9jC^gpmV!Fdj?r z(NSESJOiMV!iWzP@H|gQDUni=PVe*4QC3(=3BZUDeQA3-g^{n zY;o!;IM{!n;C~?Gh73Z7oDHU%PCbX@E=_B365n(@-uKtN2Y*%rt+@{LZ)3Y#!Ae3L z5`8{f5^wKRtdH7;Kh`=(fR+#jRB_5A%LU%32}%-m!VMC~Jc1-wuQ+83u0J-@ejEZ6 z92E#?34xNJB&A-JWVy(Rl>}f%2ah)2v%$UHL(ZtF^d2=JUHJv|9|xjI1I8-nt0z}00000NkvXXu0mjf D#qX&@ diff --git a/src/main/resources/assets/hbm/textures/items/ore_enriched.png b/src/main/resources/assets/hbm/textures/items/ore_enriched.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fc01a52de09e7f0bafe06395b2caac37bab2b2 GIT binary patch literal 389 zcmV;00eb$4P)=a~|-&C(SY$W|{nkG2bowNg@guBnjnu10tez#Q1KczG6=n!!(sal3%CWj%JgrCx8aS{8I~d!%_DSPCtOprZ(V7Gs@9 z$C`5t*8BZ4UcyKYa*{lg{vg4N2k$X)41lu^6)Eg?%W757YPETq&zX#Nc^oW=7piiN zi6TsGN4D=4Q!{8CVV%P{j}r-095Ybru!>`YQ3}L?Qf$f%HKVz_y5hAcfa8H6(P5g( zb*DqC-KNoOf`_-NL@8J<3jkggi=c_q8naXoxasylK~+^;G#Wh4W{AMUbP{k*4t!R# j>v9LVpG%y!U^UeQS9^nuV5t*Vly$8ehx2l<~HIzu{Vv3WJK{q@4IqD^8e&y6(@d w-T(aKAC)hY3Im1C?PLf&dhO3S<(JJe8@9MA@w0WV0GiC;>FVdQ&MBb@0Lh0mX#fBK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/ore_purified.png b/src/main/resources/assets/hbm/textures/items/ore_purified.png new file mode 100644 index 0000000000000000000000000000000000000000..c93d537baf9e83489738ae6ebaa584349b6bb805 GIT binary patch literal 481 zcmV<70UrK|P)NyicAS_`maMc2?-RE}pxQo?0#~ z#6+#$;LGYN$z+mu6XU|`Q`y?ycKj9aVLB>eb8}o=6}h^+#JVmK8XjUO6b2A~LTrPs z>mnYH^KEwrRaNP8xdG^wWipvGuipeoBoa204gt8i~+qJIH2FZRHMw$N9XnBF^(?DE))nRBk$o|4!}z X;-r{>yc42@00000NkvXXu0mjfBdyM+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/ore_separated.png b/src/main/resources/assets/hbm/textures/items/ore_separated.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0954e1c5cebd11f55a1a66079853865f9860f3 GIT binary patch literal 453 zcmV;$0XqJPP)tYk3RVs;QKz3Bq4;LSS(^$7N%*k-|tzk*Q9C6?RI;8 zg5x-1GMNAn$1%gN4C!{eNRssC`~LfvCq_|(=Xn^0L6Rga77KQ} z9g3o$C<;LkplKSe>vFkV9veIWlJxtm)oO)d7~Jo7k|be1pW}HRx~_9RpULHN)M~ZY zPi!`uqEe|~+cwo|mF;%R>2%_FJU#|!n#OE4lU@QoA-b+J7z~J_2!K+l#B@3ZV6)kL v>G=luRJ~pos;Z(W3i*7V<#PFB_TTCQiN%hZo8+$700000NkvXXu0mjfvN+AT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/mining_drill.png b/src/main/resources/assets/hbm/textures/models/machines/mining_drill.png index 36223f0f047aa102375637e8cf6d116affce6092..b3ff80669da4e186540f4034bccfb9fc94efa3ba 100644 GIT binary patch literal 9112 zcmYM4cQ{;Kw1-ED5=18wJ!-TBVf2zAd>FmggwfmR!srP?NQgd2B#7QgbfSwgdhd)9 zz0WB3!`tFw1th)q~ z{HbQh4!-xct>4CDM@5+$8)bOL3xket^qLA^pYCHrZR_)I8n@H8&UY=Zx6g~{LO)N> z&Z@b@)mwE(3*lup%j6zVd&P$Jw2_zz6z#pU7_M%I8|OmUk%(f52BaF^~=K!ioGJeDWAmkCa|-=CnhGK#ud}eRo;O@Lq)nNjm?)W47YX8b+fq$0XmX@5;&d-7^#aE zb>YdA%7by-Q=Rj&rPX7&h0@tqaag@RfN;iah12+}mJST4s=h1o_+~=$tEzF8l67FA z_PFj3jF9rt7G-rb_k%>JvJD2&M~yK3Nvp8D*`o-1+z;dt)I5o_sm_81i~R`sIzL5G z93F!9g0!ZlCcPIUIJT#(aYC*e$Nn%TF6a7=Diu+sF5JKU2o*NYwwee#ZkpqY=~Vol zC3whBt%0flQAkoi!()}dn(Sh(nZG~+ah6c&7Hs{K zkknIiSzF&R8VQqSVvVB)Q9SGt7%UX{Q~30i@uK>CX0YVyQeY4GEA?bx!qYA|E-3xi z5BH#3>|%aNiNMUvOpYgdP#{`mwp6NO$_$U3XGg^40$K#JWE z$9Bn9fiut}4nvp(%H`=kFK{M~aS2k$Zc>C++?u8b$UMKvm)*eYrC;R!AqB%P=8jZL8)_9lq>%iU% zYyJEKu63pt^?xL8$)si@3v{_bPZYH8(^1O-Pv{M*#nEc}?w)RP#*5`DelW5k0#l2T zq#BysojvzJNfv$=Y%nB7I!cuH*EmfY>}j9xFS^KvM7EG zf+aqT(itz?5vTpgsg&3sr;or|2%6*z7C!9rVtQmyXGT}N(DN(CaP+&y`RSzP(Dm)* zcv;Z;`mMr$Hl_n0oqTT3hrJ~AP2#q^B;Oz|Dqn`x89{t*j}A_Y`uexuyxqi>iUb?` z#Z0_))3@QR8?<}4xty_hWxKaOIXT&MflwKv8m!DLZtUq<>!I0dD3)WACC$EOz0xp* z3|ERDIbSI0ORToPA*pCWWV-h9KtjV!(+7K}cYxV}QmSzel32!~6m zeV!gw2)gXIl)P3r4K03F_yFCrIy$J!z?Imm)1f|?t@Z?EGZYgss;@Xz)XFpS!4G@p zGBZ6bp}&~27#T9M@fircFRzty46E@U&j`hD>y(trnkgG1t+P&PMk-xCmZu@*KF7t{ z&zx1fi+jeGRcajn)FcD)uHAocPQrZE=u4b?SF;{pc)?tWps9|q9Rs z1RIB%2#L`D-*S1fr3>8B_K6h_)c4cxFlYFvSm@z~;_^(5(^hXUv5T|waBpw#kuL-y zdnK!J+%kDlKWo72IgCP~`kvGC^GXLqeg1X1k0HP{Kadr_x!^|~NgHKSFpF&r-GK;` zB#kHfgCr&7YN;d5_*>SaAQCF8TGxPK6;?Nqi zaNhi4XJ_Z6>!Dk9R1`4EDO9L}$!A6mz8)TmK!Y0J`U^RXwvn$1S^2sqOR%f6^Hi2> z3D^M+q^Z|B&dFy!Up}D^jWF7ouhEy(Ffe1S^A)~pt57iJLPYcvKUBNo(`n=w<#L|y z_!;(E_oc|wqc%bod_*|Yy~qjiOw!0-6YgO3jGN1g!__4C!Nht~z`2gCH}3J=4|w?A zLQ}(B$@Z*fZ34yJnw!I_wtDH~%fK{q2p0~nlP+DEL?)DPRgpzD&}c`-{HI6m3Bk{Q zC#<@6uHXFOfsdok&H=ma=E&*X=Wk2F9lbV+zI$`Tm<KEd^JjQJ=v+!DI17o?LJ@qC4x3{X z%^o6Qk>2$&-DDfBE6^a!xjyQ5fvLGEokCc0u6u`fPQOp?plpPVZ9A9UMsn6=oxPrh zmRwfB;78Uy)GFpV#D&w-(_eNb%L1?>qK(q3-+l|j3<~V?*lgM81yGe9Ip{^5^RqK# zgK?AzvT?EG@nCr|l0H0@A4+|Uj_Gs&CY|+F?>0xh%byh$l%G0{`@4-#HB&fLO}Kj- zdgMHTe6pxKFAh!!Ha|nM*ww}t+f!-hYHiX@zE|1(DkeOnveup{+!-{3K zyH??Rn$q4ZHksV%Ih%b{){oztGi5W5bTob5x~yVL|GhFMVl7X*sL4p|;`u>)nS&iO zJrtyDYHI2QB*bgX2`>{9lRz*t6BEi_G-0nwMcVrddpapoM!452zI#t;oCjI>p`f|; zAMWYxpZvBdGz<$eOlj%Rp3Vb614Vl0hSb7c?vFu-V*=^FmdjB-tm;Ls~e>Ya;iL`jJ!`Rh9;-u?pbLV8ug7OLB|JQt&VswsTKRL z@Me_sbQ~3{wW~%PbLdw*3l=m&=25fS@TyfNyx=Dk1&KcqMAnP%(X@3WMmcgT5)I@V zLweAvVhW?j^j|xpt@}gz?dhQwjW&0F`@FitGsG-pKt7UYH2%Wg=)4(T7euAiXqYx~;03+Bm z-EDlg#0G%>kV=&UQXWGYqf3JdtlTth+V8cg477=_T|qdquRnd|dE>lWI4%qa;YXbl zQ-py3?JXF(M5hvBMPEe6T^?Snc@K^(5|s%q2Ub-iMo19&9zWFkgE7%2KAl}e4`!`$ zy<+s_s%=HDd!4CJFrIA9`u9rlKWVuMIwXjGYEQyjA7AW@q?(s4-|dOTHo5p)s0Z@=p%&Fr*GKE>&`%#Q(ydAItQ2QrBd zYsS*$lhCn9WxmhfA~Y6hgUJ~;2rDGfJ~ltdDH%CmMpdl`_yJ*}JHNu)cXJaI(}SGqnhK^# z3;%0_x%qRz95`N=4B5>ft1ensHz=r76}MC&W_&m%KH_+Ger~Exb7b-L7IXdLB^-B2 z1c(d&ouh@O0NyG|b51_J+q3=KpI&L|`J?N{`xe&||48YhY#M=JE;(QDmx8VM`<*z$ z)U%~8ytWFrd>Z=E)9+QiyR^7KSS(gRe@Ec#h7I{K1n56S_ZEHQx{6-YTAvWf4uyuY zfppd6_Xp(Erl^W26Ls$tIn=FZj#1&Ap{>)`V>_qz!fC_KVqa@&YLYVQ?SGavOX@oh zWDCS3vOLcc(j9A=7BxnFQpmR#zJQq;I}03#{na61$Kdf+f8<`msdnWH+CUlV3_ria zPYm&~@zrs+nt5cHV4P$}9Ct>;KxC<|ul10 zHNi&zZ|#edc(GH|pTY5p(Q3ykQjFy;9-SRW2V>-SJY@HlY@_CAg#An(s6*^NWl7Le z&{>GPGXCJI9v&Lr6;p7mppRmjOf^q{++JQk2ZvIzEt;86Q_vQ5@;Vu(Rd+aZXL3tk z-*~;lUF4=FJh7Y$rfJ_&d)LG-+3g~H4@Db_B5SFB2OhMA542ZhddW($G+7M!HJhAR zl17Za^opNd^G{&Al#5B$vzCoNelNaY4_g&G4$3E?=a*)lMTggmu~bkux&v}=_WAcW zz3>c4O<@`q`*CciKXRkOWf@i>U{*Tt;t#$MvN_9gYv)I3kXbo6+CV^k)Zfv?)X&(N zB*p2NQmQSxo8k3h?a->t`k(qQ!(&&MK(NMHcfRA1H2Bk(#P`p&Y~Y0!_7W+4>K*yZ z25lV>U}|?RpRgnVJwS4;P&}XKfY=Dd9q$JnKioE+nU_pc-`sB~8x?;ogz{aujsFz2 z*>oFZk&H0U-s{tx5TZn-BnoW?-(0$7s=l(?3DnA=x5Q82Aoihe(7aDQ_&7V{-4F;d z`3u7MO5OO4b6499T=A}T5Er?IM{{$2x?$(6Z#d62426OFrRgH8n|_N#|e3^6HDo9ii-wKDkfZzHOl zU+_>9PMd#a-+i^4p%V1MNgsi_QJhxgiz&Udj%fVtl2I=;=Hf=whu6ME(Dmmg=lv7d zI_%)KV-xGO2+0pWiRsg$+{!3h4e-~_tfz_QaLet&yy>9Hghm2#aNRC;yn-o62R~wz ztlWy3NXgjM&&&9k|4qH~;xr(A(SY=|SiD-~cT1y}g+7Bo5~GlG8tg>*e1L>K09}B` zKNt`2QfbmdIomc^#ak_L#+20 z&H+x28&>a(TJ2_V5^F>vF|$xuCiKN-o0SV&mPa{waN1ef$;l}{FsnJ` z*AN4Nx+wbCe=EFfhuwdf=W!0}2q8vpKJvW1Hzu!7yc3#_cUT;~3s&oZr?(^z!I70u zQ}e8!>i68uzo*T!LvoEiU-#Z%HP7j_Lh%2KCQeak;&u)Lmi%3zirTX5Cc>wv-*?-? z3CUw)kGbV8qfzHWn3mV4g~AxK`iV3uU%GacpR$`ltPt&hS;!)UBVCtr z-P5Tw2s(60JK$k?S~8lW=Vzou`49cjtNc_0&ZIV($g(S^3+YaG6n8fT5j4v{jU}}|E%)|E5v4O1}xmq&!h*2XGA`%&671=ZR^zTlupa$PA{yxuo)pl zU!qGt*=`wlLU_fecNW;LK6 z;VJEDk#WaIW)hy7Z>4R9)#dO+5dJ`~H==k}s}a%iz* z!x?13g*n%?p1>X4qj~FJLl4u-qWGv z|9d@E5{p$Ppc>G#<|rx`mBkzNE;d{2;KX5*bQ#o~qT3jHW}+?)!z?LvpP#kLGy<~U zE!+5(;}*ai`@ubD%YAh%bqlZgIN4vH{V{gEoUXEqj@tYhFWVj|papm*3~6pn9{=kg z;XW1X6C6{1I=&l~c|zj`_Vk8^hW150*!DI6aE5J!C1_WB_zNleLLVMvV=Dkng`n26s)cHPG75qzFheQ;m$yhcOOai7q*fXW-EQ<9IbTP{L%bR zz|y@1V`MCQzbBlGcuxm2VizS(WB=c6wK2W`LW<&U>nFI8=SP2QTo2ZRK1w2P z6h9*)gHNpn)B|8SDjE9bpccyjf8nxSd(p5|+@03$f|N;%02i1)9f%=}3fcvroxQKK zyN+AjHfE=)+x)&Rz5-hL+n!{W?BCf{0O?jAcv-1~9g@YWkE*m2z>$t8*y~TQasd8* zLfph#Vjp+r)h6CJGYUf7ewXE;)Lu5%JJ9pHsH zccyHPlM)T1h2~&>Dt&yad=KD!_5BK|HoilcR}L7-y$?htU>p!DL8(PkdISCQF2$yx zYsvYhfXO~56uh3Q`|dJ+-;cFKQEg^n!%{QVOEfu)tk+7H9)7m45Fo3fGY@K4Br|F` z+!mWPq@<)KEU*!Eyyqc^qZM%4kf&G%YGx+=e4Q;ZrA{AaSnqJu)kPww6&^hW5TugE zGh$$(Yww(^tnbH(ik_`=Gezv;Q9wcL-+otqlJWXU+{dq$Qeu-`4s*c#Fe72HQ%yDq|dj`GxQppFE*#dOu(5KoDw=AGZ0%+uB*&i zU$_`UU9V}F@BV_zRgETaDTfd=>HJVXDP^3540Ud9cLQ>#G|CzWS~vq94ZXG0OFBO7 zOMVjh>kD;1LTTz{>j#Tsle9K8Ay#I+4`d4)qWz=| zUN34`n}efIjH2dUQ}RZ)j_mlaqZ7zzwPnhL#hwJW5@t#J>of=m6GX2@xKmM@HwPLQ zASUt|OoQ23?`gju-Vkyl9)s-&4E^KdpgPSJ-o}bJS|iSs3%00r=$mQn=8Y3+SJk`C z@IyhTrZCh>6Wo#D4t>RRxgg>(LduoS<^oO_i{^`hO6h)lI@v+TuzN3XKp|6BIsSfr zso15R1J*cQMk2ci;9+FHE$l)0PDJHHLZ+aI@o5~$F4N;bsg(w z$F{tpHap`EE(4(uNKEIe_47ZMfwFQn60v2Yu5}I-M#HZvjJC1``UlaTCj4}w%<-nM zAPqy`DY~R+jD3v9k9y`h2amY}_&dDi*eIDPzhh^EQaYzO>J$hhc3N9{P<+_ zB_5l#lej>@F7*LiSw#gNCDwZN=DntrbIjDjg5aD?LsOIa%-?}v1t`Sojto}eYn^BC5dM&t#D{#ItV+Q`ckHBQq&gk{I!x5T zR`}BK#tL4qAyzv2iCnMS+eTpEMLcsRhA9vUWGha&ioThrzS*;toK@v3@DQVgodGv+)1AeCClXQHHIaRmg> zampG01PyD?8`;|{Pf1x>F7}*(0gZY946iicuxTa#W=h3tXJCtZuJ^0!>M6jn*^nVU zn#-hYP`Y+vP&vUds`+vwL#Mgk(83?Ke%j3vT-aXDE9VErzfk{)zvu! z1Y`_m%eAb8i^50LEwaU~vH+H$z?lC)Y{Sjd(-T%8CVF#{FE`DMJ4{3k4x*;065Yv? zO`HruATkNU6=tga6v2;xtaqHsYKfs2BKRqd-N@k|mZ^`M zh-Nuyk^wb;1>C5hC!%2kTLL+)T$i$$eZ#!#ReGx|fcrobTJxye`JzRgdRZy*n$q>@Ew4|d zLTYjGL$yOy-hO^6k&%%no2W-$2)q^b%}nw*!`zkeRw%|>uhPD{8kqq6dc1%iHs*q+ znw_0BC=2%UEsQtFO8i z&0Op`HY9>?8pn5H1cz)XDK!n15{ZBeiXt-2VAFuvt(p^wY57~~TidNmZa{sLC4q{Y z`tJFO%$(v0R|FU;SHYy9g~t5f6ann0EhZiA5CEZ(2ZRRwo5EZ@Kz=g)+1vYPoaKEZ zZA2Idg!laKy8z1n?CNVbH9M_N-T?wty_0RmLQqFZZDGA)$N%i%WWcd z#)>FR0hcJCJsc-kQYXbNyU&kuB)xmj1RhIH*9U@HhIYO2Q22SF?#dCRM(xtU=C%9I zfF3yB9?R`pOygF}X{S*P(7##U4;t?AmT&x9;MBA3q;L+kljJrH{YHC!d98u2zGEBe z9yT-f-uk4VF*;UmI(P7KOo?N`Sl!uUn>%JTO{Z?t5H?2Lf@YN{p+O$pzk{&kIr zkL3@2lZa@NunQJ+`>g zzS+*>oXyAzWNCo{(|{3Ve5Jt2VXMA5PCDmt`XQ?V%O-o-wbq+O2MO#ASy{r_^xqZ~y;yh5b{gCn9F^t?~2gpq6Tj zkMaGJXBuu8V$R8;{lDG!Z_sqXa(Jg;Lt=x6AYh`Z1?8`l^Ns!@b%R1dhcQX@Y&C8P zc^*wS%jCiKYm%}@3A;ET(3PF9ukX)q-S}@K=`*E^de6^T1zC}w#S(jMIGw}WgcdOt z_d0l~vWquqjMV|rbr_Os@);E^~6#@ z0EH|CR4bzq4Ba?J4%k-L)@~pqK0IppnCDpMXuqq#_}5iI4B#i;(<7g3Tf|$~$|`Ud zIj|rO5q9PkaeMSW>f&O7x#NxQGEe>L#;ct&(!`*K|3tcVVx!2D{_XV7&gTwdV~;w{ zG(ux#&)|yShIv86*|go}&=al{rXtK)lUa3~M!GClOj`tGt+7)Yb@=l-P*$j@Kgs$(|^%RB=kHI~}!8v=>zUul_g;sqnDLA)->4v4rjg0Fq=xN;F_e)fjppa5U HtFZq8c=PUr literal 4662 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