From 13b8efef4a8096b4e861cfa732f136f77027bf4e Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sun, 2 Aug 2026 17:56:57 +0200 Subject: [PATCH] what the fuck is an ex nihilo --- changelog | 37 ++-------- .../com/hbm/inventory/OreDictManager.java | 1 + .../inventory/recipes/RockMillRecipes.java | 73 +++++++++++++++++-- .../inventory/recipes/anvil/AnvilRecipes.java | 8 ++ src/main/java/com/hbm/items/ModItems.java | 14 ++-- src/main/resources/assets/hbm/lang/de_DE.lang | 6 +- src/main/resources/assets/hbm/lang/en_US.lang | 6 +- 7 files changed, 99 insertions(+), 46 deletions(-) diff --git a/changelog b/changelog index 8d625149d..ce18603a4 100644 --- a/changelog +++ b/changelog @@ -1,31 +1,8 @@ ## Added -* Wideband Radio Emission Detector Satellite - * Detects high-energy events like nuclear explosions, particle accelerator operations and radar from the entire map - * Not terribly accurate, positioning may be off by hundreds or thousands of blocks depending on the emission intensity -* Narrowband Emission Scanning Satellite - * Detects high-energy events like radar, particle accelerator operations, nuclear or fusion reactors - * Can pinpoint exact locations, but is limited in its field of view - -## Changed -* Updated russian and chinese localization -* AUTOCAL's `first` and `last` instructions now support variable substitution -* Spy satellites now have the `getsmog` command, checking for soot pollution on the current target coordinate -* The research reactor and breeding reactor have been deprecated - * The reactors and the plate fuel no longer have recipes, but existing ones will continue to function until they run out of fuel -* Removed orphaned multiblock dummies clearing themselves via random ticks, only block updates can do that now - -## Fixed -* Fixed pile fuel loader temperature reading not working -* Fixed mining satellite NEI handling -* Fixed crash caused by non-miner satellite ID chips in the cargo landing pad -* Potentially fixed ID-shift affecting satellites launched pre-update -* Fixed xenium resonator item mapping being incorrect, creating a relay satellite instead -* Fixed a potential crash caused by accessing out-of-range data on the radar satellite -* Fixed QMAW manual pages not being able to be overwritten by resource packs - * This feature was a major pain in the ass to actually make, and it apparently never even worked until now -* Fixed satellite groundstation losing its frequency on relog -* Added extra safeguarding preventing crashes caused by multiblock door tile entities not bound to the correct block -* Fixed new pile rods now having radiation values -* Potentially fixed a multiblock migration issue where standard electricity pylons would disappear due to changes in expected metadata -* Fixed the pipe wrench assuming anchor pos 0/0/0 when NBT data is initialized as well as clearing all NBT data if a pipe connection is created -* Fixed tower base structures spawning in sandy biomes \ No newline at end of file +* Rock mill + * Earlygame post-steel crusher type machine + * Can grind down various stones, gravel and sand into finer items while yielding byproduct + * Mainly intended to serve as an easy way to automate/bulk craft certain elements in earlygame before BOP + * While the byproduct chances are rather low and the recipe times are slow, the mills are easily scalable due to their low cost + * Comes with convenient stacking frame + * Ideal for skyblock/seablock type challenge runs, as it can be configured to serve as an Ex Nihilo substitute \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 7276abf96..062d51d5d 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -68,6 +68,7 @@ public class OreDictManager { public static final String KEY_LEAVES = "treeLeaves"; public static final String KEY_SAPLING = "treeSapling"; public static final String KEY_SAND = "sand"; + public static final String KEY_STONE = "stone"; public static final String KEY_COBBLESTONE = "cobblestone"; public static final String KEY_BLACK = "dyeBlack"; diff --git a/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java b/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java index dc09a6330..73c0e8e3d 100644 --- a/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java @@ -34,31 +34,90 @@ public class RockMillRecipes extends GenericRecipes { int duraShort = 100; int duraLong = 200; - this.register(new GenericRecipe("rock.cobble").setupNamed(duraShort, consumption).setNameWrapper("rock.crushing") + String groupCrush = "autoswitch.crushing"; + + this.register(new GenericRecipe("rock.cobble").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new OreDictStack(KEY_COBBLESTONE)) .inputFluids(new FluidStack(Fluids.WATER, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 95), new ChanceOutput(new ItemStack(ModItems.powder_quartz), 5) - )).setIconToFirstIngredient()); + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); - this.register(new GenericRecipe("rock.gravel").setupNamed(duraShort, consumption).setNameWrapper("rock.crushing") + this.register(new GenericRecipe("rock.gravel").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new ComparableStack(Blocks.gravel)) .inputFluids(new FluidStack(Fluids.WATER, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.sand), 75), new ChanceOutput(new ItemStack(Items.flint), 20), new ChanceOutput(new ItemStack(ModItems.powder_boron), 5) - )).setIconToFirstIngredient()); + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); - this.register(new GenericRecipe("rock.bauxite").setupNamed(duraLong, consumption).setNameWrapper("rock.crushing") + this.register(new GenericRecipe("rock.sand").setup(duraShort, consumption).setNameWrapper("rock.crushing") + .inputItems(new OreDictStack(KEY_SAND)) + .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputItems(new ChanceOutputMulti( + new ChanceOutput(new ItemStack(ModItems.dust), 90), + new ChanceOutput(new ItemStack(ModItems.powder_calcium), 5), + new ChanceOutput(new ItemStack(ModItems.fluorite), 5) + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); + + this.register(new GenericRecipe("rock.netherrack").setup(duraShort, consumption).setNameWrapper("rock.crushing") + .inputItems(new ComparableStack(Blocks.netherrack)) + .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputItems(new ChanceOutputMulti( + new ChanceOutput(new ItemStack(Blocks.gravel), 50), + new ChanceOutput(new ItemStack(Blocks.soul_sand), 25), + new ChanceOutput(new ItemStack(Items.glowstone_dust), 15), + new ChanceOutput(new ItemStack(ModItems.powder_quartz), 10) + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); + + this.register(new GenericRecipe("rock.soulsand").setup(duraShort, consumption).setNameWrapper("rock.crushing") + .inputItems(new ComparableStack(Blocks.soul_sand)) + .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputItems(new ChanceOutputMulti( + new ChanceOutput(new ItemStack(Blocks.sand), 50), + new ChanceOutput(new ItemStack(ModItems.powder_fire), 25), + new ChanceOutput(new ItemStack(ModItems.powder_uranium), 15), + new ChanceOutput(new ItemStack(Items.blaze_powder), 5), + new ChanceOutput(new ItemStack(Items.nether_wart), 5) + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); + + this.register(new GenericRecipe("rock.schist").setup(duraLong, consumption).setNameWrapper("rock.crushing") + .inputItems(new ComparableStack(ModBlocks.stone_gneiss)) + .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputItems(new ChanceOutputMulti( + new ChanceOutput(new ItemStack(Blocks.gravel), 50), + new ChanceOutput(new ItemStack(Blocks.sand), 10), + new ChanceOutput(new ItemStack(ModItems.powder_lithium), 25), + new ChanceOutput(new ItemStack(ModItems.powder_niobium), 5), + new ChanceOutput(new ItemStack(ModItems.powder_uranium), 5), + new ChanceOutput(new ItemStack(ModItems.powder_gold), 5) + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); + + this.register(new GenericRecipe("rock.hematite").setup(duraLong, consumption).setNameWrapper("rock.crushing") + .inputItems(new OreDictStack(HEMATITE.ore())) + .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputItems(new ChanceOutputMulti( + new ChanceOutput(new ItemStack(Blocks.gravel), 65), + new ChanceOutput(new ItemStack(ModItems.powder_iron), 25), + new ChanceOutput(new ItemStack(ModItems.powder_titanium), 10) + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); + + this.register(new GenericRecipe("rock.bauxite").setup(duraLong, consumption).setNameWrapper("rock.crushing") .inputItems(new OreDictStack(BAUXITE.ore())) .inputFluids(new FluidStack(Fluids.WATER, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 25), new ChanceOutput(new ItemStack(Items.clay_ball), 25), new ChanceOutput(new ItemStack(ModBlocks.stone_resource, 1, 2), 25), - new ChanceOutput(new ItemStack(ModBlocks.ore_titanium, 1, 2), 25) - )).setIconToFirstIngredient()); + new ChanceOutput(new ItemStack(ModBlocks.ore_titanium), 25) + )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); + + this.register(new GenericRecipe("rock.clay").setup(duraLong, consumption) + .inputItems(new OreDictStack(KEY_SAND), + new ComparableStack(ModItems.dust)) + .inputFluids(new FluidStack(Fluids.WATER, 1_000)) + .outputItems(new ItemStack(Items.clay_ball, 4))); } } 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 6fc588db3..44de9e24d 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -226,6 +226,14 @@ public class AnvilRecipes extends SerializableRecipe { boolean exp = GeneralConfig.enableExpensiveMode; + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(KEY_STONE, 16), + new OreDictStack(STEEL.plate(), 4), + new OreDictStack(CU.pipe(), 1), + new ComparableStack(ModItems.motor, 1) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_rockmill))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 8), diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 3fb3c1433..c09355033 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2980,13 +2980,13 @@ public class ModItems { waste_schrabidium = new ItemDepletedFuel().setUnlocalizedName("waste_schrabidium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_schrabidium"); waste_zfb_mox = new ItemDepletedFuel().setUnlocalizedName("waste_zfb_mox").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_zfb_mox"); - waste_plate_u233 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_u233").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_uranium"); - waste_plate_u235 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_u235").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_uranium"); - waste_plate_mox = new ItemDepletedFuel().setUnlocalizedName("waste_plate_mox").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_mox"); - waste_plate_pu239 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_pu239").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_mox"); - waste_plate_sa326 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_sa326").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_sa326"); - waste_plate_ra226be = new ItemDepletedFuel().setUnlocalizedName("waste_plate_ra226be").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_ra226be"); - waste_plate_pu238be = new ItemDepletedFuel().setUnlocalizedName("waste_plate_pu238be").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":waste_plate_pu238be"); + waste_plate_u233 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_u233").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_uranium"); + waste_plate_u235 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_u235").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_uranium"); + waste_plate_mox = new ItemDepletedFuel().setUnlocalizedName("waste_plate_mox").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_mox"); + waste_plate_pu239 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_pu239").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_mox"); + waste_plate_sa326 = new ItemDepletedFuel().setUnlocalizedName("waste_plate_sa326").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_sa326"); + waste_plate_ra226be = new ItemDepletedFuel().setUnlocalizedName("waste_plate_ra226be").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_ra226be"); + waste_plate_pu238be = new ItemDepletedFuel().setUnlocalizedName("waste_plate_pu238be").setCreativeTab(null).setTextureName(RefStrings.MODID + ":waste_plate_pu238be"); pile_rod_uranium = new ItemPileRod().setUnlocalizedName("pile_rod_uranium").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_uranium"); pile_rod_pu239 = new ItemPileRod().setUnlocalizedName("pile_rod_pu239").setCreativeTab(null).setTextureName(RefStrings.MODID + ":pile_rod_pu239"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 4afb5b568..6149f2db1 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -135,6 +135,7 @@ ass.factorioChip=Minimalisten-Schaltkreise ass.nitra=Nitra zu Munition autoswitch=Teil der Rezeptgruppe "%s"$Rezept ändert sich basierend auf das erste Item +autoswitch.crushing=Fels-Zerkleinerung autoswitch.cyclotron=Zyklotron-Pulverkisten autoswitch.pile=Wiederaufbereitung Chicago-Pile-Brennstoff autoswitch.pilerod=Chicago-Pile-Brennstoff @@ -323,6 +324,7 @@ container.machinePrecAss=Präzisions-Montagemaschine container.machinePUREX=PUREX container.machinePyroOven=Pyrolyseofen container.machineRefinery=Ölraffinerie +container.machineRockMill=Steinmühle container.machineRotaryFurnace=Rotationshochofen container.machineSelenium=Hochleistungs-Sternmotor container.machineShredder=Brecher @@ -3765,6 +3767,8 @@ rbmk.rod.xenon=Xenonvergiftung: %s rbmk.rod.coreTemp=Kerntemperatur: %s rbmk.rod.skinTemp=Außentemperatur: %s / %s +rock.crushing=Zerkleinern von %s + shape.barrelHeavy=Schwerer Lauf shape.barrelLight=Leichter Lauf shape.billet=Billet @@ -4537,7 +4541,7 @@ tile.machine_radgen.name=Strahlenbetriebener Generator tile.machine_reactor.name=Brutreaktor (LEGACY) tile.machine_reactor_small.name=Atomreaktor (LEGACY) tile.machine_refinery.name=Ölraffinerie -tile.machine_reix_mainframe.name=Rei-X Hauptrechner (WIP) +tile.machine_rockmill.name=Steinmühle tile.machine_rotary_furnace.name=Rotationshochofen tile.machine_rtg_blue.name=Konvektionsgenerator tile.machine_rtg_cyan.name=Schrabidium-Zerfallsenergie-Generator (WIP) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d14837744..39e53a26f 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -190,6 +190,7 @@ ass.factorioChip=Minimalist Circuits ass.nitra=Nitra to Ammunition autoswitch=Part of auto switch group "%s"$Recipe changes based on first ingredient +autoswitch.crushing=Rock Crushing autoswitch.cyclotron=Cyclotron Powder Boxes autoswitch.pile=Reprocessing Chicago Pile Rods autoswitch.pilerod=Chicago Pile Rods @@ -724,6 +725,7 @@ container.machinePrecAss=Precision Assembly Machine container.machinePUREX=PUREX container.machinePyroOven=Pyrolysis Oven container.machineRefinery=Oil Refinery +container.machineRockMill=Rock Mill container.machineRotaryFurnace=Rotary Furnace container.machineSelenium=Radial Performance Engine container.machineShredder=Shredder @@ -4964,6 +4966,8 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s +rock.crushing=Crushing of %s + satchip.frequency=Satellite frequency satchip.foeq=Gives you an achievement. That's it. satchip.gerald.desc=Single use.$Requires orbital module.$Melter of CPUs, bane of every server owner. @@ -5824,7 +5828,7 @@ tile.machine_radiolysis.name=Radioisotope Thermoelectric Generator and Radiolysi tile.machine_reactor.name=Breeding Reactor (LEGACY) tile.machine_reactor_small.name=Research Reactor (LEGACY) tile.machine_refinery.name=Oil Refinery -tile.machine_reix_mainframe.name=Rei-X Mainframe (WIP) +tile.machine_rockmill.name=Rock Mill tile.machine_rotary_furnace.name=Rotary Furnace tile.machine_rtg_blue.name=Convection Generator tile.machine_rtg_cyan.name=Schrabidium Decay Generator (WIP)