enhancement: multi loader support#6
Draft
Dario-Maselli wants to merge 43 commits into
Draft
Conversation
Introduce a self-contained multiloader scaffold for Architectury (common/fabric/neoforge) with Stonecutter-ready version-axis wiring. Adds: module Gradle files, settings, multiloader gradle.properties, stonecutter stub, README, common loader-agnostic entry (NerospaceCommon), platform service seam (IPlatformHelper, Services), example registries (ModRegistries), Fabric/NeoForge entry points and platform implementations, mixin and mod metadata. Scaffold is inert and does not touch the existing root single-loader build; verify and pin real Fabric/Architectury/NeoForge versions in gradle.properties before building.
Introduce multiloader build support: add a GitHub Actions workflow (.github/workflows/multiloader.yml) that iterates loader × Minecraft version matrix (experimental continue-on-error cells) and uploads built jars. Add VS Code run/debug templates and tasks (.vscode/launch.json, .vscode/tasks.json) to build/run NeoForge and Fabric targets and to regenerate loom genVsCodeRuns. Update multiloader/README.md with usage, CI, and VS Code instructions and matrix explanation. Adjust multiloader/build.gradle to derive minecraft_version_range for resource expansion, and enrich multiloader/gradle.properties with matrix pins, upstream availability notes, and per-version dependency placeholders.
Add a dedicated Gradle wrapper (9.5.1) for the multiloader nested build and make CI/tasks/VS Code use it (chmod multiloader/gradlew, set working-directory/cwd and point commands at multiloader/gradlew). Update multiloader build files: pin architectury-loom 1.17.483, adjust mappings commentary, and update fabric/architectury version pins. Improve VS Code launch/presentation formatting and rewrite tasks.json to call the multiloader wrapper (add a "Refresh loom caches" task). Expand docs (docs/MULTILOADER.md and multiloader/README.md) with architecture guidance and troubleshooting notes explaining why the separate wrapper is required and that architectury-loom currently lacks de-obfuscated MC 26.x support, which blocks builds.
Replace the Architectury-based multiloader scaffold with the MultiLoader-Template layout (ModDevGradle NeoForm/common + Fabric Loom/fabric + ModDevGradle/neoforge). Remove architectury-loom/plugin usage and related DeferredRegister wiring; share common sources via root ext properties and update module build scripts (common, fabric, neoforge) to use net.neoforged.moddev and net.fabricmc.fabric-loom. Update CI to mark fabric@26.2 verified, adjust gradle.properties pins (default MC 26.2, NeoForm/Fabric/NeoForge notes) and add guidance for self-building NeoForge to mavenLocal. Docs and README updated to explain rationale (architectury-loom lacks de-obf 26.x support), build instructions, and migration status; ModRegistries and NerospaceCommon adjusted to reflect the new registration seam.
Refactor multiloader CI/workflow and developer tasks for the nested multiloader build. - Harden multiloader GitHub Actions: remove continue-on-error, clarify matrix cells as verified or pending, and add strict failure/docs in comments. - Update editor integration: add nerospace.code-workspace to import the multiloader build; neutralize multiloader/.vscode/launch.json; update root .vscode/launch.json to include build/resources/main in -Dfml.modFolders so processed resources are found. - Overhaul .vscode/tasks.json with explicit ML run/build tasks (fabric/neoforge), use :fabric:vscode to generate Fabric run configs, add runServer/runClient targets, and set default MC to 26.2. - Add ignores for runs/ and multiloader/fabric/runs in .gitignore. - Java API adjustments for NeoForge: use FMLEnvironment.isProduction() and FMLEnvironment.getDist() to match 26.1.x API. - Small resource tidy: normalize hyphenation in fabric.mod.json and neoforge.mods.toml and remove the 'architectury' suggestion from fabric.mod.json. These changes make CI expectations explicit, provide convenient run/build tasks for the multiloader, and update code to match the newer FMLEnvironment API.
Add committed, relative VS Code run/debug configs and tasks for the multiloader and update the root launch config. Move loader manifest templates from src/main/resources to src/main/templates and add generateModMetadata ProcessResources tasks (fabric & neoforge) wired into sourceSets/IDE sync so manifests are expanded into a generated resources dir. Remove the previous global resources expansion in multiloader/build.gradle since each module now handles its own metadata generation. These changes prevent the IDE from copying raw tokenized manifests into bin/main, ensure Run & Debug picks up expanded manifests, and provide preLaunch tasks to regenerate per-machine launch args.
Point fml.modFolders at nefospace/bin/main only (remove the additional build/resources path) across .vscode/launch.json and multiloader/.vscode/launch.json. Normalize VM arg escaping (use = instead of escaped = sequences), remove machine-specific absolute launch entries from multiloader, and tidy nerospace.code-workspace formatting and settings (remove a redundant java.setting). This fixes incorrect use of ${pathSeparator} (which VS Code treats as a file separator) and keeps run/debug configs portable and relative.
Add a cross-loader registration seam (RegistrationProvider) and concrete factories for Fabric and NeoForge. Introduce ModBlocks, ModItems and ModRegistries to register a new Nerosium block and its BlockItem, plus assets (blockstate, model, texture, lang). NeoForge factory wraps DeferredRegister instances and exposes registerAll to attach to the mod event bus; Fabric factory performs eager Registry.register calls. Wire ModRegistries.init() into NerospaceCommon.init(). Also apply VS Code launch/tasks formatting tweaks, add multiloader neoforge run configs, and enable Java null analysis in nerospace.code-workspace.
Introduce multiple ore/material families and the associated assets, and centralise common registrations. ModBlocks was refactored to register many blocks (nerosium, deepslate_nerosium, nerosteel, xertz_quartz, cindrite, glacite, raw blocks, etc.) via a helper that applies common properties (map color, hardness/resistance, requiresCorrectToolForDrops, sound). ModItems now registers block items and material items (ingots, raw materials, quartz, gems) and exposes creativeTabItems() to group items into vanilla creative tabs. Adds all required resource files (blockstates, models, item models, textures, language entries, data tags, loot tables and recipes) to support the new content. Also updates platform entry points/templates and the workspace to reflect the expanded registrations.
Refactor ModBlocks to use a UnaryOperator for BlockBehaviour properties and add new blocks (station_floor, station_wall, alien_* variants, alien_lamp, alien_crystal_block, meteor_rock, plus ores/blocks like glacite). Register corresponding block items in ModItems and update creative tab groupings. Add resource assets: blockstates, block/item models, textures, loot tables, language entries, and crafting recipes for station_floor and station_wall. Update minecraft block tags (mineable/pickaxe and needs_iron_tool) to include the new blocks.
Register new items and assets for oxygen suit variants and a nerosium pickaxe. ModItems.java: add tool/armor materials, equipment asset keys, armor/tool item registrations, overloaded item helper, tag and equipment-asset helpers, and include items in creative tabs. Add resource files (equipment JSON, item models, textures, recipes) and language entries for the new items.
Register several new items (nerosium_dust, alien_fragment, alien_tech_scrap, alien_core, rocket_fuel_canister, frame_casing, grav_striders, drift_fleece) in ModItems and add them to the creative Ingredients tab. Add item asset JSONs, item model JSONs, and PNG textures for each new item. Update en_us.json with display names for the new items. Add crafting recipes: frame_casing (shaped), rocket_fuel_canister (shapeless), and an oxygen_suit_chestplate recipe that uses the rocket fuel canister.
Introduce worldgen data and wiring for the new Nerosium ore. Adds a configured_feature (nerosium_ore.json) and placed_feature (nerosium_ore_placed.json) defining ore size, targets (stone/deepslate), spawn count and height range. Adds a NeoForge biome_modifier JSON to inject the placed feature in overworld biomes. Updates Fabric initializer to register creative tab items and programmatically add the placed feature to overworld biomes (UNDERGROUND_ORES) via BiomeModifications so the ore appears on Fabric runtime.
Introduce a new Item Store block and block-entity: ItemStoreBlock and ItemStoreBlockEntity (27-slot WorldlyContainer exposing a vanilla ChestMenu). Register the block, item and block-entity via ModBlocks/ModItems/ModBlockEntities and wire ModRegistries.init(). Add resources: blockstate, model, item model, textures, lang entries, loot table, crafting recipe, and update mineable/needs_iron_tool tags. Platform/build changes: add Fabric access widener and reference it in fabric.mod.json and fabric/build.gradle to support Fabric @26.1.2; bump neo_version_26.2 in multiloader/gradle.properties. Update CI workflow (.github/workflows/multiloader.yml) and multiloader/README.md to reflect the current build-matrix status and notes about loader/version compatibility.
Register the item-storage capability for the item_store block entity on both Fabric and NeoForge sides so automation/pipes can move items in/out. - Fabric: import Fabric Transfer API and register ItemStorage.SIDED for ModBlockEntities.ITEM_STORE using ContainerStorage.of(...). - NeoForge: add NeoForgeCapabilities that registers Capabilities.Item.BLOCK for ModBlockEntities.ITEM_STORE (using WorldlyContainerWrapper/VanillaContainerWrapper) and wire its registration into NerospaceNeoForge. This creates a seam between Fabric's ItemStorage and NeoForge's transfer API to expose the block entity inventory to platform transfer systems.
Add a passive Battery block and block entity with a mod-neutral energy API. Introduces NerospaceEnergyStorage and a simple EnergyBuffer implementation (CAPACITY=1_000_000, MAX_IO=10_000) with NBT save/load accessors. Register the Battery block, item and block entity, include it on the creative tab, and add models, textures, blockstate, loot table, and a crafting recipe. Update mineable/needs_iron tags and language entry. Wire up loader-specific seams: Fabric BlockApiLookup and NeoForge BlockCapability are registered to expose the battery's NerospaceEnergyStorage for cross-loader mod usage.
Introduce a single‑fluid tank feature: NerospaceFluidStorage interface and FluidTank implementation (bounded mB storage with change callback). Add FluidTankBlock and FluidTankBlockEntity (16,000 mB capacity) with save/load of fluid and amount. Register the block, item and block entity, add recipe, loot table, blockstate/model/textures and language entry, and update mining/tool tags. Wire the mod-owned fluid lookup/capability for Fabric (BlockApiLookup) and NeoForge (BlockCapability) so the tank is discoverable via the mod's fluid API. Platform-standard fluid handler integration is noted as a deferred enhancement.
Introduce a Combustion Generator machine: adds CombustionGeneratorBlock and CombustionGeneratorBlockEntity that burn fuel items into energy (single fuel slot, capacity 100000, FE_PER_TICK 20). Add EnergyBuffer.generate(int) to support internal generation for generators. Register the block, block entity and item, update creative tab and block tags (mineable/needs_iron_tool). Add blockstate, model, textures, loot table, recipe and localization entry. Wire platform integrations: Fabric item/energy capabilities and NeoForge item/energy capability registrations. Save/load and container behaviour implemented on the block entity; common fuels and burn values defined.
Introduce a minimal Combustion Generator UI and menu support: new CombustionGeneratorScreen (simple backdrop + energy bar), CombustionGeneratorMenu, and ModMenuTypes. Wire client-side screen registration for Fabric (MenuScreens) and NeoForge (RegisterMenuScreensEvent) and update ModRegistries to initialize menu types. Make CombustionGeneratorBlockEntity implement MenuProvider and expose a ContainerData array to sync energy/capacity/burnTime/maxBurnTime with the menu; open the menu server-side on block use. Add container translation entry for the generator. This enables server-side menu creation and client screen registration; visual polish for the GUI texture is left for follow-up.
Introduce the Nerosium Grinder: block, block entity, menu, and screen with full client/server wiring and assets. Adds machine logic (tick, energy consumption, crafting, sided item access) and in-code GrinderRecipes (ores/raw -> 2 dust, ingot -> 1 dust) intended for a future datapack swap. Includes resource files (models, textures, blockstate, item model), loot/recipe JSON, and registers the block/item/menu/block-entity across registries and Fabric/NeoForge integration. Also adds EnergyBuffer.consume for internal energy use and exposes progress/energy data via the menu for the UI.
Introduce a new Passive Generator: adds PassiveGeneratorBlock, PassiveGeneratorBlockEntity (energy buffer, core item handling, ticking logic, save/load), PassiveGeneratorMenu and PassiveGeneratorScreen. Registers block, block entity, item and menu type, and wires item/energy capabilities for Fabric and NeoForge. Includes blockstate, block/item models, textures, loot table, crafting recipe, data tags, and language entries; updates creative tab to include the new block.
Introduce a new Universal Pipe block and BlockEntity that relays energy between adjacent storages. The pipe provides a small internal buffer (CAPACITY=8000, MAX_IO=1000) and tick logic to pull from extractable neighbours and push into insertable neighbours via a cross-loader EnergyLookup seam. Add EnergyLookup interface and platform adapters for Fabric and NeoForge (with service loader entries), register the block, item and block entity, wire the pipe into Fabric BlockApi and NeoForge capability registrations, and include assets/data (model, texture, blockstate, loot, recipe, language) and tag updates.
Introduce two new storage blocks: Trash Can (void item/fluid sink) and Creative Battery (infinite energy source). Adds block & block-entity classes, registration in ModBlocks/ModBlockEntities/ModItems, creative tab entries, loot tables, a crafting recipe for the Trash Can, and blockstate/model/texture/item assets. Exposes capabilities for both Fabric (ItemStorage/FLUID/ENERGY) and NeoForge (item/fluid/energy) integration. Also updates migration docs with a 2026-06-20 progress note.
Add cross-loader rocket-fuel fluid and a new gas layer plus related machines and assets. - Fluid: introduce FluidFactory seam and ModFluids to register rocket_fuel (source + flowing), add RocketFuelLiquidBlock and rocket_fuel_bucket item; add per-loader platform glue (Fabric/NeoForge) and note Fabric render caveat in docs. ModRegistries now initializes fluids before blocks/items. - Gas layer: add GasResource enum, NerospaceGasStorage interface, GasTank implementation and GasLookup seam; add GasTankBlock/GasTankBlockEntity and register them. - Machines: add OxygenGenerator and SolarPanel blocks + block entities (oxygen generator consumes energy to produce O2; solar panel generates energy). Update ModBlockEntities/ModBlocks/ModItems to register new blocks/items and include them in creative tabs. - Universal pipe: extend UniversalPipeBlockEntity to carry/relay gas (single-gas buffer), persist gas state, and use GasLookup in addition to EnergyLookup. - Assets & data: add block/item models, textures, loot tables, recipes and language strings for the new content. - Docs: update MULTILOADER_MIGRATION.md with notes about the fluid and gas ports and known follow-ups. These changes unblock the refinery/fuel tank and a basic oxygen/gas transport network across loaders.
Introduce item transport to the Universal Pipe: the pipe now implements WorldlyContainer with a 3-slot buffer, item serialization, and per-tick relay logic that pulls from non-pipe neighbours and pushes to any neighbour (vanilla Container adjacency, so it interoperates with vanilla chests/furnaces and mod machines). Added helper methods for slot/face handling and single-item transfer/insert. Register item storage capabilities on Fabric (ItemStorage.SIDED → ContainerStorage.of) and NeoForge (Capabilities.Item.BLOCK → WorldlyContainerWrapper/VanillaContainerWrapper). Also tweak SolarPanel illumination logic to use getSkyDarken() + open-sky check, and update docs to mention the new item relay and solar panel port.
Introduce three new mobs (Xertz Stalker, Quartz Crawler, Greenling) with server-side classes, AI goals and attribute builders; register cross-loader EntityType entries via ModEntities and expose attribute registration via ModEntityAttributes. Add client-side model classes, a shared GreenxertzMobModel base, renderers (GreenxertzCreatureRenderer, ClientEntityRenderers) and an emissive GlowEyesLayer, plus entity textures and glow textures. Add sound event registrations (ModSounds) and a sounds.json resource aliasing vanilla events; update ModRegistries to initialize sounds and entities. Also add a temporary build.gradle 'probeEntity' task to inspect EntityType.Builder signatures.
Introduce six new fauna: CinderStalker, EmberStrutter, FrostStrider, MeadowLoper, RuinWarden and WoollyDrift. Adds entity classes with attributes, AI and sound hooks, client-side model classes and LayerDefinitions, and textures (including glow maps). Registers renderers in ClientEntityRenderers and updates ModEntities, ModEntityAttributes and ModSounds; also adds localization entries in en_us.json. Hostile predators (CinderStalker, FrostStrider, RuinWarden) and livestock (EmberStrutter, MeadowLoper, WoollyDrift) include basic breeding/food handling, sounds, and animations.
Introduce a new Alien Villager NPC and supporting assets: adds the AlienVillager entity (merchant behavior, per-player Reputation, persistence, variant/planet/biome/color seed), createAttributes(), and registration in ModEntities and ModEntityAttributes. Implements Phase-2 trading flow and gift interactions with tiered offers via new AlienTrades and Reputation utility; offers include the Xertz Resonator (added as a plain item, model and texture included; custom gear behaviour deferred). Adds client-side rendering: AlienVillagerModel, AlienVillagerRenderState, AlienVillagerRenderer, textures (base/meadow/cindara/glacira/glow) and language entries; registers the renderer in ClientEntityRenderers. Updates docs (MULTILOADER_MIGRATION.md) noting port progress and temporary Greenxertz-only planet selection; natural spawning and spawn eggs are deferred pending dimensions/biomes. Persistence: per-villager reputation map is serialized/deserialized with a Codec; trading state and display tier logic included.
Port planetary content to datapacks and expose dimension keys in code. Adds dimension JSONs (greenxertz, cindara, glacira, station), a custom dimension_type/space.json, biome definitions (with mob spawners and ore feature references), configured and placed worldgen features for four ores, and a ModDimensions Java class that provides ResourceKey constants (Level/LevelStem) for use by code (rocket travel, villager variant). Also updates MULTILOADER_MIGRATION.md to document the port and next steps.
Port core rockets into the multiloader: add RocketEntity, RocketItem (4 tiers), RocketLaunchPadBlock, LaunchGantryBlock, LaunchPadMultiblock, Destinations, RocketMenu and the client-side pieces (RocketModel, RocketT2/T3/T4Model, RocketRenderer, RocketRenderState, RocketScreen, SpaceButton, TexturedContainerScreen). Register the rocket renderer, update registries (blocks/items/entities/menus), and include all related assets and data (textures, item/block models, blockstates, loot tables, recipes, lang entries). Update migration/checklist docs to note the port and deferred work (station founding and automation proxy). Also trim .vscode launch configs and apply small build/client setup tweaks for Fabric/NeoForge.
Port fuel-related machines to the multiloader: add FuelTank and FuelRefinery blocks, block entities, menus and client screens, plus UI helper (segmented gauge) in TexturedContainerScreen. Register block entities/items/menus and wire energy/fluid/item hookups using shared EnergyBuffer/FluidTank APIs. Add assets (models, textures, blockstates, GUIs), loot tables and recipes, and four lang keys. Also update docs and CI pins/status to reflect NeoForm/NeoForge/Fabric 26.2 availability (pin NeoForge 26.2.0.6-beta) and mark fuel machines as ported in the port-checklist and multiloader README.
Introduce a complete quarry machine: controller block and block entity implementing the mining logic, frame and landmark blocks/entities, region discovery, chunk forcing, auto-ejecting output, fluid sucking, energy/fluid buffers, persistence and container access. Add UI and menu (QuarryScreen, QuarryMenu) and supporting types (MinerTier, PlanetMiningProfile, OutputFilter, QuarryRegion). Update registries and NeoForge capabilities to wire the new parts. This implements the core quarry functionality (frame building, layered excavation, buffering/ejection and status syncing) necessary to run and control the machine.
Introduce creative travel items and lazy spawn eggs: add DestinationCompassItem (teleports to specific Nerospace destinations, creates a platform on the station), GreenxertzNavigatorItem (toggles between overworld and Greenxertz), and NerospaceSpawnEggItem (lazy EntityType supplier to avoid early binding). Register navigator, four compasses and nine spawn eggs in ModItems (including a spawnEgg helper), add item assets/models/textures and language entries, and update the MULTILOADER port checklist. Assets and creative tab placements for tools/utilities and spawn eggs were also added.
Introduce a cross-loader dedicated creative tab for the mod: add ModCreativeTab (registered via the common RegistrationProvider over CREATIVE_MODE_TAB) and wire it into ModRegistries.init(). Add ModItems.creativeContents() to produce a stable, flattened ordering for the tab. Remove per-loader creative-tab injection from Fabric and NeoForge (add explanatory comments) since the single tab now supplies contents. Add the language key (itemGroup.nerospace) and update the port checklist docs to explain the port and note the runtime bug fix (previous per-loader injections never populated tabs at runtime).
Introduce a reusable MachineModules system (MachineModules, ModuleType, UpgradeModuleItem) and integrate it into the quarry: controller now exposes module slots, aggregates speed/efficiency/fortune/silk-touch effects, adjusts energy/per-block and mining rate, and persists module state. Update QuarryMenu to show module slots and enforce module-only placement, and route container access between frame/modules/output. Add creative storage endpoints (AbstractStorageBlock + CreativeFluidTank/GasTank/ItemStore and their block entities) that provide endless fluid/gas/item sources, plus their block/item registrations and assets. Register new blocks/items/block-entities and add four module items (speed/efficiency/fortune/silk-touch); copy related assets and language keys. Minor tweaks: routing helpers, enchantment lookup via Registries, serialization hooks for modules, and UI/container size plumbing.
Implements a simplified cross-loader oxygen/atmosphere survival core. Adds OxygenManager (per-player O2 drain/refill, suit handling, air-supply mirroring), Fabric and NeoForge attachment registrations, and platform helper getters/setters for oxygen via IPlatformHelper. Registers ticking hooks for Fabric and NeoForge, wires ModDataComponents into ModRegistries, and adds ModTags plus a language key for the no-oxygen message. Also updates the port checklist doc to mark the oxygen core progress and inlines the cross-loader design notes; diffusion/field networking and other advanced features are deferred.
Introduce a cross-loader networking abstraction and implementations. Adds common ModNetwork (payload registry, clientbound/serverbound records, send helpers and init hook) and NetworkPlatform interface, and wires Services.NETWORK. Fabric and NeoForge concrete implementations (FabricNetwork, NeoForgeNetwork) register payload types/receivers and implement send methods; service provider files added for both loaders. NerospaceFabric/NerospaceFabricClient and NerospaceNeoForge now register the networking pieces, and ModRegistries calls ModNetwork.init(). Update docs to mark the networking seam done and document payload registration/sending and client-safety contract. Payloads themselves remain unregistered here and will be added by their consuming subsystems.
Ported alien worldgen and structure code into the multiloader: adds Hamlet, Ruin and MegaCity Feature implementations, the shared AlienBuild procedural pieces, and StructureSpacing region/density logic. Registers the Feature types via a new ModFeatures provider and wires ModFeatures.init() into ModRegistries. Adds a decorative VillageCore block + item, model/texture/blockstate, loot table and language entry (interactive BE/controller deferred). Adds configured/placed feature JSON and re-adds the placed features to the Greenxertz biome so these structures generate. Also updates the docs checklist to mark structures as done.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Related issue
Type of change
Checklist
./gradlew runData(if datagen changed) and./gradlew buildboth pass (BUILD SUCCESSFUL).Notes for reviewers