From 43c43eb14fcc95d2a7f24535c599c08c93006bf9 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 22 Apr 2023 16:00:07 +0200 Subject: [PATCH] watz fuel stats, more construction recipes --- .../blocks/generic/BlockToolConversion.java | 3 +- .../hbm/handler/nei/ConstructionHandler.java | 46 ++++++++++++++++-- .../com/hbm/items/machine/ItemWatzPellet.java | 38 ++++++++------- .../java/com/hbm/items/tool/ItemBoltgun.java | 7 ++- .../tileentity/machine/TileEntityWatz.java | 13 +++-- .../java/com/hbm/util/function/Function.java | 14 +++--- src/main/resources/assets/hbm/sounds.json | 1 + .../assets/hbm/sounds/tool/boltgun.ogg | Bin 0 -> 13695 bytes 8 files changed, 87 insertions(+), 35 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/tool/boltgun.ogg diff --git a/src/main/java/com/hbm/blocks/generic/BlockToolConversion.java b/src/main/java/com/hbm/blocks/generic/BlockToolConversion.java index ddb34f66e..582db2d18 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockToolConversion.java +++ b/src/main/java/com/hbm/blocks/generic/BlockToolConversion.java @@ -95,9 +95,10 @@ public class BlockToolConversion extends BlockMulti implements IToolable, ILookO if(list == null || list.isEmpty() || InventoryUtil.doesPlayerHaveAStacks(player, list, true)) { world.setBlock(x, y, z, result.value.block, result.value.meta, 3); + return true; } - return true; + return false; } @Override diff --git a/src/main/java/com/hbm/handler/nei/ConstructionHandler.java b/src/main/java/com/hbm/handler/nei/ConstructionHandler.java index e6b93517f..240ad58af 100644 --- a/src/main/java/com/hbm/handler/nei/ConstructionHandler.java +++ b/src/main/java/com/hbm/handler/nei/ConstructionHandler.java @@ -4,8 +4,10 @@ import java.util.HashMap; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; +import com.hbm.util.ItemStackUtil; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; public class ConstructionHandler extends NEIUniversalHandler { @@ -42,11 +44,11 @@ public class ConstructionHandler extends NEIUniversalHandler { /* ITER */ ItemStack[] iter = new ItemStack[] { - new ItemStack(ModBlocks.fusion_conductor, 64), - new ItemStack(ModBlocks.fusion_conductor, 64), - new ItemStack(ModBlocks.fusion_conductor, 64), - new ItemStack(ModBlocks.fusion_conductor, 64), new ItemStack(ModBlocks.fusion_conductor, 36), + new ItemStack(ModBlocks.fusion_conductor, 64), + new ItemStack(ModBlocks.fusion_conductor, 64), + new ItemStack(ModBlocks.fusion_conductor, 64), + new ItemStack(ModBlocks.fusion_conductor, 64), new ItemStack(ModBlocks.fusion_center, 64), new ItemStack(ModBlocks.fusion_motor, 4), new ItemStack(ModBlocks.reinforced_glass, 8)}; @@ -54,6 +56,42 @@ public class ConstructionHandler extends NEIUniversalHandler { bufferedRecipes.put(iter, new ItemStack(ModBlocks.iter)); bufferedTools.put(iter, new ItemStack(ModBlocks.struct_iter_core)); + /* PLASMA HEATER */ + ItemStack[] heater = new ItemStack[] { + new ItemStack(ModBlocks.fusion_heater, 7), + new ItemStack(ModBlocks.fusion_heater, 64), + new ItemStack(ModBlocks.fusion_heater, 64) }; + + bufferedRecipes.put(heater, new ItemStack(ModBlocks.plasma_heater)); + bufferedTools.put(heater, new ItemStack(ModBlocks.struct_plasma_core)); + + /* COMPACT LAUNCHER */ + ItemStack[] launcher = new ItemStack[] { new ItemStack(ModBlocks.struct_launcher, 8) }; + + bufferedRecipes.put(launcher, new ItemStack(ModBlocks.compact_launcher)); + bufferedTools.put(launcher, new ItemStack(ModBlocks.struct_launcher_core)); + + /* LAUNCH TABLE */ + ItemStack[] table = new ItemStack[] { + new ItemStack(ModBlocks.struct_launcher, 16), + new ItemStack(ModBlocks.struct_launcher, 64), + new ItemStack(ModBlocks.struct_scaffold, 11)}; + + bufferedRecipes.put(table, new ItemStack(ModBlocks.launch_table)); + bufferedTools.put(table, new ItemStack(ModBlocks.struct_launcher_core_large)); + + /* SOYUZ LAUNCHER */ + ItemStack[] soysauce = new ItemStack[] { + new ItemStack(ModBlocks.struct_launcher, 60), + ItemStackUtil.addTooltipToStack(new ItemStack(ModBlocks.struct_launcher, 320), EnumChatFormatting.RED + "5x64"), + new ItemStack(ModBlocks.struct_scaffold, 53), + ItemStackUtil.addTooltipToStack(new ItemStack(ModBlocks.struct_scaffold, 384), EnumChatFormatting.RED + "6x64"), + new ItemStack(ModBlocks.concrete_smooth, 8), + ItemStackUtil.addTooltipToStack(new ItemStack(ModBlocks.concrete_smooth, 320), EnumChatFormatting.RED + "5x64"),}; + + bufferedRecipes.put(soysauce, new ItemStack(ModBlocks.soyuz_launcher)); + bufferedTools.put(soysauce, new ItemStack(ModBlocks.struct_soyuz_core)); + return recipes ? bufferedRecipes : bufferedTools; } } diff --git a/src/main/java/com/hbm/items/machine/ItemWatzPellet.java b/src/main/java/com/hbm/items/machine/ItemWatzPellet.java index 0b782df9d..4a0f35dc1 100644 --- a/src/main/java/com/hbm/items/machine/ItemWatzPellet.java +++ b/src/main/java/com/hbm/items/machine/ItemWatzPellet.java @@ -36,18 +36,18 @@ public class ItemWatzPellet extends ItemEnumMulti { public static enum EnumWatzType { - SCHRABIDIUM( 0x32FFFF, 0x005C5C, 2_000, 10D, new FunctionLogarithmic(10), null, null), - HES( 0x66DCD6, 0x023933, 1_500, 10D, null, null, null), - MES( 0xCBEADF, 0x28473C, 1_000, 10D, null, null, null), - LES( 0xABB4A8, 0x0C1105, 500, 10D, null, null, null), - HEN( 0xA6B2A6, 0x030F03, 0, 10D, null, null, null), - MEU( 0xC1C7BD, 0x2B3227, 0, 10D, null, null, null), - MEP( 0x9AA3A0, 0x111A17, 0, 10D, null, null, null), - LEAD( 0xA6A6B2, 0x03030F, 0, 0, null, null, new FunctionSqrt(10)), //standard absorber, negative coefficient - BORON( 0xBDC8D2, 0x29343E, 0, 0, null, null, new FunctionLinear(10)), //improved absorber, linear - DU( 0xC1C7BD, 0x2B3227, 0, 0, null, null, new FunctionQuadratic(1D, 1D).withDiv(100)), //absorber with positive coefficient - NQD( 0x4B4B4B, 0x121212, 0, 0, null, null, null), - NQR( 0x2D2D2D, 0x0B0B0B, 0, 0, null, null, null); + SCHRABIDIUM( 0x32FFFF, 0x005C5C, 2_000, 20D, 0.02D, new FunctionLinear(1.5D), new FunctionSqrt(1D/20D).withOff(20D * 20D), null), + HES( 0x66DCD6, 0x023933, 1_750, 20D, 0.01D, new FunctionLinear(1.25D), new FunctionSqrt(1/15D).withOff(15D*15D), null), + MES( 0xCBEADF, 0x28473C, 1_500, 15D, 0.005D, new FunctionLinear(1.15D), new FunctionSqrt(1/15D).withOff(15D*15D), null), + LES( 0xABB4A8, 0x0C1105, 1_250, 15D, 0.0025D, new FunctionLinear(1D), new FunctionSqrt(1/10D).withOff(10D*10D), null), + HEN( 0xA6B2A6, 0x030F03, 0, 10D, 0.001D, new FunctionSqrt(100), null, null), + MEU( 0xC1C7BD, 0x2B3227, 0, 10D, 0.001D, new FunctionSqrt(75), null, null), + MEP( 0x9AA3A0, 0x111A17, 0, 15D, 0.001D, new FunctionSqrt(150), new FunctionSqrt(1D/20D).withOff(20D * 20D), null), + LEAD( 0xA6A6B2, 0x03030F, 0, 0, 0.005D, null, null, new FunctionSqrt(10)), //standard absorber, negative coefficient + BORON( 0xBDC8D2, 0x29343E, 0, 0, 0.005D, null, null, new FunctionLinear(10)), //improved absorber, linear + DU( 0xC1C7BD, 0x2B3227, 0, 0, 0.005D, null, null, new FunctionQuadratic(1D, 1D).withDiv(100)), //absorber with positive coefficient + NQD( 0x4B4B4B, 0x121212, 2_000, 20, 0.02D, new FunctionLinear(2D), new FunctionSqrt(1D/25D).withOff(25D * 25D), null), + NQR( 0x2D2D2D, 0x0B0B0B, 2_500, 30, 0.02D, new FunctionLinear(1.5D), new FunctionSqrt(1D/25D).withOff(25D * 25D), null); public double yield = 1_000_000_000; public int colorLight; @@ -56,16 +56,17 @@ public class ItemWatzPellet extends ItemEnumMulti { public double passive; //base flux emission public double heatEmission; //reactivity(1) to heat (heat per outgoing flux) public Function burnFunc; //flux to reactivity(0) (classic reactivity) - public Function heatMult; //reactivity(0) to reactivity(1) based on heat (temperature coefficient) + public Function heatDiv; //reactivity(0) to reactivity(1) based on heat (temperature coefficient) public Function absorbFunc; //flux to heat (flux absobtion for non-active component) - private EnumWatzType(int colorLight, int colorDark, double passive, double heatEmission, Function burnFunction, Function heatMultiplier, Function absorbFunction) { + private EnumWatzType(int colorLight, int colorDark, double passive, double heatEmission, double mudContent, Function burnFunction, Function heatDivisor, Function absorbFunction) { this.colorLight = colorLight; this.colorDark = colorDark; this.passive = passive; this.heatEmission = heatEmission; + this.mudContent = mudContent; this.burnFunc = burnFunction; - this.heatMult = heatMultiplier; + this.heatDiv = heatDivisor; this.absorbFunc = absorbFunction; } } @@ -129,13 +130,16 @@ public class ItemWatzPellet extends ItemEnumMulti { String color = EnumChatFormatting.GOLD + ""; String reset = EnumChatFormatting.RESET + ""; - if(num.passive > 0) list.add(color + "Base fission rate: " + reset + num.passive); + if(num.passive > 0){ + list.add(color + "Base fission rate: " + reset + num.passive); + list.add(EnumChatFormatting.RED + "Self-ingiting!"); + } if(num.heatEmission > 0) list.add(color + "Heat per flux: " + reset + num.heatEmission + " TU"); if(num.burnFunc != null) { list.add(color + "Reacton function: " + reset + num.burnFunc.getLabelForFuel()); list.add(color + "Fuel type: " + reset + num.burnFunc.getDangerFromFuel()); } - if(num.heatMult != null) list.add(color + "Thermal coefficient: " + reset + num.heatMult.getLabelForFuel()); + if(num.heatDiv != null) list.add(color + "Thermal multiplier: " + reset + num.heatDiv.getLabelForFuel() + " TU⁻¹"); if(num.absorbFunc != null) list.add(color + "Flux capture: " + reset + num.absorbFunc.getLabelForFuel()); } diff --git a/src/main/java/com/hbm/items/tool/ItemBoltgun.java b/src/main/java/com/hbm/items/tool/ItemBoltgun.java index b97fb4b7a..a4ef287f3 100644 --- a/src/main/java/com/hbm/items/tool/ItemBoltgun.java +++ b/src/main/java/com/hbm/items/tool/ItemBoltgun.java @@ -10,6 +10,7 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; +import com.hbm.util.EntityDamageUtil; import api.hbm.block.IToolable; import api.hbm.block.IToolable.ToolType; @@ -58,9 +59,10 @@ public class ItemBoltgun extends Item implements IAnimatedItem { if(slot != null) { if(slot.getItem() == item) { if(!world.isRemote) { + world.playSoundAtEntity(entity, "hbm:item.boltgun", 1.0F, 1.0F); player.inventory.decrStackSize(i, 1); player.inventoryContainer.detectAndSendChanges(); - entity.attackEntityFrom(DamageSource.causePlayerDamage(player).setDamageBypassesArmor(), 10F); + EntityDamageUtil.attackEntityFromIgnoreIFrame(entity, DamageSource.causePlayerDamage(player).setDamageBypassesArmor(), 10F); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); @@ -92,7 +94,8 @@ public class ItemBoltgun extends Item implements IAnimatedItem { if(b instanceof IToolable && ((IToolable)b).onScrew(world, player, x, y, z, side, fX, fY, fZ, ToolType.BOLT)) { if(!world.isRemote) { - + + world.playSoundAtEntity(player, "hbm:item.boltgun", 1.0F, 1.0F); player.inventoryContainer.detectAndSendChanges(); ForgeDirection dir = ForgeDirection.getOrientation(side); double off = 0.25; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index 4b8bc95e3..be72c62f4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -181,11 +181,11 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand for(ItemStack stack : pellets) { EnumWatzType type = EnumUtil.grabEnumSafely(EnumWatzType.class, stack.getItemDamage()); Function burnFunc = type.burnFunc; - Function heatMod = type.heatMult; + Function heatDiv = type.heatDiv; if(burnFunc != null) { - double mod = heatMod != null ? heatMod.effonix(heat) : 1D; - double burn = burnFunc.effonix(inputFlux) * mod; + double div = heatDiv != null ? heatDiv.effonix(heat) : 1D; + double burn = burnFunc.effonix(inputFlux) / div; ItemWatzPellet.setYield(stack, ItemWatzPellet.getYield(stack) - burn); addedFlux += burn; addedHeat += type.heatEmission * burn; @@ -198,7 +198,10 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand Function absorbFunc = type.absorbFunc; if(absorbFunc != null) { - addedHeat += absorbFunc.effonix(baseFlux + fluxLastReaction); + double absorb = absorbFunc.effonix(baseFlux + fluxLastReaction); + addedHeat += absorb; + ItemWatzPellet.setYield(stack, ItemWatzPellet.getYield(stack) - absorb); + tanks[2].setFill(tanks[2].getFill() + (int) Math.round(type.mudContent * absorb)); } } @@ -309,6 +312,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand } for(int i = 0; i < tanks.length; i++) tanks[i].readFromNBT(nbt, "t" + i); + this.heat = nbt.getInteger("heat"); this.fluxLastBase = nbt.getDouble("lastFluxB"); this.fluxLastReaction = nbt.getDouble("lastFluxR"); @@ -332,6 +336,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand nbt.setTag("locks", list); for(int i = 0; i < tanks.length; i++) tanks[i].writeToNBT(nbt, "t" + i); + nbt.setInteger("heat", this.heat); nbt.setDouble("lastFluxB", fluxLastBase); nbt.setDouble("lastFluxR", fluxLastReaction); diff --git a/src/main/java/com/hbm/util/function/Function.java b/src/main/java/com/hbm/util/function/Function.java index c9825d3e4..6f50ee651 100644 --- a/src/main/java/com/hbm/util/function/Function.java +++ b/src/main/java/com/hbm/util/function/Function.java @@ -27,8 +27,8 @@ public abstract class Function { public String getXName(boolean brackets) { String x = "x"; boolean mod = false; - if(div != 1D) x += " / " + div; - if(off != 0D) x += " + " + off; + if(div != 1D) x += " / " + String.format("%,.1f", div); + if(off != 0D) x += " + " + String.format("%,.1f", off); if(mod && brackets) x = "(" + x + ")"; return x; } @@ -46,28 +46,28 @@ public abstract class Function { public static class FunctionLogarithmic extends FunctionSingleArg { public FunctionLogarithmic(double level) { super(level); this.withOff(1D); } @Override public double effonix(double x) { return Math.log10(getX(x)) * level; } - @Override public String getLabelForFuel() { return "log10(" + getXName(false) + ") * " + level; } + @Override public String getLabelForFuel() { return "log10(" + getXName(false) + ") * " + String.format("%,.1f", this.level); } @Override public String getDangerFromFuel() { return EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"; } } public static class FunctionPassive extends FunctionSingleArg { public FunctionPassive(double level) { super(level); } @Override public double effonix(double x) { return this.level; } - @Override public String getLabelForFuel() { return "" + level; } + @Override public String getLabelForFuel() { return "" + String.format("%,.1f", this.level); } @Override public String getDangerFromFuel() { return EnumChatFormatting.DARK_GREEN + "SAFE / PASSIVE"; } } public static class FunctionSqrt extends FunctionSingleArg { public FunctionSqrt(double level) { super(level); } @Override public double effonix(double x) { return BobMathUtil.squirt(getX(x)) * this.level; } - @Override public String getLabelForFuel() { return "sqrt(" + getXName(false) + ") * " + this.level; } //not entirely correct but good enough + @Override public String getLabelForFuel() { return "sqrt(" + getXName(false) + ") * " + String.format("%,.3f", this.level); } //not entirely correct but good enough @Override public String getDangerFromFuel() { return EnumChatFormatting.YELLOW + "MEDIUM / SQUARE ROOT"; } } public static class FunctionLinear extends FunctionSingleArg { public FunctionLinear(double level) { super(level); } @Override public double effonix(double x) { return getX(x) * this.level; } - @Override public String getLabelForFuel() { return getXName(true) + " * " + this.level; } + @Override public String getLabelForFuel() { return getXName(true) + " * " + String.format("%,.1f", this.level); } @Override public String getDangerFromFuel() { return EnumChatFormatting.RED + "DANGEROUS / LINEAR"; } } @@ -75,7 +75,7 @@ public abstract class Function { public FunctionQuadratic(double level) { super(level, 0D); } public FunctionQuadratic(double level, double vOff) { super(level, vOff); } @Override public double effonix(double x) { return getX(x) * getX(x) * this.level + this.vOff; } - @Override public String getLabelForFuel() { return getXName(true) + "² * " + this.level + (vOff != 0 ? (" + " + vOff) : ""); } + @Override public String getLabelForFuel() { return getXName(true) + "² * " + String.format("%,.1f", this.level) + (vOff != 0 ? (" + " + String.format("%,.1f", vOff)) : ""); } @Override public String getDangerFromFuel() { return EnumChatFormatting.RED + "DANGEROUS / QUADRATIC"; } } } diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 6458aa7fc..ab2066140 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -78,6 +78,7 @@ "item.vice": {"category": "player", "sounds": [{"name": "tool/vice", "stream": false}]}, "item.upgradePlug": {"category": "player", "sounds": [{"name": "tool/upgradePlug", "stream": false}]}, "item.battery": {"category": "player", "sounds": [{"name": "tool/battery", "stream": false}]}, + "item.boltgun": {"category": "player", "sounds": [{"name": "tool/boltgun", "stream": false}]}, "music.recordLambdaCore": {"category": "record", "sounds": [{"name": "music/recordLambdaCore", "stream": true}]}, "music.recordSectorSweep": {"category": "record", "sounds": [{"name": "music/recordSectorSweep", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/tool/boltgun.ogg b/src/main/resources/assets/hbm/sounds/tool/boltgun.ogg new file mode 100644 index 0000000000000000000000000000000000000000..98356b58b2e9318fde1afccc83d6a171bf8826cf GIT binary patch literal 13695 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 aZ((ilAA6vczkk*GmqFmw3hG$q%KruRF6f^C literal 0 HcmV?d00001