From 841864e3689ec7a5aab4cf0112a2796a518ade78 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 27 Jan 2025 16:55:41 +0100 Subject: [PATCH] the blombus --- changelog | 10 ++- .../recipes/ParticleAcceleratorRecipes.java | 2 +- .../inventory/recipes/anvil/AnvilRecipes.java | 57 ++++++++++++++- .../recipes/loader/SerializableRecipe.java | 3 + .../machine/albion/TileEntityPADetector.java | 71 ++++++++++++++++++- .../machine/albion/TileEntityPASource.java | 2 +- .../machine/rbmk/TileEntityRBMKBase.java | 5 +- 7 files changed, 143 insertions(+), 7 deletions(-) diff --git a/changelog b/changelog index db0987c5a..ea9b5d05a 100644 --- a/changelog +++ b/changelog @@ -4,6 +4,9 @@ * Can be cooled into cold perflyoromethyl using two compressors to be used as coolant for particle accelerators * Also required for soldering all control units * Standard coolant will be removed soon in favor of perfloromethyl, however for now it continues to function just the same +# Particle accelerator + * A new and improved version of the old one + * Instead of being assembled block by block with weird rules, the new PA is assembled from six different machine parts, similar to how RBMKs work ## Changed * The bedrock ore processor now has an NEI handler @@ -25,10 +28,11 @@ * Removed compression recipes for steam, because why would you ever use those? * Fluid tanks that use pressurized fluids now say "pressurized, use compressor!" to avoid confusion over what "1PU" means * Damage should no longer register at all when the damage resistance is 100%, similar to how damage is completely nullified by DT (i.e. not even knockback is applied) +* Anvil construction recipes are now configurable via `hbmAnvil.json` ## Fixed * Fixed incorrect tooltip in the automatic control rod's GUI -* Fixed recipe autogen creating recipes for nonexistant thorium bedrock ore +* Fixed recipe autogen creating recipes for nonexistant thorium nether ore * Fixed FBI agents spawning both the old and new bullet entities when firing * Fixed dupe concerning one of the weapon abilities * Fixed crates not sending a block update when the contents change, breaking redstone comparator functionality @@ -37,5 +41,7 @@ * Gun damage now also does 0 points of vanilla damage, ensuring that certain entity events trigger, e.g. neutral mobs targeting the player * Fixed items being deleted by the crucible when using hotbar shortcuts by disabling hotkey shortcuts entirely * How about you shift-click like a normal person + * Hotkey shortcuts may return, but this requires a substantial rewrite of the container base code because vanilla's implementation is atrocious * Fixed legendary crafting causing disconnects on servers -* Fixed a dupe caused by shift clicking \ No newline at end of file +* Fixed a dupe caused by shift clicking +* Added more safeguards and range checks to ReaSim water calculation which might fix the issue of ReaSim water breaking completely \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java b/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java index 9179182ff..7936a6015 100644 --- a/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java @@ -17,7 +17,7 @@ import net.minecraft.item.ItemStack; public class ParticleAcceleratorRecipes extends SerializableRecipe { - private static final List recipes = new ArrayList(); + public static final List recipes = new ArrayList(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 56a5ea997..9ff9ae027 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -1,8 +1,12 @@ package com.hbm.inventory.recipes.anvil; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.inventory.OreDictManager; @@ -18,10 +22,12 @@ import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.recipes.AssemblerRecipes; import com.hbm.inventory.recipes.AssemblerRecipes.AssemblerRecipe; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; import com.hbm.items.food.ItemFlask.EnumInfusion; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.util.Tuple.Pair; import net.minecraft.block.Block; import net.minecraft.init.Blocks; @@ -30,7 +36,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class AnvilRecipes { +public class AnvilRecipes extends SerializableRecipe { private static List smithingRecipes = new ArrayList(); private static List constructionRecipes = new ArrayList(); @@ -39,6 +45,11 @@ public class AnvilRecipes { registerSmithing(); registerConstruction(); } + + @Override public String getFileName() { return "hbmAnvil.json"; } + @Override public Object getRecipeObject() { return constructionRecipes; } + @Override public void deleteRecipes() { constructionRecipes.clear(); } + @Override public void registerDefaults() { registerConstruction(); } /* * ////// // // // ////// // // // // // ////// @@ -1064,6 +1075,12 @@ public class AnvilRecipes { this.setOverlay(OverlayType.NONE); //no preferred overlay for many:many conversions } + public AnvilConstructionRecipe(AStack[] input, Pair[] output) { + for(AStack stack : input) this.input.add(stack); + for(Pair out : output) this.output.add(new AnvilOutput(out.getKey(), out.getValue())); + this.setOverlay(OverlayType.NONE); //no preferred overlay for many:many conversions + } + public AnvilConstructionRecipe setTier(int tier) { this.tierLower = tier; if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMUnlockAnvil) this.tierLower = 1; @@ -1130,4 +1147,42 @@ public class AnvilRecipes { RECYCLING, SMITHING; } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + + AStack[] inputs = this.readAStackArray(obj.get("inputs").getAsJsonArray()); + Pair[] outputs = this.readItemStackArrayChance(obj.get("outputs").getAsJsonArray()); + + int tierLower = obj.get("tierLower").getAsInt(); + int tierUpper = obj.has("tierUpper") ? obj.get("tierUpper").getAsInt() : -1; + + OverlayType overlay = OverlayType.NONE; + if(obj.has("overlay")) { + String overlayName = obj.get("overlay").getAsString(); + overlay = OverlayType.valueOf(overlayName); + if(overlay == null) overlay = OverlayType.NONE; + } + + this.constructionRecipes.add(new AnvilConstructionRecipe(inputs, outputs).setTierRange(tierLower, tierUpper).setOverlay(overlay)); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + AnvilConstructionRecipe rec = (AnvilConstructionRecipe) recipe; + + writer.name("inputs").beginArray(); + for(AStack stack : rec.input) this.writeAStack(stack, writer); + writer.endArray(); + + writer.name("outputs").beginArray(); + for(AnvilOutput stack : rec.output) this.writeItemStackChance(new Pair(stack.stack, stack.chance), writer); + writer.endArray(); + + writer.name("tierLower").value(rec.tierLower); + writer.name("tierUpper").value(rec.tierUpper); + + writer.name("overlay").value(rec.overlay.name()); + } } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index de9283804..5cf8d0fdc 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -24,6 +24,7 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.MatDistribution; import com.hbm.inventory.recipes.*; +import com.hbm.inventory.recipes.anvil.AnvilRecipes; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Pair; @@ -75,6 +76,8 @@ public abstract class SerializableRecipe { recipeHandlers.add(new ExposureChamberRecipes()); recipeHandlers.add(new AmmoPressRecipes()); recipeHandlers.add(new AssemblerRecipes()); + //AFTER Assembler + recipeHandlers.add(new AnvilRecipes()); recipeHandlers.add(new PedestalRecipes()); recipeHandlers.add(new MatDistribution()); diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java index ba1849895..748d81ba7 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java @@ -2,18 +2,23 @@ package com.hbm.tileentity.machine.albion; import com.hbm.inventory.container.ContainerPADetector; import com.hbm.inventory.gui.GUIPADetector; +import com.hbm.inventory.recipes.ParticleAcceleratorRecipes; +import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPADetector extends TileEntityCooledBase implements IGUIProvider { +public class TileEntityPADetector extends TileEntityCooledBase implements IGUIProvider, IParticleUser { public TileEntityPADetector() { super(5); @@ -76,4 +81,68 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPADetector(player.inventory, this); } + + @Override + public boolean canParticleEnter(Particle particle, ForgeDirection dir, int x, int y, int z) { + ForgeDirection detectorDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + BlockPos input = new BlockPos(xCoord, yCoord, zCoord).offset(detectorDir, -4); + return input.compare(x, y, z) && detectorDir == dir; + } + + @Override + public void onEnter(Particle particle, ForgeDirection dir) { + particle.invalid = true; + //particle will crash if not perfectly focused + if(particle.defocus > 0) return; + + for(ParticleAcceleratorRecipe recipe : ParticleAcceleratorRecipes.recipes) { + + if(particle.momentum >= recipe.momentum && + ((recipe.input1.matchesRecipe(particle.input1, true) && recipe.input2.matchesRecipe(particle.input2, true)) || + (recipe.input1.matchesRecipe(particle.input2, true) && recipe.input2.matchesRecipe(particle.input1, true)))) { + if(canAccept(recipe)) { + if(recipe.output1.getItem().hasContainerItem(recipe.output1)) this.decrStackSize(1, 1); + if(recipe.output2.getItem().hasContainerItem(recipe.output2)) this.decrStackSize(2, 1); + + if(slots[3] == null) { + slots[3] = recipe.output1.copy(); + } else { + slots[3].stackSize += recipe.output1.stackSize; + } + + if(slots[4] == null) { + slots[4] = recipe.output2.copy(); + } else { + slots[4].stackSize += recipe.output2.stackSize; + } + } + return; + } + } + } + + public boolean canAccept(ParticleAcceleratorRecipe recipe) { + return checkSlot(recipe.output1, 1, 3) && checkSlot(recipe.output2, 2, 4); + } + + public boolean checkSlot(ItemStack output, int containerSlot, int outputSlot) { + if(output != null) { + if(slots[outputSlot] != null) { + //cancel if: output item does not match, meta does not match, resulting stacksize exceeds stack limit + if(slots[outputSlot].getItem() != output.getItem() || slots[outputSlot].getItemDamage() != output.getItemDamage() || slots[outputSlot].stackSize + output.stackSize > output.getMaxStackSize()) return false; + } + if(slots[outputSlot].getItem().hasContainerItem(slots[outputSlot])) { + ItemStack container = slots[outputSlot].getItem().getContainerItem(slots[outputSlot]); + //cancel if: container slot is empty, container item does not match, meta does not match + if(slots[containerSlot] == null || slots[containerSlot].getItem() != container.getItem() || slots[containerSlot].getItemDamage() != container.getItemDamage()) return false; + } + } + + return true; + } + + @Override + public BlockPos getExitPos(Particle particle) { + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java index 76432e74b..4bbc03598 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java @@ -79,7 +79,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv if(pa.canParticleEnter(particle, particle.dir, particle.x, particle.y, particle.z)) { pa.onEnter(particle, particle.dir); BlockPos exit = pa.getExitPos(particle); - particle.move(exit); + if(exit != null) particle.move(exit); } else { particle.crash(); worldObj.createExplosion(null, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 5, false); return; } } else { System.out.println("derailed!"); 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 8ee80176b..f345b29b5 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -18,6 +18,7 @@ import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IOverpressurable; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; +import com.hbm.util.BobMathUtil; import com.hbm.util.Compat; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -134,8 +135,10 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements double availableWater = this.water; double availableSpace = this.maxSteam - this.steam; - int processedWater = (int) Math.floor(Math.min(availableHeat, Math.min(availableWater, availableSpace)) * RBMKDials.getReaSimBoilerSpeed(worldObj)); + int processedWater = (int) Math.floor(BobMathUtil.min(availableHeat, availableWater, availableSpace) * MathHelper.clamp_double(RBMKDials.getReaSimBoilerSpeed(worldObj), 0D, 1D)); + if(processedWater <= 0) return; + this.water -= processedWater; this.steam += processedWater; this.heat -= processedWater * heatConsumption;