Nerospace 1.0.2 - Forge 26.2
Curse Maven Snippet
What's new
Added
NeroLink companion module (za.co.neroland.nerospace.link)
- Nerospace now registers a module with Neroland Core's link registry, so the NeroLink companion
bridge serves it instead of reporting
nerospace: absent. Schema v1. - Five read-only sections:
rockets(tier, fuel, oxygen, power, launch readiness + nearby launch-pad tiers),stations(the stations you own, plus registry capacity as plain counts),planets(gravity / airless / hazard, plus which worlds you have reached),life_support(your oxygen tank, suit tier and hazard shield) andstar_guide(your chapter/step progress and next step). - Two deliberately conservative actions:
rename_station(owner-gated, online-required, runs the same server-side path as the in-game naming console) andacknowledge_alert. Nothing in the module can launch a rocket, move a player or edit the world from a phone. - Three live events:
oxygen_lowandrocket_landed(owner-scoped), and a deliberately anaemicstation_statebroadcast carrying only a slot number, a dimension and a state word. - New config key
linkModuleEnabled(defaulttrue, server-authoritative) switches the whole module off; it is re-checked on every snapshot, action and publish, so/neroland config reloadapplies immediately. - Privacy: every section is filtered by the requesting player's UUID. No other player's station, oxygen value or Star Guide step can appear in a response; ownership of other players is never emitted, not even as a name. Operator status is deliberately not honoured. Rockets and launch pads have no owner in Nerospace, so that section reports only what you could already see from where you stand (a 128-block radius around you, while online) rather than a server-wide roster.
Per-loader Maven artifacts published to GitHub Packages
- The release workflow now publishes all six
nerospace-<loader>-<mc>artifacts after the build, so sibling Nero mods can compile againstza.co.neroland.nerospace.apifrom a remote repository instead of reaching Nerospace by reflection.
Marker-less quarry setup (frame outline)
- The quarry area can now be defined without landmarks: outline a closed rectangle with
hand-placed Frame Casing (it is now a placeable block item that places
quarry_frame) and put the Quarry Controller beside it — the controller detects the complete perimeter (same plane, same size limits as the landmark path) and starts mining inside it immediately. The landmark flow is unchanged. - The GUI now shows why the quarry is paused ("Paused — frame incomplete / out of power / output buffer full / fluid buffer full / out of Frame Casing / wrong planet").
Public cargo-rocket route API (za.co.neroland.nerospace.api)
- New semver-stable route surface for logistics consumers (NeroLogistics'
RouteProviderseam):NerospaceRoutes— static lookup facade:endpoints()(Home + Orbital Station + the three moons, stable order),endpoint/isEndpoint,route(from, to),routesFrom(from), andisOpen(...)liveness checks against loaded dimensions.RouteEndpoint— immutable endpoint record (dimension key, display name, optionalPlanetId).CargoRoute— immutable directed route record carrying the minimum rocket tier (1–4), the per-launch fuel cost in millibuckets (the same cross-dimension launch cost a crewed rocket pays,fuelCost-config-scaled at query time), and a canonical transit duration in ticks (TRANSIT_TICKS_PER_STEPper step of separation in the destination order).
- Read-only and player-data-free; the internals (
rocket.Destinations,rocket.RocketTravel,rocket.RocketTier) remain internal.
Meteor Tracker is now craftable (survival)
- New shaped recipe: a vanilla Compass with Nerosteel Ingots above and below and Redstone Dust at the sides. The tracker was previously creative-only. (The four destination compasses remain creative-only pending a rework.)
Optional Energized Power interop declared
- All three loader manifests now declare Energized Power as an optional/suggested
dependency with
AFTERload ordering, so its capabilities andc:tags are ready before Nerospace loads when it is installed. Nerospace stays fully independent of it.
Fixed
A refused GUI no longer reports as a successful one (MC-NEROSPACE-J)
- The
MenuOpenerguard already stopped a Bukkit/Paper hybrid from taking the server thread down when a plugin choked on a modded item duringInventoryOpenEvent— but 21 of its 22 call sites discarded the result and returnedInteractionResult.SUCCESSregardless. They now return the newMenuOpener.openOrConsume, which reportsCONSUMEon a refusal.FAILwould be wrong: it does not consume the action, so the interaction would fall through to the held item and the player would place a block against the machine they were trying to open. - An Alien Villager whose trade screen was refused stayed locked forever.
startTradingset the trading player before opening, and nothing cleared it when the open failed — so the villager was flagged as busy with a player who had no window, and neither they nor anyone else could trade with it again. It is now released on refusal. - Handled-failure telemetry was applying its
handled/sourcetags through a scope that never reached the event, so every report arrived unlabelled, at error level, in its own new issue. The tags now land, the level isWARNING(a guard caught it; the server carried on), and reports are fingerprinted by guard and operation so hybrid noise collapses into one issue without swallowing a genuine bug in one of our own menus. - Privacy: the guard's log line and telemetry payload identified the menu by its rendered title, which for a renamed Alien Villager is text a player typed on a name tag. It now sends the translation key or the provider class name, never player-authored text.
Right-to-erasure now reaches Alien Villager reputation (POPIA/GDPR)
- Each Alien Villager keeps a
UUID -> reputationmap in its own entity NBT — an undeclared fourth per-player store that Nerospace's Core erasure hook never touched, so an erased player's UUID could sit in villager NBT indefinitely. The eraser (nowdata.NerospaceErasure) sweeps every loaded level and drops the entry, and a villager whose chunk loads later in the same server session has the entry stripped as it reads its NBT. The residual gap — a villager in a chunk never visited again after a server restart — is documented in code rather than papered over; deliberately no persistent suppression list, because storing the very UUID we were asked to forget, forever, would be worse. - The eraser's comment claiming an offline player's attachment data "resets to defaults on its own"
was wrong: both
oxygenandstar_guide_seenare declaredserialize(...)withcopyOnDeath()and persist in the player's save file. The comment now states the real limitation, and an erasure that lands while a player is offline is completed the next time they log in during the same session.
Machine blocks now drop themselves when mined
- Several blocks used
requiresCorrectToolForDropsbut were missing from theminecraft:mineable/pickaxetag, so no tool ever counted as correct and they dropped nothing: Fuel Tank, Fuel Refinery, Oxygen Generator, Terraformer, Hydration Module, Terraform Monitor, Star Guide, Solar Panel (all tiers), Quarry Controller, Rocket Launch Pad, Launch Gantry, Village Core (plus Meteor Core, Launch Controller and its filler for mining-speed parity). All are now pickaxe-mineable; loot-table-dropping ones also need an iron tool, matching the other machines. Solar Panel T2/T3 keep their one-item multiblock drop from code (their loot tables are now empty to prevent a duplicate drop).
Changed
Neroland Core dependency floor raised to 1.10.0
nerolandcore_versionmoves from1.4.0to1.10.0(six minors of drift). Core's V1 API is frozen and every minor in that range is additive-only, so no Nerospace code changed. The loader dependency ranges are derived from this single property —[1.10.0,2.0)for NeoForge/Forge and>=1.10.0 <2.0.0for Fabric — so an out-of-date Core is now refused at load time instead of crashing later at registration.
Quarry frame lifecycle
- Breaking a frame block now drops a Frame Casing, and the quarry notices the broken ring: it rebuilds the gap from its casing stock, or pauses with "frame incomplete" until the player patches the ring by hand or inserts casings into the frame slots.
- A finished dig dismantles its frame: the standing frame blocks are removed and their casings returned to the controller's frame slots (spilled at the controller if the slots overflow). Breaking the controller still drops everything it holds.
- Breaking the controller mid-dig no longer silently deletes the frame. The orphaned frame
blocks now decay: each one crumbles (break effect, dropping its Frame Casing — the same
drop as mining it yourself) at its own random moment, the ring slowly dissolving block by
block over roughly the next 30 seconds to 4 minutes (tunable via the new
quarryFrameDecayTicksconfig key). Placing a new controller beside a still-complete orphaned ring re-adopts it and stops the decay.
Storage blocks moved to Neroland Core
- The Battery, Fluid Tank, Gas Tank, Item Store, and Trash Can (the first
four with their Creative variants) now ship in the shared Neroland Core library
instead of Nerospace. Their ids changed from
nerospace:*tonerolandcore:battery,nerolandcore:fluid_tank,nerolandcore:gas_tank,nerolandcore:item_store,nerolandcore:trash_can(andnerolandcore:creative_*), so every Neroland mod now shares one set of storage endpoints. They craft and behave exactly as before. - Bumped the required Neroland Core dependency to 1.1.0 (the release that adds these blocks and the generic fluid/gas storage APIs; the Trash Can also brings Core's first menu type and client screen).
- The Universal Pipe still interoperates with all of these blocks — it bridges Core's
nerolandcore:fluid/nerolandcore:gas(and energy / item) capabilities onto Nerospace's ownnerospace:fluid/nerospace:gaslookups, so existing pipe networks keep working (including voiding into the Trash Can).
Generators now push power directly (no cables needed)
- The Combustion Generator, Passive Generator, and Solar Panel now default their energy auto-eject to ON: they push power into adjacent receivers every tick — machines, batteries, pipes, and (via Neroland Core 1.3.2's Forge-Energy fallback) third-party FE blocks. Auto-eject can still be toggled off per machine in the side-config UI.
Quarry pacing rebalance
- The quarry's mining interval increased from 8 to 10 ticks — a modest slow-down to rebalance throughput against its power draw.
Neroland Core dependency bumped to 1.3.2
- Brings the standard Forge-Energy fallback in Core's energy lookup: the Universal Pipe now connects to and transfers with third-party FE cables and machines (e.g. Energized Power) on NeoForge and Forge, and Core's Battery pushes power into adjacent blocks without cables. See Neroland Core's changelog for details.
Build & CI
- New auto-assign workflow: the maintainer is assigned to newly opened issues and PRs
(including forked PRs via a limited, API-only
pull_request_target). publish.ymlrelease-note extraction now tries the exact version section first, falls back to[Unreleased], and only uses the placeholder when neither exists.
Migration note (existing worlds)
- Block-id aliases preserve existing placements. Blocks already placed as
nerospace:battery,nerospace:fluid_tank,nerospace:gas_tank,nerospace:item_store, ornerospace:trash_can(andcreative_*) are remapped to the matchingnerolandcore:block on load:- Forge — via Forge's
MissingMappingsEvent(fully supported). - NeoForge / Fabric — modern NeoForge removed that event and Fabric never had
one, so a small, strictly-scoped mixin remaps these ids at the registry
lookup instead. It is
require = 0(best-effort): if it can't apply on a given version it safely no-ops rather than crashing. Verify on your save after updating; if a placed block ever drops, break and re-place it with the Neroland Core variant — items and stored contents are unaffected regardless.
- Forge — via Forge's
This mod has no additional files

