Multi-Team Support


Same Factorio seed, up to 20 private worlds — each team races their own copy. Independent research, separate planets, zero resource conflicts. Buddy-join with friends, ally via mutual friendship, spectate rivals with live per-player follow cams. First-to-research announcements and per-team clocks drive fair speedruns. Full Space Age support, including modded planets via PlanetsLib. Common terrain mods (dangOreus, VoidBlock, Alien Biomes) work out of the box.

Scenarios
2 days ago
2.0
179
Planets Character Environment

Changelog

Version: 0.4.12
Date: 2026-05-08
  Features:
    - Disable Blueprint Imports admin flag (default ON): blocks importing external blueprints
      via chat-paste strings, the blueprint library, and the Import-string button. In-game
      blueprint creation (alt-shift-click, copy-paste of placed entities) still works. Toggle
      from the Admin panel to allow imports without restarting.
Version: 0.4.11
Date: 2026-05-08
  Features:
    - Krastorio 2 / Krastorio 2 Spaced Out compatibility: crash-site entities (vanilla
      wrecks plus K2 spaceship pieces and chests) on team Nauvis surfaces are now
      mineable. K2's planetary teleporter "standing on" detection and tesla coil
      targeting now fire correctly on team characters.
Version: 0.4.10
Date: 2026-05-06
  Features:
    - Animated pop-text notifications: floating text animations appear above players at key
      moments — a coloured elastic pop on spawn confirm, a snap-in jiggle on team join, a
      large comic bounce above all team members on production milestones and death. All
      animations use the player's own chat colour. Disabled via the popup_text_enabled admin
      flag.
    - Tech research record popups: the first team to research a tech sees a "First!" popup
      with the tech icon; a subsequent faster clear shows "New record!". Uses the same
      animated pop-text system as milestones.
    - /t <message> command: sends a private message to your team only. Factorio's command
      system ensures the message is never broadcast by the engine — teammates see a green
      [Team] label; other teams see nothing.
    - Deep_Core_Operations compatibility: when DCO is active each MTS team gets its own
      ship via the DCO remote interface; players spawn on the ship's interior surface with
      DCO-appropriate starter items. Spawn teleports now retry each tick until the target
      surface is ready rather than silently dropping.
    - Admin starter-items panel: pressing Enter in the count field now submits the item,
      equivalent to clicking the + button.
  Changes:
    - Pop-text spawn position raised and upward drift increased so notifications are less
      likely to be obscured by open GUI panels.
  Bugfixes:
    - Fixed crash when a player died while in remote view: pop_text.rip was reading
      surface.players on a space-platform surface, which Factorio does not support.
    - Fixed crash when a tech was researched via the map editor: text render scale was 0 on
      the first tick (ease-out starts at 0); clamped to 1e-4.
    - Fixed spawn confirm popup not appearing after buddy join acceptance.
    - Fixed spawn confirm popup incorrectly firing when exiting spectator mode or during
      team-to-team force transitions.
    - Fixed spectator permission group blocking translate_string input actions, causing mods
      that call player.request_translations() (e.g. factoriolab-export) to hang waiting for
      on_string_translated events that never fired.
Version: 0.4.9
Date: 2026-05-05
  Features:
    - Ultracube compatibility: each team gets its own starting cube on their own surface.
      Cube location alerts are shown only to players on the relevant force. Force slots are
      cleaned up when a team disbands so recycled slots get a fresh cube and a clean victory
      condition.
Version: 0.4.8
Date: 2026-05-05
  Features:
    - Teams panel now shows a research queue in each team card header: up to 7 tech icons
      with live progress bars that update at 10 FPS in-place. Hovering an icon shows the
      tech name, queue position, and current progress percentage.
    - Team cards show a colour-coded last-active indicator (green < 1 h, yellow < 24 h,
      red > 24 h). Hovering it shows each member's total playtime and when they were last
      online. The label refreshes in-place once per minute.
    - Production Stats item tracking is now per-player — each player independently
      explores which items to track; no longer a shared global list.
    - Production Stats columns are now sortable. Click any column header to cycle through
      unsorted → descending → ascending.
  Changes:
    - Max teams cap raised from 20 to 60 when Space Age is not installed (Space Age stays
      at 20 due to per-team planet variant pre-creation).
    - Team card header now shows only the display name; internal force name and player count
      appear in a tooltip on hover, freeing space for longer team names.
    - Research queue icons resized to 20 × 20 px; empty slots always reserve the progress
      bar row so the card height never changes when research starts or finishes.
  Bugfixes:
    - Fixed crash when an admin kicked an offline player.
