Stationeers

Character Movement, Bitshifting, and a new Spray Gun

We have been working hard at our reworking of Rockets, but we have removed those changes from this build as they aren't ready, but we wanted to get out changes to the character controller and particularly fixes to the Linux Dedicated server. There is really a lot of different things in this updates so even some really good changes are glossed over outside of a brief mention in the changelog.

Camera and Character Movement


For a long time players have requested fixes for the dreaded "getting stuck on corners". This update features a complete rework of the colliders and rigidbodies for controlling the character. In the test scene the character easily got stuck on things before the changes, and after the update there was zero getting stuck on things. We anticipate those frustrated with this in the past will find this much better.

We've enhanced the player's camera movement once again in an effort to further minimize stuttering. Additionally, we've made a series of refinements to the player movement mechanism. These cumulative changes aim to ensure a smoother in-game experience, reducing instances of getting snagged on corners or minor ground protrusions. The end result is a more fluid and seamless navigation throughout the game environment.

The reason this has been so challenging is the many layers that involve controlling a stationeers character. The user input, the winds in the cells as the player moves, the different frictions of the environment, complex player made colliders, and differing gravity - all combine to make it very complex for us to move a character compared to your average game. Additionally we have to do all kinds of "fudgery" to make the character feel right when moving. We have for example a "grounding" system which, when close to ground, holds you there more. Without this system on lower gravity environments like the moon, running over a small rise would invariably launch you into the air for some time which was very frustrating.

Integrated Circuit Additions


Binary Notation


We've added a Binary notation preprocessor macro that allows binary numbers to be represented with a leading '%'. Binary numbers such as %1011011 will be precompiled to 91. To improve readability, binary values can be separated with underscores; however, they will still concatenate together, so %10_11_011 will similarly precompile to 91. These underscores hold no functional use and are purely for readability. This feature is applicable wherever a number is used, such as in defines, move, or instructions that permit numbers.

Hexadecimal Notation


For hexadecimal numbers, a similar notation preprocessor macro is in place. It utilizes a leading '$' to indicate that the following valid hexadecimal characters are to be parsed together as a hexadecimal value. For example, $F will be precompiled as 15. Just like binary notation, underscores can be used for readability but hold no functional value, so $A_B can be used to represent 171.

Bitshifting


Furthermore, we've incorporated 'Shift Left/Right Logical' (SLL/SRL) and 'Shift Left/Right Arithmetic' (SLA/SRA) instructions. The SLL and SRL operations perform a logical shift on the binary representation of a value, shifting bits to the left or right and filling the leftmost vacancies with zeros. On the other hand, the SLA and SRA operations execute an arithmetic shift, also moving bits left or right, but filling the vacated bits with a copy of the sign bit. These enhancements are designed to offer you more control and flexibility over your IC code operations.

We need you!



Stationeers is a small niche project. We know times are tough and our project isn't for everyone. So if you like the work we do, we would love to encourage you to spread the word, grab our supporter DLCs, and watch Stationeers content creators on places like twitch and youtube. We want to keep developing this game for many years, well beyond any early access release and to do this we need your support

https://store.steampowered.com/app/2089290/Stationeers_Human_Cosmetics_Pack/

https://store.steampowered.com/app/1038400/Stationeers_Zrilian_Species_Pack/

https://store.steampowered.com/app/1038500/Stationeers_HEM_Droid_Species_Pack/

Spray Gun





The Spray Gun allows for faster and more efficient painting. Simply load a spray can into the spray gun and get more out of each can.

Manual Hatch Welding





We've introduced the capability to both weld and un-weld the Manual Hatch using a Welder. While this operation will consume some time and fuel or power, it allows you to secure the hatch either in an open or closed position. This new feature proves especially handy if you wish to establish a hatch for maintenance purposes but deter its routine usage.

Tooltips





We've enhanced the tooltips associated with building actions. Now, when a structure placement is hindered, a specific tooltip will reveal what is obstructing the construction, replacing the previous generic 'Structure' message.

Additionally, we've incorporated a wealth of additional details into our extended tooltips. For instance, you'll now find settings related to Active Vent for both Internal and External safeties.

Build States





Some of the older devices were added to the game without build states. We’re slowly going to be adding build states to these. In this update we’ve added build states to the Station Batteries. When loading a game your Station Batteries should still be in their completed state, but the building of future ones will require you to complete the build state steps.

