From a7b741fe48429250f70c72a5e5647ba237c65dc8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 18 Aug 2023 14:18:24 +0200 Subject: [PATCH 1/5] PWR heat transfer --- .../java/com/hbm/blocks/machine/BlockPWR.java | 46 +++++++- .../java/com/hbm/inventory/fluid/Fluids.java | 3 +- .../java/com/hbm/inventory/gui/GUIPWR.java | 9 ++ .../inventory/recipes/CentrifugeRecipes.java | 6 +- .../machine/TileEntityPWRController.java | 109 +++++++++++++++++- 5 files changed, 163 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/BlockPWR.java b/src/main/java/com/hbm/blocks/machine/BlockPWR.java index 7012f5437..d30541e60 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockPWR.java +++ b/src/main/java/com/hbm/blocks/machine/BlockPWR.java @@ -3,12 +3,14 @@ package com.hbm.blocks.machine; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.FluidType; import com.hbm.lib.RefStrings; import com.hbm.render.block.ct.CT; import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.IBlockCT; import com.hbm.tileentity.machine.TileEntityPWRController; +import api.hbm.fluid.IFluidConnector; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -22,6 +24,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPWR extends BlockContainer implements IBlockCT { @@ -91,7 +94,7 @@ public class BlockPWR extends BlockContainer implements IBlockCT { super.breakBlock(world, x, y, z, block, meta); } - public static class TileEntityBlockPWR extends TileEntity { + public static class TileEntityBlockPWR extends TileEntity implements IFluidConnector { public Block block; public int coreX; @@ -154,5 +157,46 @@ public class BlockPWR extends BlockContainer implements IBlockCT { this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); } } + + @Override + public long transferFluid(FluidType type, int pressure, long fluid) { + + if(this.getBlockMetadata() != 1) return fluid; + if(block == null) return fluid; + + if(worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + + TileEntity tile = worldObj.getTileEntity(coreX, coreY, coreZ); + if(tile instanceof TileEntityPWRController) { + TileEntityPWRController controller = (TileEntityPWRController) tile; + return controller.transferFluid(type, pressure, fluid); + } + } + + return fluid; + } + + @Override + public long getDemand(FluidType type, int pressure) { + + if(this.getBlockMetadata() != 1) return 0; + if(block == null) return 0; + + if(worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + + TileEntity tile = worldObj.getTileEntity(coreX, coreY, coreZ); + if(tile instanceof TileEntityPWRController) { + TileEntityPWRController controller = (TileEntityPWRController) tile; + return controller.getDemand(type, pressure); + } + } + + return 0; + } + + @Override + public boolean canConnect(FluidType type, ForgeDirection dir) { + return this.getBlockMetadata() == 1; + } } } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index fba8a1b43..3c70626d5 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -490,8 +490,7 @@ public class Fluids { HOTOIL.addTraits(new FT_Coolable(OIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); HOTCRACKOIL.addTraits(new FT_Coolable(CRACKOIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); - COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); - COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.PWR, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); + COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).setEff(HeatingType.PWR, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); COOLANT_HOT.addTraits(new FT_Coolable(COOLANT, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); MUG.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(400, 1, MUG_HOT, 1)); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index af7130a47..083cab0c7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -41,6 +41,8 @@ public class GUIPWR extends GuiInfoContainer { //TODO: calculate some prediction using extrapolation (or some math sector that ends with -ic) //int timeLeft = (controller.processTime - controller.progress) / 20; //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); + + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { ((int) (controller.progress * 100 / controller.processTime)) + "%" }); if(controller.typeLoaded != -1 && controller.amountLoaded > 0) { @@ -89,6 +91,9 @@ public class GUIPWR extends GuiInfoContainer { if(System.currentTimeMillis() % 1000 < 500) drawTexturedModalRect(guiLeft + 147, guiTop, 176, 14, 26, 26); + int p = (int) (controller.progress * 33 / controller.processTime); + drawTexturedModalRect(guiLeft + 54, guiTop + 33, 176, 0, p, 14); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, (double) controller.coreHeat / (double) controller.coreHeatCapacity); GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, (double) controller.hullHeat / (double) controller.hullHeatCapacity); @@ -96,6 +101,10 @@ public class GUIPWR extends GuiInfoContainer { ItemStack display = new ItemStack(ModItems.pwr_fuel, 1, controller.typeLoaded); this.drawItemStack(display, guiLeft + 89, guiTop + 5, EnumChatFormatting.YELLOW + "" + controller.amountLoaded + "/" + controller.rodCount); RenderHelper.enableGUIStandardItemLighting(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } + + controller.tanks[0].renderTank(guiLeft + 8, guiTop + 57, this.zLevel, 16, 52); + controller.tanks[1].renderTank(guiLeft + 26, guiTop + 57, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index a3735f8bb..5e619c676 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -1,6 +1,7 @@ package com.hbm.inventory.recipes; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; @@ -188,8 +189,9 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(ModItems.nugget_pu238, 6), new ItemStack(ModItems.nuclear_waste, 2) }); - if(OreDictionary.doesOreNameExist("nuggetNaquadria")) { - ItemStack nuggetNQR = OreDictionary.getOres("nuggetNaquadria").get(0); + ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); + if(naquadriaNuggets.size() != 0) { + ItemStack nuggetNQR = naquadriaNuggets.get(0); ItemStack copy = nuggetNQR.copy(); copy.stackSize = 12; recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.NQD)), new ItemStack[] { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 564df30ac..5aa739e75 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -1,6 +1,8 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; @@ -9,6 +11,7 @@ import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; @@ -18,6 +21,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; +import api.hbm.fluid.IFluidStandardTransceiver; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -28,13 +32,13 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { +public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IFluidStandardTransceiver { public FluidTank[] tanks; public int coreHeat; - public static final int coreHeatCapacity = 25_000_000; + public static final int coreHeatCapacity = 10_000_000; public int hullHeat; - public static final int hullHeatCapacity = 25_000_000; + public static final int hullHeatCapacity = 10_000_000; public double flux; public int rodLevel; @@ -53,6 +57,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public int sourceCount; public boolean assembled; + + protected List ports = new ArrayList(); public TileEntityPWRController() { super(3); @@ -82,6 +88,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(block == ModBlocks.pwr_heatex) heatexCount++; if(block == ModBlocks.pwr_channel) channelCount++; if(block == ModBlocks.pwr_neutron_source) sourceCount++; + if(block == ModBlocks.pwr_port) ports.add(entry.getKey()); } for(Entry entry : rodMap.entrySet()) { @@ -141,6 +148,15 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.tanks[0].setType(2, slots); setupTanks(); + for(BlockPos pos : ports) { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + BlockPos portPos = pos.offset(dir); + + if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); + if(worldObj.getTotalWorldTime() % 20 == 0) this.trySubscribe(tanks[0].getTankType(), worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); + } + } + if((typeLoaded == -1 || amountLoaded <= 0) && slots[0] != null && slots[0].getItem() == ModItems.pwr_fuel) { typeLoaded = slots[0].getItemDamage(); amountLoaded++; @@ -190,12 +206,14 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG } /* CORE COOLING */ - double coreCoolingApproachNum = getXOverE(this.heatexCount, 10) / 2D; + double coreCoolingApproachNum = getXOverE((double) this.heatexCount / (double) this.rodCount, 2) / 2D; int averageCoreHeat = (this.coreHeat + this.hullHeat) / 2; this.coreHeat -= (coreHeat - averageCoreHeat) * coreCoolingApproachNum; this.hullHeat -= (hullHeat - averageCoreHeat) * coreCoolingApproachNum; - this.hullHeat *= 0.99D; + updateCoolant(); + + this.hullHeat *= 0.999D; this.flux = newFlux; @@ -214,6 +232,26 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG } } + protected void updateCoolant() { + + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + if(trait == null || trait.getEfficiency(HeatingType.PWR) <= 0) return; + + double coolingEff = (double) this.channelCount / (double) this.rodCount * 0.1D; //10% cooling if numbers match + if(coolingEff > 1D) coolingEff = 1D; + + int heatToUse = (int) (this.hullHeat * coolingEff); + HeatingStep step = trait.getFirstStep(); + int coolCycles = tanks[0].getFill() / step.amountReq; + int hotCycles = (tanks[1].getMaxFill() - tanks[1].getFill()) / step.amountProduced; + int heatCycles = heatToUse / step.heatReq; + int cycles = Math.min(coolCycles, Math.min(hotCycles, heatCycles)); + + this.hullHeat -= step.heatReq * cycles; + this.tanks[0].setFill(tanks[0].getFill() - step.amountReq * cycles); + this.tanks[1].setFill(tanks[1].getFill() + step.amountProduced * cycles); + } + public void networkUnpack(NBTTagCompound nbt) { tanks[0].readFromNBT(nbt, "t0"); tanks[1].readFromNBT(nbt, "t1"); @@ -234,6 +272,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(trait == null || trait.getEfficiency(HeatingType.PWR) <= 0) { tanks[0].setTankType(Fluids.NONE); tanks[1].setTankType(Fluids.NONE); + return; } tanks[1].setTankType(trait.getFirstStep().typeProduced); @@ -258,6 +297,29 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG super.readFromNBT(nbt); this.assembled = nbt.getBoolean("assembled"); + this.coreHeat = nbt.getInteger("coreHeat"); + this.hullHeat = nbt.getInteger("hullHeat"); + this.flux = nbt.getDouble("flux"); + this.rodLevel = nbt.getInteger("rodLevel"); + this.rodTarget = nbt.getInteger("rodTarget"); + this.typeLoaded = nbt.getInteger("typeLoaded"); + this.amountLoaded = nbt.getInteger("amountLoaded"); + this.progress = nbt.getDouble("progress"); + this.processTime = nbt.getDouble("processTime"); + + this.rodCount = nbt.getInteger("rodCount"); + this.connections = nbt.getInteger("connections"); + this.connectionsControlled = nbt.getInteger("connectionsControlled"); + this.heatexCount = nbt.getInteger("heatexCount"); + this.channelCount = nbt.getInteger("channelCount"); + this.sourceCount = nbt.getInteger("sourceCount"); + + ports.clear(); + int portCount = nbt.getInteger("portCount"); + for(int i = 0; i < portCount; i++) { + int[] port = nbt.getIntArray("p" + i); + ports.add(new BlockPos(port[0], port[1], port[2])); + } } @Override @@ -265,6 +327,28 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG super.writeToNBT(nbt); nbt.setBoolean("assembled", assembled); + nbt.setInteger("coreHeat", coreHeat); + nbt.setInteger("hullHeat", hullHeat); + nbt.setDouble("flux", flux); + nbt.setInteger("rodLevel", rodLevel); + nbt.setInteger("rodTarget", rodTarget); + nbt.setInteger("typeLoaded", typeLoaded); + nbt.setInteger("amountLoaded", amountLoaded); + nbt.setDouble("progress", progress); + nbt.setDouble("processTime", processTime); + + nbt.setInteger("rodCount", rodCount); + nbt.setInteger("connections", connections); + nbt.setInteger("connectionsControlled", connectionsControlled); + nbt.setInteger("heatexCount", heatexCount); + nbt.setInteger("channelCount", channelCount); + nbt.setInteger("sourceCount", sourceCount); + + nbt.setInteger("portCount", ports.size()); + for(int i = 0; i < ports.size(); i++) { + BlockPos pos = ports.get(i); + nbt.setIntArray("p" + i, new int[] { pos.getX(), pos.getY(), pos.getZ() }); + } } @Override @@ -289,4 +373,19 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPWR(player.inventory, this); } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] { tanks[1] }; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] { tanks[0] }; + } } From 05f45e8a769f55c736760193a8bd2db1880be41b Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 20 Aug 2023 19:23:35 +0200 Subject: [PATCH 2/5] PWR controllability --- .../java/com/hbm/inventory/gui/GUIPWR.java | 68 ++++++++++++++++-- .../machine/TileEntityMachineChemplant.java | 2 + .../TileEntityMachineChemplantBase.java | 2 + .../machine/TileEntityPWRController.java | 64 ++++++++++++++++- src/main/resources/assets/hbm/sounds.json | 1 + .../assets/hbm/sounds/block/reactorLoop.ogg | Bin 0 -> 112164 bytes 6 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/block/reactorLoop.ogg diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index 083cab0c7..b8888ec02 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -1,21 +1,29 @@ package com.hbm.inventory.gui; +import org.apache.commons.lang3.math.NumberUtils; +import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPWR; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.render.util.GaugeUtil; import com.hbm.render.util.GaugeUtil.Gauge; import com.hbm.tileentity.machine.TileEntityPWRController; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class GUIPWR extends GuiInfoContainer { @@ -23,6 +31,8 @@ public class GUIPWR extends GuiInfoContainer { protected TileEntityPWRController controller; private final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/reactors/gui_pwr.png"); + private GuiTextField field; + public GUIPWR(InventoryPlayer inventory, TileEntityPWRController controller) { super(new ContainerPWR(inventory, controller)); this.controller = controller; @@ -30,6 +40,21 @@ public class GUIPWR extends GuiInfoContainer { this.xSize = 176; this.ySize = 188; } + + @Override + public void initGui() { + super.initGui(); + + Keyboard.enableRepeatEvents(true); + + this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 63, 30, 8); + this.field.setTextColor(0x00ff00); + this.field.setDisabledTextColour(0x008000); + this.field.setEnableBackgroundDrawing(false); + this.field.setMaxStringLength(3); + + this.field.setText((100 - controller.rodTarget) + ""); + } @Override public void drawScreen(int x, int y, float interp) { @@ -37,13 +62,9 @@ public class GUIPWR extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 115, guiTop + 31, 18, 18, x, y, new String[] { "Core: " + String.format("%,d", controller.coreHeat) + " / " + String.format("%,d", controller.coreHeatCapacity) + " TU" }); this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 31, 18, 18, x, y, new String[] { "Hull: " + String.format("%,d", controller.hullHeat) + " / " + String.format("%,d", controller.hullHeatCapacity) + " TU" }); - - //TODO: calculate some prediction using extrapolation (or some math sector that ends with -ic) - //int timeLeft = (controller.processTime - controller.progress) / 20; - //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); - - this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { ((int) (controller.progress * 100 / controller.processTime)) + "%" }); + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { ((int) (controller.progress * 100 / controller.processTime)) + "%" }); + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 53, 54, 4, x, y, "Control rod level: " + (100 - controller.rodLevel) + "%"); if(controller.typeLoaded != -1 && controller.amountLoaded > 0) { ItemStack display = new ItemStack(ModItems.pwr_fuel, 1, controller.typeLoaded); @@ -88,12 +109,15 @@ public class GUIPWR extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - if(System.currentTimeMillis() % 1000 < 500) + if(controller.hullHeat > controller.hullHeatCapacity * 0.8 || controller.coreHeat > controller.coreHeatCapacity * 0.8) drawTexturedModalRect(guiLeft + 147, guiTop, 176, 14, 26, 26); int p = (int) (controller.progress * 33 / controller.processTime); drawTexturedModalRect(guiLeft + 54, guiTop + 33, 176, 0, p, 14); + int c = (int) (controller.rodLevel * 52 / 100); + drawTexturedModalRect(guiLeft + 53, guiTop + 54, 176, 40, c, 2); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, (double) controller.coreHeat / (double) controller.coreHeatCapacity); GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, (double) controller.hullHeat / (double) controller.hullHeatCapacity); @@ -103,8 +127,38 @@ public class GUIPWR extends GuiInfoContainer { RenderHelper.enableGUIStandardItemLighting(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } + + GL11.glDisable(GL11.GL_LIGHTING); controller.tanks[0].renderTank(guiLeft + 8, guiTop + 57, this.zLevel, 16, 52); controller.tanks[1].renderTank(guiLeft + 26, guiTop + 57, this.zLevel, 16, 52); + + this.field.drawTextBox(); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int i) { + super.mouseClicked(mouseX, mouseY, i); + this.field.mouseClicked(mouseX, mouseY, i); + + if(guiLeft + 88 <= mouseX && guiLeft + 88 + 18 > mouseX && guiTop + 58 < mouseY && guiTop + 58 + 18 >= mouseY) { + + if(NumberUtils.isNumber(field.getText())) { + int level = (int)MathHelper.clamp_double(Double.parseDouble(field.getText()), 0, 100); + field.setText(level + ""); + + NBTTagCompound control = new NBTTagCompound(); + control.setInteger("control", 100 - level); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(control, controller.xCoord, controller.yCoord, controller.zCoord)); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1F)); + + } + } + } + + @Override + protected void keyTyped(char c, int i) { + if(this.field.textboxKeyTyped(c, i)) return; + super.keyTyped(c, i); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 379a95c1b..3da9f3833 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -304,6 +304,8 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements this.maxProgress = recipe.getDuration() * this.speed / 100; + if(maxProgress <= 0) maxProgress = 1; + if(this.progress >= this.maxProgress) { consumeFluids(recipe); produceFluids(recipe); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index d91102d51..99e38f3e4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -150,6 +150,8 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa this.maxProgress[index] = recipe.getDuration() * this.speed / 100; + if(maxProgress[index] <= 0) maxProgress[index] = 1; + if(this.progress[index] >= this.maxProgress[index]) { consumeFluids(recipe, index); produceFluids(recipe, index); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 5aa739e75..ec3a6488a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -16,6 +16,8 @@ import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.EnumUtil; @@ -41,8 +43,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public static final int hullHeatCapacity = 10_000_000; public double flux; - public int rodLevel; - public int rodTarget; + public int rodLevel = 100; + public int rodTarget = 100; public int typeLoaded; public int amountLoaded; @@ -58,6 +60,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public boolean assembled; + private AudioWrapper audio; + protected List ports = new ArrayList(); public TileEntityPWRController() { @@ -228,7 +232,54 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG data.setDouble("progress", progress); data.setInteger("typeLoaded", typeLoaded); data.setInteger("amountLoaded", amountLoaded); + data.setInteger("rodLevel", rodLevel); + data.setInteger("rodTarget", rodTarget); this.networkPack(data, 150); + } else { + + if(amountLoaded > 0) { + + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + + audio.keepAlive(); + + } else { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + } + } + + @Override + public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.reactorLoop", xCoord, yCoord, zCoord, 1F, 10F, 1.0F, 20); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; } } @@ -263,6 +314,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG progress = nbt.getDouble("progress"); typeLoaded = nbt.getInteger("typeLoaded"); amountLoaded = nbt.getInteger("amountLoaded"); + rodLevel = nbt.getInteger("rodLevel"); + rodTarget = nbt.getInteger("rodTarget"); } protected void setupTanks() { @@ -295,6 +348,9 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + + tanks[0].readFromNBT(nbt, "t0"); + tanks[1].readFromNBT(nbt, "t1"); this.assembled = nbt.getBoolean("assembled"); this.coreHeat = nbt.getInteger("coreHeat"); @@ -325,6 +381,9 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + + tanks[0].writeToNBT(nbt, "t0"); + tanks[1].writeToNBT(nbt, "t1"); nbt.setBoolean("assembled", assembled); nbt.setInteger("coreHeat", coreHeat); @@ -361,6 +420,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(data.hasKey("control")) { this.rodTarget = MathHelper.clamp_int(data.getInteger("control"), 0, 100); + this.markChanged(); } } diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 90efc5334..d2c6248c7 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -58,6 +58,7 @@ "block.hornNearDual": {"category": "block", "sounds": [{"name": "block/hornNearDual", "stream": false}]}, "block.hornFarSingle": {"category": "block", "sounds": [{"name": "block/hornFarSingle", "stream": false}]}, "block.hornFarDual": {"category": "block", "sounds": [{"name": "block/hornFarDual", "stream": false}]}, + "block.reactorLoop": {"category": "block", "sounds": [{"name": "block/reactorLoop", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/reactorLoop.ogg b/src/main/resources/assets/hbm/sounds/block/reactorLoop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..428ddeabbfdcd94c2efc0856475005c552ce8e32 GIT binary patch literal 112164 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

M!MJR$YCP(^U!H|1~Bo0_t1Jqm@k*myH2Go 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 M_FsL+dSj9R0DEf;Jpcdz literal 0 HcmV?d00001 From ae44c8a2a4d0bf89a3ce2736be50c76fbfcfe8e2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 21 Aug 2023 16:04:25 +0200 Subject: [PATCH 3/5] sodalite, heatable heavy water, sodium --- changelog | 50 ++++++++---------- .../hbm/blocks/machine/MachineAutosaw.java | 40 +++++++++++++- .../com/hbm/inventory/OreDictManager.java | 5 ++ .../java/com/hbm/inventory/fluid/Fluids.java | 8 ++- .../fluid/trait/FT_PWRModerator.java | 43 +++++++++++++++ .../hbm/inventory/fluid/trait/FluidTrait.java | 1 + .../inventory/recipes/CentrifugeRecipes.java | 8 ++- .../inventory/recipes/CombinationRecipes.java | 5 +- .../inventory/recipes/FuelPoolRecipes.java | 3 ++ src/main/java/com/hbm/items/ModItems.java | 8 ++- .../com/hbm/items/special/ItemBedrockOre.java | 3 +- .../machine/TileEntityCoreEmitter.java | 2 +- .../machine/TileEntityCoreInjector.java | 3 +- .../machine/TileEntityCoreStabilizer.java | 3 +- .../machine/TileEntityMachineAutosaw.java | 11 ++++ .../machine/TileEntityPWRController.java | 7 ++- .../com/hbm/world/feature/BedrockOre.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../textures/gui/fluids/heavywater_hot.png | Bin 0 -> 464 bytes .../hbm/textures/items/gem_sodalite.png | Bin 0 -> 504 bytes .../hbm/textures/items/powder_sodium.png | Bin 0 -> 488 bytes 22 files changed, 162 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/heavywater_hot.png create mode 100644 src/main/resources/assets/hbm/textures/items/gem_sodalite.png create mode 100644 src/main/resources/assets/hbm/textures/items/powder_sodium.png diff --git a/changelog b/changelog index 61558946a..404c55913 100644 --- a/changelog +++ b/changelog @@ -1,33 +1,27 @@ ## Added -* Analysis tool - * A more universal version of the power net analyzer - * Currently only works on fluid networks though - * In addition to seeing links and subscribers, the analysis tool also displays subscriber positions as well as a log (up to 50 entries) of what block received how much fluid - * This should finally give more insight in the bug that rarely causes fluids to disappear -* Leadburster - * A 40mm launcher grenade that doesn't explode, instead it attaches itself to a block and starts firing bullets - * Fires in circles for 2 seconds before it self-destructs -* Congo lake - * A 40mm pump-action grenade launcher with a capacity of 4 rounds -* Lantern - * Cheap and fancy illumination - * Will blind glyphids in a small radius - * Glyphids don't actually have eyes, just don't think about it too much -* Ashpit - * An optional part that can be placed under fireboxes and heating ovens - * Collects ashes, producing one ash pile for every 10 furnace operations worth of fuel - * Ash comes in different types like wood (from planks, logs and saplings), coal (coal, lignite and coke) and generic (everything else) - * Ashes can be used as dyes, for making industrial fertilizer, as low-efficiency furnace fuel or for carbon in the crucible - * Coal ashes can also be centrifuged, returning the flammable content as unburned coal dust as well as a small amount of boron +* PWR + * The successor to the old large nuclear reactor + * Has some design similarities with the RBMK, but in 3D + * Relatively easy to build and safe to operate + * Does not use any tile entity rendering and all math is pre-calculated when the reactor is assembled, making this one even more performant than the old large reactor +* Sodalite + * A gem that can be extracted from fluorite ore + * Can be heated in the combination oven to make sodium dust and chlorine ## Changed -* Updated polish and chinese localization -* Flechettes now get stuck in blocks for a few seconds -* NBT kits now display the amount of items in a stack -* Removed the special nuclear meteorite +* Bedrock fluorite ore now yields actual ore instead of fluorite directly +* Blocks that fall from fallout effects no longer drop items when falling on small blocks, preventing issues like gas blocks being dropped +* Bullets no longer need primers to be crafted, primers no longer exist at all +* The automatic buzzsaw can now use wood oil, ethanol, fish oil and heavy oil to run +* Fluorite ore is now centrifugable +* Fluorite crystals now centrifuge into slightly less fluorite but also yield sodalite ## Fixed -* Fixed thermos crashing config hitting before the config is saved, resulting in an empty config the first time the server is launched -* Fixed heating oven not visually connecting to exhaust pipes -* Fixed loot blocks not correctly rendering items that require multiple render passes -* Fixed special meteorites spawning in worldgen +* Fixed FEnSU's IO limit not working properly +* Fixed overflow caused by uncapped Spk values of DFC beams, they are now capped at 9,200,000 Spk +* Fixed smooth lighting not working on connected textures +* Fixed the Thermos preventer not working on Crucible type servers +* Fixed pollution save files not working correctly on certain Thermos forks +* Fixed blast furnace output overstacking +* Fixed potential crash caused by centrifuges trying to create a recipe using non-registered items +* Fixed chemplant GUI crashing when too many upgrades are applied to a short duration recipe diff --git a/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java b/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java index fe568c409..0aeca216d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java +++ b/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java @@ -5,16 +5,25 @@ import java.util.List; import java.util.Locale; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineAutosaw; import com.hbm.util.I18nUtil; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; 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 MachineAutosaw extends BlockContainer implements ILookOverlay { +public class MachineAutosaw extends BlockContainer implements ILookOverlay, ITooltipProvider { public MachineAutosaw() { super(Material.iron); @@ -39,6 +48,30 @@ public class MachineAutosaw extends BlockContainer implements ILookOverlay { public boolean renderAsNormalBlock() { return false; } + + @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) { + + TileEntityMachineAutosaw saw = (TileEntityMachineAutosaw) world.getTileEntity(x, y, z); + + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, x, y, z, player.getHeldItem()); + if(saw.acceptedFuels.contains(type)) { + saw.tank.setTankType(type); + saw.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation("hbmfluid." + type.getName().toLowerCase(Locale.US))).appendSibling(new ChatComponentText("!"))); + return true; + } + } + + return false; + } + + return true; + } @Override public void printHook(Pre event, World world, int x, int y, int z) { @@ -55,4 +88,9 @@ public class MachineAutosaw extends BlockContainer implements ILookOverlay { ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 36a75a648..02afded30 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -212,6 +212,7 @@ public class OreDictManager { public static final DictFrame CINNABAR = new DictFrame("Cinnabar"); public static final DictFrame BORAX = new DictFrame("Borax"); public static final DictFrame CHLOROCALCITE = new DictFrame("Chlorocalcite"); + public static final DictFrame SODALITE = new DictFrame("Sodalite"); public static final DictFrame VOLCANIC = new DictFrame("Volcanic"); public static final DictFrame HEMATITE = new DictFrame("Hematite"); public static final DictFrame MALACHITE = new DictFrame("Malachite"); @@ -221,6 +222,8 @@ public class OreDictManager { */ /** LITHIUM */ public static final DictFrame LI = new DictFrame("Lithium"); + /** SODIUM */ + public static final DictFrame NA = new DictFrame("Sodium"); /* * PHOSPHORUS */ @@ -395,6 +398,7 @@ public class OreDictManager { CINNABAR .crystal(cinnebar) .gem(cinnebar) .ore(ore_cinnebar, ore_depth_cinnebar); BORAX .dust(powder_borax) .ore(ore_depth_borax); CHLOROCALCITE .dust(powder_chlorocalcite); + SODALITE .gem(gem_sodalite); VOLCANIC .gem(gem_volcanic) .ore(basalt_gem); HEMATITE .ore(fromOne(stone_resource, EnumStoneType.HEMATITE)); MALACHITE .ore(fromOne(stone_resource, EnumStoneType.MALACHITE)); @@ -404,6 +408,7 @@ public class OreDictManager { * HAZARDS, MISC */ LI .hydro(1F) .ingot(lithium) .dustSmall(powder_lithium_tiny) .dust(powder_lithium) .block(block_lithium) .ore(ore_gneiss_lithium, ore_meteor_lithium); + NA .hydro(1F) .dust(powder_sodium); /* * PHOSPHORUS diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 3c70626d5..2ad14ed42 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -156,6 +156,7 @@ public class Fluids { public static FluidType SMOKE_LEADED; public static FluidType SMOKE_POISON; public static FluidType HELIUM4; + public static FluidType HEAVYWATER_HOT; private static final HashMap idMapping = new HashMap(); private static final HashMap nameMapping = new HashMap(); @@ -311,7 +312,8 @@ public class Fluids { SMOKE = new FluidType("SMOKE", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS, NOID, NOCON); SMOKE_LEADED = new FluidType("SMOKE_LEADED", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS, NOID, NOCON); SMOKE_POISON = new FluidType("SMOKE_POISON", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS, NOID, NOCON); - HELIUM4 = new FluidType(123,"HELIUM4", 0xE54B0A, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + HELIUM4 = new FluidType("HELIUM4", 0xE54B0A, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + HEAVYWATER_HOT = new FluidType(124, "HEAVYWATER_HOT",0x4D007B, 1, 0, 0, EnumSymbol.NONE).setTemp(600).addTraits(LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ //ADD NEW FLUIDS HERE @@ -323,6 +325,7 @@ public class Fluids { //vanilla metaOrder.add(WATER); metaOrder.add(HEAVYWATER); + metaOrder.add(HEAVYWATER_HOT); metaOrder.add(LAVA); //steams metaOrder.add(STEAM); @@ -499,6 +502,9 @@ public class Fluids { BLOOD.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(500, 1, BLOOD_HOT, 1)); BLOOD_HOT.addTraits(new FT_Coolable(BLOOD, 1, 1, 500).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + HEAVYWATER.addTraits(new FT_Heatable().setEff(HeatingType.PWR, 1.0D).addStep(300, 1, HEAVYWATER_HOT, 1), new FT_PWRModerator(1.25D)); + HEAVYWATER_HOT.addTraits(new FT_Coolable(HEAVYWATER, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + if(idMapping.size() != metaOrder.size()) { throw new IllegalStateException("A severe error has occoured during NTM's fluid registering process! The MetaOrder and Mappings are inconsistent! Mapping size: " + idMapping.size()+ " / MetaOrder size: " + metaOrder.size()); } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java new file mode 100644 index 000000000..65386405a --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java @@ -0,0 +1,43 @@ +package com.hbm.inventory.fluid.trait; + +import java.io.IOException; +import java.util.List; + +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_PWRModerator extends FluidTrait { + + private double multiplier; + + public FT_PWRModerator(double mulitplier) { + this.multiplier = mulitplier; + } + + public double getMultiplier() { + return multiplier; + } + + @Override + public void addInfo(List info) { + info.add(EnumChatFormatting.BLUE + "[PWR Flux Multiplier]"); + } + + @Override + public void addInfoHidden(List info) { + int mult = (int) (multiplier * 100 - 100); + info.add(EnumChatFormatting.BLUE + "Core flux " + (mult >= 0 ? "+" : "") + mult + "%"); + } + + @Override + public void serializeJSON(JsonWriter writer) throws IOException { + writer.name("multiplier").value(multiplier); + } + + @Override + public void deserializeJSON(JsonObject obj) { + this.multiplier = obj.get("multiplier").getAsDouble(); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java index ba385ad54..ff2522d09 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java @@ -24,6 +24,7 @@ public abstract class FluidTrait { traitNameMap.put("poison", FT_Poison.class); // x traitNameMap.put("toxin", FT_Toxin.class); // x traitNameMap.put("ventradiation", FT_VentRadiation.class); // x + traitNameMap.put("pwrmoderator", FT_PWRModerator.class); // x traitNameMap.put("gaseous", FT_Gaseous.class); traitNameMap.put("gaseous_art", FT_Gaseous_ART.class); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 5e619c676..1f1aa97ea 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -320,6 +320,12 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(ModItems.powder_emerald, 1), new ItemStack(Blocks.gravel, 1) }); + recipes.put(new OreDictStack(F.ore()), new ItemStack[] { + new ItemStack(ModItems.fluorite, 3), + new ItemStack(ModItems.fluorite, 3), + new ItemStack(ModItems.gem_sodalite, 1), + new ItemStack(Blocks.gravel, 1) }); + recipes.put(new OreDictStack(REDSTONE.ore()), new ItemStack[] { new ItemStack(Items.redstone, 3), new ItemStack(Items.redstone, 3), @@ -457,7 +463,7 @@ public class CentrifugeRecipes extends SerializableRecipe { recipes.put(new ComparableStack(ModItems.crystal_copper), new ItemStack[] { new ItemStack(ModItems.powder_copper, 2), new ItemStack(ModItems.powder_copper, 2), new ItemStack(ModItems.sulfur, 1), new ItemStack(ModItems.powder_cobalt_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_tungsten), new ItemStack[] { new ItemStack(ModItems.powder_tungsten, 2), new ItemStack(ModItems.powder_tungsten, 2), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_aluminium), new ItemStack[] { new ItemStack(ModItems.powder_aluminium, 2), new ItemStack(ModItems.powder_aluminium, 2), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); - recipes.put(new ComparableStack(ModItems.crystal_fluorite), new ItemStack[] { new ItemStack(ModItems.fluorite, 3), new ItemStack(ModItems.fluorite, 3), new ItemStack(ModItems.fluorite, 3), new ItemStack(ModItems.powder_lithium_tiny, 1) }); + recipes.put(new ComparableStack(ModItems.crystal_fluorite), new ItemStack[] { new ItemStack(ModItems.fluorite, 4), new ItemStack(ModItems.fluorite, 4), new ItemStack(ModItems.gem_sodalite, 2), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_beryllium), new ItemStack[] { new ItemStack(ModItems.powder_beryllium, 2), new ItemStack(ModItems.powder_beryllium, 2), new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_lead), new ItemStack[] { new ItemStack(ModItems.powder_lead, 2), new ItemStack(ModItems.powder_lead, 2), new ItemStack(ModItems.powder_gold, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_schraranium), new ItemStack[] { new ItemStack(ModItems.nugget_schrabidium, 2), new ItemStack(ModItems.nugget_schrabidium, 2), new ItemStack(ModItems.nugget_uranium, 2), new ItemStack(ModItems.nugget_plutonium, 2) }); diff --git a/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java b/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java index d1c218639..efcd14b13 100644 --- a/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java @@ -43,9 +43,10 @@ public class CombinationRecipes extends SerializableRecipe { recipes.put(LIGNITE.dust(), new Pair(DictFrame.fromOne(ModItems.coke, EnumCokeType.LIGNITE), new FluidStack(Fluids.COALCREOSOTE, 50))); recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.briquette, EnumBriquetteType.LIGNITE)), new Pair(DictFrame.fromOne(ModItems.coke, EnumCokeType.LIGNITE), new FluidStack(Fluids.COALCREOSOTE, 100))); - recipes.put(CINNABAR.crystal(), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.MERCURY, 100))); //recipes.put(CHLOROCALCITE.dust(), new Pair(new ItemStack(ModItems.powder_calcium), new FluidStack(Fluids.CHLORINE, 250))); - recipes.put(new ComparableStack(Items.glowstone_dust), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.CHLORINE, 100))); + recipes.put(CINNABAR.crystal(), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.MERCURY, 100))); + recipes.put(new ComparableStack(Items.glowstone_dust), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.CHLORINE, 100))); + recipes.put(SODALITE.gem(), new Pair(new ItemStack(ModItems.powder_sodium), new FluidStack(Fluids.CHLORINE, 100))); recipes.put(new ComparableStack(DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.BAUXITE)), new Pair(new ItemStack(ModItems.ingot_aluminium, 2), new FluidStack(Fluids.REDMUD, 250))); recipes.put(KEY_LOG, new Pair(new ItemStack(Items.coal, 1 ,1), new FluidStack(Fluids.WOODOIL, 250))); diff --git a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java index 2e80c2bb4..9f01c9d80 100644 --- a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java @@ -11,6 +11,7 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import net.minecraft.item.ItemStack; @@ -37,6 +38,8 @@ public class FuelPoolRecipes extends SerializableRecipe { recipes.put(new ComparableStack(ModItems.waste_plate_sa326, 1, 1), new ItemStack(ModItems.waste_plate_sa326)); recipes.put(new ComparableStack(ModItems.waste_plate_ra226be, 1, 1), new ItemStack(ModItems.waste_plate_ra226be)); recipes.put(new ComparableStack(ModItems.waste_plate_pu238be, 1, 1), new ItemStack(ModItems.waste_plate_pu238be)); + + for(EnumPWRFuel pwr : EnumPWRFuel.values()) recipes.put(new ComparableStack(ModItems.pwr_fuel_hot, 1, pwr.ordinal()), new ItemStack(ModItems.pwr_fuel_depleted, 1, pwr.ordinal())); } @Override diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index ba2d0ba6c..119a33d3b 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -415,7 +415,8 @@ public class ModItems { public static Item crystal_cinnebar; public static Item crystal_trixite; public static Item crystal_osmiridium; - + + public static Item gem_sodalite; public static Item gem_tantalium; public static Item gem_volcanic; public static Item gem_alexandrite; @@ -481,6 +482,7 @@ public class ModItems { public static Item powder_steel; public static Item powder_lithium; public static Item powder_zirconium; + public static Item powder_sodium; public static Item redstone_depleted; public static Item powder_australium; @@ -2828,6 +2830,7 @@ public class ModItems { crystal_cinnebar = new Item().setUnlocalizedName("crystal_cinnebar").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":crystal_cinnebar"); crystal_trixite = new Item().setUnlocalizedName("crystal_trixite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":crystal_trixite"); crystal_osmiridium = new Item().setUnlocalizedName("crystal_osmiridium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":crystal_osmiridium"); + gem_sodalite = new ItemCustomLore().setUnlocalizedName("gem_sodalite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_sodalite"); gem_tantalium = new ItemCustomLore().setUnlocalizedName("gem_tantalium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_tantalium"); gem_volcanic = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("gem_volcanic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_volcanic"); gem_alexandrite = new ItemAlexandrite().setUnlocalizedName("gem_alexandrite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_alexandrite"); @@ -2877,6 +2880,7 @@ public class ModItems { powder_steel = new Item().setUnlocalizedName("powder_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_steel"); powder_lithium = new Item().setUnlocalizedName("powder_lithium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_lithium"); powder_zirconium = new Item().setUnlocalizedName("powder_zirconium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_zirconium"); + powder_sodium = new Item().setUnlocalizedName("powder_sodium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_sodium"); redstone_depleted = new Item().setUnlocalizedName("redstone_depleted").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":redstone_depleted"); powder_power = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("powder_power").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_energy_alt"); powder_iodine = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("powder_iodine").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_iodine"); @@ -5764,6 +5768,7 @@ public class ModItems { GameRegistry.registerItem(powder_lithium, powder_lithium.getUnlocalizedName()); GameRegistry.registerItem(powder_lithium_tiny, powder_lithium_tiny.getUnlocalizedName()); GameRegistry.registerItem(powder_zirconium, powder_zirconium.getUnlocalizedName()); + GameRegistry.registerItem(powder_sodium, powder_sodium.getUnlocalizedName()); GameRegistry.registerItem(powder_lignite, powder_lignite.getUnlocalizedName()); GameRegistry.registerItem(powder_iodine, powder_iodine.getUnlocalizedName()); GameRegistry.registerItem(powder_thorium, powder_thorium.getUnlocalizedName()); @@ -5871,6 +5876,7 @@ public class ModItems { GameRegistry.registerItem(crystal_cinnebar, crystal_cinnebar.getUnlocalizedName()); GameRegistry.registerItem(crystal_trixite, crystal_trixite.getUnlocalizedName()); GameRegistry.registerItem(crystal_osmiridium, crystal_osmiridium.getUnlocalizedName()); + GameRegistry.registerItem(gem_sodalite, gem_sodalite.getUnlocalizedName()); GameRegistry.registerItem(gem_tantalium, gem_tantalium.getUnlocalizedName()); GameRegistry.registerItem(gem_volcanic, gem_volcanic.getUnlocalizedName()); GameRegistry.registerItem(gem_alexandrite, gem_alexandrite.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemBedrockOre.java b/src/main/java/com/hbm/items/special/ItemBedrockOre.java index 9d12bade0..f4362a93f 100644 --- a/src/main/java/com/hbm/items/special/ItemBedrockOre.java +++ b/src/main/java/com/hbm/items/special/ItemBedrockOre.java @@ -95,7 +95,8 @@ public class ItemBedrockOre extends ItemEnumMulti { GOLD("Gold", 0xF9D738, B_LEAD, B_COPPER, B_BISMUTH), //occurs with copper, lead and rare bismuthide URANIUM("Uranium", 0x868D82, B_LEAD, B_RADIUM, B_POLONIUM), //uranium and its decay products THORIUM("Thorium", 0x7D401D, B_SILICON, B_URANIUM, B_TECHNETIUM), //thorium occours with uraninite and decay products - CHLOROCALCITE("Chlorocalcite", 0xCDE036, B_LITHIUM, B_SILICON, B_SILICON); //i guess? + CHLOROCALCITE("Chlorocalcite", 0xCDE036, B_LITHIUM, B_SILICON, B_SILICON), //i guess? + FLUORITE("Fluorite", 0xF6F3E7, B_SILICON, B_LITHIUM, B_ALUMINIUM); //different silicon-bearing gemstones, generic lithium, aluminium from sodium compound trailings public String oreName; public int color; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 3f0f6bba4..a3adb1bc1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -129,7 +129,7 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne Block b = worldObj.getBlock(x, y, z); - if(b != Blocks.air) { + if(!b.isAir(worldObj, x, y, z)) { if(b.getMaterial().isLiquid()) { worldObj.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "random.fizz", 1.0F, 1.0F); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index b4fffdb9c..bd2366acc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -19,7 +19,6 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -97,7 +96,7 @@ public class TileEntityCoreInjector extends TileEntityMachineBase implements IFl break; } - if(worldObj.getBlock(x, y, z) != Blocks.air) + if(!worldObj.getBlock(x, y, z).isAir(worldObj, x, y, z)) break; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index 82ce38079..a60975ed3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -17,7 +17,6 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -86,7 +85,7 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I break; } - if(worldObj.getBlock(x, y, z) != Blocks.air) + if(!worldObj.getBlock(x, y, z).isAir(worldObj, x, y, z)) break; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index 2ca86eb13..3ec39159b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -1,9 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashSet; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockTallPlant.EnumTallFlower; +import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; @@ -29,6 +31,15 @@ import net.minecraft.util.Vec3; public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardReceiver { + public static final HashSet acceptedFuels = new HashSet(); + + static { + acceptedFuels.add(Fluids.WOODOIL); + acceptedFuels.add(Fluids.ETHANOL); + acceptedFuels.add(Fluids.FISHOIL); + acceptedFuels.add(Fluids.HEAVYOIL); + } + public FluidTank tank; public boolean isOn; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index ec3a6488a..9fd2a7ec2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -11,6 +11,7 @@ import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; @@ -221,6 +222,10 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.flux = newFlux; + if(tanks[0].getTankType().hasTrait(FT_PWRModerator.class)) { + this.flux *= tanks[0].getTankType().getTrait(FT_PWRModerator.class).getMultiplier(); + } + NBTTagCompound data = new NBTTagCompound(); tanks[0].writeToNBT(data, "t0"); tanks[1].writeToNBT(data, "t1"); @@ -291,7 +296,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG double coolingEff = (double) this.channelCount / (double) this.rodCount * 0.1D; //10% cooling if numbers match if(coolingEff > 1D) coolingEff = 1D; - int heatToUse = (int) (this.hullHeat * coolingEff); + int heatToUse = (int) (this.hullHeat * coolingEff * trait.getEfficiency(HeatingType.PWR)); HeatingStep step = trait.getFirstStep(); int coolCycles = tanks[0].getFill() / step.amountReq; int hotCycles = (tanks[1].getMaxFill() - tanks[1].getFill()) / step.amountProduced; diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java index 19895823d..f20e79039 100644 --- a/src/main/java/com/hbm/world/feature/BedrockOre.java +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -36,9 +36,9 @@ public class BedrockOre { registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.FLUORITE, 1), WorldConfig.bedrockFluoriteSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 4), 1, 0x202020), WorldConfig.bedrockCoalSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.fluorite, 4), 1, 0xd0d0d0), WorldConfig.bedrockFluoriteSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(Items.glowstone_dust, 4), 1, 0xF9FF4D), WorldConfig.bedrockGlowstoneSpawn); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index c764f300e..a1fef17c3 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3959,6 +3959,7 @@ tile.machine_assembler.name=Fertigungsmaschine tile.machine_assemfac.name=Fertigungsfabrik tile.machine_autocrafter.name=Automatische Werkbank tile.machine_autosaw.name=Automatische Kreissäge +tile.machine_autosaw.desc=Schneidet Pflanzen nieder, pflanzt Bäume nach$Akzeptiert:$-Holzöl$-Ethanol$-Fischöl$-Schweröl tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energiespeicherblock tile.machine_battery_potato.name=Kartoffelbatterieblock diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 6e2e10e35..5aae8fd7b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4891,6 +4891,7 @@ tile.machine_assembler.name=Assembly Machine tile.machine_assemfac.name=Assembly Factory tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_autosaw.name=Automatic Buzz Saw +tile.machine_autosaw.desc=Cuts down nearby plants, re-plants trees$Accepts:$-Wood oil$-Ethanol$-Fish oil$-Heavy oil tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energy Storage Block tile.machine_battery_potato.name=Potato Battery Block diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/heavywater_hot.png b/src/main/resources/assets/hbm/textures/gui/fluids/heavywater_hot.png new file mode 100644 index 0000000000000000000000000000000000000000..119b76cda83fe79157024691fe7b947695d24903 GIT binary patch literal 464 zcmV;>0WbcEP);Un9FrR$=dGZ86Q38P!f?%;Inrnxnt2+9=r><+<$cVuZi5Lv>%J|CkprY*TY;4Sa z=61aii8zbJU{Ew)NPC09;V>9#>O9%TR(uBnAvY|Rj*jq3Aom5~$urlHh)eh^Hm@@? zk(e(V3>(`UHwHr>;L@Lg3_%cTYIgSgNJYiUioPswk*qns^V~bxDQUJ6Vo&i!#_xg zA3^YVR#rOG;l8JD%9!_=+j#qr#F8sPP!u2i;e%wFlI5gM=}3#sYE)E*3gy94iLx$x zX(Eq5I4DO;2g)ex(&CYbq6dUDMLL}1D=l47VX-VMZ!q5=lsu#n1)-r~=m%7lOLO7p z`jdU)Dk^GfJRX3ChV%JM2!Y@Emq1`+<2qgsUp!)#6yPu2^ylEDR$kx$00006YfGC6?Vy7L|i66m0 z6fEh)K?inH5O^L5BFV59Ux~C}Ls^?IJdaDJkN3;f!4udveL%VnulxG{?&}r)(;{a* z+#AS>7{Guv@M$J@W^A*#KP#(+19`vT%ClFS@*(fZ-G^B@E%rjABh#0a*OSkg`%-0g zp^EiEG(3GWOuDxja@iff6vl`4mSg}41621cZl!?zM{NI!;_r6j4F4vYC3qTp7qgFXmgR)qkpg0@(a%T9_?QPGojz(DDz;&#SC z3{1TZ0W7cOBH|;D9zP(Fi1Oy8%g){!_cM1ehcNbHi0^LwN;hrd%8y)RWON8IU}{1A u_6Wwto5c`vOg9oI$0Qck_s?-m=dnMgkmGYli)2~=0000P)Nklp?N*Iq`QK6>^Z$Jyw3+O z5B&egXiF@ekyDYc>a=Wy-(}8Olnd%&OOdwY$iq4%h4}?Gf-<_a_WWjs(!hjdoJfyswu^x1f#k~=H@@L6%@H~^A?|%me`}6JJ~GC*0?PU&3_lc z;AgN*#rp(6K0isuvaxKN!1qaZcGIEKtsgq3yQJ()OImfviZd(Ka8n%TgXE|3@-UZ^ zlpdCia9d`alAKdl8X|26>pu;xToStOivUy Date: Mon, 21 Aug 2023 22:09:54 +0200 Subject: [PATCH 4/5] TOREX flash overlay --- .../java/com/hbm/blocks/bomb/NukeBoy.java | 10 +++- .../hbm/entity/effect/EntityNukeTorex.java | 2 +- .../java/com/hbm/items/tool/ItemWandD.java | 18 ++++-- .../com/hbm/main/ModEventHandlerClient.java | 43 +++++++++----- .../hbm/render/entity/effect/RenderTorex.java | 59 +++++++++++++++++++ .../machine/TileEntityPWRController.java | 1 + src/main/java/com/hbm/util/TrackerUtil.java | 9 +++ 7 files changed, 121 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/hbm/blocks/bomb/NukeBoy.java b/src/main/java/com/hbm/blocks/bomb/NukeBoy.java index 01673e12d..d25f59ace 100644 --- a/src/main/java/com/hbm/blocks/bomb/NukeBoy.java +++ b/src/main/java/com/hbm/blocks/bomb/NukeBoy.java @@ -5,10 +5,12 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.entity.effect.EntityNukeCloudSmall; +import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.interfaces.IBomb; import com.hbm.main.MainRegistry; import com.hbm.tileentity.bomb.TileEntityNukeBoy; +import com.hbm.util.TrackerUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -124,7 +126,13 @@ public class NukeBoy extends BlockContainer implements IBomb { world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.boyRadius, x + 0.5, y + 0.5, z + 0.5)); - world.spawnEntityInWorld(EntityNukeCloudSmall.statFac(world, x, y, z, BombConfig.boyRadius)); + //world.spawnEntityInWorld(EntityNukeCloudSmall.statFac(world, x, y, z, BombConfig.boyRadius)); + + EntityNukeTorex torex = new EntityNukeTorex(world); + torex.setPositionAndRotation(x + 0.5, y + 1, z + 0.5, 0, 0); + torex.getDataWatcher().updateObject(10, 1.5F); + world.spawnEntityInWorld(torex); + TrackerUtil.setTrackingRange(world, torex, 1000); } return false; } diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index b93311496..227552d0c 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -151,7 +151,7 @@ public class EntityNukeTorex extends Entity { if(life > fadeOut) { float fac = (float)(life - fadeOut) / (float)(lifetime - fadeOut); - return 1F - fac * fac; + return 1F - fac; } return 1.0F; diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 4c80ccab4..1e8e427dc 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -2,15 +2,22 @@ package com.hbm.items.tool; import java.util.List; +import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.lib.Library; +import com.hbm.util.TrackerUtil; +import cpw.mods.fml.relauncher.ReflectionHelper; +import net.minecraft.entity.EntityTracker; +import net.minecraft.entity.EntityTrackerEntry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.IntHashMap; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; public class ItemWandD extends Item { @@ -32,7 +39,7 @@ public class ItemWandD extends Item { vnt.setSFX(new ExplosionEffectStandard()); vnt.explode();*/ - PollutionHandler.incrementPollution(world, pos.blockX, pos.blockY, pos.blockZ, PollutionType.SOOT, 15); + //PollutionHandler.incrementPollution(world, pos.blockX, pos.blockY, pos.blockZ, PollutionType.SOOT, 15); /*TimeAnalyzer.startCount("setBlock"); world.setBlock(pos.blockX, pos.blockY, pos.blockZ, Blocks.dirt); @@ -54,15 +61,16 @@ public class ItemWandD extends Item { tom.destructionRange = 600; world.spawnEntityInWorld(tom);*/ - /*EntityNukeTorex torex = new EntityNukeTorex(world); + EntityNukeTorex torex = new EntityNukeTorex(world); torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); torex.getDataWatcher().updateObject(10, 1.5F); world.spawnEntityInWorld(torex); - EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); + /*EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); IntHashMap map = ReflectionHelper.getPrivateValue(EntityTracker.class, entitytracker, "trackedEntityIDs", "field_72794_c"); EntityTrackerEntry entry = (EntityTrackerEntry) map.lookup(torex.getEntityId()); - entry.blocksDistanceThreshold = 1000; - world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, 150, pos.blockX, pos.blockY + 1, pos.blockZ));*/ + entry.blocksDistanceThreshold = 1000;*/ + TrackerUtil.setTrackingRange(world, torex, 1000); + //world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, 150, pos.blockX, pos.blockY + 1, pos.blockZ)); //DungeonToolbox.generateBedrockOreWithChance(world, world.rand, pos.blockX, pos.blockZ, EnumBedrockOre.TITANIUM, new FluidStack(Fluids.SULFURIC_ACID, 500), 2, 1); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 17a4e9682..a1bc1b705 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1,7 +1,6 @@ package com.hbm.main; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Random; @@ -18,7 +17,6 @@ import com.hbm.blocks.rail.IRailNTM.MoveContext; import com.hbm.blocks.rail.IRailNTM.RailCheckType; import com.hbm.blocks.rail.IRailNTM.RailContext; import com.hbm.config.GeneralConfig; -import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.mob.EntityHunterChopper; import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.entity.train.EntityRailCarRidable; @@ -147,11 +145,38 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent; public class ModEventHandlerClient { + public static int flashTimer; + @SubscribeEvent public void onOverlayRender(RenderGameOverlayEvent.Pre event) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; + /// NUKE FLASH /// + if(event.type == ElementType.CROSSHAIRS && flashTimer > 0) { + int width = event.resolution.getScaledWidth(); + int height = event.resolution.getScaledHeight(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.0F); + GL11.glDepthMask(false); + tess.startDrawingQuads(); + float brightness = (flashTimer - event.partialTicks) / 200F; + tess.setColorRGBA_F(1F, 1F, 1F, brightness * 0.8F); + tess.addVertex(width, 0, 0); + tess.addVertex(0, 0, 0); + tess.addVertex(0, height, 0); + tess.addVertex(width, height, 0); + tess.draw(); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDepthMask(true); + return; + } + /// HANDLE GUN OVERLAYS /// if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemHUD) { ((IItemHUD)player.getHeldItem().getItem()).renderHUD(event, event.type, player, player.getHeldItem()); @@ -196,18 +221,6 @@ public class ModEventHandlerClient { } } - List torex = world.getEntitiesWithinAABB(EntityNukeTorex.class, player.boundingBox.expand(100, 100, 100)); - - if(!torex.isEmpty()) { - EntityNukeTorex t = torex.get(0); - List text = new ArrayList(); - text.add("Speed: " + t.getSimulationSpeed()); - text.add("Alpha: " + t.getAlpha()); - text.add("Age: " + t.ticksExisted + " / " + t.getMaxAge()); - text.add("Clouds: " + t.cloudlets.size()); - ILookOverlay.printGeneric(event, "DEBUG", 0xff0000, 0x4040000, text); - } - /*List text = new ArrayList(); text.add("IMPACT: " + ImpactWorldHandler.getImpactForClient(world)); text.add("DUST: " + ImpactWorldHandler.getDustForClient(world)); @@ -1250,6 +1263,8 @@ public class ModEventHandlerClient { client.sendQueue.addToSendQueue(new C0CPacketInput(client.moveStrafing, client.moveForward, client.movementInput.jump, client.movementInput.sneak)); } } + + if(event.phase == Phase.START) if(flashTimer > 0) flashTimer--; } @SubscribeEvent diff --git a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java index 661b57773..dfa21028c 100644 --- a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java +++ b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java @@ -2,6 +2,7 @@ package com.hbm.render.entity.effect; import java.util.ArrayList; import java.util.Comparator; +import java.util.Random; import org.lwjgl.opengl.GL11; @@ -9,6 +10,7 @@ import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.effect.EntityNukeTorex.Cloudlet; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.main.ModEventHandlerClient; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.OpenGlHelper; @@ -23,6 +25,7 @@ import net.minecraft.util.Vec3; public class RenderTorex extends Render { private static final ResourceLocation cloudlet = new ResourceLocation(RefStrings.MODID + ":textures/particle/particle_base.png"); + private static final ResourceLocation flash = new ResourceLocation(RefStrings.MODID + ":textures/particle/flare.png"); @Override public void doRender(Entity entity, double x, double y, double z, float f0, float interp) { @@ -31,6 +34,8 @@ public class RenderTorex extends Render { GL11.glTranslated(x, y, z); EntityNukeTorex cloud = (EntityNukeTorex)entity; cloudletWrapper(cloud, interp); + if(cloud.ticksExisted < 101) flashWrapper(cloud, interp); + if(cloud.ticksExisted < 10 && ModEventHandlerClient.flashTimer < 100) ModEventHandlerClient.flashTimer = 200; GL11.glPopMatrix(); } @@ -81,6 +86,43 @@ public class RenderTorex extends Render { GL11.glDisable(GL11.GL_BLEND); GL11.glPopMatrix(); } + + private void flashWrapper(EntityNukeTorex cloud, float interp) { + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + RenderHelper.disableStandardItemLighting(); + + bindTexture(flash); + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + double age = Math.min(cloud.ticksExisted + interp, 100); + float alpha = (float) ((100D - age) / 100F); + + Random rand = new Random(cloud.getEntityId()); + + for(int i = 0; i < 3; i++) { + float x = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); + float y = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); + float z = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); + tessellateFlash(tess, x, y + cloud.coreHeight, z, (float) (10 * cloud.rollerSize), alpha, interp); + } + + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + } private void tessellateCloudlet(Tessellator tess, double posX, double posY, double posZ, Cloudlet cloud, float interp) { @@ -104,6 +146,23 @@ public class RenderTorex extends Render { } + private void tessellateFlash(Tessellator tess, double posX, double posY, double posZ, float scale, float alpha, float interp) { + + float f1 = ActiveRenderInfo.rotationX; + float f2 = ActiveRenderInfo.rotationZ; + float f3 = ActiveRenderInfo.rotationYZ; + float f4 = ActiveRenderInfo.rotationXY; + float f5 = ActiveRenderInfo.rotationXZ; + + tess.setColorRGBA_F(1F, 1F, 1F, alpha); + + tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); + tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); + tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); + tess.addVertexWithUV((double) (posX + f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ + f2 * scale - f4 * scale), 0, 1); + + } + @Override protected ResourceLocation getEntityTexture(Entity p_110775_1_) { return null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 9fd2a7ec2..e50143a6b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -202,6 +202,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG slots[1].stackSize++; } + this.amountLoaded--; this.markChanged(); } } diff --git a/src/main/java/com/hbm/util/TrackerUtil.java b/src/main/java/com/hbm/util/TrackerUtil.java index 9889d0c6e..62140046e 100644 --- a/src/main/java/com/hbm/util/TrackerUtil.java +++ b/src/main/java/com/hbm/util/TrackerUtil.java @@ -41,4 +41,13 @@ public class TrackerUtil { entry.ticks = 0; } } + + public static void setTrackingRange(World world, Entity e, int range) { + + if(world instanceof WorldServer) { + WorldServer server = (WorldServer) world; + EntityTrackerEntry entry = getTrackerEntry(server, e.getEntityId()); + entry.blocksDistanceThreshold = range; + } + } } From 35b18dda348dd17ac7c65c409c8ddd44d72b911f Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 21 Aug 2023 23:07:47 +0200 Subject: [PATCH 5/5] do the bugshaker --- .../java/com/hbm/entity/effect/EntityNukeTorex.java | 11 +++++++++++ .../java/com/hbm/main/ModEventHandlerRenderer.java | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 227552d0c..8e0ef45f1 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -36,6 +36,17 @@ public class EntityNukeTorex extends Entity { this.dataWatcher.addObject(10, new Float(1)); } + @Override + @SideOnly(Side.CLIENT) + public int getBrightnessForRender(float p_70070_1_) { + return 15728880; + } + + @Override + public float getBrightness(float p_70013_1_) { + return 1.0F; + } + @Override public void onUpdate() { diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 7dd68dd4c..eee0c1d97 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -28,8 +28,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors; import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderPlayerEvent; public class ModEventHandlerRenderer { @@ -377,4 +379,15 @@ public class ModEventHandlerRenderer { event.blue = event.blue * (1 - interp) + sootColor * interp; } } + + @SubscribeEvent + public void onRenderHUD(RenderGameOverlayEvent.Pre event) { + + if(event.type == ElementType.HOTBAR && ModEventHandlerClient.flashTimer > 0) { + double mult = (ModEventHandlerClient.flashTimer + event.partialTicks) * 0.01D; + double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 5; + double vertical = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.01 + 2), -0.7, 0.7) * 1; + GL11.glTranslated(horizontal * mult, vertical * mult, 0); + } + } }