Version: 0.4.7
Date: 2026-05-04
  Features:
    - New players receive a welcome announcement on first join that includes
      the Discord invite link. Returning players receive a "Welcome back"
      message that includes their team name if they are on one.
    - Periodic server-wide Discord reminder every 6 hours, prompting players
      to join for reset notifications and game polls.
    - Discord URL is configured via Settings → Map → Discord URL (defaults to
      the community Discord; leave blank to disable all Discord messages).
Version: 0.4.6
Date: 2026-05-03
  Changes:
    - Team color now syncs from the leader's player color regardless of
      source — the /color console command and Factorio's built-in GUI color
      picker are both detected.
    - Buddy-request events (request, cancel, accept, reject, join) are now
      announced to all connected players, not just the team involved.
    - Player leaving a team is now announced to all connected players.
    - Solo leader leaving their team now auto-disbands it and broadcasts the
      standard disband message.
    - Production Stats panel now colors each team name using the leader's
      current player color.
  Bugfixes:
    - Follow Cam frame is now closed on player disconnect; previously it
      persisted on reconnect with cleared state, making all buttons no-ops.
    - Follow Cam now renders immediately on open — the target area is charted
      at frame creation rather than on the next poll tick.
    - Clicking the Follow Cam toggle no longer rebuilds the Teams panel for
      all connected players, eliminating the per-click lag spike.
Version: 0.4.5
Date: 2026-05-01
  Features:
    - Broadcast starter-item additions to all players. Both admin
      add paths — manual single-item add and "Copy from inventory" —
      print a colorized "<Admin> added Nx [item] to the starter
      items list." Copy-from-inventory announces only the diff
      (new or increased items); empty diffs stay silent.
  Tweaks:
    - Welcome / About panel refresh: list the Admin nav button
      (admin only), add a Records & announcements section
      explaining tech-record and milestone broadcasts plus the
      per-team clock, and add a Commands section listing
      /mts-teams, /mts-players, /mts-rename, /mts-leave, /mts-kick.
Version: 0.4.4
Date: 2026-04-30
  Features:
    - Spawn labels: every team-owned surface (planet variants,
      cloned surfaces, and space platforms) now carries a persistent
      "<team_tag_with_leader>'s\n<location>" label at the spawn
      area. Platformer's existing hub label is rerouted through the
      same code so it picks up the team-and-leader prefix too.
      Live-refresh on /mts-rename, the Team Settings rename field,
      and leader auto-election after a leader leaves. Backfilled on
      on_configuration_changed for upgraded saves.
  Tweaks:
    - Landing pen: drop the "Same start. Different finish." subtitle
      and render the "Spawn when ready" prompt with default-large at
      scale 3 so it stays crisp instead of looking upscaled.
