Update

NEO: The Game – Update v1.31.0: A Lighter Offline Empire

Nalem


NEO: The Game – Update v1.31.0: A Lighter Offline Empire

Hello everyone,

This update is mostly about making the living galaxy cheaper and more reliable to run when you are away — plus clearer fixes in two very different building modes: first-person block building, and third-person city planning.

Offline empire — redesigned for performance

You already earned resources while offline: when you logged back in, the game caught up production for the time you were gone. That catch-up is still there.

What changed is how the offline side of the game runs:

  • Ship orders no longer need a full sector server just to wait. Before, an active inter-sector ship job could keep a whole Unity game process alive (or wake empty sectors on a timer) only to advance the order. That was expensive for the servers and fragile: some orders never finished if the ship was already at the destination. Orders now progress in a lightweight background worker that talks to the database directly — so your freighters keep moving without spinning up empty worlds.
  • Offline production can tick continuously, not only at login. The same worker can grant production while you stay disconnected, instead of waiting for your next reconnect to apply the whole catch-up in one go. Online players are carefully excluded so you never get paid twice for the same time window.
  • The goal is a lighter, more honest offline simulation — same empire progressing while you are away, far less RAM/CPU burned on idle sectors, and fewer stuck ship jobs.

First-person blocks

This is the on-foot mode: you look through the camera, aim a face, and place or break blocks from your hotbar — not the city-builder camera.

  • Identical blocks stack in one inventory slot (up to a stack limit). Placing the same block repeatedly no longer empties a slot and forces you onto the next one; twenty identical blocks no longer waste twenty slots.
  • Batch crafting spends first, then grants — crafting several items at once cannot credit free results if the cost fails mid-way.
  • Placed blocks stop flying away on your screen. The block appeared in the right spot, then drifted under world gravity on clients because physics was only frozen on the server. Blocks are neutralized for every peer now.
  • Clearer first-person placement feedback: translucent ghost previews, a single owner for rotation, and orientation that follows the face you aim at (all six directions).

Third-person roads and city building

This is the planning mode: the camera pulls back and you place roads (and buildings) like a city-builder on the planet surface — a separate pipeline from first-person blocks.

  • Roads no longer jump after you confirm them. The hover preview could look perfect, then the spawned tiles slid and twisted toward the world origin because of a leftover projector on the road prefab. That projector is removed.
  • Road preview follows the real ground under the cursor (surface normal, stable facing while you drag, invalid placements refused) instead of floating on a pure planetary radial.
  • The server uses the same road rules as the preview — overlap margins, distance to nearby roads measured from the placement point, orientation, and rejection of bad numbers — so what you see is what gets accepted.

Planets that stay loaded, respawns that work

  • Standing still no longer unloads your planet under you. If you paused long enough for physics to sleep (common while aiming a first-person place or lining up a road), or you were in a vehicle, the planet could decide nobody was there and despawn everything. Presence now covers sleeping rigidbodies and vehicles.
  • Death and respawn are more reliable, including god-mode /respawn when you need to reset on purpose.
  • More objects keep planet-local positions (stargates, wave spawners, related placements) so they do not drift when the world reloads.
  • Atmosphere rendering fix for planetary skies.

Smoother crowded sectors

  • Visibility updates are incremental. The sector used to rebuild who can see whom for every object against every connection on a timer — costly with many players and entities. It now updates only what moved or changed context, which should feel smoother in busy rooms.

What you should notice

  • Ship orders that keep progressing without waking empty sectors; offline production that can advance while you stay logged out (login catch-up remains the safety net).
  • First-person: stacked block inventory, stable block placement, clearer ghosts.
  • Third-person city building: roads that match the preview and stay where you laid them.
  • Fewer mystery planet unloads while you are still standing there.

Thanks for playing NEO! Stay tuned for more updates.

— Nalem


Full changelog (technical)

Offline economy worker (why / what)

  • Context: Login catch-up already applied offline resource gains as rate times time since last update. Continuous offline simulation and inter-sector ship bookkeeping previously leaned on Unity GameServers (wake timers, prevent-room-terminate), which was heavy and could leave orders stuck when the ship was already at the target sector.
  • Ship-order engine (tranche 1): standalone .NET worker advances order state from MongoDB only (pending to running to done, orphan purge, MOVE arrival without scene wake). Atomic resource ledger path reused for economic writes.
  • Continuous resource tick (tranche 2): worker grants production for offline players on an interval. Master persists a room registry so the worker skips online / suspect / stale sectors (anti double-earn vs the live GameServer tick). Final safety: compare-and-set on last-updated so a reconnect race cannot credit the same window twice.
  • Registry write ordering: room registry updates are serialized per room so an older write cannot resurrect a deleted room doc and freeze offline ticks for that sector.
  • Ops: self-contained linux worker deployed beside the game servers; restart scripts bring master, site bridge, and worker up together.

Interest management (perf)

  • Replaced global observer rebuilds with incremental rebuilds driven by spatial cell / observation-context changes. Baseline and before/after measurement harness added.

First-person blocks and inventory (separate from city-builder placement)

  • Inventory slots become typed stacks (item + count, max stack 64) instead of one string per slot — driven by first-person block spam/place workflow.
  • Batch craft: pay costs before crediting outputs (atomic fail-closed).
  • Disable dynamic rigidbody / world gravity on placed blocks for all peers (was server-only under server defines, so first-person clients kept drifting after a correct spawn).
  • Translucent first-person ghost; single rotation owner; neighbor-face orientation on six faces.

Third-person road / city-builder placement (separate from FP blocks)

  • Client road preview: ground normal (not only planetary radial), stable drag yaw, refuse invalid placements; stop copying neighbor pose as a full duplicate.
  • Server road validation parity with preview (overlap half-extents / bounds, distance anchored at placement point, orientation outward, reject NaNs).
  • Removed RoadProjector from road prefabs (it translated/rotated the road root toward world origin by projector height after spawn).

Planet presence and world locality

  • Keep planets loaded while a player remains: refresh presence for sleeping rigidbodies and vehicle occupancy (trigger Stay alone was not enough while aiming FP or city-builder placement).
  • Planet-local persistence for stargate / wave spawner / related sibling placements; safer child iteration when reparenting.
  • Atmosphere rendering fix.

Respawn

  • Death/respawn lifecycle hardening; voluntary kill/respawn path that can ignore god-mode when issued by command so /respawn works under god protection.
  • Legacy entity-id tolerance for older persisted documents.

Server save reliability

  • Planet climate at sector shutdown: planet climate/atmosphere data used to save mostly on a 5-minute timer. During a clean room stop, late climate writes could be rejected while gameplay admission was closed — so up to a few minutes of climate changes could be lost. Climate save is now part of the final sector save path for worlds still loaded, so it is awaited with the rest of shutdown.
  • Player stats final save no longer does a transient world-position write before the corrected planet-local write; final stats write is a true upsert.
  • Further removal of blocking waits on resource/research async paths; ResourceValue float truncation tolerance.
  • Mirror weave verifier and fail-closed per-DLL deploy smoke; server builds wait for editor recompile after server defines so script layouts match.