Skip to content

Nerospace 1.0.2

Latest

Choose a tag to compare

@github-actions github-actions released this 10 Aug 20:29

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) and star_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) and acknowledge_alert. Nothing in the module
    can launch a rocket, move a player or edit the world from a phone.
  • Three live events: oxygen_low and rocket_landed (owner-scoped), and a deliberately anaemic
    station_state broadcast carrying only a slot number, a dimension and a state word.
  • New config key linkModuleEnabled (default true, server-authoritative) switches the whole module
    off; it is re-checked on every snapshot, action and publish, so /neroland config reload applies
    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 against za.co.neroland.nerospace.api from 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' RouteProvider seam):
    • NerospaceRoutes — static lookup facade: endpoints() (Home + Orbital Station + the three
      moons, stable order), endpoint/isEndpoint, route(from, to), routesFrom(from), and
      isOpen(...) liveness checks against loaded dimensions.
    • RouteEndpoint — immutable endpoint record (dimension key, display name, optional PlanetId).
    • 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_STEP per 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 AFTER load ordering, so its capabilities and c: 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 MenuOpener guard already stopped a Bukkit/Paper hybrid from taking the server thread down when
    a plugin choked on a modded item during InventoryOpenEvent — but 21 of its 22 call sites discarded
    the result and returned InteractionResult.SUCCESS regardless. They now return the new
    MenuOpener.openOrConsume, which reports CONSUME on a refusal. FAIL would 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. startTrading set 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 / source tags 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 is WARNING (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 -> reputation map 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 (now data.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 oxygen and star_guide_seen are declared serialize(...) with copyOnDeath()
    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 requiresCorrectToolForDrops but were missing from the
    minecraft:mineable/pickaxe tag, 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_version moves from 1.4.0 to 1.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.0 for 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
    quarryFrameDecayTicks config 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:* to nerolandcore:battery,
    nerolandcore:fluid_tank, nerolandcore:gas_tank, nerolandcore:item_store,
    nerolandcore:trash_can (and nerolandcore: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
    own nerospace:fluid / nerospace:gas lookups, 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.yml release-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, or nerospace:trash_can (and creative_*) are remapped to
    the matching nerolandcore: 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.