Version: 0.4.3
Date: 2026-04-30
  Features:
    - Dynamic planet enumeration. MTS now iterates data.raw.planet
      at data-final-fixes (and game.planets at runtime) instead of
      hardcoding the vanilla 5 base planets. Modded planets — those
      registered via data:extend or via planet libraries like
      PlanetsLib — get per-team variants, per-team space connections,
      force locks, and discovery-tech routing automatically.
      info.json declares ? PlanetsLib so its data stages run before
      MTS's, ensuring modded planets are present at enumeration time.
    - Generalized clone_mirror: any mts-{planet}-{N} surface mirrors
      from the matching {planet} surface, not just nauvis. Mods that
      decorate Vulcanus, Gleba, Fulgora, Aquilo, or any modded
      planet now reach team variants automatically.
    - Discovery tech detection scans every loaded technology for
      unlock-space-location effects rather than matching tech names.
      Works for vanilla planet-discovery-* techs and for custom
      naming schemes used by planet mods.
    - Teams GUI shows spectate buttons for own-team surfaces too
      (previously foreign-team only). Use case: viewing your own
      planet from your space platform without leaving the hub.
      Friend-view path (no force change, no crafting pause) for
      same-team views; full spectator path for foreign teams.
    - Teams GUI rebuilds automatically on on_surface_created when
      the new surface is team-owned (rocket launches a new platform,
      a new modded planet variant is instantiated, etc.).
    - Lignumis compat placeholder at compat/lignumis.lua: pure-comments
      brief documenting the three runtime hardcoded "lignumis" filters
      that break per-team variants and how to fix them upstream. No
      active code; revisit when actually playing Lignumis.
  Fixes:
    - Spectator: pre-spectate "sitting in a space platform hub" state
      is now correctly restored on exit. Uses the documented
      LuaPlayer.enter_space_platform(platform) API to re-establish
      the hub-pilot relationship — set_controller alone restored the
      camera but not the "Drop to a planet" / platform schedule UI.
    - Spectator: pressing escape in a platform-targeting spectator
      session no longer leaves the user silently stuck. The camera
      reverts to phys_surface (Factorio's escape behavior on
      platforms doesn't fire on_player_controller_changed); a new
      on_player_changed_surface check auto-exits the spectator when
      the camera leaves the target team's territory.
    - Spectator: viewing an own-team surface no longer forces the
      player into spectator force. needs_spectator_mode now
      short-circuits to false when viewer_force == target_force,
      routing the click through enter_friend_view (no force swap,
      no crafting pause).
    - Force-utils: on_foreign_surface now recognizes Space Age
      mts-{planet}-{N} variants via planet_map.get_force_by_planet.
      Fixes the case where bouncing-from-foreign-surface didn't
      trigger after exiting spectator on a team variant.
    - Surface-utils: get_home_surface preference order corrected.
      The player's stored player_surfaces entry takes priority over
      any team platform; platforms are now a last-resort fallback.
      Fixes the regression where "return to base" sent platform-
      owning teams to the platform instead of their planet.
    - vanilla / Space Age compat: pre-generate spawn-area chunks
      synchronously before teleporting the player. Without this
      pre-gen, clone_area runs on the chunk containing the player's
      character and overwrites it, dropping them into god mode.
    - Spectator: after exiting spectator via the on-screen button,
      the Teams GUI rebuilds immediately so the button hides on
      one click instead of the user needing a second click that
      teleports them home.
    - Spectator: crafting_queue_size guarded against the "No
      crafting queue" engine error when called on players in
      god/spectator/remote controllers.
    - Diagnostic: helpers.player_state now logs character entity,
      player.opened, nearby entity, and player.hub for spectator-
      related debugging.
Version: 0.4.2
Date: 2026-04-29
  Changes:
    - docs/COMPAT.md restructured around the clone_mirror default.
      The old four-layer framing gave each option equal weight; in
      practice clone_mirror handles the bulk of cases automatically
      and the rest are runtime gameplay rules that need narrower
      fixes. Three ranked options for mod authors are now spelled
      out: surface.planet.name predicate (smallest, generic), expose
      runtime rules as remote.add_interface functions (closed-
      source-friendly, multi-surface-mod-friendly), and mts-v1
      event subscription (MTS-coupled). The "expose runtime rules
      as remote functions" path is new — it wasn't called out
      before and is the cleanest answer for closed-source authors
      who'd rather not couple to MTS specifically.
Version: 0.4.1
Date: 2026-04-29
  Features:
    - Generic terrain compatibility via compat/clone_mirror.lua. Any
      third-party mod that decorates the real "nauvis" surface via
      on_chunk_generated and filters by hardcoded surface name is
      now automatically mirrored onto every team surface. The mod's
      handler runs once on nauvis; MTS clones the resulting tiles,
      entities, and decoratives to each team-N-nauvis (or
      mts-nauvis-N) variant. Verified with dangOreus, VoidBlock,
      Alien Biomes, Periodic Madness, and the vanilla worldgen
      stack. New mods that follow the same pattern work
      automatically with no per-mod compat code.
  Changes:
    - Every team gets the same map by design. A single nauvis
      source-of-truth is decorated by the mod stack, then cloned
      to all team surfaces. Per-team randomization (different ore
      patterns or biome layouts per team) is replaced with
      consistent terrain across teams. Suits competitive race
      formats; if you needed per-team variety this is a regression.
    - dangOreus compat shim drops ~400 lines of re-implemented
      perlin / voronoi / pie / spiral pattern code in favor of
      cloning. Runtime gameplay rules (block non-miners on ore,
      container spillage, floor-is-lava) are preserved as a thin
      ~150-line per-mod shim. dangOreus is now re-enabled on real
      nauvis (it was previously toggled off) so its chunk-gen
      output exists to clone from.
    - VoidBlock compat shim drops the entire on_chunk_generated
      body and the PLANETS / get_planet_config helpers. Surface
      creation with autoplace disabled stays, since it saves
      cloning over wasted vanilla worldgen.
    - vanilla compat now pre-generates spawn-area chunks before
      teleporting the player. Without pre-gen, clone_area would
      run on the chunk containing the player's character and
      overwrite it, dropping the player into god-controller mode.
  Removed:
    - compat/gridlocked.lua. The HUD-refresh stopgap and the
      voidblock pre-claim are gone. Gridlocked still partially
      works alongside MTS (its handlers don't filter by surface
      name) but the stale HUD label after force change, the
      voidblock + gridlocked landfill deadlock, and the
      recent_claims save crash on team-slot release are
      unaddressed pending upstream fixes.
Version: 0.4.0
Date: 2026-04-29
  Features:
    - Public mts-v1 remote interface for third-party mod
      compatibility. Exposes events (on_team_created,
      on_team_released, on_player_joined_team, on_player_left_team,
      on_team_surface_created) and queries (get_team_list,
      get_team_info, is_team_surface, get_surface_owner,
      list_team_surfaces). See scripts/remote_api.lua for the full
      contract and docs/COMPAT.md for integration patterns including
      examples for chunk-gen mods (dangOreus-style) and stateless
      surface decorators (VoidBlock-style).
    - Admin command /mts-replay [--chunks] to re-fire
      on_surface_created (and optionally on_chunk_generated for
      every existing chunk) on team surfaces, so a newly-installed
      third-party mod can apply its setup retroactively without
      starting a fresh save.
    - Admin commands /mts-pause, /mts-resume, /mts-trim for runtime
      team management. /mts-pause sets active=false on all entities
      owned by a team force; /mts-resume reverses it; /mts-trim
      deletes unused chunks on team nauvis surfaces, processing one
      surface per tick interval to avoid stutter.
    - Gridlocked compatibility. The voidblock compat shim now pre-
      claims the four chunks containing the starter island when
      Gridlocked is loaded, preventing the deadlock where landfill
      can't be placed on unclaimed chunks. The gl_points HUD label
      is refreshed when a player changes force (stopgap until
      upstream Gridlocked hooks on_player_changed_force itself).
  Changes:
    - Welcome screen About tab rewritten around the team-pool model.
      Mentions hidden-until-friendly surfaces, lists the actual nav
      buttons (Teams, Research, Production Stats, Team Awards, Team
      Settings), and adds a Space Age section that only renders when
      Space Age is active.
    - The voidblock compat shim's leftover-entity purge in
      on_chunk_generated is now restricted to vanilla worldgen types
      (tree, simple-entity, resource, fish, cliff, unit-spawner,
      turret, unit) instead of nuking every non-character non-cargo-
      pod entity. Mod-placed entities like Gridlocked's
      gl-unclaimed-chunk markers now survive the tile swap.
    - team_tag_with_leader helper promoted to scripts/helpers and
      adopted by /mts-pause and /mts-resume admin output for
      consistent rich-text formatting.
  Removed:
    - Per-team offline auto-pause checkbox in Team Settings, and the
      associated force_pause hooks for on_player_joined,
      on_player_left, and on_force_changed. /mts-pause and
      /mts-resume admin commands remain the only pause path. A
      one-shot migration in on_configuration_changed resumes any
      legacy paused or mid-pause forces so existing saves don't
      load with stuck active=false entities.
Version: 0.3.9
Date: 2026-04-24
  Features:
    - Team Awards GUI (new top-bar button): leaderboard window with
      Research, Science, and Resources tabs, each showing the top 3
      teams per achievement ranked by elapsed time since team birth.
      Gold / silver / bronze rows, team tag with current leader's name.
    - Follow Cam now charts a box around the tracked player every tick
      so the camera widget always has map data to render. Previously,
      non-friend viewers saw a black cell until the chart data happened
      to already exist for their force.
    - Follow Cam / Spectate on a player who is themselves spectating
      another team now shows that player's body (their physical
      surface/position) instead of chain-following whatever they're
      watching.
    - dangOreus compat: a small deepwater patch is now carved at the
      origin of every team surface during chunk generation, so
      offshore pumps still have water access when the dangOreus
      starting radius is shrunk far enough to bury vanilla's starter
      lake in ore.
  Changes:
    - Milestone announcements now render the item as an icon in the
      quantity text ("produce 100 [item=landfill]") instead of a
      plain word. The per-tracker `label` field is no longer used.
    - Spectate surface button now uses the map icon, visually
      distinct from the radar icon used by Follow Cam.
    - Team rename (/mts-rename or Team Settings) refreshes any open
      Awards windows so the new name appears immediately.
