From cf2973320016da81afbdae341dc6e18ae3ebc87e Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 3 May 2021 23:06:09 +0200 Subject: [PATCH] functional RBMK boiler --- .../com/hbm/blocks/generic/BlockGrate.java | 3 +- .../hbm/entity/effect/EntityFalloutRain.java | 1 - src/main/java/com/hbm/items/ModItems.java | 6 +++ .../java/com/hbm/items/armor/ItemModAuto.java | 33 ++++++++++++ .../hbm/render/block/RenderRBMKControl.java | 2 +- .../hbm/render/block/RenderRBMKReflector.java | 2 +- .../com/hbm/render/block/RenderRBMKRod.java | 2 +- .../tileentity/machine/rbmk/RBMKDials.java | 48 ++++++++++++++++-- .../machine/rbmk/TileEntityRBMKBase.java | 4 +- .../machine/rbmk/TileEntityRBMKBoiler.java | 41 ++++++++++++++- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/items/injector_5htp.png | Bin 0 -> 284 bytes .../hbm/textures/items/injector_knife.png | Bin 0 -> 264 bytes .../hbm/textures/models/weapons/lance.png | Bin 0 -> 8268 bytes 15 files changed, 133 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/hbm/items/armor/ItemModAuto.java create mode 100644 src/main/resources/assets/hbm/textures/items/injector_5htp.png create mode 100644 src/main/resources/assets/hbm/textures/items/injector_knife.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/lance.png diff --git a/src/main/java/com/hbm/blocks/generic/BlockGrate.java b/src/main/java/com/hbm/blocks/generic/BlockGrate.java index 304a0899f..5d6ded3ae 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockGrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockGrate.java @@ -68,7 +68,8 @@ public class BlockGrate extends Block { @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { - return side == ForgeDirection.UP; + int meta = world.getBlockMetadata(x, y, z); + return (side == ForgeDirection.UP && meta == 7) || (side == ForgeDirection.DOWN && meta == 0); } @Override diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index b4f6ccbd1..e269688fd 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -4,7 +4,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.config.RadiationConfig; import com.hbm.config.VersatileConfig; -import com.hbm.main.MainRegistry; import com.hbm.saveddata.AuxSavedData; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index a617d8dd2..9f56383ba 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1966,6 +1966,8 @@ public class ModItems { public static Item scrumpy; public static Item wild_p; public static Item fabsols_vodka; + public static Item injector_5htp; + public static Item injector_knife; public static Item hazmat_helmet; public static Item hazmat_plate; @@ -2965,6 +2967,8 @@ public class ModItems { scrumpy = new ItemModRevive(1).setUnlocalizedName("scrumpy").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":scrumpy"); wild_p = new ItemModRevive(3).setUnlocalizedName("wild_p").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":wild_p"); fabsols_vodka = new ItemModRevive(9999).setUnlocalizedName("fabsols_vodka").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":fabsols_vodka"); + injector_5htp = new ItemModAuto().setUnlocalizedName("injector_5htp").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":injector_5htp"); + injector_knife = new ItemModAuto().setUnlocalizedName("injector_knife").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":injector_knife"); can_empty = new Item().setUnlocalizedName("can_empty").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":can_empty"); can_smart = new ItemEnergy().setUnlocalizedName("can_smart").setContainerItem(ModItems.can_empty).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":can_smart"); @@ -6718,6 +6722,8 @@ public class ModItems { GameRegistry.registerItem(scrumpy, scrumpy.getUnlocalizedName()); GameRegistry.registerItem(wild_p, wild_p.getUnlocalizedName()); GameRegistry.registerItem(fabsols_vodka, fabsols_vodka.getUnlocalizedName()); + GameRegistry.registerItem(injector_5htp, injector_5htp.getUnlocalizedName()); + GameRegistry.registerItem(injector_knife, injector_knife.getUnlocalizedName()); //The Gadget GameRegistry.registerItem(gadget_explosive, gadget_explosive.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ItemModAuto.java b/src/main/java/com/hbm/items/armor/ItemModAuto.java new file mode 100644 index 000000000..81fe68120 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ItemModAuto.java @@ -0,0 +1,33 @@ +package com.hbm.items.armor; + +import java.util.List; + +import com.hbm.handler.ArmorModHandler; +import com.hbm.items.ModItems; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +public class ItemModAuto extends ItemArmorMod { + + public ItemModAuto() { + super(ArmorModHandler.extra, false, true, false, false); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + if(this == ModItems.injector_5htp) { + list.add(EnumChatFormatting.BLUE + "Imported from Japsterdam."); + } + if(this == ModItems.injector_knife) { + list.add(EnumChatFormatting.RED + "Pain."); + list.add(""); + list.add(EnumChatFormatting.RED + "Hurts, doesn't it?"); + } + + list.add(""); + super.addInformation(stack, player, list, bool); + } +} diff --git a/src/main/java/com/hbm/render/block/RenderRBMKControl.java b/src/main/java/com/hbm/render/block/RenderRBMKControl.java index 19e8f8f6d..176b7be1f 100644 --- a/src/main/java/com/hbm/render/block/RenderRBMKControl.java +++ b/src/main/java/com/hbm/render/block/RenderRBMKControl.java @@ -67,7 +67,7 @@ public class RenderRBMKControl implements ISimpleBlockRenderingHandler { tessellator.addTranslation(x + 0.5F, y, z + 0.5F); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Column", iicon, tessellator, 0, true); - if(block == ModBlocks.rbmk_boiler && world.getBlock(x, y + 1, z) == Blocks.air) { + if(block == ModBlocks.rbmk_boiler && world.getBlock(x, y + 1, z) != block) { //tessellator.addTranslation(0, 0.125F, 0); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Lid", iicon, tessellator, 0, true); //tessellator.addTranslation(0, -0.125F, 0); diff --git a/src/main/java/com/hbm/render/block/RenderRBMKReflector.java b/src/main/java/com/hbm/render/block/RenderRBMKReflector.java index 24b3d9c62..763e917ac 100644 --- a/src/main/java/com/hbm/render/block/RenderRBMKReflector.java +++ b/src/main/java/com/hbm/render/block/RenderRBMKReflector.java @@ -58,7 +58,7 @@ public class RenderRBMKReflector implements ISimpleBlockRenderingHandler { tessellator.addTranslation(x + 0.5F, y, z + 0.5F); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_reflector, "Column", iicon, tessellator, 0, true); - if(world.getBlock(x, y + 1, z) == Blocks.air) + if(world.getBlock(x, y + 1, z) != block) ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_element, "Lid", iicon, tessellator, 0, true); tessellator.addTranslation(-x - 0.5F, -y, -z - 0.5F); diff --git a/src/main/java/com/hbm/render/block/RenderRBMKRod.java b/src/main/java/com/hbm/render/block/RenderRBMKRod.java index 14a90eb4d..b944b5ef0 100644 --- a/src/main/java/com/hbm/render/block/RenderRBMKRod.java +++ b/src/main/java/com/hbm/render/block/RenderRBMKRod.java @@ -59,7 +59,7 @@ public class RenderRBMKRod implements ISimpleBlockRenderingHandler { tessellator.addTranslation(x + 0.5F, y, z + 0.5F); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_element, "Column", iicon, tessellator, 0, true); - if(world.getBlock(x, y + 1, z) == Blocks.air) + if(world.getBlock(x, y + 1, z) != block) ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_element, "Lid", iicon, tessellator, 0, true); tessellator.addTranslation(-x - 0.5F, -y, -z - 0.5F); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 65012ab66..47c53700d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -12,6 +12,7 @@ public class RBMKDials { public static final String KEY_HEAT_PROVISION = "dialHeatProvision"; public static final String KEY_COLUMN_HEIGHT = "dialColumnHeight"; public static final String KEY_PERMANENT_SCRAP = "dialEnablePermaScrap"; + public static final String KEY_BOILER_HEAT_CONSUMPTION = "dialBoilerHeatConsumption"; public static void createDials(World world) { GameRules rules = world.getGameRules(); @@ -22,35 +23,72 @@ public class RBMKDials { rules.setOrCreateGameRule(KEY_HEAT_PROVISION, "0.2"); rules.setOrCreateGameRule(KEY_COLUMN_HEIGHT, "4"); rules.setOrCreateGameRule(KEY_PERMANENT_SCRAP, "false"); + rules.setOrCreateGameRule(KEY_BOILER_HEAT_CONSUMPTION, "0.1"); } - + + /** + * Returns the amount of heat per tick removed from components passively + * @param world + * @return + */ public static double getPassiveCooling(World world) { return shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_PASSIVE_COOLING), 5.0D); } - //[0;1] + /** + * Returns the percentual step size how quickly neighboring component heat equalizes. 1 is instant, 0.5 is in 50% steps, et cetera. + * @param world + * @return [0;1] + */ public static double getColumnHeatFlow(World world) { return MathHelper.clamp_double(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEAT_FLOW), 5.0D), 0.0D, 1.0D); } - //[0;1] + /** + * Returns a modifier for fuel rod diffusion, i.e. how quickly the core and hull temperatures equalize. + * @param world + * @return >0 + */ public static double getFuelDiffusionMod(World world) { - return MathHelper.clamp_double(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_FUEL_DIFFUSION_MOD), 1.0D), 0.0D, 1.0D); + return Math.max(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_FUEL_DIFFUSION_MOD), 1.0D), 0.0D); } - //[0;1] + /** + * Returns the percentual step size how quickly the fuel hull heat and the component heat equalizes. 1 is instant, 0.5 is in 50% steps, et cetera. + * @param world + * @return [0;1] + */ public static double getFuelHeatProvision(World world) { return MathHelper.clamp_double(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_HEAT_PROVISION), 0.2D), 0.0D, 1.0D); } + /** + * Simple integer that decides how tall the structure is. + * @param world + * @return [0;15] + */ public static int getColumnHeight(World world) { return MathHelper.clamp_int(shittyWorkaroundParseInt(world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEIGHT), 4), 1, 16) - 1; } + /** + * Whether or not scrap entities despawn on their own or remain alive until picked up. + * @param world + * @return + */ public static boolean getPermaScrap(World world) { return world.getGameRules().getGameRuleBooleanValue(KEY_PERMANENT_SCRAP); } + /** + * How many heat units are consumed per steam unit (scaled per type) produced. + * @param world + * @return >0 + */ + public static double getBoilerHeatConsumption(World world) { + return Math.max(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_BOILER_HEAT_CONSUMPTION), 0.1D), 0D); + } + //why make the double representation accessible in a game rule when you can just force me to add a second pointless parsing operation? public static double shittyWorkaroundParseDouble(String s, double def) { diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index baa32f6cf..adf553ab7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -132,8 +132,8 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke this.heat -= this.passiveCooling(); - if(heat < 0) - heat = 0D; + if(heat < 20) + heat = 20D; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 54dac8709..a66e2a396 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -42,15 +42,54 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I if(!worldObj.isRemote) { feed.updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId); steam.updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId); + + double heatCap = this.getHeatFromSteam(steam.getTankType()); + double heatProvided = this.heat - heatCap; + + if(heatProvided > 0) { + int waterUsed = (int)Math.floor(heatProvided / RBMKDials.getBoilerHeatConsumption(worldObj)); + waterUsed = Math.min(waterUsed, feed.getFill()); + feed.setFill(feed.getFill() - waterUsed); + int steamProduced = (int)Math.floor((waterUsed * 100) / getFactorFromSteam(steam.getTankType())); + steam.setFill(steam.getFill() + steamProduced); + + if(steam.getFill() > steam.getMaxFill()) { + steam.setFill(steam.getMaxFill()); + } + } + + fillFluidInit(steam.getTankType()); } super.updateEntity(); } + + public double getHeatFromSteam(FluidType type) { + + switch(type) { + case STEAM: return 100D; + case HOTSTEAM: return 300D; + case SUPERHOTSTEAM: return 450D; + case ULTRAHOTSTEAM: return 600D; + default: return 0D; + } + } + + public double getFactorFromSteam(FluidType type) { + + switch(type) { + case STEAM: return 1D; + case HOTSTEAM: return 10D; + case SUPERHOTSTEAM: return 100D; + case ULTRAHOTSTEAM: return 1000D; + default: return 0D; + } + } @Override public void fillFluidInit(FluidType type) { - fillFluid(this.xCoord, this.yCoord + 5, this.zCoord, getTact(), type); + fillFluid(this.xCoord, this.yCoord + RBMKDials.getColumnHeight(worldObj) + 1, this.zCoord, getTact(), type); } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index afe85734b..88f2e101b 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1396,6 +1396,8 @@ item.ingot_uranium_fuel.name=Urankernbrennstoffbarren item.ingot_verticium.name=Verticiumbarren item.ingot_weidanium.name=Weidaniumbarren item.ingot_zirconium.name=Zirkoniumwürfel +item.injector_5htp.name=5-HTP-Autoinjektor +item.injector_knife.name=20cm Klingen-Autoinjektor item.ink.name=林-Tinte item.insert_doxium.name=Astolfium-dottierte Doxiumeinlage item.insert_du.name=DU-Einlage diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index f63a41a00..94fbd8b33 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1396,6 +1396,8 @@ item.ingot_uranium_fuel.name=Ingot of Uranium Fuel item.ingot_verticium.name=Verticium Ingot item.ingot_weidanium.name=Weidanium Ingot item.ingot_zirconium.name=Zirconium Cube +item.injector_5htp.name=5-HTP Autoinjector +item.injector_knife.name=8 Inch Blade Autoinjector item.ink.name=林 Ink item.insert_doxium.name=Astolfium-Doped Doxium Insert item.insert_du.name=DU Insert diff --git a/src/main/resources/assets/hbm/textures/items/injector_5htp.png b/src/main/resources/assets/hbm/textures/items/injector_5htp.png new file mode 100644 index 0000000000000000000000000000000000000000..19ff0a9cdbf59636be7d25bcb8974575271d8fc0 GIT binary patch literal 284 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 literal 0 HcmV?d00001