CHANGELOG

Changelog


v3.0.0

Added

  • Decor Batching (New Module): Automatically combines meshes of decorative pieces (Misc category, no WearNTear) in a chunk grid to drastically reduce draw calls on large bases. Configurable rebuild cooldown and minimum pieces per chunk.
  • In-Game Settings Menu: Added a built-in VPO configuration menu accessible directly from the Main Menu. No longer requires external BepInEx Configuration Manager to tweak settings.
  • Network Optimizations (Crossplay Safe!): Brought back and completely rewritten to safely support Game Pass / Crossplay:
    • Steam Socket Uncap: Increases P2P data limits (solves lag on huge bases). Safely disables itself if not running on Steam.
    • Adaptive Throttling: Intelligently drops ZDO sends to clients with high ping (>400ms) to prevent choking their connection.
    • Smart ZDO Sorting: Prioritizes players, portals, and ships over AI during network sync to prevent desyncs.
    • Smart Zone Ownership: Automatically transfers AI control to the player with the lowest ping in the zone.
  • Piece Sleep Manager: Puts static building pieces (WearNTear) to sleep after 2 frames of inactivity, saving CPU cycles on massive structures.

Changed / Optimized

  • Zero GC Allocations on Hot Paths: Replaced expensive Reflection (GetValue/SetValue) with compiled Expression delegates. Completely eliminates boxing (float -> object) and garbage generation per frame in:
    • LightFlickerPatch (v2.8.0)
    • VegetationPatches (v2.8.1)
    • SmokePatch (v2.9.0)
    • ObjectPoolManager
  • O(1) Collection Upgrades: Upgraded DistanceCullerManager, AIOptimizerManager, and AudioPoolManager to use HashSet alongside List. This changes duplicate checking from O(n) to O(1), fixing massive O(n²) lag spikes when loading chunks with thousands of objects.
  • Smoke Physics Overhaul: AddForce is now throttled to run once every 3 physics frames. Rigidbody mass updates are throttled to 0.1s. isKinematic and Rigidbody references are now heavily cached.
  • Tamed Idle Optimizer: Optimized base detection using LayerMask directly in Physics.OverlapSphere, avoiding expensive GetComponentInParent traversals on hundreds of colliders.
  • Object Pooling: Optimized IsInWhitelist to use GetStableHashCode, completely avoiding string allocations (Replace, Trim) on the hot path. Removed unnecessary thread lock statements since pooling is strictly single-threaded, reducing overhead.
  • AdvancedLightManager & FrameBudgetGuard: Cached Comparer delegates to avoid lambda allocations multiple times per second.

Fixed

  • [CRITICAL] Smoke Memory Leak: Fixed a critical vanilla issue (and previous patch oversight) where smoke objects were never destroyed after fading out. Hundreds of invisible smoke objects would accumulate and tick in FixedUpdate, killing FPS over time.
  • [CRITICAL] Light Culling Conflict: Fixed a severe conflict where AdvancedLightManager and LightLODManager both patched ZNetScene.CreateObject and fought over light states. Registration is now unified.
  • Zombie Lights Bug: Fixed a bug in AdvancedLightManager where destroyed lights weren't removed from the _culledLights list, causing zombie references that permanently broke the active lights limit.
  • Animator Conflict: Fixed a bug where AIOptimizer and CharacterAnimatorOptimizer were fighting over Animator.cullingMode in the same frame.
  • Support Cache: Added ZNetScene_OnDestroy_Postfix to clear the invalidation queue on scene unload, preventing null reference errors when changing worlds.

v2.7.1

Added

  • mini-update (smokePatch).

v2.7.0

Added

  • Light Flicker Optimization — Harmony Prefix on LightFlicker.CustomUpdate that fixes light intensity at its base value, eliminating per-frame Shadow Map recalculation for all fires and torches.
  • Smoke Physics Optimization — Harmony Prefix on Smoke.CustomUpdate that replaces the vanilla complex aerodynamics with a lightweight quadratic interpolation + single upward force.
  • Engine Quality Settings — Forces low-level Unity QualitySettings at startup: softParticles = false, softVegetation = false, configurable particleRaycastBudget.
  • Skip Intro — Skips Iron Gate and Coffee Stain logo screens on every game launch.
  • Frame Budget Guard — Dynamic stutter protection system. Monitors a rolling 120-frame window and lowers Time.maximumDeltaTime when heavy spikes are detected.

Changed

  • Config sections renumbered: new modules occupy sections 17–21.

v2.6.4

Added

  • Nothing (maintenance release).

v2.6.3

Added

  • Welcome screen on main menu launch with clickable Discord link.

v2.6.0

Changed / Fixed

  • Removed NetworkManager and ZDOOptimizer temporarily (crossplay issues).
  • Fixed LightLODManager duplicate scans.
  • DistanceCuller refactored to central Update loop.
  • AsyncWearInit early exit when queue is empty.

v2.5.1

  • Initial public release.