From 9cf673206a5d55d21c42e9988f3fabc250d10561 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 17 Mar 2024 17:31:50 +0100 Subject: [PATCH] flash! bam! alakazam! --- changelog | 6 + src/main/java/com/hbm/blocks/ModBlocks.java | 4 +- .../com/hbm/blocks/generic/BlockLayering.java | 2 + .../com/hbm/blocks/machine/MachineDrain.java | 86 ++++++++ .../com/hbm/blocks/network/BlockRFCable.java | 81 -------- .../hbm/entity/projectile/EntityOilSpill.java | 75 +++---- .../java/com/hbm/inventory/fluid/Fluids.java | 20 +- src/main/java/com/hbm/main/ClientProxy.java | 16 +- .../java/com/hbm/main/CraftingManager.java | 2 + .../com/hbm/main/ModEventHandlerClient.java | 2 + .../java/com/hbm/main/ResourceManager.java | 6 + .../java/com/hbm/particle/ParticleSplash.java | 68 +++++++ .../hbm/render/tileentity/RenderDrain.java | 58 ++++++ .../hbm/render/tileentity/RenderRFCable.java | 159 --------------- .../java/com/hbm/tileentity/TileMappings.java | 2 +- .../bomb/TileEntityLaunchPadRusted.java | 2 + .../conductor/TileEntityRFDuct.java | 144 ------------- .../machine/TileEntityMachineDrain.java | 155 ++++++++++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../assets/hbm/models/machines/drain.obj | 190 ++++++++++++++++++ .../blocks/particle/particle_splash.png | Bin 0 -> 151 bytes .../hbm/textures/models/machines/drain.png | Bin 0 -> 1452 bytes 23 files changed, 651 insertions(+), 429 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineDrain.java delete mode 100644 src/main/java/com/hbm/blocks/network/BlockRFCable.java create mode 100644 src/main/java/com/hbm/particle/ParticleSplash.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderDrain.java delete mode 100644 src/main/java/com/hbm/render/tileentity/RenderRFCable.java delete mode 100644 src/main/java/com/hbm/tileentity/conductor/TileEntityRFDuct.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java create mode 100644 src/main/resources/assets/hbm/models/machines/drain.obj create mode 100644 src/main/resources/assets/hbm/textures/blocks/particle/particle_splash.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/drain.png diff --git a/changelog b/changelog index 139f571f9..70889c8e7 100644 --- a/changelog +++ b/changelog @@ -2,6 +2,10 @@ * More axes * Bismuth, volcanic, chlorophyte and mese tool materials now have axes * Axes also double as offensive weapons, being a lot more powerful than their pickaxe counterparts +* Drainage pipe + * Spills fluid, allowing to void up to 1.000mB per tick + * Might slightly alter the landscape, depending on whether the fluid was poisonous + * Viscous, flammable liquids cause oil spill blocks to appear ## Changed * After three quarters of a decade, three separate models, countless rebalances and hours of senseless yapping, the industrial generator has finally met its end. Suddenly, yet not unsurprisingly, on this here day the industrial generator has closed its eyes for the final time. It was a long and eventful journey, but as with all things in life, it too had to come to an end. @@ -29,3 +33,5 @@ * Fixed the "Hold shift for more info" line appearing on fluid info when shift is held, and disappearing otherwise * Fixed smokestacks being able to void any fluid under certain conditions * Fixed the hydrotreater only using half as much crude oil per operation as it should +* Fixed the old launchpad printing the wrong message when successfully launched via detonator +* Oil spills should no longer save, fixing an issue where chunkloaded derricks would constantly spill oil entities into unloaded chunks, causing them to get stuck diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 102d1b007..2df3a276c 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -806,6 +806,7 @@ public class ModBlocks { public static Block fluid_duct_exhaust; public static Block fluid_valve; public static Block fluid_switch; + public static Block machine_drain; public static Block radio_torch_sender; public static Block radio_torch_receiver; public static Block radio_torch_counter; @@ -952,7 +953,6 @@ public class ModBlocks { public static Block dfc_core; public static Block machine_converter_he_rf; - public static final int guiID_converter_he_rf = 28; public static Block machine_converter_rf_he; public static Block machine_schrabidium_transmutator; @@ -1972,6 +1972,7 @@ public class ModBlocks { fluid_duct_gauge = new FluidDuctGauge().setBlockName("fluid_duct_gauge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_valve = new FluidValve(Material.iron).setBlockName("fluid_valve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_switch = new FluidSwitch(Material.iron).setBlockName("fluid_switch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + machine_drain = new MachineDrain(Material.iron).setBlockName("machine_drain").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); radio_torch_sender = new RadioTorchSender().setBlockName("radio_torch_sender").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); radio_torch_receiver = new RadioTorchReceiver().setBlockName("radio_torch_receiver").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); radio_torch_counter = new RadioTorchCounter().setBlockName("radio_torch_counter").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtty_counter"); @@ -3262,6 +3263,7 @@ public class ModBlocks { GameRegistry.registerBlock(fluid_duct_solid, fluid_duct_solid.getUnlocalizedName()); register(fluid_valve); register(fluid_switch); + register(machine_drain); register(radio_torch_sender); register(radio_torch_receiver); register(radio_torch_counter); diff --git a/src/main/java/com/hbm/blocks/generic/BlockLayering.java b/src/main/java/com/hbm/blocks/generic/BlockLayering.java index d4f516436..4a131cdc6 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockLayering.java +++ b/src/main/java/com/hbm/blocks/generic/BlockLayering.java @@ -101,6 +101,8 @@ public class BlockLayering extends Block { public boolean isReplaceable(IBlockAccess world, int x, int y, int z) { if(this == ModBlocks.leaves_layer) return true; + if(this == ModBlocks.oil_spill) return true; + if(this == ModBlocks.foam_layer) return true; int meta = world.getBlockMetadata(x, y, z); return meta >= 7 ? false : blockMaterial.isReplaceable(); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineDrain.java b/src/main/java/com/hbm/blocks/machine/MachineDrain.java new file mode 100644 index 000000000..46aaf943e --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineDrain.java @@ -0,0 +1,86 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.machine.TileEntityMachineDrain; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class MachineDrain extends BlockDummyable implements ILookOverlay { + + public MachineDrain(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineDrain(); + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {0, 0, 2, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(!world.isRemote && !player.isSneaking()) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return false; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(te instanceof TileEntityMachineDrain)) return false; + + TileEntityMachineDrain drain = (TileEntityMachineDrain) te; + + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, pos[0], pos[1], pos[2], player.getHeldItem()); + drain.tank.setTankType(type); + drain.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation(type.getConditionalName())).appendSibling(new ChatComponentText("!"))); + + return true; + } + return false; + + } else { + return true; + } + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(te instanceof TileEntityMachineDrain)) return; + + TileEntityMachineDrain drain = (TileEntityMachineDrain) te; + List text = new ArrayList(); + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + drain.tank.getTankType().getLocalizedName() + ": " + drain.tank.getFill() + "/" + drain.tank.getMaxFill() + "mB"); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockRFCable.java b/src/main/java/com/hbm/blocks/network/BlockRFCable.java deleted file mode 100644 index d087a33c4..000000000 --- a/src/main/java/com/hbm/blocks/network/BlockRFCable.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.hbm.blocks.network; - -import com.hbm.tileentity.conductor.TileEntityRFDuct; - -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class BlockRFCable extends BlockContainer { - - public BlockRFCable(Material p_i45386_1_) { - super(p_i45386_1_); - float p = 1F/16F; - this.setBlockBounds(11 * p / 2, 11 * p / 2, 11 * p / 2, 1 - 11 * p / 2, 1 - 11 * p / 2, 1 - 11 * p / 2); - this.useNeighborBrightness = true; - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - if(world.getTileEntity(x, y, z) instanceof TileEntityRFDuct) { - TileEntityRFDuct cable = (TileEntityRFDuct)world.getTileEntity(x, y, z); - - if(cable != null) - { - float p = 1F/16F; - float minX = 11 * p / 2 - (cable.connections[5] != null ? (11 * p / 2) : 0); - float minY = 11 * p / 2 - (cable.connections[1] != null ? (11 * p / 2) : 0); - float minZ = 11 * p / 2 - (cable.connections[2] != null ? (11 * p / 2) : 0); - float maxX = 1 - 11 * p / 2 + (cable.connections[3] != null ? (11 * p / 2) : 0); - float maxY = 1 - 11 * p / 2 + (cable.connections[0] != null ? (11 * p / 2) : 0); - float maxZ = 1 - 11 * p / 2 + (cable.connections[4] != null ? (11 * p / 2) : 0); - - this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); - } - } - return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - if(world.getTileEntity(x, y, z) instanceof TileEntityRFDuct) { - TileEntityRFDuct cable = (TileEntityRFDuct)world.getTileEntity(x, y, z); - - if(cable != null) - { - float p = 1F/16F; - float minX = 11 * p / 2 - (cable.connections[5] != null ? (11 * p / 2) : 0); - float minY = 11 * p / 2 - (cable.connections[1] != null ? (11 * p / 2) : 0); - float minZ = 11 * p / 2 - (cable.connections[2] != null ? (11 * p / 2) : 0); - float maxX = 1 - 11 * p / 2 + (cable.connections[3] != null ? (11 * p / 2) : 0); - float maxY = 1 - 11 * p / 2 + (cable.connections[0] != null ? (11 * p / 2) : 0); - float maxZ = 1 - 11 * p / 2 + (cable.connections[4] != null ? (11 * p / 2) : 0); - - this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); - } - } - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityRFDuct(10000); - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } -} diff --git a/src/main/java/com/hbm/entity/projectile/EntityOilSpill.java b/src/main/java/com/hbm/entity/projectile/EntityOilSpill.java index 5e3a1c55c..aba68c0a9 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityOilSpill.java +++ b/src/main/java/com/hbm/entity/projectile/EntityOilSpill.java @@ -3,47 +3,54 @@ package com.hbm.entity.projectile; import com.hbm.entity.particle.EntityOilSpillFX; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityOilSpill extends EntityThrowable { - public EntityOilSpill(World p_i1773_1_) - { - super(p_i1773_1_); - } + public EntityOilSpill(World p_i1773_1_) { + super(p_i1773_1_); + } - public EntityOilSpill(World p_i1774_1_, EntityLivingBase p_i1774_2_) - { - super(p_i1774_1_, p_i1774_2_); - } + public EntityOilSpill(World p_i1774_1_, EntityLivingBase p_i1774_2_) { + super(p_i1774_1_, p_i1774_2_); + } - @Override - public void entityInit() { - } + @Override + public void entityInit() { } - public EntityOilSpill(World p_i1775_1_, double p_i1775_2_, double p_i1775_4_, double p_i1775_6_) - { - super(p_i1775_1_, p_i1775_2_, p_i1775_4_, p_i1775_6_); - } - - @Override - public void onUpdate() { - super.onUpdate(); - if(!worldObj.isRemote) { - worldObj.spawnEntityInWorld(new EntityOilSpillFX(worldObj, this.posX, this.posY, this.posZ, 0.0, 0.0, 0.0)); - if(this.isBurning()) { - this.setDead(); - worldObj.createExplosion(null, posX, posY, posZ, 1.5F, true); - } - } - } + public EntityOilSpill(World p_i1775_1_, double p_i1775_2_, double p_i1775_4_, double p_i1775_6_) { + super(p_i1775_1_, p_i1775_2_, p_i1775_4_, p_i1775_6_); + } - @Override - protected void onImpact(MovingObjectPosition p_70184_1_) - { - if(this.ticksExisted > 5) { - this.setDead(); - } - } + @Override + public void onUpdate() { + super.onUpdate(); + if(!worldObj.isRemote) { + worldObj.spawnEntityInWorld(new EntityOilSpillFX(worldObj, this.posX, this.posY, this.posZ, 0.0, 0.0, 0.0)); + if(this.isBurning()) { + this.setDead(); + worldObj.createExplosion(null, posX, posY, posZ, 1.5F, true); + } + } + } + + @Override + protected void onImpact(MovingObjectPosition p_70184_1_) { + if(this.ticksExisted > 5) { + this.setDead(); + } + } + + @Override + public boolean writeToNBTOptional(NBTTagCompound nbt) { + return false; + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setDead(); + } } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index cec12e07f..027833121 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -202,7 +202,11 @@ public class Fluids { /* Original baseline for leaded fuels */ public static final float LEAD_FUEL = PollutionHandler.HEAVY_METAL_PER_SECOND * 0.025F; /* Poison stat for most petrochemicals */ - public static final float POISON_OIL = PollutionHandler.POISON_PER_SECOND * 0.025F; + public static final float POISON_OIL = PollutionHandler.POISON_PER_SECOND * 0.0025F; + /* Poison stat for horrible chemicals like red mud or phosgene */ + public static final float POISON_EXTREME = PollutionHandler.POISON_PER_SECOND * 0.025F; + /* Poison stat for mostly inert things like carbon dioxide */ + public static final float POISON_MINOR = PollutionHandler.POISON_PER_SECOND * 0.001F; public static final FT_Polluting P_OIL = new FT_Polluting().burn(PollutionType.SOOT, SOOT_UNREFINED_OIL).release(PollutionType.POISON, POISON_OIL); public static final FT_Polluting P_FUEL = new FT_Polluting().burn(PollutionType.SOOT, SOOT_REFINED_OIL).release(PollutionType.POISON, POISON_OIL); @@ -261,7 +265,7 @@ public class Fluids { AMAT = new FluidType("AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); ASCHRAB = new FluidType("ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); ACID = new FluidType("ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(new FT_Corrosive(40), LIQUID); - WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), new FT_VentRadiation(0.1F), LIQUID, VISCOUS); + WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), new FT_VentRadiation(0.1F), LIQUID, VISCOUS, new FT_Polluting().release(PollutionType.POISON, POISON_EXTREME)); CRYOGEL = new FluidType("CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170).addTraits(LIQUID, VISCOUS); HYDROGEN = new FluidType("HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).setTemp(-260).addContainers(new CD_Gastank(0x4286f4, 0xffffff)).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), LIQUID, EVAP); OXYGEN = new FluidType("OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC).setTemp(-100).addContainers(new CD_Gastank(0x98bdf9, 0xffffff)).addTraits(LIQUID, EVAP); @@ -280,7 +284,7 @@ public class Fluids { PLASMA_HT = new FluidType("PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(NOCON, NOID, PLASMA); PLASMA_XM = new FluidType("PLASMA_XM", 0xC6A5FF, 0, 4, 1, EnumSymbol.RADIATION).setTemp(4250).addTraits(NOCON, NOID, PLASMA); PLASMA_BF = new FluidType("PLASMA_BF", 0xA7F1A3, 4, 5, 4, EnumSymbol.ANTIMATTER).setTemp(8500).addTraits(NOCON, NOID, PLASMA); - CARBONDIOXIDE = new FluidType("CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + CARBONDIOXIDE = new FluidType("CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS, new FT_Polluting().release(PollutionType.POISON, POISON_MINOR)); PLASMA_DH3 = new FluidType("PLASMA_DH3", 0xFF83AA, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3480).addTraits(NOCON, NOID, PLASMA); HELIUM3 = new FluidType("HELIUM3", 0xFCF0C4, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); DEATH = new FluidType("DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(80), new FT_Poison(true, 4), LEADCON, LIQUID, VISCOUS); @@ -307,7 +311,7 @@ public class Fluids { WOODOIL = new FluidType("WOODOIL", 0x847D54, 2, 2, 0, EnumSymbol.NONE).addContainers(new CD_Canister(0xBF7E4F)).addTraits(LIQUID, VISCOUS, P_OIL); COALCREOSOTE = new FluidType("COALCREOSOTE", 0x51694F, 3, 2, 0, EnumSymbol.NONE).addContainers(new CD_Canister(0x285A3F)).addTraits(LIQUID, VISCOUS, P_OIL); SEEDSLURRY = new FluidType("SEEDSLURRY", 0x7CC35E, 0, 0, 0, EnumSymbol.NONE).addContainers(new CD_Canister(0x7CC35E)).addTraits(LIQUID, VISCOUS); - NITRIC_ACID = new FluidType("NITRIC_ACID", 0xBB7A1E, 3, 0, 2, EnumSymbol.OXIDIZER).addTraits(LIQUID, new FT_Corrosive(60)); + NITRIC_ACID = new FluidType("NITRIC_ACID", 0xBB7A1E, 3, 0, 2, EnumSymbol.OXIDIZER).addTraits(LIQUID, new FT_Corrosive(60), new FT_Polluting().release(PollutionType.POISON, POISON_EXTREME)); SOLVENT = new FluidType("SOLVENT", 0xE4E3EF, 2, 3, 0, EnumSymbol.NONE).addContainers(new CD_Canister(0xE4E3EF)).addTraits(LIQUID, new FT_Corrosive(30)); BLOOD = new FluidType("BLOOD", 0xB22424, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, DELICIOUS); BLOOD_HOT = new FluidType("BLOOD_HOT", 0xF22419, 3, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS).setTemp(666); //it's funny because it's the satan number @@ -326,8 +330,8 @@ public class Fluids { KEROSENE_REFORM = new FluidType("KEROSENE_REFORM", 0xFFA5F3, 1, 2, 0, EnumSymbol.NONE).addTraits(LIQUID, P_FUEL).addContainers(new CD_Canister(0xFF377D)); REFORMGAS = new FluidType("REFORMGAS", 0x6362AE, 1, 4, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0x9392FF, 0xFFB992)).addTraits(GASEOUS, P_GAS); COLLOID = new FluidType("COLLOID", 0x787878, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS); - PHOSGENE = new FluidType("PHOSGENE", 0xCFC4A4, 4, 0, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0xCFC4A4, 0x361414)).addTraits(GASEOUS); - MUSTARDGAS = new FluidType("MUSTARDGAS", 0xBAB572, 4, 1, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0xBAB572, 0x361414)).addTraits(GASEOUS); + PHOSGENE = new FluidType("PHOSGENE", 0xCFC4A4, 4, 0, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0xCFC4A4, 0x361414)).addTraits(GASEOUS, new FT_Polluting().release(PollutionType.POISON, POISON_EXTREME)); + MUSTARDGAS = new FluidType("MUSTARDGAS", 0xBAB572, 4, 1, 1, EnumSymbol.NONE).addContainers(new CD_Gastank(0xBAB572, 0x361414)).addTraits(GASEOUS, new FT_Polluting().release(PollutionType.POISON, POISON_EXTREME)); IONGEL = new FluidType("IONGEL", 0xB8FFFF, 1, 0, 4, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS); OIL_COKER = new FluidType("OIL_COKER", 0x001802, 2, 1, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, P_OIL); NAPHTHA_COKER = new FluidType("NAPHTHA_COKER", 0x495944, 2, 1, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, P_OIL); @@ -338,7 +342,7 @@ public class Fluids { FISHOIL = new FluidType("FISHOIL", 0x4B4A45, 0, 1, 0, EnumSymbol.NONE).addTraits(LIQUID, P_FUEL); SUNFLOWEROIL = new FluidType("SUNFLOWEROIL", 0xCBAD45, 0, 1, 0, EnumSymbol.NONE).addTraits(LIQUID, P_FUEL); NITROGLYCERIN = new FluidType("NITROGLYCERIN", 0x92ACA6, 0, 4, 0, EnumSymbol.NONE).addTraits(LIQUID); - REDMUD = new FluidType("REDMUD", 0xD85638, 3, 0, 4, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, LEADCON, new FT_Corrosive(60), new FT_Flammable(1_000)); + REDMUD = new FluidType("REDMUD", 0xD85638, 3, 0, 4, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, LEADCON, new FT_Corrosive(60), new FT_Flammable(1_000), new FT_Polluting().release(PollutionType.POISON, POISON_EXTREME)); CHLOROCALCITE_SOLUTION = new FluidType("CHLOROCALCITE_SOLUTION", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, NOCON, new FT_Corrosive(60)); CHLOROCALCITE_MIX = new FluidType("CHLOROCALCITE_MIX", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, NOCON, new FT_Corrosive(60)); CHLOROCALCITE_CLEANED = new FluidType("CHLOROCALCITE_CLEANED", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, NOCON, new FT_Corrosive(60)); @@ -355,7 +359,7 @@ public class Fluids { THORIUM_SALT = new FluidType("THORIUM_SALT", 0x7A5542, 2, 0, 3, EnumSymbol.NONE).setTemp(800).addTraits(LIQUID, VISCOUS, new FT_Corrosive(65)); THORIUM_SALT_HOT = new FluidType("THORIUM_SALT_HOT", 0x3E3627, 2, 0, 3, EnumSymbol.NONE).setTemp(1600).addTraits(LIQUID, VISCOUS, new FT_Corrosive(65)); THORIUM_SALT_DEPLETED = new FluidType("THORIUM_SALT_DEPLETED", 0x302D1C, 2, 0, 3, EnumSymbol.NONE).setTemp(800).addTraits(LIQUID, VISCOUS, new FT_Corrosive(65)); - FULLERENE = new FluidType("FULLERENE", 0xFF7FED, 3, 3, 3, EnumSymbol.NONE).addTraits(LIQUID, new FT_Corrosive(65)); + FULLERENE = new FluidType("FULLERENE", 0xFF7FED, 3, 3, 3, EnumSymbol.NONE).addTraits(LIQUID, new FT_Corrosive(65), new FT_Polluting().release(PollutionType.POISON, POISON_MINOR)); PHEROMONE = new FluidType("PHEROMONE", 0x5FA6E8, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, new FT_Pheromone(1)); PHEROMONE_M = new FluidType("PHEROMONE_M", 0x48C9B0 , 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, new FT_Pheromone(2)); OIL_DS = new FluidType("OIL_DS", 0x121212, 2, 1, 0, EnumSymbol.NONE).addContainers(new CD_Canister(0x424242)).addTraits(LIQUID, VISCOUS, P_OIL); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 7e026da72..6c18ce192 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -274,6 +274,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineLiquefactor.class, new RenderLiquefactor()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineSolidifier.class, new RenderSolidifier()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCompressor.class, new RenderCompressor()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineDrain.class, new RenderDrain()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadiolysis.class, new RenderRadiolysis()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityElectrolyser.class, new RenderElectrolyser()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceIron.class, new RenderFurnaceIron()); @@ -337,7 +338,6 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySoyuzCapsule.class, new RenderCapsule()); //network ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFluidDuct.class, new RenderFluidDuct()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRFDuct.class, new RenderRFCable()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPylon.class, new RenderPylon()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityConnector.class, new RenderConnector()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPylonLarge.class, new RenderPylonLarge()); @@ -1764,6 +1764,20 @@ public class ClientProxy extends ServerProxy { } } + if("splash".equals(type)) { + if(particleSetting == 0 || (particleSetting == 1 && rand.nextBoolean())) { + ParticleSplash fx = new ParticleSplash(man, world, x, y, z); + + if(data.hasKey("color")) { + Color color = new Color(data.getInteger("color")); + float f = 1F - rand.nextFloat() * 0.2F; + fx.setRBGColorF(color.getRed() / 255F * f, color.getGreen() / 255F * f, color.getBlue() / 255F * f); + } + + Minecraft.getMinecraft().effectRenderer.addEffect(fx); + } + } + if("deadleaf".equals(type)) { if(particleSetting == 0 || (particleSetting == 1 && rand.nextBoolean())) Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleDeadLeaf(man, world, x, y, z)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d12b5d0b2..43d45ebf4 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -1056,6 +1056,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.brick_fire), new Object[] { "BB", "BB", 'B', ModItems.ingot_firebrick }); addShapelessAuto(new ItemStack(ModItems.ingot_firebrick, 4), new Object[] { ModBlocks.brick_fire }); + + addRecipeAuto(new ItemStack(ModBlocks.machine_drain), new Object[] { "PPP", "T ", "PPP", 'P', STEEL.plateCast(), 'T', ModItems.tank_steel }); addRecipeAuto(new ItemStack(ModBlocks.filing_cabinet, 1, DecoCabinetEnum.STEEL.ordinal()), new Object[] { " P ", "PIP", " P ", 'P', STEEL.plate(), 'I', ModItems.plate_polymer }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index c43e7e0e7..4a3ad255e 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1251,6 +1251,7 @@ public class ModEventHandlerClient { public static IIcon particleBase; public static IIcon particleLeaf; + public static IIcon particleSplash; @SubscribeEvent public void onTextureStitch(TextureStitchEvent.Pre event) { @@ -1258,6 +1259,7 @@ public class ModEventHandlerClient { if(event.map.getTextureType() == 0) { particleBase = event.map.registerIcon(RefStrings.MODID + ":particle/particle_base"); particleLeaf = event.map.registerIcon(RefStrings.MODID + ":particle/dead_leaf"); + particleSplash = event.map.registerIcon(RefStrings.MODID + ":particle/particle_splash"); } } diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index f02a8f479..8b1759c0e 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -301,6 +301,9 @@ public class ResourceManager { public static final IModelCustom solar_boiler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/solar_boiler.obj")); public static final IModelCustom solar_mirror = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/solar_mirror.obj")); + //Drain + public static final IModelCustom drain = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/drain.obj")); + //Vault Door public static final IModelCustom vault_cog = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vault_cog.obj")); public static final IModelCustom vault_frame = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vault_frame.obj")); @@ -738,6 +741,9 @@ public class ResourceManager { public static final ResourceLocation solar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/solar_boiler.png"); public static final ResourceLocation solar_mirror_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/solar_mirror.png"); + //Drain + public static final ResourceLocation drain_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/drain.png"); + //Blast Door public static final ResourceLocation blast_door_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/blast_door_base.png"); public static final ResourceLocation blast_door_tooth_tex = new ResourceLocation(RefStrings.MODID, "textures/models/blast_door_tooth.png"); diff --git a/src/main/java/com/hbm/particle/ParticleSplash.java b/src/main/java/com/hbm/particle/ParticleSplash.java new file mode 100644 index 000000000..0411a3f62 --- /dev/null +++ b/src/main/java/com/hbm/particle/ParticleSplash.java @@ -0,0 +1,68 @@ +package com.hbm.particle; + +import com.hbm.main.ModEventHandlerClient; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.world.World; + +@SideOnly(Side.CLIENT) +public class ParticleSplash extends EntityFX { + + public ParticleSplash(TextureManager texman, World world, double x, double y, double z) { + super(world, x, y, z); + particleIcon = ModEventHandlerClient.particleSplash; + this.particleRed = this.particleGreen = this.particleBlue = 1F - world.rand.nextFloat() * 0.2F; + this.particleAlpha = 0.5F; + this.particleScale = 0.4F; + this.particleMaxAge = 200 + world.rand.nextInt(50); + this.particleGravity = 0.4F; + } + + public int getFXLayer() { + return 1; + } + + public void onUpdate() { + super.onUpdate(); + + if(!this.onGround) { + this.motionX += rand.nextGaussian() * 0.002D; + this.motionZ += rand.nextGaussian() * 0.002D; + + if(this.motionY < -0.5D) + this.motionY = -0.5D; + } else { + this.setDead(); + } + } + + @Override + public void renderParticle(Tessellator tess, float interp, float fX, float fY, float fZ, float sX, float sZ) { + + tess.setNormal(0.0F, 1.0F, 0.0F); + + tess.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha); + + float scale = this.particleScale; + float pX = (float) (this.prevPosX + (this.posX - this.prevPosX) * (double) interp - interpPosX); + float pY = (float) (this.prevPosY + (this.posY - this.prevPosY) * (double) interp - interpPosY); + float pZ = (float) (this.prevPosZ + (this.posZ - this.prevPosZ) * (double) interp - interpPosZ); + + boolean flipU = this.getEntityId() % 2 == 0; + boolean flipV = this.getEntityId() % 4 < 2; + + double minU = flipU ? particleIcon.getMaxU() : particleIcon.getMinU(); + double maxU = flipU ? particleIcon.getMinU() : particleIcon.getMaxU(); + double minV = flipV ? particleIcon.getMaxV() : particleIcon.getMinV(); + double maxV = flipV ? particleIcon.getMinV() : particleIcon.getMaxV(); + + tess.addVertexWithUV((double) (pX - fX * scale - sX * scale), (double) (pY - fY * scale), (double) (pZ - fZ * scale - sZ * scale), maxU, maxV); + tess.addVertexWithUV((double) (pX - fX * scale + sX * scale), (double) (pY + fY * scale), (double) (pZ - fZ * scale + sZ * scale), maxU, minV); + tess.addVertexWithUV((double) (pX + fX * scale + sX * scale), (double) (pY + fY * scale), (double) (pZ + fZ * scale + sZ * scale), minU, minV); + tess.addVertexWithUV((double) (pX + fX * scale - sX * scale), (double) (pY - fY * scale), (double) (pZ + fZ * scale - sZ * scale), minU, maxV); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/render/tileentity/RenderDrain.java b/src/main/java/com/hbm/render/tileentity/RenderDrain.java new file mode 100644 index 000000000..e2fdcfce0 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderDrain.java @@ -0,0 +1,58 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderDrain extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity te, double x, double y, double z, float interp) { + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(te.getBlockMetadata() - BlockDummyable.offset) { + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + } + + bindTexture(ResourceManager.drain_tex); + ResourceManager.drain.renderAll(); + + GL11.glPopMatrix(); + + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_drain); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(-1, -1, 0); + GL11.glScaled(5, 5, 5); + } + public void renderCommon() { + GL11.glRotatef(180, 0F, 1F, 0F); + GL11.glTranslated(0.75, 0, 0); + bindTexture(ResourceManager.drain_tex); ResourceManager.drain.renderAll(); + } + }; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderRFCable.java b/src/main/java/com/hbm/render/tileentity/RenderRFCable.java deleted file mode 100644 index 918d88d6a..000000000 --- a/src/main/java/com/hbm/render/tileentity/RenderRFCable.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.hbm.render.tileentity; - -import org.lwjgl.opengl.GL11; - -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.conductor.TileEntityRFDuct; - -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.util.ForgeDirection; - -public class RenderRFCable extends TileEntitySpecialRenderer { - - public ResourceLocation texture = new ResourceLocation(RefStrings.MODID, "textures/blocks/rf_cable.png"); - float pixel = 1F/16F; - float textureP = 1F / 32F; - - @Override - public void renderTileEntityAt(TileEntity tileentity, double offsetX, double offsetY, double offsetZ, float f) { - GL11.glTranslated(offsetX, offsetY, offsetZ); - GL11.glDisable(GL11.GL_LIGHTING); - this.bindTexture(texture); - drawCore(tileentity); - TileEntityRFDuct cable = (TileEntityRFDuct) tileentity; - for(int i = 0; i < cable.connections.length; i++) - { - if(cable.connections[i] != null) - { - drawConnection(cable.connections[i]); - } - } - GL11.glTranslated(-offsetX, -offsetY, -offsetZ); - GL11.glEnable(GL11.GL_LIGHTING); - - } - - public void drawCore(TileEntity tileentity) { - Tessellator tesseract = Tessellator.instance; - tesseract.startDrawingQuads(); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 0 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 11 * pixel / 2, 1 - 11 * pixel / 2, 0 * textureP, 5 * textureP); - - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 0 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 11 * pixel / 2, 1 - 11 * pixel / 2, 0 * textureP, 5 * textureP); - - tesseract.addVertexWithUV(11 * pixel / 2, 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 0 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 11 * pixel / 2, 11 * pixel / 2, 0 * textureP, 5 * textureP); - - tesseract.addVertexWithUV(11 * pixel / 2, 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 0 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 11 * pixel / 2, 11 * pixel / 2, 0 * textureP, 5 * textureP); - - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 0 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 0 * textureP, 5 * textureP); - - tesseract.addVertexWithUV(11 * pixel / 2, 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 11 * pixel / 2, 11 * pixel / 2, 0 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 11 * pixel / 2, 1 - 11 * pixel / 2, 0 * textureP, 5 * textureP); - tesseract.draw(); - - // Muehsam muss ich hier im BSH meine genialen Mods schreiben, obwohl ich die Zeit eigentlich doch besser nutzen koennte. - // Da mir das aber Spass macht, wird auch in Zukunft gutes Zeug von mir geben (und damit meine ich NICHT Drogen, etc.) - // Danke. - - //I didn't write this, but I'm gonna leave it there. - } - - public void drawConnection(ForgeDirection direction) - { - Tessellator tesseract = Tessellator.instance; - tesseract.startDrawingQuads(); - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - if(direction.equals(ForgeDirection.UP)) - { - - } - if(direction.equals(ForgeDirection.DOWN)) - { - GL11.glRotatef(180, 1, 0, 0); - } - if(direction.equals(ForgeDirection.NORTH)) - { - GL11.glRotatef(270, 1, 0, 0); - } - if(direction.equals(ForgeDirection.SOUTH)) - { - GL11.glRotatef(90, 1, 0, 0); - } - if(direction.equals(ForgeDirection.EAST)) - { - GL11.glRotatef(270, 0, 0, 1); - } - if(direction.equals(ForgeDirection.WEST)) - { - GL11.glRotatef(90, 0, 0, 1); - } - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1, 1 - 11 * pixel / 2, 10 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1, 1 - 11 * pixel / 2, 10 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 0 * textureP); - - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1, 11 * pixel / 2, 10 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1, 11 * pixel / 2, 10 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 0 * textureP); - - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1, 11 * pixel / 2, 10 * textureP, 5 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1, 1 - 11 * pixel / 2, 10 * textureP, 0 * textureP); - tesseract.addVertexWithUV(1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 0 * textureP); - - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 1 - 11 * pixel / 2, 5 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1, 1 - 11 * pixel / 2, 10 * textureP, 5 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1, 11 * pixel / 2, 10 * textureP, 0 * textureP); - tesseract.addVertexWithUV(11 * pixel / 2, 1 - 11 * pixel / 2, 11 * pixel / 2, 5 * textureP, 0 * textureP); - tesseract.draw(); - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - if(direction.equals(ForgeDirection.UP)) - { - - } - if(direction.equals(ForgeDirection.DOWN)) - { - GL11.glRotatef(-180, 1, 0, 0); - } - if(direction.equals(ForgeDirection.NORTH)) - { - GL11.glRotatef(-270, 1, 0, 0); - } - if(direction.equals(ForgeDirection.SOUTH)) - { - GL11.glRotatef(-90, 1, 0, 0); - } - if(direction.equals(ForgeDirection.EAST)) - { - GL11.glRotatef(-270, 0, 0, 1); - } - if(direction.equals(ForgeDirection.WEST)) - { - GL11.glRotatef(-90, 0, 0, 1); - } - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - } -} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 73980b18a..33081cb50 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -97,6 +97,7 @@ public class TileMappings { put(TileEntityMachineExcavator.class, "tileentity_ntm_excavator"); put(TileEntityFluidDuctSimple.class, "tileentity_universal_duct_simple"); put(TileEntityFluidDuct.class, "tileentity_universal_duct"); + put(TileEntityMachineDrain.class, "tileentity_fluid_drain"); put(TileEntityMachineFluidTank.class, "tileentity_fluid_tank"); put(TileEntityMachineTurbofan.class, "tileentity_machine_turbofan"); put(TileEntityMachineTurbineGas.class, "tileentity_machine_gasturbine"); @@ -136,7 +137,6 @@ public class TileMappings { put(TileEntityFF.class, "tileentity_forcefield"); put(TileEntityForceField.class, "tileentity_machine_field"); put(TileEntityMachineShredderLarge.class, "tileentity_machine_big_shredder"); - put(TileEntityRFDuct.class, "tileentity_hbm_rfduct"); put(TileEntityReactorControl.class, "tileentity_reactor_remote_control"); put(TileEntityWasteDrum.class, "tileentity_waste_drum"); put(TileEntityDecon.class, "tileentity_decon"); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java index c5c5db0bd..cdfa9eca8 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadRusted.java @@ -110,6 +110,8 @@ public class TileEntityLaunchPadRusted extends TileEntityMachineBase implements this.missileLoaded = false; this.decrStackSize(1, 1); this.markDirty(); + + return BombReturnCode.LAUNCHED; } } } diff --git a/src/main/java/com/hbm/tileentity/conductor/TileEntityRFDuct.java b/src/main/java/com/hbm/tileentity/conductor/TileEntityRFDuct.java deleted file mode 100644 index 1054a5b41..000000000 --- a/src/main/java/com/hbm/tileentity/conductor/TileEntityRFDuct.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.hbm.tileentity.conductor; - -import cofh.api.energy.EnergyStorage; -import cofh.api.energy.IEnergyConnection; -import cofh.api.energy.IEnergyHandler; -import cofh.api.energy.IEnergyReceiver; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityRFDuct extends TileEntity implements IEnergyHandler { - - public ForgeDirection[] connections = new ForgeDirection[6]; - protected EnergyStorage storage; - public int output; - - public TileEntityRFDuct(int output) { - this.output = output; - this.storage = new EnergyStorage(200); - - storage.setMaxReceive(output); - storage.setMaxExtract(output); - storage.setMaxTransfer(output); - } - - public void updateEntity() { - this.updateConnections(); - - if (storage.getEnergyStored() > 0) { - for (int i = 0; i < 6; i++) { - - int targetX = xCoord + ForgeDirection.getOrientation(i).offsetX; - int targetY = yCoord + ForgeDirection.getOrientation(i).offsetY; - int targetZ = zCoord + ForgeDirection.getOrientation(i).offsetZ; - - TileEntity tile = worldObj.getTileEntity(targetX, targetY, targetZ); - if (tile instanceof IEnergyReceiver) { - int maxExtract = storage.getMaxExtract(); - int maxAvailable = storage.extractEnergy(maxExtract, true); - int energyTransferred = ((IEnergyReceiver) tile) - .receiveEnergy(ForgeDirection.getOrientation(i).getOpposite(), maxAvailable, false); - - storage.extractEnergy(energyTransferred, false); - } - } - } - - } - - public void updateConnections() { - if (this.worldObj.getTileEntity(xCoord, yCoord + 1, zCoord) instanceof IEnergyConnection) - connections[0] = ForgeDirection.UP; - else - connections[0] = null; - - if (this.worldObj.getTileEntity(xCoord, yCoord - 1, zCoord) instanceof IEnergyConnection) - connections[1] = ForgeDirection.DOWN; - else - connections[1] = null; - - if (this.worldObj.getTileEntity(xCoord, yCoord, zCoord - 1) instanceof IEnergyConnection) - connections[2] = ForgeDirection.NORTH; - else - connections[2] = null; - - if (this.worldObj.getTileEntity(xCoord, yCoord, zCoord + 1) instanceof IEnergyConnection) - connections[3] = ForgeDirection.SOUTH; - else - connections[3] = null; - - if (this.worldObj.getTileEntity(xCoord + 1, yCoord, zCoord) instanceof IEnergyConnection) - connections[4] = ForgeDirection.EAST; - else - connections[4] = null; - - if (this.worldObj.getTileEntity(xCoord - 1, yCoord, zCoord) instanceof IEnergyConnection) - connections[5] = ForgeDirection.WEST; - else - connections[5] = null; - } - - public boolean onlyOneOpposite(ForgeDirection[] directions) { - ForgeDirection mainDirection = null; - boolean isOpposite = false; - - for (int i = 0; i < directions.length; i++) { - - if (mainDirection == null && directions[i] != null) - mainDirection = directions[i]; - - if (directions[i] != null && mainDirection != directions[i]) { - if (!isOpposite(mainDirection, directions[i])) - return false; - else - isOpposite = true; - } - } - - return isOpposite; - } - - public boolean isOpposite(ForgeDirection firstDirection, ForgeDirection secondDirection) { - - if ((firstDirection.equals(ForgeDirection.NORTH) && secondDirection.equals(ForgeDirection.SOUTH)) - || firstDirection.equals(ForgeDirection.SOUTH) && secondDirection.equals(ForgeDirection.NORTH)) - return true; - - if ((firstDirection.equals(ForgeDirection.EAST) && secondDirection.equals(ForgeDirection.WEST)) - || firstDirection.equals(ForgeDirection.WEST) && secondDirection.equals(ForgeDirection.EAST)) - return true; - - if ((firstDirection.equals(ForgeDirection.UP) && secondDirection.equals(ForgeDirection.DOWN)) - || firstDirection.equals(ForgeDirection.DOWN) && secondDirection.equals(ForgeDirection.UP)) - return true; - - return false; - } - - @Override - public boolean canConnectEnergy(ForgeDirection from) { - return true; - } - - @Override - public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { - return this.storage.receiveEnergy(Math.min(output, maxReceive), simulate); - } - - @Override - public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { - - return storage.extractEnergy(storage.getMaxExtract(), simulate); - } - - @Override - public int getEnergyStored(ForgeDirection from) { - return storage.getEnergyStored(); - } - - @Override - public int getMaxEnergyStored(ForgeDirection from) { - return storage.getMaxEnergyStored(); - } - -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java new file mode 100644 index 000000000..3535fb9af --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDrain.java @@ -0,0 +1,155 @@ +package com.hbm.tileentity.machine; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Flammable; +import com.hbm.inventory.fluid.trait.FT_Polluting; +import com.hbm.inventory.fluid.trait.FluidTrait.FluidReleaseType; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Liquid; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Viscous; +import com.hbm.main.MainRegistry; +import com.hbm.packet.BufPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.fluid.IFluidStandardReceiver; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityMachineDrain extends TileEntityLoadedBase implements IFluidStandardReceiver, IBufPacketReceiver { + + public FluidTank tank; + + public TileEntityMachineDrain() { + this.tank = new FluidTank(Fluids.NONE, 2_000); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 20 == 0) { + for(DirPos pos : getConPos()) this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + + PacketDispatcher.wrapper.sendToAllAround(new BufPacket(xCoord, yCoord, zCoord, this), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + + if(tank.getFill() > 0) { + int toSpill = Math.max(tank.getFill() / 2, 1); + tank.setFill(tank.getFill() - toSpill); + FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.SPILL, toSpill); + + if(toSpill >= 100 && worldObj.rand.nextInt(20) == 0 && tank.getTankType().hasTrait(FT_Liquid.class) && tank.getTankType().hasTrait(FT_Viscous.class) && tank.getTankType().hasTrait(FT_Flammable.class)) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + Vec3 start = Vec3.createVectorHelper(xCoord + 0.5 - dir.offsetX * 3, yCoord + 0.5, zCoord + 0.5 - dir.offsetZ * 3); + Vec3 end = start.addVector(worldObj.rand.nextGaussian() * 5, -25, worldObj.rand.nextGaussian() * 5); + MovingObjectPosition mop = worldObj.func_147447_a(start, end, false, true, false); + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK && mop.sideHit == 1) { + Block block = worldObj.getBlock(mop.blockX, mop.blockY + 1, mop.blockZ); + if(!block.getMaterial().isLiquid() && block.isReplaceable(worldObj, mop.blockX, mop.blockY + 1, mop.blockZ) && ModBlocks.oil_spill.canPlaceBlockAt(worldObj, mop.blockX, mop.blockY + 1, mop.blockZ)) { + worldObj.setBlock(mop.blockX, mop.blockY + 1, mop.blockZ, ModBlocks.oil_spill); + } + } + } + } + + } else { + + if(tank.getFill() > 0 && MainRegistry.proxy.me().getDistance(xCoord, yCoord, zCoord) < 100) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + + NBTTagCompound data = new NBTTagCompound(); + if(tank.getTankType().hasTrait(FT_Gaseous.class)) { + data.setString("type", "tower"); + data.setFloat("lift", 0.5F); + data.setFloat("base", 0.375F); + data.setFloat("max", 3F); + data.setInteger("life", 100 + worldObj.rand.nextInt(50)); + } else { + data.setString("type", "splash"); + } + + data.setInteger("color", tank.getTankType().getColor()); + data.setDouble("posX", xCoord + 0.5 - dir.offsetX * 2.5); + data.setDouble("posZ", zCoord + 0.5 - dir.offsetZ * 2.5); + data.setDouble("posY", yCoord + 0.5); + + MainRegistry.proxy.effectNT(data); + } + } + } + + public DirPos[] getConPos() { + ForgeDirection dir0 = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection dir1 = dir0.getRotation(ForgeDirection.UP); + ForgeDirection dir2 = dir0.getRotation(ForgeDirection.DOWN); + return new DirPos[] { + new DirPos(xCoord + dir0.offsetX, yCoord, zCoord + dir0.offsetZ, dir0), + new DirPos(xCoord + dir1.offsetX, yCoord, zCoord + dir1.offsetZ, dir1), + new DirPos(xCoord + dir2.offsetX, yCoord, zCoord + dir2.offsetZ, dir2) + }; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.tank.readFromNBT(nbt, "t"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.tank.writeToNBT(nbt, "t"); + } + + @Override public void serialize(ByteBuf buf) { tank.serialize(buf); } + @Override public void deserialize(ByteBuf buf) { tank.deserialize(buf); } + + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {tank}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public boolean canConnect(FluidType type, ForgeDirection dir) { + return dir != ForgeDirection.UP && dir != ForgeDirection.DOWN; + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 2, + yCoord, + zCoord - 2, + xCoord + 3, + yCoord + 1, + zCoord + 3 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index dec70dd9b..8c01c9c42 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4145,6 +4145,7 @@ tile.machine_difurnace_on.name=Hochofen tile.machine_difurnace_rtg_off.name=Atomarer Hochofen tile.machine_difurnace_rtg_on.name=Atomarer Hochofen tile.machine_dineutronium_battery.name=Spark Energiespeicherblock +tile.machine_drain.name=Ausgussrohr tile.machine_drill.name=Automatischer Minenbohrer tile.machine_electric_furnace_off.name=Elektrischer Ofen tile.machine_electric_furnace_on.name=Elektrischer Ofen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index b7473cda6..918395027 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5159,6 +5159,7 @@ tile.machine_difurnace_on.name=Blast Furnace tile.machine_difurnace_rtg_off.name=Nuclear Blast Furnace tile.machine_difurnace_rtg_on.name=Nuclear Blast Furnace tile.machine_dineutronium_battery.name=Spark Energy Storage Block +tile.machine_drain.name=Drainage Pipe tile.machine_drill.name=Automatic Mining Drill tile.machine_electric_furnace_off.name=Electric Furnace tile.machine_electric_furnace_on.name=Electric Furnace diff --git a/src/main/resources/assets/hbm/models/machines/drain.obj b/src/main/resources/assets/hbm/models/machines/drain.obj new file mode 100644 index 000000000..0ad9f9eb5 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/drain.obj @@ -0,0 +1,190 @@ +# Blender v2.79 (sub 0) OBJ File: 'drain.blend' +# www.blender.org +o Cube_Cube.001 +v -0.500000 0.000000 0.500000 +v -0.500000 1.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v 0.500000 1.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.853553 -0.353553 +v -0.500000 1.000000 0.000000 +v -0.500000 0.853553 0.353553 +v -0.500000 0.500000 0.500000 +v -0.500000 0.146447 0.353553 +v -0.500000 0.000000 -0.000000 +v -0.500000 0.146447 -0.353553 +v -2.500000 0.500000 -0.500000 +v -2.500000 0.853553 -0.353553 +v -2.500000 1.000000 0.000000 +v -2.500000 0.853553 0.353553 +v -2.500000 0.500000 0.500000 +v -2.500000 0.146447 0.353553 +v -2.500000 0.000000 -0.000000 +v -2.500000 0.146447 -0.353553 +v -2.500000 0.500000 -0.437500 +v -2.500000 0.809359 -0.309359 +v -2.500000 0.937500 0.000000 +v -2.500000 0.809359 0.309359 +v -2.500000 0.500000 0.437500 +v -2.500000 0.190641 0.309359 +v -2.500000 0.062500 -0.000000 +v -2.500000 0.190641 -0.309359 +v -1.500000 0.500000 -0.437500 +v -1.500000 0.809359 -0.309359 +v -1.500000 0.937500 0.000000 +v -1.500000 0.809359 0.309359 +v -1.500000 0.500000 0.437500 +v -1.500000 0.190641 0.309359 +v -1.500000 0.062500 -0.000000 +v -1.500000 0.190641 -0.309359 +vt 0.250000 0.326531 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.326531 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.326531 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.326531 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.653061 +vt 0.000000 0.326531 +vt 0.250000 0.326531 +vt 0.250000 0.653061 +vt 0.000000 0.326531 +vt 0.437500 0.653061 +vt 0.343750 0.000000 +vt 0.437500 0.000000 +vt 0.625000 0.653061 +vt 0.531250 -0.000000 +vt 0.625000 0.000000 +vt 0.812500 0.653061 +vt 0.718750 0.000000 +vt 0.812500 0.000000 +vt 0.906250 0.653061 +vt 0.906250 -0.000000 +vt 0.343750 0.653061 +vt 0.250000 0.000000 +vt 0.531250 0.653061 +vt 0.718750 0.653061 +vt 1.000000 0.653061 +vt 1.000000 -0.000000 +vt 0.812500 0.673469 +vt 0.250000 0.653061 +vt 0.343750 0.673469 +vt 0.250000 0.673469 +vt 0.437500 0.673469 +vt 0.625000 0.673469 +vt 0.906250 0.673469 +vt 0.531250 0.673469 +vt 0.718750 0.673469 +vt 0.531250 1.000000 +vt 0.718750 1.000000 +vt 0.812500 1.000000 +vt 0.250000 1.000000 +vt 0.437500 1.000000 +vt 0.625000 1.000000 +vt 1.000000 0.673469 +vt 0.906250 1.000000 +vt 0.343750 1.000000 +vt 0.249819 0.795918 +vt 0.217837 0.896766 +vt 0.140625 0.938539 +vt 0.000000 0.326531 +vt 0.000000 0.326531 +vt 0.000000 0.326531 +vt 0.000000 0.653061 +vt 0.000000 0.653061 +vt 1.000000 1.000000 +vt 0.063413 0.896766 +vt 0.031431 0.795918 +vt 0.063413 0.695070 +vt 0.140625 0.653298 +vt 0.217837 0.695070 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.9239 0.3827 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 0.3827 0.9239 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 -0.9239 -0.3827 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/6/2 +f 8/7/3 5/8/3 7/9/3 +f 6/10/4 1/11/4 5/12/4 +f 7/13/5 1/14/5 3/15/5 +f 4/16/6 6/17/6 8/7/6 +f 21/18/7 14/19/7 13/20/7 +f 19/21/8 12/22/8 11/23/8 +f 17/24/9 10/25/9 9/26/9 +f 24/27/10 9/26/10 16/28/10 +f 22/29/11 15/30/11 14/19/11 +f 20/31/12 13/20/12 12/22/12 +f 18/32/13 11/23/13 10/25/13 +f 23/33/14 16/28/14 15/34/14 +f 24/27/1 25/35/1 17/24/1 +f 23/36/1 30/37/1 31/38/1 +f 20/31/1 29/39/1 21/18/1 +f 18/32/1 27/40/1 19/21/1 +f 23/33/1 32/41/1 24/27/1 +f 21/18/1 30/37/1 22/29/1 +f 19/21/1 28/42/1 20/31/1 +f 17/24/1 26/43/1 18/32/1 +f 27/40/14 36/44/14 28/42/14 +f 25/35/7 34/45/7 26/43/7 +f 32/41/12 33/46/12 25/35/12 +f 30/37/13 39/47/13 31/38/13 +f 28/42/10 37/48/10 29/39/10 +f 26/43/11 35/49/11 27/40/11 +f 31/50/8 40/51/8 32/41/8 +f 29/39/9 38/52/9 30/37/9 +f 37/53/1 36/54/1 35/55/1 +f 2/1/1 4/56/1 3/2/1 +f 4/4/2 8/57/2 7/5/2 +f 8/7/3 6/17/3 5/8/3 +f 6/10/4 2/58/4 1/11/4 +f 7/13/5 5/59/5 1/14/5 +f 4/16/6 2/60/6 6/17/6 +f 21/18/7 22/29/7 14/19/7 +f 19/21/8 20/31/8 12/22/8 +f 17/24/9 18/32/9 10/25/9 +f 24/27/10 17/24/10 9/26/10 +f 22/29/11 23/36/11 15/30/11 +f 20/31/12 21/18/12 13/20/12 +f 18/32/13 19/21/13 11/23/13 +f 23/33/14 24/27/14 16/28/14 +f 24/27/1 32/41/1 25/35/1 +f 23/36/1 22/29/1 30/37/1 +f 20/31/1 28/42/1 29/39/1 +f 18/32/1 26/43/1 27/40/1 +f 23/33/1 31/50/1 32/41/1 +f 21/18/1 29/39/1 30/37/1 +f 19/21/1 27/40/1 28/42/1 +f 17/24/1 25/35/1 26/43/1 +f 27/40/14 35/49/14 36/44/14 +f 25/35/7 33/46/7 34/45/7 +f 32/41/12 40/51/12 33/46/12 +f 30/37/13 38/52/13 39/47/13 +f 28/42/10 36/44/10 37/48/10 +f 26/43/11 34/45/11 35/49/11 +f 31/50/8 39/61/8 40/51/8 +f 29/39/9 37/48/9 38/52/9 +f 35/55/1 34/62/1 33/63/1 +f 33/63/1 40/64/1 35/55/1 +f 40/64/1 39/65/1 35/55/1 +f 39/65/1 38/66/1 35/55/1 +f 38/66/1 37/53/1 35/55/1 diff --git a/src/main/resources/assets/hbm/textures/blocks/particle/particle_splash.png b/src/main/resources/assets/hbm/textures/blocks/particle/particle_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..c5045b8e66f74bb76c17f1e995fbd10bc4945cbf GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vfvr5puigIOIA|R9E^OQv0yIq%M$3JaaTLrk)-hi0 zJ7Jx4WddS_GNsgIaJMbWT*vsJCOg<|>uUrI4GnpWSFt$Hwr#tN?)6#5`bNOe(2y`b ztdFB38*JOQYaG-^)#(cXj?t;$FM z^BmMW1cd23PRPA8Rvq`#msee_L3$>jUaz}CR!wA4l3#+zZl}ZC20aSJ-s?5#J#Uku8iYo_1bu6FHi>PTfn}fdvWa$(M zDoImQQ=pWBF$Tt1q_O-QMc*_{n5GHKvO>o)7DeAQO)mip3k#tH#LX9zSm1_Xyt7X!Mn^{l{_^sIN~HqE7{nRMybYBgAvC87p+uT2__hNw-P!pAgCG@H%$<1gr6pxZ6r5b*Hu0M0p< zmX-wm_V$MJ^K)>{vAVj7Y&I(lKR7r5=NvmbI~W-m0RS`_4Qy;|fOC#wu_y?r*XvkW zSpnx9hlhuln3w?Yo`1Htx4}8b=H{mOj$s%$IXMC69ECywsZ>hXb9HqE&N&tr7vE1A z)tR_kfOC$!ySstIwY|N)wyx_al}cTo0;N(3)oNAXlv1SAX=E}PFvdRa-TvDG*=!b! zF>xL{TVP~lL?k=IFkD-JF@|cj>e&L8WuaE9dA5LQnrJi{o-JTm7MjhbYYX`P3&hz1 zYW8*{kx2OBsZ>hj1Q}1K(;_Fxcs83wB9U-qZ%5xLl$`7i0Lf%h{1D0dj4@;~nV+YC zEIpqB`FviKuySeZSJL{mD09_PRxWeZ(l)3C%@qX9&CMa7&v(t>&CSi%sRZMM_rO#9IudlB-J3GV7%nZJL`zG!Vn$0Hm_xCY9J&o(@YYYz$gAjsRt%mjWbxcl9;{N^~ zqoboBgy8Y<5zEWVn4Fx%?d>hn=`?KHMx|20*47rLr>Ajoae-tq3EQ?&tJQFHbcC6i z8JwM+fl>+e8v22}#D#n;x>P%f7N0J&Tag+jqs@5@wzvgo>w za=DDBrzaQYCts=(j3WbI2?m9AE|(L}xm+&Rf5IS0U<4Ej1y2$Tl0mKnJp`1?m9De> zm%0=5JLjXwXQ}ME#YH6ubPjb{zGNjB_quDKE5RTAKHy(b$bmZI&idp40000