Dear Extraordinary Survivalists
v1.18.2-rc.1, a unstable release, can now be downloaded through the account manager (section "Other Goodies").
[Edit:] Also release rc.2 to address multiple issues
The large influx of active players has put 1.18 servers under heavy load - in this update we have tried to reduce the load by using more optimal algorithms and optionally utilize use more CPU cores. Server owners that suffer from bad tickrates - do try this version, open your servermagicnumbers.json and set "MaxPhysicsThreads: 4", or similar (suggested range 2-8, depending on the number of CPU threads available).
Players still on game version 1.18.1 should be able to play normally on a 1.18.2-rc.1 or 1.18.2-rc.2 server - they connect OK and we have not received reports of any issues in this configuration.
If you experience unusually wonky physics or entity spawning, do let us know!
- Tweak: Landform scale is now a configurable parameter in the customize world screen
- Tweak: "Standard Survival" Playstyle default value changes: Reduce upheaval rate (40%->30%), Reduce landform scale (120%->100%). This will affect new worlds only. Existing worlds should remain unaffected.
- Tweak: Linux: Enable mesa_glthread on systems that should support it via run.sh (AMD/Intel GPUs)
- Tweak: Graceful server shutdown and exit in almost all situations. ?May improve dark chunks issue
- Fixed: Rotation of ground storable when using WorldEdit rotate (included schematics placed rotated by worldgen)
- Fixed: Rare TreasureMap crash
- Tweak: Tongs recipe uses rope instead of twine
- Tweak: Metal plaques now material metal, and not combustible.
- Tweak: Ink and Quill can be ground stored
- Tweak: Improved in-game guidance on understanding prospecting results
- Tweak: Seaweed bends and sways nicely
- Tweak: Removed bronze chain and lamellae from panning bony soil to avoid age skipping
- Tweak: Lit torches placed below water (by player or by worldgen) will be extinguished
- Tweak: Water in 2-deep (or more) lakes can flow sideways (similar to 1-deep ponds) if a bank is broken
- Tweak: Holes in water below the surface of lakes can normally now heal, if enough source blocks are around
- Tweak: Re-added flavor text for Hunter class.
- Tweak: If Resonance Archives entrance would be below sea-level, raise it up to sea-level
- Tweak: Added extra check for a privilege "ignoremaxclients" that can be added to let privileged players (for example, staff) join multiplayer servers despite the max clients limit
- Tweak: For commands, more informative error message if wrong subcommand typed in a command which can also be used with no subcommands, such as /time
Tweak: Performance tweaks
- Added Multithreading support to entity physics. Experimental, server-side only. Can enable up to 8 physics threads in total (including the main thread), default is 1, i.e. multithreading disabled. Enable by setting "MaxPhysicsThreads" in servermagicnumbers.json to 2 or higher. (The game will ignore settings higher than 8.) Related to this change, /logticks output for controlled physics is formatted differently now.
- Server: Significantly improve server entityspawner performance
- Server and client: reduce entity tick time for task-startexecute-fleeentity, and seekentity and stayclosetoentity tasks
- Server and client: entity physics: improve per-tick time for knockback check and trigger-insideblock
- Small improvement in multiplayer server-side tick performance generally, when sending blockEntity updates to many clients
- Small improvement in server and client-side performance, when spawning each entity
- Reduce the lag-spike on creating new ground-storage piles
- Grass block updates slightly improved [details: use ExchangeBlock in place of SetBlock]
- Fixed: Support beams deleting existing blocks
- Fixed: Beams sometimes disappearing from sight if their base block is behind the player
- Fixed: Gravel/sand falling when placing ruins and other schematics (leading to a falling gravel sound when entering new world areas)
- Fixed: Rotations for crate, anvil, chute, display case, trunk, labeled chest, doors, and chiselled blocks when used in schematics and worldedit - this includes when these blocks are used in Trader caravans, because caravans can be randomly rotated when worldgen places them
- When chiselled blocks are rotated in a schematic, their materials textures (for example, log textures) should also now be correctly rotated
- Fixed: Player underwater was not suffocating if lanterns or ladders in same space
- Fixed: Manually placing water will now place correctly if placed in the same space as an existing partial solid block
- Fixed: Wording mistake in a short story.
- Fixed: Missing name for aged chests
- Fixed: Might mitigate the fruit tree crash? :shrug:
- Fixed: On client shutdown, very rare ThreadAbortException in chunkTesselator thread
- Fixed: "/help we" now lists out the directional subcommands correctly
- Fixed: Potential rare bug with blockEntities removed on server not being removed client-side
- Fixed: Setting player roles did not sync to client
- Fixed: Missing translations in the moddb util
- Fixed: Able to circumvent drunkenness / low stability chat text distortion
- Fixed: "The Invention" music track never playing
- Fixed: Unknown block in some clutter handbook pages
- Fixed: Unknown blocks in some chests in the Resonance Archives
- Fixed: World edit command results sent to the wrong player
- Fixed: A new crash in BehaviorPillar? :shrug:
- Fixed: Server side exception that kicks the player when talking to traders
- Fixed: Multiple visual issues with the new seraph clothing pieces
- Fixed: Unused herbs (angelica.png, ...) trying to resolve images and causing errors on startup
- Fixed: server.sh not showing command results
- Fixed: Multiple minor issues with the Resonance Archives
- Api Tweak: Behaviors and AITasks now have an optional AfterInitialize() method, can be used to fetch info from other behaviors for the same entity after the other behaviors are guaranteed initialized
- Api Fixed: Typo in MultiBlock.OnBlockInteractStop() called *Step methods instead of *Stop
- Api Technical Notes for modders: Entity physics, including updates to entity.OnGround and .Swimming flags, now happens after all other entity behaviors have been ticked but before the next entity tick. Entity physics can be multithreaded: several threads will process entity physics in parallel, at the appropriate time in the overall game tick. Please ensure that your implementations of Entity.OnFallToGround(), Entity.OnCollideWithLiquid(), Entity.OnExitedLiquid() are all globally threadsafe. "Globally" threadsafe means, changes to the fields or properties of the calling entity itself are OK (for one single entity, these methods cannot be called at the same time for the same entity on different threads, and other entity behavior code will not be running during physics updates). But global data stored in a non-threadsafe way (for example, a single Dictionary in your mod holding all swimming entities, unless it is a ConcurrentDictionary) should not be modified inside these physics methods, on a server. Likewise setting blocks, spawning new entities or entityItems (drops) or other changes with global effects on the server in these physics methods (or in any other code which extends entity physics) is not a good idea. If necessary, use server.EnqueueMainThreadTask() to safely set blocks, spawn new entities or to change global data, if your mod's code is currently taking these kinds of actions in entity physics methods.
- Api Technical Notes for modders (2): In the unlikely event that your mod's code replaces or extends EntityBehaviorControlledPhysics.OnGameTick() or .OnPhysicsTick() it may not work correctly with the new multithreaded system, please contact the devs for specific help.
- API Technical Notes for modders (3): If your coded mod uses multithreading - either TyronThreadPool queuing or creating its own threads on a server - then ServerMain.FrameProfiler will now be null on threads which are not the main thread and not ServerThreads created in the vanilla game engine. This may trigger null reference exceptions in your code if the FrameProfiler is used in your own threads. This is intended behavior: your code should not meaningfully write to the FrameProfiler except on the main thread. If in doubt, in your code use ServerMain.FrameProfiler?.Mark() or similar code.