Version: 0.3.8
Date: 2026-04-20
  Features:
    - Team Settings GUI (new top-bar button): team leaders can rename their
      team and toggle offline auto-pause. Non-leaders see all options in a
      read-only state with an "only your team leader can change these
      settings" notice. Any change is broadcast to all players.
    - Offline auto-pause (opt-in per team): when enabled and every team
      member is offline, all entities on the team's surfaces are set to
      active = false, freezing production. They resume on reconnect. Work
      is amortized chunk-by-chunk across ticks (500-entity budget per
      tick) so large bases don't stutter.
    - Follow Cam per-camera controls: each tracked player now has its own
      zoom-out / zoom-in / close buttons. Zoom levels persist across
      rebuilds (default 0.5, range 0.05 - 0.5).
    - Spectator announcements include surface name: "Pirion is now
      spectating Avengers (Nauvis)" instead of "spectating Avengers".
      Works for start, stop, and follow-cam "expand" paths (which also
      include the target player's name).
    - Space Age: each team's Aquilo variant now has its own connection to
      the shared solar-system-edge, and the vanilla edge → shattered-planet
      connection remains shared. Every team can now reach the endgame.
  Bugfixes:
    - Space map button no longer disappears when a space platform is
      built. Root cause was on_surface_created re-running the full force-
      lock reset, which clobbered planet-discovery unlocks every time.
      Split into a narrow "hide-only" path for surface events vs the full
      reset for init / slot recycle / force reset.
    - Fix state leak between team-slot occupants on release/reclaim.
Version: 0.3.2
Date: 2026-04-16
  Other:
    - Release workflow: release notes now cover changes since the last
      PUBLISHED release (queried via the GitHub API) instead of just the
      current version's changelog entry. Handles cases where an intermediate
      version was tagged but never published — its changelog gets included
      in the next successful release's notes. Same notes used for both the
      GitHub release body and the Discord announcement.
Version: 0.3.1
Date: 2026-04-16
  Features:
    - dangOreus mod compatibility: when dangOreus is active, dangOreus's
      chunk-gen behavior (ore flooding, anti-building-on-ore, container
      spill, floor-is-lava) is applied to each team's nauvis surface
      (team-N-nauvis in base 2.0 / VoidBlock, mts-nauvis-N in Space Age).
      Default nauvis is disabled for dangOreus since no team plays there.
      All five dangOreus modes (pie, random, voronoi, perlin, spiral) work.
      Perlin mode also fixes an upstream bug where integer coordinates
      collapsed the noise output to a constant (ore variety restored via
      coordinate scaling).
  Bugfixes:
    - Platformer mode: fix player being teleported to the landing-pen
      surface after pressing Escape from a remote view. Root cause was
      Factorio's god-controller cursor following the last-viewed surface
      when there's no character to anchor position (Platformer players
      have no character by design). Mitigated by saving the god's
      physical_surface + physical_position before entering remote view
      and teleporting back on exit (god_pre_remote anchor in
      on_player_controller_changed).
    - Fix on_player_controller_changed handlers referencing the wrong
      event field. Factorio 2.0 uses event.old_type, not
      event.old_controller_type; the mismatched field silently read nil,
      so prior attempts at this fix never actually executed.
    - Re-enable hiding the default nauvis surface from team forces in
      all modes (base 2.0, VoidBlock, Platformer) now that the
      god_pre_remote guard protects against the related SurfaceList
      engine quirk.
  Other:
    - Diagnostic logging: helpers.diag() + helpers.player_state() instrument
      every surface/controller event and every teleport call site with
      force/surface/position/physical_surface/physical_position/controller
      type, making future position-state bugs far easier to diagnose.
    - helpers.set_surface_hidden() wrapper (with DISABLE_SURFACE_HIDING
      kill-switch) routes all force.set_surface_hidden calls through one
      place so they can be disabled globally for diagnosis.
