Compare commits

...
Author SHA1 Message Date
16bf606664 doc: update the mode change list 2026-05-31 00:50:41 +01:00
e713602796 tweak: worldgen
- only cold biomes with scarce wood
- no structures
- lock into hard difficulty
2026-05-31 00:47:46 +01:00
f5c5156cba tweak: remove common oil sources 2026-05-31 00:46:54 +01:00
1bb2ee9ef4 tweak: farming station recipe to MV 2026-05-31 00:46:06 +01:00
e4e8b3fc20 tweak: disable thermal blaze variants 2026-05-31 00:45:30 +01:00
8bdf163148 add: mods injection 2026-05-31 00:45:16 +01:00
2a97a9d066 add: patching mechanism 2026-05-31 00:44:59 +01:00
6548da3e75 fix: remove conflicting classes from stock AE2 2026-05-31 00:41:51 +01:00
4ca94d56d3 add: buildSide function definition and outputs
outputs include
- package for both client and server
- an app to run the server
- an OCI container to run the server
2026-05-31 00:41:48 +01:00
983811d27c add: proper source defs and use 2026-05-31 00:36:51 +01:00
648b4e6699 ignore temp files 2026-05-31 00:35:15 +01:00
17 changed files with 572 additions and 18 deletions

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
.opencode
base
result

View file

@ -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)

View file

@ -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";
}

27
flake.lock generated Normal file
View file

@ -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
}

169
flake.nix
View file

@ -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}";
};
};
};
}

View file

@ -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

View file

@ -0,0 +1,12 @@
--- config/enderio/recipes/user/user_recipes.xml
+++ config/enderio/recipes/user/user_recipes.xml
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<enderio:recipes xmlns:enderio="http://enderio.com/recipes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://enderio.com/recipes recipes.xsd ">
+<!-- Disabled by NomiHarder — replaced with MV-tier CraftTweaker recipe -->
+<recipe name="Farming Station" disabled="true" />
+
<recipe name="Tweak: Wood Hopper" disabled="true" />
<recipe name="Gear, Wood" disabled="true" />
<recipe name="Gear, ae2 messes things up" disabled="true" />

View file

@ -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

View file

@ -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"
}
]
}
}
}

View file

@ -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"
}
]
}
}
}

View file

@ -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"
}
]
}
}
}

View file

@ -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"
}
}

View file

@ -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
}

View file

@ -0,0 +1,19 @@
--- scripts/Multiblocks.zs
+++ scripts/Multiblocks.zs
@@ -1831,17 +1831,6 @@
.outputs(<gregtech:meta_item_1:16035>)
.buildAndRegister();
-// Oil Drilling Rig mechanics
-oildrillingrig.recipeMap
- .recipeBuilder()
- .duration(100)
- .EUt(875)
- .inputs(<inspirations:pipe>)
- .fluidInputs(<liquid:drilling_fluid> * 1000)
- .fluidOutputs(<liquid:oil> * 1000)
- .property("consumeChance", 1)
- .buildAndRegister();
-
// Lunar Mining Station Rover Missions
lunarminingstation.recipeMap

View file

@ -0,0 +1,11 @@
import crafttweaker.item.IItemStack;
import crafttweaker.oredict.IOreDictEntry;
recipes.remove(<enderio:block_farm_station>);
recipes.addShaped("nomiharder_farming_station", <enderio:block_farm_station>,
[
[<enderio:item_material:13>, <minecraft:ender_pearl>, <enderio:item_material:13>],
[<enderio:item_alloy_ingot:7>, <gregtech:machine:502>, <enderio:item_alloy_ingot:7>],
[<ore:gearSteel>, <minecraft:ender_pearl>, <ore:gearSteel>]
]
);

View file

@ -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

20
sources.nix Normal file
View file

@ -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=";
};
}