From d7ff947bbf12371d8b615047cfe6be4b8217f6e4 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 28 Sep 2023 22:49:12 +0200 Subject: [PATCH] powered condenser --- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../machine/MachineCondenserPowered.java | 82 +++++++++ src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 2 + .../render/tileentity/RenderCondenser.java | 81 +++++++++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityCondenser.java | 42 +++-- .../machine/TileEntityCondenserPowered.java | 165 ++++++++++++++++++ .../textures/models/machines/condenser.png | Bin 1581 -> 2699 bytes 9 files changed, 361 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderCondenser.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index fc09defc2..2e4a6cda9 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1018,6 +1018,7 @@ public class ModBlocks { public static Block machine_condenser; public static Block machine_tower_small; public static Block machine_tower_large; + public static Block machine_condenser_powered; public static Block machine_electrolyser; @@ -2301,6 +2302,7 @@ public class ModBlocks { machine_condenser = new MachineCondenser(Material.iron).setBlockName("machine_condenser").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":condenser"); machine_tower_small = new MachineTowerSmall(Material.iron).setBlockName("machine_tower_small").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_concrete"); machine_tower_large = new MachineTowerLarge(Material.iron).setBlockName("machine_tower_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); + machine_condenser_powered = new MachineCondenserPowered(Material.iron).setBlockName("machine_condenser_powered").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel_machine"); machine_deuterium_extractor = new MachineDeuteriumExtractor(Material.iron).setBlockName("machine_deuterium_extractor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_deuterium_extractor_side"); machine_deuterium_tower = new DeuteriumTower(Material.iron).setBlockName("machine_deuterium_tower").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":concrete"); @@ -3332,6 +3334,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_condenser, machine_condenser.getUnlocalizedName()); GameRegistry.registerBlock(machine_tower_small, machine_tower_small.getUnlocalizedName()); GameRegistry.registerBlock(machine_tower_large, machine_tower_large.getUnlocalizedName()); + register(machine_condenser_powered); GameRegistry.registerBlock(machine_deuterium_extractor, machine_deuterium_extractor.getUnlocalizedName()); GameRegistry.registerBlock(machine_deuterium_tower, machine_deuterium_tower.getUnlocalizedName()); GameRegistry.registerBlock(machine_liquefactor, ItemBlockBase.class, machine_liquefactor.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java b/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java new file mode 100644 index 000000000..3fa62d072 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineCondenserPowered.java @@ -0,0 +1,82 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityCondenserPowered; +import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineCondenserPowered extends BlockDummyable implements ILookOverlay { + + public MachineCondenserPowered(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int meta) { + if(meta >= 12) return new TileEntityCondenserPowered(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {2, 0, 1, 1, 3, 3}; + } + + @Override + public int getOffset() { + return 1; + } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x = x + dir.offsetX * o; + z = z + dir.offsetZ * o; + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + 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); + this.makeExtra(world, x + dir.offsetX + rot.offsetX, y + 1, z + dir.offsetZ + rot.offsetZ); + this.makeExtra(world, x + dir.offsetX - rot.offsetX, y + 1, z + dir.offsetZ - rot.offsetZ); + this.makeExtra(world, x - dir.offsetX + rot.offsetX, y + 1, z - dir.offsetZ + rot.offsetZ); + this.makeExtra(world, x - dir.offsetX - rot.offsetX, y + 1, z - dir.offsetZ - rot.offsetZ); + } + + @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 TileEntityCondenserPowered)) return; + + TileEntityCondenserPowered tower = (TileEntityCondenserPowered) te; + List text = new ArrayList(); + + text.add(BobMathUtil.getShortNumber(tower.power) + "HE / " + BobMathUtil.getShortNumber(tower.maxPower) + "HE"); + + for(int i = 0; i < tower.tanks.length; i++) + text.add((i < 1 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + I18nUtil.resolveKey("hbmfluid." + tower.tanks[i].getTankType().getName().toLowerCase(Locale.US)) + ": " + tower.tanks[i].getFill() + "/" + tower.tanks[i].getMaxFill() + "mB"); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 19ef08ea7..2e295603d 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -255,6 +255,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChungus.class, new RenderChungus()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTowerLarge.class, new RenderLargeTower()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTowerSmall.class, new RenderSmallTower()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCondenserPowered.class, new RenderCondenser()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDeuteriumTower.class, new RenderDeuteriumTower()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCatalyticCracker.class, new RenderCatalyticCracker()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineLiquefactor.class, new RenderLiquefactor()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 18f7b0059..6077a2947 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -108,6 +108,7 @@ public class ResourceManager { //Cooling Tower public static final IModelCustom tower_small = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_small.obj")); public static final IModelCustom tower_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_large.obj")); + public static final IModelCustom condenser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/condenser.obj")); //IGen public static final IModelCustom igen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/igen.obj")); @@ -467,6 +468,7 @@ public class ResourceManager { //Cooling Tower public static final ResourceLocation tower_small_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/tower_small.png"); public static final ResourceLocation tower_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/tower_large.png"); + public static final ResourceLocation condenser_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/condenser.png"); //Deuterium Tower public static final ResourceLocation deuterium_tower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/machine_deuterium_tower.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderCondenser.java b/src/main/java/com/hbm/render/tileentity/RenderCondenser.java new file mode 100644 index 000000000..40af1e6dc --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderCondenser.java @@ -0,0 +1,81 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityCondenserPowered; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderCondenser extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + + switch(tileEntity.getBlockMetadata() - 10) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + 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; + } + + TileEntityCondenserPowered condenser = (TileEntityCondenserPowered) tileEntity; + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.condenser_tex); + ResourceManager.condenser.renderPart("Condenser"); + + float rot = condenser.lastSpin + (condenser.spin - condenser.lastSpin) * f; + + GL11.glPushMatrix(); + GL11.glTranslated(0,1.5, 0); + GL11.glRotatef(rot, 1, 0, 0); + GL11.glTranslated(0, -1.5, 0); + ResourceManager.condenser.renderPart("Fan1"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(0,1.5, 0); + GL11.glRotatef(rot, -1, 0, 0); + GL11.glTranslated(0, -1.5, 0); + ResourceManager.condenser.renderPart("Fan2"); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_condenser_powered); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(-1, -1, 0); + GL11.glScaled(2.75, 2.75, 2.75); + } + public void renderCommon() { + GL11.glScaled(0.75, 0.75, 0.75); + GL11.glTranslated(0.5, 0, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.condenser_tex); ResourceManager.condenser.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + } + }; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 36afb0545..3a52058d6 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -299,6 +299,7 @@ public class TileMappings { put(TileEntityCondenser.class, "tileentity_condenser"); put(TileEntityTowerSmall.class, "tileentity_cooling_tower_small"); put(TileEntityTowerLarge.class, "tileentity_cooling_tower_large"); + put(TileEntityCondenserPowered.class, "tileentity_condenser_powered"); put(TileEntityDeuteriumExtractor.class, "tileentity_deuterium_extractor"); put(TileEntityDeuteriumTower.class, "tileentity_deuterium_tower"); put(TileEntityMachineLiquefactor.class, "tileentity_liquefactor"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 8b42674b0..3e4df7177 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -42,35 +42,45 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidA age = 0; } + NBTTagCompound data = new NBTTagCompound(); + this.tanks[0].writeToNBT(data, "0"); + if(this.waterTimer > 0) this.waterTimer--; - + int convert = Math.min(tanks[0].getFill(), tanks[1].getMaxFill() - tanks[1].getFill()); - tanks[0].setFill(tanks[0].getFill() - convert); - - if(convert > 0) - this.waterTimer = 20; - - int light = this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, this.xCoord, this.yCoord, this.zCoord); - - if(TomSaveData.forWorld(worldObj).fire > 1e-5 && light > 7) { // Make both steam and water evaporate during firestorms... - tanks[1].setFill(tanks[1].getFill() - convert); - } else { - tanks[1].setFill(tanks[1].getFill() + convert); + if(extraCondition(convert)) { + tanks[0].setFill(tanks[0].getFill() - convert); + + if(convert > 0) + this.waterTimer = 20; + + int light = this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, this.xCoord, this.yCoord, this.zCoord); + + if(TomSaveData.forWorld(worldObj).fire > 1e-5 && light > 7) { // Make both steam and water evaporate during firestorms... + tanks[1].setFill(tanks[1].getFill() - convert); + } else { + tanks[1].setFill(tanks[1].getFill() + convert); + } + + postConvert(convert); } + this.tanks[1].writeToNBT(data, "1"); + this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); fillFluidInit(tanks[1].getTankType()); - - NBTTagCompound data = new NBTTagCompound(); - this.tanks[0].writeToNBT(data, "0"); - this.tanks[1].writeToNBT(data, "1"); data.setByte("timer", (byte) this.waterTimer); + packExtra(data); INBTPacketReceiver.networkPack(this, data, 150); } } + + public void packExtra(NBTTagCompound data) { } + public boolean extraCondition(int convert) { return true; } + public void postConvert(int convert) { } @Override public void networkUnpack(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java new file mode 100644 index 000000000..7bd58cf0a --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java @@ -0,0 +1,165 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energy.IEnergyUser; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCondenserPowered extends TileEntityCondenser implements IEnergyUser { + + public long power; + public static final long maxPower = 10_000_000; + public float spin; + public float lastSpin; + + public TileEntityCondenserPowered() { + tanks = new FluidTank[2]; + tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 100_000); + tanks[1] = new FluidTank(Fluids.WATER, 100_000); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote) { + + this.lastSpin = this.spin; + + if(this.waterTimer > 0) { + this.spin += 30F; + + if(this.spin >= 360F) { + this.spin -= 360F; + this.lastSpin -= 360F; + } + + if(worldObj.getTotalWorldTime() % 4 == 0) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + worldObj.spawnParticle("cloud", xCoord + 0.5 + dir.offsetX * 1.5, yCoord + 1.5, zCoord + 0.5 + dir.offsetZ * 1.5, dir.offsetX * 0.1, 0, dir.offsetZ * 0.1); + worldObj.spawnParticle("cloud", xCoord + 0.5 - dir.offsetX * 1.5, yCoord + 1.5, zCoord + 0.5 - dir.offsetZ * 1.5, dir.offsetX * -0.1, 0, dir.offsetZ * -0.1); + } + } + } + } + + @Override + public void packExtra(NBTTagCompound data) { + data.setLong("power", power); + } + + @Override + public boolean extraCondition(int convert) { + return power >= convert * 10; + } + + @Override + public void postConvert(int convert) { + this.power -= convert * 10; + if(this.power < 0) this.power = 0; + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.power = nbt.getLong("power"); + this.tanks[0].readFromNBT(nbt, "0"); + this.tanks[1].readFromNBT(nbt, "1"); + this.waterTimer = nbt.getByte("timer"); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.power = nbt.getLong("power"); + tanks[0].readFromNBT(nbt, "water"); + tanks[1].readFromNBT(nbt, "steam"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("power", power); + tanks[0].writeToNBT(nbt, "water"); + tanks[1].writeToNBT(nbt, "steam"); + } + + @Deprecated @Override public void fillFluidInit(FluidType type) { } + + @Override + public void subscribeToAllAround(FluidType type, TileEntity te) { + for(DirPos pos : getConPos()) { + this.trySubscribe(this.tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + @Override + public void sendFluidToAll(FluidTank tank, TileEntity te) { + for(DirPos pos : getConPos()) { + this.sendFluid(this.tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + public DirPos[] getConPos() { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + return new DirPos[] { + 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()), + new DirPos(xCoord + dir.offsetX * 2 - rot.offsetX, yCoord + 1, zCoord + dir.offsetZ * 2 - rot.offsetZ, dir), + new DirPos(xCoord + dir.offsetX * 2 + rot.offsetX, yCoord + 1, zCoord + dir.offsetZ * 2 + rot.offsetZ, dir), + new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX, yCoord + 1, zCoord - dir.offsetZ * 2 - rot.offsetZ, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 2 + rot.offsetX, yCoord + 1, zCoord - dir.offsetZ * 2 + rot.offsetZ, dir.getOpposite()) + }; + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 3, + yCoord, + zCoord - 3, + xCoord + 4, + yCoord + 3, + zCoord + 4 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public long getPower() { + return this.power; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public long getMaxPower() { + return this.maxPower; + } +} diff --git a/src/main/resources/assets/hbm/textures/models/machines/condenser.png b/src/main/resources/assets/hbm/textures/models/machines/condenser.png index b5bbd66b728211045a93347c3917975519de1aa9..cb3573db19150af373a3614189e9c578ffaf3ef9 100644 GIT binary patch literal 2699 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