more RBMK gamerules, fixed RBMK fuels incorrect init, proper heat gen

This commit is contained in:
Bob 2021-04-28 22:52:42 +02:00
parent 4a5947cec5
commit f2f6df24b8
8 changed files with 76 additions and 30 deletions

View File

@ -1,13 +1,13 @@
package com.hbm.blocks.machine.rbmk; package com.hbm.blocks.machine.rbmk;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBoiler; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBoiler;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class RBMKBoiler extends RBMKBase { public class RBMKBoiler extends RBMKBase {
@ -16,6 +16,10 @@ public class RBMKBoiler extends RBMKBase {
if(meta >= this.offset) if(meta >= this.offset)
return new TileEntityRBMKBoiler(); return new TileEntityRBMKBoiler();
if(hasExtra(meta))
return new TileEntityProxyCombo(false, false, true);
return null; return null;
} }
@ -28,4 +32,10 @@ public class RBMKBoiler extends RBMKBase {
public int getRenderType(){ public int getRenderType(){
return this.renderIDControl; return this.renderIDControl;
} }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
this.makeExtra(world, x, y + 3, z);
}
} }

View File

@ -1,11 +1,13 @@
package com.hbm.blocks.machine.rbmk; package com.hbm.blocks.machine.rbmk;
import com.hbm.blocks.ModBlocks; import com.hbm.blocks.ModBlocks;
import com.hbm.tileentity.TileEntityProxyInventory;
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKRod; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKRod;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class RBMKRod extends RBMKBase { public class RBMKRod extends RBMKBase {
@ -15,6 +17,9 @@ public class RBMKRod extends RBMKBase {
if(meta >= this.offset) if(meta >= this.offset)
return new TileEntityRBMKRod(); return new TileEntityRBMKRod();
if(hasExtra(meta))
return new TileEntityProxyInventory();
return null; return null;
} }
@ -27,4 +32,10 @@ public class RBMKRod extends RBMKBase {
public int getRenderType(){ public int getRenderType(){
return this.renderIDRods; return this.renderIDRods;
} }
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
this.makeExtra(world, x, y + 3, z);
}
} }

View File

@ -2534,7 +2534,7 @@ public class ModItems {
redstone_depleted = new Item().setUnlocalizedName("redstone_depleted").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":redstone_depleted"); redstone_depleted = new Item().setUnlocalizedName("redstone_depleted").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":redstone_depleted");
powder_power = new ItemCustomLore().setUnlocalizedName("powder_power").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_energy_alt"); powder_power = new ItemCustomLore().setUnlocalizedName("powder_power").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_energy_alt");
powder_iodine = new ItemCustomLore().setUnlocalizedName("powder_iodine").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_iodine"); powder_iodine = new ItemCustomLore().setUnlocalizedName("powder_iodine").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_iodine");
powder_thorium = new ItemCustomLore().setUnlocalizedName("powder_thorium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_thorium"); powder_thorium = new ItemHazard().addRadiation(ItemHazard.th232 * ItemHazard.powder).toItem().setUnlocalizedName("powder_thorium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_thorium");
powder_neodymium = new ItemCustomLore().setUnlocalizedName("powder_neodymium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_neodymium"); powder_neodymium = new ItemCustomLore().setUnlocalizedName("powder_neodymium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_neodymium");
powder_astatine = new ItemCustomLore().setUnlocalizedName("powder_astatine").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_astatine"); powder_astatine = new ItemCustomLore().setUnlocalizedName("powder_astatine").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_astatine");
powder_caesium = new ItemCustomLore().setUnlocalizedName("powder_caesium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_caesium"); powder_caesium = new ItemCustomLore().setUnlocalizedName("powder_caesium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_caesium");

View File