Stationpedia


We’ve updated how build-states are displayed to provide tier information and the benefits, such as build time and energy cost.

We also corrected the description of the deep miner, and corrected the name of ‘Infinite’ filters to ‘Catalytic’.

Linux Dedicated Server


Our Linux dedicated server recently encountered a significant issue that necessitated a substantial investment of time and resources to resolve. Over the course of the past month, this problem not only imposed a severe strain on our project timeline, but it also imposed roadblocks that halted the progress of other tasks.

Initially, the idea of supporting Linux dedicated servers seemed feasible and manageable. As such, we moved forward with its implementation. However, as time went on, the practical and monetary resources required to maintain this service became considerably more significant than we had anticipated.

We found ourselves on the verge of suspending our support for Linux dedicated servers when, fortuitously, we were able to identify and implement a solution. However, this experience has given us pause, causing us to reconsider the feasibility and value of continuing this service.

Our stance on this matter is candid: the costs and complications associated with supporting Linux dedicated servers are increasingly becoming prohibitive.

Should we encounter another scenario like this, it's probable that we would temporarily suspend our Linux support until we can confidently proceed without it detrimentally impacting the project's trajectory. We sincerely hope that this step will not be necessary, but we are committed to making the best decisions for the project's overall success and sustainability.

Coming Soon


First stages of Phase Change in next update


As part of our complete rework of Rockets we have been working on for our next updates we have been working on phase change for gases and liquids. The next update will be the first step in what will be a long series of gradual changes to bring an implementation of phase change into the game. We have been testing out early changes on the beta branch, but remember that this will be subject to change and even what is outlined here may change.

The next update is going to have profound impacts on how gases interact at extreme temperatures and pressures. We will explain more in that update, but you can expect us to provide migration assistance with the save. But if you are working with extremely cold or hot gases, or those under a lot of little pressure you will need to be especially careful with the next update.

Coming Soon: Liquids for Rocket Fuels


Our broad goal with Rockets is to have you "build" the rockets using the mechanics players are familiar with in their bases. You will need to craft complex systems to make rocket fuel(s), and then pump and activate those fuels to produce the thrust you need, and even control them for the various things Rockets may be used for.

In the update expect to see a whole host of new liquids such as liquid oxygen and nitrogen, and even liquids for fuels. We may also make some changes to gases as well.

Coming Soon: Changes to Pipes likely


In terms of phase change, we have been considering a lot of options. We have considered having generic pipes and a number of options. Currently we are leaning towards you have to give some indication as to your use of the pipe, and you will likely suffer big problems if phase change happens in a gas pipe and you don't have something like a purge valve. We are also likely changing the pipe volumes and introducing more pipe variations with different volumes. We may have ducts which are more similar to existing gas pipe volumes, but will not want to carry liquid and will have much lower pressure limits.

Remember though that we have to deal with an approximation. It's very challenging for us to go down this route, but we feel it is important for Rockets and additionally for our future plans like things for nuclear power. We are also investigating how we might go back to representing liquids in the world as well - but nothing concrete on that yet.

Hotfix Deployed v0.2.4120.19431


  • This hotfix addresses a problem with the player cookie that was preventing players from starting new games.

Hotfix Deployed v0.2.4117.19426


  • This hotfix removed some WIP changes around liquids and related atmospheric devices that should not yet be present.