Version: 0.3.0
Date: 2026-04-16
  Features:
    - Space Age support: per-team planet variants (mts-nauvis-1, mts-vulcanus-1, etc.)
      with space-connection topology mirrored from vanilla. Auto-detected at runtime.
    - Each team gets their own full solar system; base planets are locked and hidden
      for team forces so teams never collide on shared planets.
    - Researching planet-discovery techs unlocks the team's variant (not the base).
    - Teams GUI: replaces "Players & Platforms" with a card-based team-centric view.
      Each card shows members (★ leader, online/offline, friendship), surfaces, and
      per-player Follow Cam buttons.
    - Follow Cam: grid of live camera widgets tracking individual players across
      planets and surfaces. Updates at ~30 FPS. Click a cell's magnifier to expand
      into full spectator mode; Esc returns to the grid with state preserved.
    - Tech records & announcements: tracks first + fastest per technology across
      teams. Broadcasts "first to research [X]" and "new speed record" messages.
    - Milestone engine: generic production-threshold tracker (science, landfill,
      space platform tile). Editable via milestones/config.lua — add any category
      with its own thresholds and counters.
    - Team clock: each team's elapsed time starts when the first member spawns,
      used for all record comparisons regardless of team creation time.
    - Redesigned Landing Pen: "Start a new team" primary button + "OR join an
      existing team" section with per-team Request to Join. Request flow announces
      to all team members (only the leader can accept).
    - Cancel request button: requesters can withdraw before a response.
    - Leave/Kick confirmation dialogs explain consequences before executing.
    - Admin toolbar button (only visible to admins) replaces auto-open panel.
    - Commands: /mts-teams (list all teams + status), /mts-rename (leader renames).
  Changes:
    - Force naming reform: forces are now "team-1" through "team-N" (pre-created
      at game start via mts_max_teams startup setting; default 20). Forces no
      longer carry a player's name — any member can become leader without a swap.
    - Team names are customizable via /mts-rename or the Teams panel.
    - Force color always derived from team leader's player color.
    - Simplified team-leader logic: leader leaving elects a new leader; no
      complex force-swapping.
    - Landing pen players stay on the spectator force until they click Spawn,
      so game.forces.player stays clean as a research baseline.
    - Teams GUI and all chat announcements use "Team <name>" prefix and
      color-tag teams consistently.
    - Default nauvis surface is hidden from team forces (Space Age or not).
    - /mts-kick and /mts-leave now use confirmation dialogs (gui/confirm.lua).
    - Multi-player teams (buddy join) enabled by default.
  Bugfixes:
    - Research on leaving a team resets to baseline (was incorrectly carrying
      over the team's full research to the departing player's new force).
    - Team cards stay visible while a member is spectating (uses team_pool
      occupancy check, not force.players length, so spectating members don't
      hide their team).
    - Follow Cam tooltips update when targets are added/removed.
    - Buddy join request routes to team leader (not arbitrary member).
    - Admin nav button stays grouped with mod buttons after demote/promote.