@ -6,12 +6,14 @@ import com.hbm.items.ModItems;
import com.hbm.items.special.ItemHazard; import com.hbm.items.special.ItemHazard;
import com.hbm.main.MainRegistry; import com.hbm.main.MainRegistry;
import com.hbm.tileentity.machine.rbmk.IRBMKFluxReceiver.NType; import com.hbm.tileentity.machine.rbmk.IRBMKFluxReceiver.NType;
import com.hbm.tileentity.machine.rbmk.RBMKDials;
import com.hbm.util.I18nUtil; import com.hbm.util.I18nUtil;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
public class ItemRBMKRod extends ItemHazard { public class ItemRBMKRod extends ItemHazard {
@ -61,7 +63,7 @@ public class ItemRBMKRod extends ItemHazard {
return this; return this;
} }
public ItemRBMKRod setStats(double funcStart) { public ItemRBMKRod setStats(double funcEnd) {
return setStats(funcEnd, 0); return setStats(funcEnd, 0);
} }
@ -130,16 +132,17 @@ public class ItemRBMKRod extends ItemHazard {
* Heat up the core based on the outFlux, then move some heat to the hull * Heat up the core based on the outFlux, then move some heat to the hull
* @param stack * @param stack
*/ */
public void updateHeat(ItemStack stack) { public void updateHeat(World world, ItemStack stack) {
//TODO: use exponentials so the heat function isn't linear (to allow very spicy core temperatures)
double coreHeat = this.getCoreHeat(stack); double coreHeat = this.getCoreHeat(stack);
double hullHeat = this.getHullHeat(stack); double hullHeat = this.getHullHeat(stack);
if(coreHeat > hullHeat) { if(coreHeat > hullHeat) {
coreHeat -= this.diffusion; double mid = (coreHeat - hullHeat) / 2D;
hullHeat += this.diffusion;
coreHeat -= mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world);
hullHeat += mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world);
this.setCoreHeat(stack, coreHeat); this.setCoreHeat(stack, coreHeat);
this.setHullHeat(stack, hullHeat); this.setHullHeat(stack, hullHeat);
@ -151,14 +154,16 @@ public class ItemRBMKRod extends ItemHazard {
* @param stack * @param stack
* @return * @return
*/ */
public double provideHeat(ItemStack stack, double heat) { public double provideHeat(World world, ItemStack stack, double heat) {
double hullHeat = this.getHullHeat(stack); double hullHeat = this.getHullHeat(stack);
if(hullHeat <= heat) if(hullHeat <= heat)
return 0; return 0;
double ret = (hullHeat - heat) / 2; //TODO: replace this with an euler func that employs our old buddy diffusion double ret = (hullHeat - heat) / 2;
ret *= RBMKDials.getFuelHeatProvision(world);
hullHeat -= ret; hullHeat -= ret;
this.setHullHeat(stack, hullHeat); this.setHullHeat(stack, hullHeat);
@ -227,7 +232,7 @@ public class ItemRBMKRod extends ItemHazard {
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.xenonGen", EnumChatFormatting.WHITE + "x * " + xGen)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.xenonGen", EnumChatFormatting.WHITE + "x * " + xGen));
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.xenonBurn", EnumChatFormatting.WHITE + "x² * " + xBurn)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmx.xenonBurn", EnumChatFormatting.WHITE + "x² * " + xBurn));
list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmx.heat", heat + "°C")); list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmx.heat", heat + "°C"));
list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmx.diffusion", diffusion + "°C/t")); list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmx.diffusion", diffusion + "¹/²"));
list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "m"));
list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "m"));
list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmx.melt", meltingPoint + "m")); list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmx.melt", meltingPoint + "m"));
@ -246,7 +251,7 @@ public class ItemRBMKRod extends ItemHazard {
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.xenonGen", EnumChatFormatting.WHITE + "x * " + xGen)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.xenonGen", EnumChatFormatting.WHITE + "x * " + xGen));
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.xenonBurn", EnumChatFormatting.WHITE + "x² * " + xBurn)); list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("trait.rbmk.xenonBurn", EnumChatFormatting.WHITE + "x² * " + xBurn));
list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmk.heat", heat + "°C")); list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmk.heat", heat + "°C"));
list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmk.diffusion", diffusion + "°C/t")); list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("trait.rbmk.diffusion", diffusion + "¹/²"));
list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "°C")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "°C"));
list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "°C")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "°C"));
list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmk.melt", meltingPoint + "°C")); list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmk.melt", meltingPoint + "°C"));

View File