Changelog v0.2.4089.19416


  • Fixing munmap_chunk() error on Linux dedicated servers
  • Removing debugging logs and commands used for this error
  • Added number of arguments check to all commands
  • Removed unwanted error messages when user enters wrong number of commands
  • Added liquid volatiles icon.
  • Added liquid nitrogen and oxygen icons.
  • Adding logs for linux to help debug munmap_chunk() error
  • Fixed PlayerCookie with saved ClientId=0 not generating a new client id causing a new character to spawn every time
  • Added missing editor tags for rocket fuselage
  • Added per-world-instance UI state to Player Cookie to allow clients to have their window layout saved on servers
  • Added rocket networks and first pass on registering internal grids that can be filled with components
  • Reverted window layout changes
  • Added per-save player UI preferences to player cookie so that clients retain window layouts when connecting to hosts
  • Added LogicType and LogicSlotType as a constant, in addition to being a variable class on some instructions. This means you can reference them outside of specific instructions so long as you preface them with their type in front, such as LogicType.Pressure. Credit: Risu (discord).
  • Fixed switch collider size on gas turbo volume pump
  • Disabled fuselage and nose cone
  • Fixed Atmospherics thread error spam caused by new gas addition deleting some serialised data on plant prefabs.
  • Fixed BNAZ instruction could not run because it was asking for the incorrect number of parameters. It has been like this for four years.
  • Added Liquid Nitrogen Gas Type. Currently only spawn-able using debug commands.
  • Added HASH(..), Binary, and Hex syntax descriptions to script help.
  • Added a few rocket pieces for testing. These are subject to change.
  • Added Binary and Hex notation for IC instructions. Adding a % in front of the number will specify the number is to be treated as a binary representation. So if '15' is the real number, '%1111' would be parsed as 15. The hex value of '$F' would also be parsed as 15. This is useful for ease of writing scripts to make use of various bitshift functions and changes. Additionally, you can add '_' underscores between digits to help with readability. Note they are not functional, and are stripped. So in the example above '%11_11' will also resolve to 15.
  • Added LogicSlotType.FilterType. This allows you to return the current filter type of a filter that is in a GasFilter slot. It will be returned as an integer, which can be checked against the GasType constants.
  • Adding Unity's .meta file for my last commit
  • Adding separate Linux .so for our RakNet fork in case this is causing BindSharedIPV4 to fail. I don't think this is the problem but will revert if it doesn't help the dedicated server situation
  • Updating RocketNet plugin to latest version
  • Hopefully fixes munmap_chunk() error but need to wait to test on Linux dedicated server to be sure
  • Fixed leading whitespace for jump labels not correctly being parsed. Now leading whitespace will not break jump label assignments.
  • Fixed bug in stationpedia where gas thumbnails were off by one
  • Tweaked splitting stacks into hand to make the interaction more intuitive. Splitting from non-hand slots will now split into the active hand or, if the active hand is unavailable, the other hand. If both are unavailable, will split onto the ground. Splitting from a hand slot will split to the other hand, or if the other hand is unavailable, the ground.
  • Changed Gas Particle collision layers to only be Default and Terrain. This should reduce the physics cost of gas particles, which could be high in some instances.
  • Added NOT bitwise operation. Performs a bitwise logical NOT operation flipping each bit of the input value, resulting in a binary complement. If a bit is 1, it becomes 0, and if a bit is 0, it becomes 1.
  • Changed AND to be a bitwise and not a boolen operation. In most circumstances, this will not cause any issues with scripts. Performs a bitwise logical AND operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 1, the resulting bit is set to 1. Otherwise the resulting bit is set to 0.
  • Changed OR to be a bitwise and not a boolen operation. In most circumstances, this will not cause any issues with scripts. Performs a bitwise logical OR operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If either bit is 1, the resulting bit is set to 1. If both bits are 0, the resulting bit is set to 0.
  • Changed XOR to be a bitwise and not boolen operation. In most circumstances, this will not cause any issues with scripts. Performs a bitwise logical XOR (exclusive OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If the bits are different (one bit is 0 and the other is 1), the resulting bit is set to 1. If the bits are the same (both 0 or both 1), the resulting bit is set to 0.
  • Changed NOR to be a bitwise and not boolen operation. In most circumstances, this will not cause any issues with scripts. Performs a bitwise logical NOR (NOT OR) operation on the binary representation of two values. Each bit of the result is determined by evaluating the corresponding bits of the input values. If both bits are 0, the resulting bit is set to 1. Otherwise, if at least one bit is 1, the resulting bit is set to 0.
  • Fixed AdvancedSuit was not resetting stack when IC chip inserted.
  • Optimized IC Chip network serialization, reducing network message size for updates.
  • Fixed rescanning of JUMP, DEFINE, and ALIAS validation. Now when a line of text in script editor is changed, the database is correctly recalculated and applied to all the rest of the code. This will give instant feedback as to whether a jump label, or alias etc…, still exists or exists again. This makes it much easier to write IC code in the IC editor.
  • Fixed IC editor would say some alias and defines were not valid, even though they were, particularly when using the HASH macro or others.
  • Added Binary notation preprocessor macro for IC code. binary numbers can be wrapped and will be converted precompile.
  • Added SRL and SLL 'Shift Left/Right Logical' instructions. Performs a logical left/right shift operation on the binary representation of a value. It shifts the bits to the left/right and fills the vacated leftmost bits with zeros
  • Added SRA and SLA 'Shift Left/Right Arithmetic instructions. Performs an arithmetic left/right shift operation on the binary representation of a value. It shifts the bits to the left/right and fills the vacated bits with a copy of the sign bit (the most significant bit).
  • Reverted FlashPoint and AutoIgnition changes for Ingots (rev19265).
  • Replaced Animator with animationComponents on Advanced composter.
  • Fixed some error state checking logic on advanced composter.
  • Fixed Error on Client when Compost created by advanced composter.
  • Removed processing coroutines from AdvancedComposter. Moved processing logic onto ServerTick.
  • Changed removed cooked foods and canned foods from being valid composter inputs.
  • Added ICompostable interface. TODO: implement ICompostable on dynamic composter.
  • Added Import hopper to advanced Composter.
  • Fixed NRE error on client if trying to Destroy a null thing.
  • Updated generator for merging all localization files into one resx file
  • Fixed Some Animation states out of sync on client on join.
  • Removed Auto-ignition behaviour from ingots, Manual hatch and heat exchanger.
  • Added new color swatches
  • Fixed servers not correctly requesting a new session ID if there was an exception of any kind during a ping to the server list
  • Fixed illegal characters can cause loading of saves to break. Now any illegal characters will be stripped and loading continue.
  • Added SyncList from AotR. This is a generic method that allows easily serializing lists for events and new things using the highly efficient FragmentHandler instead of network messages. Implemented for AudioEvent off the SprayGun as a demonstration.
  • Refactored display of Build State Manufacture Data (manufacturing tier, and statistics).
  • Refactored recipe string generation to use StringBuilder, reducing memory garbage and fixing various bugs with extra carriage returns being present in some recipes.
  • Removed MAX_FRAGMENTS_PER_FRAME that was limiting the message fragment creation per frame. This was a legacy restriction. RocketNet interop works directly with the OS, so maximum fragment is effectively unlimited. The fragments can be queued up until OS memory limits, with the router itself controlling the delivery.
  • Added SprayGun. This takes Spray Cans and allows you to paint faster and more efficiently than using the cans directly.
  • Added ability to scroll console window with page up and page down
  • Added the ability to use secondary action on spray cans to paint the item in your other hand
  • Added Build States to Station Battery and Station Battery (Large). All older saves will automatically load with the full build states, but new batteries will require their build to be progressed. See Stationpedia for more information.
  • Fixed wrong state material setting on emergency suit prefab causing an index out of range error when picking up or dropping emergency suit.
  • Pushing new version of RocketNet for linux to fix munmap_chunck error STAT-1794
  • Added wip localization generation command
  • Added first pass of sprites avialable for use with Signs. You can reference these in your HTML tags. Sizing issues may exist though currently.
  • Added cutout for some structures such as Lockers, Stackers, Unpackers, ChuteBins, and the Furnaces. These will now show above walls and frames, so you will be able to see inside them as if they had cut a hole in the mesh. This means you can mount a locker on a wall, but still see inside the locker.
  • Refactor of tooltips. Introduced a variety of new information to extended tooltips, such as settings on Active vent for Internal and external safetys. Optimized the compilation of strings for tooltips.
  • Fixed Items were reporting incorrect values for decay. Simplified how they are calculated and optimized how the strings are generated.
  • Fixed StructureShelf slot rotations were incorrect. Now they are correctly rotated like other storage units in the game.
  • Fixed Chat could not be initiated using the "Return" key (or whatever is set). Now pressing the Chat action will automatically open the chat window and then send the result to clients. This is effectively the same as the chat key but much easier to do.
  • Fixed Multiline text input would show '…' instead of overflow, making it very hard to read text you have written with it.
  • Fixed Multiline text would submit on pressing enter, making it annoying to add additional lines.
  • Added HTML tag support for Signs and Pipe Labels.
  • Added Sign rename uses MultiLine text to allow more room. HTML result is not shown, so you can see the HTML tags. They will be parsed after.
  • Refactored SetPower to use UniTask and not Coroutine scheduler when device power state change queued from thread.
  • Removed PlayerList property that was generating memory garbage. Replaced with Clients.Find.
  • Added extended tooltips to Slots. Now will show the slot type, if anything other than none. Certain items will also show their current state in the tooltip as well, such as batteries and consumables, as well as stacks.
  • Improved tooltips for state handling for Human states.
  • Refactored Ragdoll handling and Dragging of characters. Removed an unused rigidbody which was causing character dragging to not be correctly rotated. Refactored dragging ragdoll handling to parent a dragged or ragdoll character parts to the correct rigidbody. Fixed a number of glitches associated with dragging or ragdolling characters, including desyncs and various physics issues. Balanced and tweaked ragdoll part constraints and dampening.
  • Added MAX_DEPENETRATION_VELOCITY to restrict how fast overlapping colliders are resolved. This will fix numerous situations where a kiss of death collision occurs when colliders are suddenly overlapping. It is still quite high, so it may be tweaked further. This may help with some situations where players are suddenly colliding with terrain during atmospheric changes.
  • Fixed several errors being thrown when spawning chickens
  • Fixed Music devices could not connect to passive speaker and existing connected devices printed errors. This was caused by accidental removal of IAudioInput interface from passive speaker when implementing AudioAlert system.
  • Fixed (Beta only) Welding tooltip was correct for Manual Hatches, but action still prevented advancement.
  • Fixed incorrect hydration calculation. Water was being consumed too slowly. Have returned this to expected behaviour.
  • Refactored character ragdoll, rigidbody, and collider handling to change how ragdoll and carrying characters are handled and character materials as they move around. This is a major change. A number of issues were causing unused colliders to 'stick' on terrain. All these colliders were audited and the problem ones diagnosed and removed from the code. Ragdoll was almost completely broken as it was being layered on top of existing rigidbody. The old system was repurposed and cleaned up, and reapplied. Currently while characters are being carried, they will be out of ragdoll, to reduce physics clipping issues.
  • Removed interactions as dragging method, now a general interaction on an unconscious or dead character will allow you to drag them, anywhere on the character.
  • Removed physics breaking constrains for dragging joints. While these are a good idea in general, they are a terrible idea if not handled. We are allowing joints to break, and then not handling the result when broken. This leaves people stuck carrying something, until they drop it at least. For now the breaking strength is infinity, until handling is implemented.
  • Added new physics materials to ease character across different structure colliders, reducing the chances characters will get "stuck" on terrain. In test environment was able to get stuck with 100% reproduction prior to change. After, unable to get character stuck.
  • Removed interactionId serialization for DragToSlot. it was completely unused and served no purpose, and prevented the use of AttackWith as a generic method to handle dragging, which is more appropriate than InteractWith for dragging of humans, given no interactable really exists to allow an interaction to take place.
  • Updated render distance for some clothing items to make them more consistent
  • Removed ifdefs around setting skinned meshes to always enabled
  • Fixed repairing a damaged partially completed structure will also advance its construction if the tools were the same. Now you can only advance construction of fully repaired structures.
  • Fixed server list player count; should now accurately report active players instead of 0
  • Fixed Composite Floor Grating Kit prefab selection starts on item 4.
  • Implemented ITransmittable on Advanced tablet. You can now read/write values to AdvancedTablet using logic transmitter.
  • Fixed LadderPlatform now uses crowbar to deconstruct.
  • Fixed Ordering of prefabs on Composite Floor Grating kit.
  • Added ability to weld and unweld a Manual Hatch. This is done using a Welder. Welding a hatch will take some time and fuel/power, but will lock the door in place (open or closed). This is useful if you want an access hatch for maintenance access, but want to prevent regular use. Tooltips (localizable) have been added as well as the description changed for the hatch to indicate this functionality.
  • Fixed clients had jerky movement. Clients were not having physics interpolation enabled for their main character. Without this, the FixedUpdate physics step was not in sync with the rendering, resulting in jerky movement. Interpolation will result in smoother movement of characters. Singleplayer has interpolation turned on anyway.
  • Added extended tooltips for building, now will always report what structure is preventing placement rather than just a generic message saying "structure". This will make it much easier for players to diagnose why they cannot place a structure. Was doing this for small grid structure, but not large grid ones.