diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dea79f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.opencode +base + +result diff --git a/README.md b/README.md index a037d43..fcd0caf 100644 --- a/README.md +++ b/README.md @@ -10,34 +10,37 @@ The balancing in this mode is mostly unaltered, but aims to encourage using more # List of (proposed) changes +Legend: +- `x` implemented +- `/` partially implemented +- [` `] not implemented yet + ## World -- [ ] Single frozen biome (alike frozen tundra) -- [ ] No structures (beside caves, probably) +- [x] Single frozen biome (alike frozen tundra) +- [x] No structures (beside caves, probably) - [ ] No void world -- [ ] Permanent night -- [ ] Hardcore Darkness (i.e. no light = pitch black world) +- [x] Permanent night +- [x] Hardcore Darkness (i.e. no light = pitch black world) - [ ] Permanent storm starting at day 2 -- [ ] Tough As Nails mod (temperature regulation + thirst) -- [ ] Locked at hard difficulty +- [x] Locked at hard difficulty - [ ] Higher mob spawning rate - [ ] No mob spawning before day 3 -- [ ] No blazes or thermal foundation blaze variants +- [ ] No blazes +- [x] No thermal foundation blaze variants ## Progression -- [ ] Not allowed to use oil, in any form -- [ ] Lava pumping from Nether using drilling rig +- [/] Not allowed to use oil, in any form - [ ] Other planets provide meaningful outputs via drilling rig -- [ ] EIO Farming Station is lowered to early MV -- [ ] No DML +- [x] EIO Farming Station is lowered to early MV - [ ] No fancy metal furnaces ## Transportation - [ ] No energy sources beside GT-native ones and Nuclearcraft reactors (no solar panels, no TE dynamos, no DE reactors) - [ ] No energy distribution beside GT-native ones (for instance -- no EIO energy conduits) -- [ ] No resource management solutions besides GT-native ones (no ME networks, no EIO item/fluid conduits). Bulk storage (think drawers and barrels) are allowed. +- [ ] No resource management solutions beside Logistics Pipes (no ME networks, no EIO item/fluid conduits). Bulk storage (think drawers and barrels) are allowed to come from any mod. - [ ] No "magic teleportation stuff" (Ender Chests, Dimensional Transcievers), unless: - it's an EIO Telepad - they are used to tranport between the Nether and Overworld, and have a positions that of a vanilla nether portal (identical y, 8-scaled x and z) diff --git a/base.nix b/base.nix deleted file mode 100644 index fb3a202..0000000 --- a/base.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ - client = "https://nightly.link/Nomifactory/Nomifactory/workflows/nightly/dev/nomifactory-dev-5a07e6e-client.zip"; - server = "https://nightly.link/Nomifactory/Nomifactory/workflows/nightly/dev/nomifactory-dev-5a07e6e-server.zip"; -} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..fe08f56 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1751274312, + "narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index e3f70ef..2905aa8 100644 --- a/flake.nix +++ b/flake.nix @@ -1,4 +1,169 @@ { - inputs = { }; - outputs = { }; + description = "NomiFactory harder config — modified modpack"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; + }; + + outputs = + { self, nixpkgs }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; }; + + sources = import ./sources.nix; + + # base Nomi + base-server = pkgs.fetchurl sources.nomi-server; + base-client = pkgs.fetchurl sources.nomi-client; + + # additional mods + hardcore-darkness = { + src = pkgs.fetchurl sources.hardcore-darkness; + jar = "HardcoreDarkness.jar"; + }; + simple-login = { + src = pkgs.fetchurl sources.simple-login; + jar = "SimpleLogin.jar"; + }; + + buildSide = + { + name, + base, + extraMods, + }: + let + modsDir = if name == "client" then "overrides/mods" else "mods"; + commonDir = ./patches/common; + prefix = if name == "client" then "overrides/" else ""; + sideDir = toString ./patches + "/${name}"; + in + pkgs.runCommand "nomifactory-harder-${name}" + { + nativeBuildInputs = with pkgs; [ + unzip + zip + patch + ]; + allowSubstitutes = false; + } + '' + mkdir staging + cd staging + unzip -q ${base} + + # Normalize line endings before patching (some configs are CRLF) + find . -type f \( -name '*.cfg' -o -name '*.properties' -o -name '*.xml' -o -name '*.zs' -o -name '*.json' \) \ + -exec sed -i 's/\r$//' {} \; + + # Apply patches and overlays from common/ + if [ -d "${commonDir}" ]; then + for p in $(find "${commonDir}" -name '*.patch'); do + rel="''${p#${commonDir}/}" + target="${prefix}''${rel%.patch}" + patch -p0 -l "$target" < "$p" + done + for f in $(find "${commonDir}" -type f ! -name '*.patch' -size +0c); do + rel="''${f#${commonDir}/}" + target="${prefix}$rel" + mkdir -p "$(dirname "$target")" + cp "$f" "$target" + done + fi + + # Apply patches and overlays from side-specific dir (if present) + if [ -d "${sideDir}" ]; then + for p in $(find "${sideDir}" -name '*.patch'); do + rel="''${p#${sideDir}/}" + target="''${rel%.patch}" + patch -p0 -l "$target" < "$p" + done + for f in $(find "${sideDir}" -type f ! -name '*.patch' -size +0c); do + rel="''${f#${sideDir}/}" + mkdir -p "$(dirname "$rel")" + cp "$f" "$rel" + done + fi + + # Strip AE2 coremod registration from the jar — bansoukou already provides + # patched classes. The original jar's AE2ELTransformer would add + # readItemStack_ae2el_old to PacketBuffer, but bansoukou's patched + # PacketBuffer already has it, causing Duplicate method name error. + # We keep the jar for mod registration but remove the FMLCorePlugin + # manifest entry so the coremod (and its transformer) doesn't load. + mkdir -p mods/ae2-uel-v0.56.7 + cd mods/ae2-uel-v0.56.7 + unzip -qo ../ae2-uel-v0.56.7.jar + sed -i '/^FMLCorePlugin:/d' META-INF/MANIFEST.MF + zip -qr ../ae2-uel-v0.56.7.jar . + cd ../.. + rm -rf mods/ae2-uel-v0.56.7 + + # Inject extra mod jars into the correct directory for this side + mkdir -p "${modsDir name}" + ${builtins.concatStringsSep "\n" (map (m: "cp ${m.src} \"${modsDir name}/${m.jar}\"") extraMods)} + + # Repack (zip auto-appends .zip; fix if it does) + zip -qr "$out" . + [ -f "$out.zip" ] && mv "$out.zip" "$out" || true + ''; + + launch-server = pkgs.writeShellScript "nomifactory-harder-server" '' + set -euo pipefail + DATA_DIR="''${1:-./nomifactory-harder-data}" + + ${pkgs.coreutils}/bin/mkdir -p "$DATA_DIR" + ${pkgs.coreutils}/bin/echo "Extracting server pack to $DATA_DIR ..." + ${pkgs.unzip}/bin/unzip -n ${self.packages.${system}.server} -d "$DATA_DIR" + + cd "$DATA_DIR" + export PATH="${pkgs.jre8}/bin:$PATH" + ${pkgs.coreutils}/bin/chmod +x launch.sh + ${pkgs.bash}/bin/bash launch.sh + ''; + in + { + packages.${system} = { + server = buildSide { + name = "server"; + base = base-server; + extraMods = [ + simple-login + ]; + }; + + client = buildSide { + name = "client"; + base = base-client; + extraMods = [ + hardcore-darkness + simple-login + ]; + }; + + default = self.packages.${system}.server; + + server-oci = pkgs.dockerTools.buildImage { + name = "nomifactory-harder-server"; + tag = "latest"; + + copyToRoot = pkgs.writeShellScriptBin "entrypoint" '' + exec ${launch-server} /srv + ''; + + config = { + Entrypoint = [ "/bin/entrypoint" ]; + WorkingDir = "/srv"; + }; + }; + }; + + apps.${system} = { + server = { + type = "app"; + program = "${launch-server}"; + }; + }; + }; } diff --git a/patches/common/config/cofh/thermalfoundation/common.cfg.patch b/patches/common/config/cofh/thermalfoundation/common.cfg.patch new file mode 100644 index 0000000..641d128 --- /dev/null +++ b/patches/common/config/cofh/thermalfoundation/common.cfg.patch @@ -0,0 +1,29 @@ +--- config/cofh/thermalfoundation/common.cfg ++++ config/cofh/thermalfoundation/common.cfg +@@ -518,7 +518,7 @@ + B:Effect=true + + # If TRUE, Blizzes will spawn naturally. [default: true] +- B:Enable=true ++ B:Enable=false + + # This sets the maximum light level Blizzes can spawn at, if restricted. [range: 0 ~ 15, default: 8] + I:LightLevel=8 +@@ -541,7 +541,7 @@ + B:Effect=true + + # If TRUE, Blitzes will spawn naturally. [default: true] +- B:Enable=true ++ B:Enable=false + + # This sets the maximum light level Blitzes can spawn at, if restricted. [range: 0 ~ 15, default: 8] + I:LightLevel=8 +@@ -564,7 +564,7 @@ + B:Effect=true + + # If TRUE, Basalzes will spawn naturally. [default: true] +- B:Enable=true ++ B:Enable=false + + # This sets the maximum light level Basalzes can spawn at, if restricted. [range: 0 ~ 15, default: 8] + I:LightLevel=8 diff --git a/patches/common/config/enderio/recipes/user/user_recipes.xml.patch b/patches/common/config/enderio/recipes/user/user_recipes.xml.patch new file mode 100644 index 0000000..526ac89 --- /dev/null +++ b/patches/common/config/enderio/recipes/user/user_recipes.xml.patch @@ -0,0 +1,12 @@ +--- config/enderio/recipes/user/user_recipes.xml ++++ config/enderio/recipes/user/user_recipes.xml +@@ -1,6 +1,9 @@ + + + ++ ++ ++ + + + diff --git a/patches/common/config/ftbutilities.cfg.patch b/patches/common/config/ftbutilities.cfg.patch new file mode 100644 index 0000000..ebe2a21 --- /dev/null +++ b/patches/common/config/ftbutilities.cfg.patch @@ -0,0 +1,11 @@ +--- config/ftbutilities.cfg ++++ config/ftbutilities.cfg +@@ -177,7 +177,7 @@ + # 18000 - Midnight + # Min: -1 + # Max: 23999 +- I:forced_spawn_dimension_time=-1 ++ I:forced_spawn_dimension_time=18000 + + # Locked weather type in spawn dimension. + # -1 - Disabled diff --git a/patches/common/config/gregtech/worldgen/overworld/heavy_oil_sphere.json b/patches/common/config/gregtech/worldgen/overworld/heavy_oil_sphere.json new file mode 100644 index 0000000..cba787d --- /dev/null +++ b/patches/common/config/gregtech/worldgen/overworld/heavy_oil_sphere.json @@ -0,0 +1,23 @@ +{ + "weight": 0, + "density": 0.9, + "max_height": 60, + "min_height": 10, + "dimension_filter": ["name:*(overworld|lostcities)"], + "generator": { + "type": "sphere", + "radius": [4, 6] + }, + "filler": { + "type": "ignore_bedrock", + "value": { + "type": "weight_random", + "values": [ + { + "weight": 100, + "value": "block:gregtech:fluid.oil_heavy" + } + ] + } + } + } diff --git a/patches/common/config/gregtech/worldgen/overworld/light_oil_sphere.json b/patches/common/config/gregtech/worldgen/overworld/light_oil_sphere.json new file mode 100644 index 0000000..ca4257c --- /dev/null +++ b/patches/common/config/gregtech/worldgen/overworld/light_oil_sphere.json @@ -0,0 +1,23 @@ +{ + "weight": 0, + "density": 0.9, + "max_height": 60, + "min_height": 10, + "dimension_filter": ["name:*(overworld|lostcities)"], + "generator": { + "type": "sphere", + "radius": [7, 9] + }, + "filler": { + "type": "ignore_bedrock", + "value": { + "type": "weight_random", + "values": [ + { + "weight": 100, + "value": "block:gregtech:fluid.oil_light" + } + ] + } + } + } diff --git a/patches/common/config/gregtech/worldgen/overworld/medium_oil_sphere.json b/patches/common/config/gregtech/worldgen/overworld/medium_oil_sphere.json new file mode 100644 index 0000000..137c0c0 --- /dev/null +++ b/patches/common/config/gregtech/worldgen/overworld/medium_oil_sphere.json @@ -0,0 +1,23 @@ +{ + "weight": 0, + "density": 0.9, + "max_height": 60, + "min_height": 10, + "dimension_filter": ["name:*(overworld|lostcities)"], + "generator": { + "type": "sphere", + "radius": [7, 9] + }, + "filler": { + "type": "ignore_bedrock", + "value": { + "type": "weight_random", + "values": [ + { + "weight": 100, + "value": "block:gregtech:fluid.oil_medium" + } + ] + } + } + } diff --git a/patches/common/config/gregtech/worldgen/overworld/oilsands_vein.json b/patches/common/config/gregtech/worldgen/overworld/oilsands_vein.json new file mode 100644 index 0000000..ed2b3fc --- /dev/null +++ b/patches/common/config/gregtech/worldgen/overworld/oilsands_vein.json @@ -0,0 +1,35 @@ +{ + "weight": 0, + "density": 0.8, + "height": { + "min": 10, + "max": 80 + }, + "layer": { + "block": { + "block": "gregtech:ore_oilsands_0", + "properties": { + "state": 0 + } + }, + "density": 0.8, + "radius": 21, + "type": "ore" + }, + "dimension_filter": [ + { + "dimension": { + "type": "whitelist", + "value": [ + "minecraft:overworld", + "lostcities:lostcities" + ] + } + } + ], + "name": "oilsands_vein", + "vein": { + "radius": 21, + "type": "ellipsoid" + } + } diff --git a/patches/common/config/lostcities/profile_default.cfg b/patches/common/config/lostcities/profile_default.cfg new file mode 100644 index 0000000..a43cdc1 --- /dev/null +++ b/patches/common/config/lostcities/profile_default.cfg @@ -0,0 +1,138 @@ +# Configuration file + +cities_default { + S:cityBiomeFactorDefault=0.0 + S:cityBiomeFactors < + > + S:cityChance=0.0 + I:cityLevel0Height=75 + I:cityLevel1Height=83 + I:cityLevel2Height=91 + I:cityLevel3Height=99 + I:cityMaxRadius=128 + I:cityMinRadius=50 + S:cityThresshold=0.2 +} + +cityspheres_default { + S:citySphereChance=0.0 + S:citySphereFactor=1.2 + B:landscapeOutside=false + S:monorailChance=0.8 + I:monorailOffset=-2 + B:onlyPredefined=false + I:outsideGroundLevel=-1 + S:outsideProfile= + S:outsideSurfaceVariation=1.0 + B:singleBiome=false + S:sphereSurfaceVariation=1.0 +} + +client_default { + S:fogBlue=-1.0 + S:fogDensity=-1.0 + S:fogGreen=-1.0 + S:fogRed=-1.0 + S:horizon=-1.0 +} + +explosions_default { + I:debrisToNearbyChunkFactor=200 + S:destroyLoneBlocksFactor=0.05 + S:destroyOrMoveChance=0.4 + I:destroySmallSectionsSize=50 + S:explosionChance=0.0 + I:explosionMaxHeight=90 + I:explosionMaxRadius=35 + I:explosionMinHeight=75 + I:explosionMinRadius=15 + B:explosionsInCitiesOnly=true + S:miniExplosionChance=0.0 + I:miniExplosionMaxHeight=100 + I:miniExplosionMaxRadius=12 + I:miniExplosionMinHeight=60 + I:miniExplosionMinRadius=5 +} + +lostcity_default { + S:allowedBiomeFactors < + minecraft:ice_flats=1 + minecraft:frozen_river=1 + > + S:biomeSelectionStrategy=original + S:bridgeChance=0.0 + B:bridgeSupports=true + S:building2x2Chance=0.0 + S:buildingChance=0.0 + B:buildingDoorwayChance=0.6 + S:buildingFrontChance=0.0 + I:buildingMaxCellars=0 + I:buildingMaxFloors=0 + I:buildingMaxFloorsChance=0 + I:buildingMinCellars=0 + I:buildingMinFloors=0 + I:buildingMinFloorsChance=0 + S:buildingWithoutLootChance=1.0 + S:chestWithoutLootChance=1.0 + S:corridorChance=0.0 + S:dataCenterChance=0.0 + S:description=Frozen waste with taiga pockets — explore for wood + S:extraDescription= + S:fountainChance=0.0 + B:generateLighting=false + B:generateLoot=false + B:generateSpawners=false + S:generatorOptions= + I:groundLevel=71 + I:highwayDistanceMask=0 + S:highwayPerlinFactor=100.0 + B:highwayRequiresTwoCities=true + S:highwaySecondaryPerlinScale=10.0 + B:highwaySupports=true + S:icon=textures/gui/icon_default.png + S:landscapeType=default + S:libraryChance=0.0 + S:liquidBlock=minecraft:water + S:manualBiomeMappings < + > + S:parkChance=0.0 + S:railwayDungeonChance=0.0 + B:railwayStationsEnabled=false + B:railwaysCanEnd=false + B:railwaysEnabled=false + S:randomLeafBlockChance=0.0 + I:randomLeafBlockThickness=2 + S:rubbleDirtScale=0.0 + B:rubbleLayer=false + S:rubbleLeaveScale=0.0 + S:ruinChance=0.0 + S:ruinMaxlevelPercent=0.0 + S:ruinMinlevelPercent=0.0 + B:ruins=false + S:spawnBiome=minecraft:ice_flats + S:spawnCity= + B:spawnNotInBuilding=false + S:spawnSphere= + S:vineChance=0.0 + I:waterLevelOffset=8 + S:worldStyle=standard +} + +maxcaveheight { + I:structures_default=128 +} + +structures_default { + B:generateCaves=true + B:generateDungeons=false + B:generateLakes=false + B:generateMansions=false + B:generateMineshafts=false + B:generateOceanMonuments=false + B:generateRavines=false + B:generateScattered=false + B:generateStrongholds=false + B:generateVillages=false + B:preventLakesRavinesInCities=false + B:preventVillagesInCities=false +} diff --git a/patches/common/scripts/Multiblocks.zs.patch b/patches/common/scripts/Multiblocks.zs.patch new file mode 100644 index 0000000..ce6f3a7 --- /dev/null +++ b/patches/common/scripts/Multiblocks.zs.patch @@ -0,0 +1,19 @@ +--- scripts/Multiblocks.zs ++++ scripts/Multiblocks.zs +@@ -1831,17 +1831,6 @@ + .outputs() + .buildAndRegister(); + +-// Oil Drilling Rig mechanics +-oildrillingrig.recipeMap +- .recipeBuilder() +- .duration(100) +- .EUt(875) +- .inputs() +- .fluidInputs( * 1000) +- .fluidOutputs( * 1000) +- .property("consumeChance", 1) +- .buildAndRegister(); +- + // Lunar Mining Station Rover Missions + lunarminingstation.recipeMap \ No newline at end of file diff --git a/patches/common/scripts/NomiHarder.zs b/patches/common/scripts/NomiHarder.zs new file mode 100644 index 0000000..80e8404 --- /dev/null +++ b/patches/common/scripts/NomiHarder.zs @@ -0,0 +1,11 @@ +import crafttweaker.item.IItemStack; +import crafttweaker.oredict.IOreDictEntry; + +recipes.remove(); +recipes.addShaped("nomiharder_farming_station", , + [ + [, , ], + [, , ], + [, , ] + ] +); diff --git a/patches/server/server.properties.patch b/patches/server/server.properties.patch new file mode 100644 index 0000000..8cd2572 --- /dev/null +++ b/patches/server/server.properties.patch @@ -0,0 +1,15 @@ +--- server.properties ++++ server.properties +@@ -22,9 +22,9 @@ pvp=true +-difficulty=1 ++difficulty=3 + enable-command-block=false + gamemode=0 + player-idle-timeout=0 + max-players=20 + spawn-monsters=true + view-distance=10 +-generate-structures=true ++generate-structures=false +-motd=Nomifactory Server ++motd=NomiSuffory Server diff --git a/sources.nix b/sources.nix new file mode 100644 index 0000000..5e74c75 --- /dev/null +++ b/sources.nix @@ -0,0 +1,20 @@ +{ + nomi-client = { + url = "https://nightly.link/Nomifactory/Nomifactory/workflows/nightly/dev/nomifactory-dev-5a07e6e-client.zip"; + hash = "sha256-VLabdIF8QTB3HTzu+vbyiyFcDH57Zxf4195oJ+eyBLo="; + }; + nomi-server = { + url = "https://nightly.link/Nomifactory/Nomifactory/workflows/nightly/dev/nomifactory-dev-5a07e6e-server.zip"; + hash = "sha256-5ve+pWdN+SWeYlk8HFgVc1vKE3ThXQt/3fxtNmP/cPU="; + }; + + hardcore-darkness = { + url = "https://www.curseforge.com/api/v1/mods/225957/files/2499443/download"; + hash = "sha256-+xORPolvnT+v7e+QrANfSt6dktjzPSzPwyxUh9VZ/fg="; + }; + + simple-login = { + url = "https://www.curseforge.com/api/v1/mods/312664/files/2996748/download"; + hash = "sha256-fYVxNfYLSt4hkA7qA5eFw0Zwnlxg1Tg/j4tHFKK3/Jg="; + }; +}