@ -2,6 +2,7 @@ package com.hbm.render.block;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.blocks.machine.rbmk.RBMKBase;
import com.hbm.main.ResourceManager; import com.hbm.main.ResourceManager;
import com.hbm.render.util.ObjUtil; import com.hbm.render.util.ObjUtil;
@ -10,6 +11,7 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Blocks;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.model.obj.WavefrontObject; import net.minecraftforge.client.model.obj.WavefrontObject;
@ -40,9 +42,11 @@ public class RenderRBMKControl implements ISimpleBlockRenderingHandler {
GL11.glTranslated(0, 1, 0); GL11.glTranslated(0, 1, 0);
} }
tessellator.startDrawingQuads(); if(block != ModBlocks.rbmk_boiler) {
ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Lid", iicon, tessellator, 0, true); tessellator.startDrawingQuads();
tessellator.draw(); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Lid", iicon, tessellator, 0, true);
tessellator.draw();
}
GL11.glPopMatrix(); GL11.glPopMatrix();
} }
@ -63,14 +67,11 @@ public class RenderRBMKControl implements ISimpleBlockRenderingHandler {
tessellator.addTranslation(x + 0.5F, y, z + 0.5F); tessellator.addTranslation(x + 0.5F, y, z + 0.5F);
ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Column", iicon, tessellator, 0, true); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Column", iicon, tessellator, 0, true);
/*if(world.getBlock(x, y + 1, z) == Blocks.air) { if(block == ModBlocks.rbmk_boiler && world.getBlock(x, y + 1, z) == Blocks.air) {
//tessellator.addTranslation(0, 0.125F, 0); //tessellator.addTranslation(0, 0.125F, 0);
ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Lid", iicon, tessellator, 0, true); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_rods, "Lid", iicon, tessellator, 0, true);
//tessellator.addTranslation(0, -0.125F, 0); //tessellator.addTranslation(0, -0.125F, 0);
}*/ }
//if(world.getBlock(x, y + 1, z) == Blocks.air)
// ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.rbmk_element, "Lid", ModBlocks.rbmk_rod.getIcon(0, 0), tessellator, 0, true);
tessellator.addTranslation(-x - 0.5F, -y, -z - 0.5F); tessellator.addTranslation(-x - 0.5F, -y, -z - 0.5F);

View File

@ -1,23 +1,44 @@
package com.hbm.tileentity.machine.rbmk; package com.hbm.tileentity.machine.rbmk;
import net.minecraft.util.MathHelper;
import net.minecraft.world.GameRules; import net.minecraft.world.GameRules;
import net.minecraft.world.World; import net.minecraft.world.World;
public class RBMKDials { public class RBMKDials {
public static final String KEY_PASSIVE_COOLING = "dialPassiveCooling"; public static final String KEY_PASSIVE_COOLING = "dialPassiveCooling";
public static final String KEY_COLUMN_HEAT_FLOW = "dialColumnHeatFlow";
public static final String KEY_FUEL_DIFFUSION_MOD = "dialDiffusionMod";
public static final String KEY_HEAT_PROVISION = "dialHeatProvision";
public static void createDials(World world) { public static void createDials(World world) {
GameRules rules = world.getGameRules(); GameRules rules = world.getGameRules();
if(!rules.getGameRuleStringValue(KEY_PASSIVE_COOLING).isEmpty()) rules.setOrCreateGameRule(KEY_PASSIVE_COOLING, "5.0");
rules.setOrCreateGameRule(KEY_PASSIVE_COOLING, "5.0"); rules.setOrCreateGameRule(KEY_COLUMN_HEAT_FLOW, "0.2");
rules.setOrCreateGameRule(KEY_FUEL_DIFFUSION_MOD, "1.0");
rules.setOrCreateGameRule(KEY_HEAT_PROVISION, "0.2");
} }
public static double getPassiveCooling(World world) { public static double getPassiveCooling(World world) {
return shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_PASSIVE_COOLING), 5.0D); return shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_PASSIVE_COOLING), 5.0D);
} }
//[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]
public static double getFuelDiffusionMod(World world) {
return MathHelper.clamp_double(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_FUEL_DIFFUSION_MOD), 1.0D), 0.0D, 1.0D);
}
//[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);
}
//why make the double representation accessible in a game rule when you can just force me to add a second pointless parsing operation? //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) { public static double shittyWorkaroundParseDouble(String s, double def) {

View File

@ -114,7 +114,7 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
} }
int members = rec.size(); int members = rec.size();
double stepSize = 0.2D; double stepSize = RBMKDials.getColumnHeatFlow(worldObj);
if(members > 1) { if(members > 1) {
@ -128,9 +128,6 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
} }
} }
/**
* TODO: add faster passive cooling based on temperature (blackbody radiation has an exponent of 4!)
*/
private void coolPassively() { private void coolPassively() {
this.heat -= this.passiveCooling(); this.heat -= this.passiveCooling();

View File

@ -47,11 +47,12 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM
ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem());
double fluxIn = fluxFromType(rod.nType); double fluxIn = fluxFromType(rod.nType);
//System.out.println(fluxIn + " - " + this.fluxFast + " - " + this.fluxSlow);
double fluxOut = rod.burn(slots[0], fluxIn); double fluxOut = rod.burn(slots[0], fluxIn);
NType rType = rod.rType; NType rType = rod.rType;
rod.updateHeat(slots[0]); rod.updateHeat(worldObj, slots[0]);
this.heat += rod.provideHeat(slots[0], heat); this.heat += rod.provideHeat(worldObj, slots[0], heat);
//for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back //for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back
this.fluxFast = 0; this.fluxFast = 0;