Version: 0.2.20
Date: 2026-04-14
  Features:
    - Buddy join team size limit: admin dropdown (2-10, default 2) controls max players per team
    - /mts-leave command: any player can leave their team and return to the Landing Pen
    - /mts-kick command: team leader can kick members from their team
    - Team leadership transfer: when owner leaves, next member is promoted and all players are notified
    - Admin Starter Items tab: configure starting inventory by copying from inventory or adding items manually
    - Starter items auto-populated from first player's inventory on initial spawn
    - New admin-added starter items are distributed to all already-spawned players immediately
    - Anti-abuse: inventory cleared when rejoining a team previously left
    - Landing Pen GUI is now scrollable for large player counts
    - Team spawn announcement broadcast when a player starts their team
  Changes:
    - Rename force prefix from "player-" to "force-"
    - Rename commands from /st-* to /mts-*
    - Player names in system messages are now colorized with their chat color
    - Force name shown in grey brackets after every "team" mention in chat messages
    - Force name shown next to owner name in the Players GUI
    - Leave Team button removed from Players GUI (use /mts-leave instead)
  Bugfixes:
    - Fix multiplayer desync caused by storage writes in on_load
    - Fix team size not decrementing when force owner leaves
    - Fix Players GUI showing old owner name after team leadership transfer
    - Fix "Return to my base" button appearing for players in the Landing Pen
    - Fix crash from duplicate GUI element names in Starter Items tab
Version: 0.2.17
Date: 2026-04-08
  Features:
    - Players in the Landing Pen are now assigned the spectator permission group, preventing building or griefing in the pen area
  Changes:
    - Update README: remove Space Block references, add Platformer and VoidBlock links, remove installation section, fix command references
    - Update info.json description
Version: 0.2.16
Date: 2026-04-08
  Features:
    - Spectate now focuses on the target player's live position (or their saved position if they are away spectating someone else), instead of always starting at surface origin
    - Returning from spectate restores the player to their exact pre-spectate surface and position, with collision avoidance to prevent getting stuck in structures built by bots
    - Character remains vulnerable (destructible) while spectating, preventing players from using spectate mode to escape enemy attacks
  Changes:
    - Rename gui/platforms.lua to gui/surfaces.lua (internal variable: surfaces_gui)
  Bugfixes:
    - Players in the Landing Pen can no longer see or use the "request friend" option for spawned players
Version: 0.2.15
Date: 2026-04-07
  Changes:
    - Extract shared compat utilities (planet_display_name, process_pending_teleports, setup_player_surface) into compat_utils.lua to reduce duplication between vanilla and VoidBlock modules
  Bugfixes:
    - Fix spectator mode not exiting when spawning from the Landing Pen
Version: 0.2.14
Date: 2026-04-06
  Features:
    - VoidBlock mod compatibility: each player gets their own Nauvis with void-island terrain
    - Pre-generate chunks around spawn so players never see default terrain flash
  Changes:
    - Stats GUI: active category and time period buttons use green_button style for visibility
Version: 0.2.13
Date: 2026-04-06
  Features:
    - "Allow Friendship" admin flag: disabling dissolves all friendships and hides checkboxes
    - Per-player "show offline" toggle in Players panel (hidden by default)
    - Players in the Landing Pen are excluded from Research and Stats GUIs
  Changes:
    - Codebase reorganized into gui/, compat/ folders with shared helpers.lua
    - All module variables renamed from M/H to descriptive names
    - Extracted force_utils.lua, surface_utils.lua, gui/friendship.lua,
      gui/research_diff.lua, gui/landing_pen_terrain.lua for smaller files
    - Vanilla surface naming changed from "st-<index>-<planet>" to "<force>-<planet>"
    - Spectator exit always teleports player home (prevents god-mode stranding)
    - Stats GUI refreshes on player spawn (not just connect/disconnect)
    - Widened Players panel and Stats name column to prevent layout shifts
  Bugfixes:
    - Fix spectator bounce failing in Platformer god mode (force lookup used
      spectator force instead of effective force)
    - Fix landing pen player colors: use chat_color consistently instead of
      hardcoded yellow for self and grey for spawned players
Version: 0.2.12
Date: 2026-04-05
  Features:
    - Spectator system: view other players' surfaces via a dedicated spectator force
    - Spectate button (magnifying glass) on each player's platform/surface row
    - Friend-view: friends bypass spectator force and get direct remote view
    - Mutual friendship: both sides must agree to activate, either side can break
    - Friendship request states: request friend (blue), pending (yellow), friends (green)
    - Chat prefix shows "[on X's base][spectator]" or "[on X's base][friend]" context
    - Admin flag: "Spectate Notifications" to toggle spectation announcements
    - Admin flag changes now broadcast to all players
    - Crafting queue freezes while spectating, resumes on exit
    - "Stop spectating" button shows "(crafting paused)" when crafting queue is active
    - Surface visibility: other players' surfaces hidden from map sidebar unless friends
  Changes:
    - GPS ping buttons replaced with spectate buttons in Players GUI
    - Friendship is now mutual (requires both sides) instead of one-directional
    - Friend/unfriend downgrade: losing friendship while viewing switches to spectator mode
    - Spectator force hidden from all player-facing GUIs (Players, Research, Stats)
    - Players GUI uses effective force for all comparisons (correct during spectation)
    - Vanilla surface naming changed from "st-<index>-<planet>" to "<force>-<planet>"
  Bugfixes:
    - Fix player color showing as white when spectating (now uses game.get_player lookup)
Version: 0.2.11
Date: 2026-04-04
  Features:
    - Announce friend/unfriend actions to all players with mutual status indicator
  Bugfixes:
    - Fix players being stranded on foreign surfaces after exiting GPS remote view
    - Fix landing-pen players being moved to foreign surfaces via GPS tag clicks
Version: 0.2.9
Date: 2026-04-03
  Features:
    - Landing Pen visual overhaul: lab-dark-2 island, water moat, grass ring, ground text
    - Add "Buddy Join" admin feature flag (off by default) to gate buddy request system
    - New branding: "Solo by design. Legendary by choice."
  Changes:
    - Replace quality sync polling (every 30 ticks) with event-driven sync on research finished
    - Landing Pen chunks now handled via on_chunk_generated (no more grass outside the void)
  Bugfixes:
    - Fix nav bar buttons not working after server restart / save transfer
    - Fix welcome screen crash when on_player_created and on_player_joined_game both fire
Version: 0.2.8
Date: 2026-04-02
  Features:
    - Research GUI: collapsible player rows (1 row default, expand to see all)
    - Research GUI: "You both have researched" section in diff view
    - Research GUI: click any tech icon to open it in the tech tree
    - Research GUI: Escape navigates back from diff to overview before closing
    - Welcome window: added close button and About tab selected by default
    - Welcome window: Discord tab uses full logo image
    - Admin panel now visible to all admins, not just the host
    - Add GitHub Actions workflow to package mod zip on version tags
  Changes:
    - Remove all periodic GUI polling; all updates are now purely event-driven
    - Platforms and admin frames use clear() instead of destroy+recreate (fixes drag jitter)
    - Nav bar buttons doubled in size (56x56)
    - Landing Pen window positioned below top bar, above Players panel
    - Research play time now shows elapsed since spawn, not absolute game time
    - Remove em-dashes from About page and README
  Bugfixes:
    - Fix Players panel reappearing after closing (5-second poll was recreating it)
    - Fix admin and Players windows feeling jittery while dragging
Version: 0.2.7
Date: 2026-04-01
  Features:
    - Add Landing Pen: new players wait in a shared pre-game lobby before spawning
    - Add buddy system: pen players can request to join an active player's force
    - Add vanilla surface support: each player gets their own nauvis surface
    - Add admin panel with runtime feature flags (Landing Pen toggle)
    - Add per-player clock tracking (time since spawn)
    - Add research comparison panel with tech icon grid and 1-on-1 diff view
    - Show Platforms GUI to players in the Landing Pen
  Changes:
    - Rename Platforms GUI to Players GUI
    - Include vanilla surfaces in the player list as "<name>'s base on <Planet>"
    - Disabling Landing Pen mid-session immediately spawns all waiting players
  Bugfixes:
    - Fix landing pen surface shape: out-of-map tiles outside the circle
    - Fix spawn button double-fire and duplicate platform creation
    - Fix cutscene skip: exit_cutscene() before teleport
    - Fix solo force being reset by scenario after cutscene
    - Fix teleport retry: keep pending entry until teleport succeeds
Version: 0.2.6
Date: 2026-03-31
  Bugfixes:
    - Fix Stats button width in Platforms title bar
Version: 0.2.5
Date: 2026-03-31
  Features:
    - Add per-player production stats GUI with five categories (Ores, Plates, Intermediates, Science, Custom)
    - Categories built dynamically from game prototypes; works with overhaul mods
    - 12 choose-elem-button columns per category; players can swap any item
    - Time range selector: 1m / 10m / 1h / 10h / All time
    - Per-player column overrides persisted across sessions
  Changes:
    - Online/offline status updates instantly via events (no tick delay)
Version: 0.2.4
Date: 2026-03-30
  Features:
    - Add Platformer mod compatibility: per-player space platform creation and deferred teleport
    - Add "Return to my base" button when visiting a foreign surface
  Changes:
    - Hide the default "player" force from the platforms GUI
    - Declare optional dependency on Platformer for correct load ordering
Version: 0.2.3
Date: 2026-03-29
  Changes:
    - Remove GPS ping button from player name rows; GPS buttons now only appear on platform rows
Version: 0.2.2
Date: 2026-03-29
  Changes:
    - Remove all hub collision detection hacks (use /unstuck instead)
Version: 0.2.1
Date: 2026-03-29
  Bugfixes:
    - Fix hub collision fix and /unstuck to use physical_surface/position
    - Fix remote view (GPS clicks) incorrectly triggering the collision fix
Version: 0.2.0
Date: 2026-03-29
  Changes:
    - Remove automatic hub collision repositioning (caused issues with GPS pings)
    - Document /unstuck command as the manual alternative
Version: 0.1.1
Date: 2026-03-28
  Changes:
    - Add thumbnail image for mod portal
    - Add homepage URL to info.json
Version: 0.1.0
Date: 2026-03-28
  Features:
    - Separate forces: each player gets their own force with independent research
    - Quality unlocks and space platform access copied from default force
    - Neutral diplomacy: players start in cease-fire with all others
    - Per-player friend toggle via the Platforms GUI
    - Cross-force chat: normal messages broadcast to all forces
    - Draggable, collapsible Platforms GUI with live GPS locations
    - /platforms command with colored names and clickable GPS pings
    - /unstuck command to eject from vehicles and teleport to safety