We've made the upgrade to .NET 10 and C# 14. For the most part, things should be the same. There may be some small performance improvements -- we've noticed a few of our benchmarks go down which is great!

The upgrade to C# 14 enables features that you can find out about here. Here's a few:

Null conditional assignment

Property?.Value = 20.0f;

Field accessors

public float Health
{
    get;
    set
    {
        if ( field == value ) return;

        field = value;
        OnHealthChanged?.Invoke( value );
    }
}

Extension properties

public static class Enumerable
{
    extension<TSource>(IEnumerable<TSource> source)
    {
        // Extension property:
        public bool IsEmpty => !source.Any();
    }
}
If you're using Visual Studio, make sure you update to VS2026, or your favourite code editor that supports the .NET 10 SDK. For players, when you boot the game up it'll install the .NET 10 runtime for you.
We changed how the play mode works, instead of the seperate Scene/Game tabs before the game now launches and replaces the active scene tab. You can swap between inspecting the scene and playing the scene by ejecting (F8).

Primarily the change was to take better control of the engine, as previously the game dock was a hidden external window made by Source 2, captured in Qt and hacked around. This was hard to maintain as a unique path in the editor, was unstable and also made the editor completely unusable on Linux.

This probably pisses everyone off because it's a change in their workflow and there will be some teething bugs. But it's an opportunity to define a better workflow overall, e.g there are people who have the game and scene side by side extensively, and there are some people who don't, we should be able to satisfy both. 
I've been making UI in games for 30 years and using Razor components for UI is the best way I have found. Our Razor syntax highlighting has always been quite fickle, and the update to VS2026 made it a million times worse.

As part of my hackweek I decided to do a deep dive on it all to see if I could figure out why. And I did it! 

I am so happy that everyone now gets to experience it like how it's meant to work, with auto completion, syntax highlighting and full intellisense. It really is a total game changer and makes things so much easier.

Namespacing

To make it work properly, we had to cooperate with how namespacing works. In Razor/Blazor, if you don't specify a @namespace in your file, it'll default to <RootNamespace>.<FolderName>. Whether this is good or bad, I'll let you decide.. but I have made s&box have the same behaviour now.

This means that if your code won't compile now, add a @namespace to all your .razor files, or live with the folder based namespaces.

Inherits

Razor doesn't know that we're using Panels instead of whatever they use. So we need to tell them. You do this by adding @inherits Panel at the top of every .razor file. If your intellisense isn't working, make sure you have this line.

Parameters

For parameters to show properly in intellisense you need to add a [Parameter] attribute to the property. That way when you use one of your components, you'll have autocompletion.

You can add these to your regular .cs based Panels to get autocompletion too!
Cosmetics can now have physics bones to simulate hair or dangly bits.
It’s all physics-based, so setup is simple: create colliders and joints just like a ragdoll.

Tutorial:
I decided that we're going to open source the finances. We're going to show how much money we make and we're going to show how much money we pay out to the community. I don't think it's easy for people to comprehend what we're doing here so they're inevitably going to see everything as a cash grab.

My hope is that by showing actual dollar figures it will allow everyone to draw their own conclusions instead of having to choose who to believe. And if we are fucking up, they'll be able to show us how and hold us to account.

I feel like it's quite easy to create a community where everyone wins. Valve have done this repeatedly. They did it for me. They could have easily made Garry's Mod themselves. They could have taken 100% of that money. They could have given me $100k for the rights. But they didn't, they knew that if you let people succeed it's good for them and it's good for you. Everyone wins.

Valve gave me my chance. I'm already rich. I don't want to fuck anyone over. I want to give opportunities to the next generation, like Valve did me. We can all win together.
We noticed that you couldn't select a bunch of objects and set their material group, so now that works. This also applies for body groups!
With the move from Textures -> Sprites it's been a bit more cumbersome to just use Textures without creating/embedding a Sprite...

So now you can just drag sprites, textures, or image files onto the control widget to automatically embed it for you. This makes it easier to do everything in-line (like texture generators), and once your sprite has more than one image the widget will become a normal Embedded Resource Control
There was a bit of weirdness around network time, where the network receive and send heartbeats would run before the scene time was updated, so everything from the network could be a frametime old.

I've done a pass on this to make it all more logical. I think there's still more that we can look at to solidify it, and I doubt that anyone will notice any difference, but this is way more correct now.
I've added a system to dynamically disable networked objects based on visibility. By default, if a map is loaded that has VIS information from Hammer, it'll use that to determine if an object is visible for a Connection - based on their main camera position.

By default, all networked objects have this behaviour disabled. To enable it, you must turn off Always Transmit either via the network settings in the inspector for that object, or by code with the Network.AlwaysTransmit property.

You can also choose to add a Component that implements INetworkVisible and add that to the root networked object - if this exists, it'll use that instead.

In the video below, you can see how it works - the Cube in this video is using a custom visibility component where the Cube is culled if the player is more than 512 units away.

When networked objects are culled, Sync Var (and Transform) updates are no longer sent from their owner to the clients it isn't visible to - but RPCs will still be sent, and the object will still be spawned, it'll just become disabled until it's visible.

Some documentation for this is available here.
We've wrapped up work on the new physgun! The viewmodel and worldmodel are available on the workshop.
As always, check out all of our weapons here.
25.11.19
25.11.19
13 November 2025
🎁 Added
🧼 Improved
  • Multi-select support for material groups
  • Multi-select support for body groups
  • Razor syntax highlight in VS2026
  • Razor intellisense in VS2026
  • Sprite Control Widget enhancements
  • Cloud asset cleanup
  • Network time sync improvements
  • Prop / ModelPhysics network refresh is granular instead of the whole hierarchy
  • Only create bone physics if the model has joints
  • Editor: Dedicated server uses local project path, instead of cloud project path
  • Movie Maker: serialization safety, better string support
  • Physics rules caching
  • Friends List overlay improvements
🪛 Fixed
  • Several security exploits allowing RCE
  • Error sometimes when framing objects in the editor
  • Terrain not streaming textures and using the lowest mip
  • Physics spring serialization fixes
  • Warning/error in AddPanelEventAttribute
  • box3d: Hull bugs
  • SSR and SSAO not working
  • Highlight not working
  • Hammer Static Overlays not projecting on world only properly
🚯 Removed
  • A bunch of unused native libraries
  • ModelDoc: Unused jiggle/cloth/softbody nodes
  • ModelDoc: Cloth preview (hasn't been functional for a while)
⚠️ Known Issues
  • VR doesn't work
trophy 1430
Apr 2021 113 posts
Update 25.11.19 : news/update-25-11-19
trophy 1360
Sep 2021 104 posts
I absolutely support these words: "I want to give opportunities to the next generation, like Valve did me. We can all win together". You're already doing a lot for us, you're one of the most open gamedev studios, you give the opportunity for making money and now you're preparing a license with 0% royalti, which is just wow. That's why I've been waiting for s&box release since 2017 🔥
trophy 1933
Sep 2021 12 posts
<3
trophy 2020
Apr 2021 61 posts
When s&box succeeds, we all succeed. Love it.
trophy 400
Jul 2023 27 posts
🔥🔥🔥🔥
trophy 3071
Jul 2021 4 posts
VR breaking right when i started a project on it last weekend, damn i'm unlucky. i hope it gets fixed quickly
trophy 1260
Feb 2024 31 posts
>editor now is usable on linux
>jiggle bones for cosmetics
>razor auto completion, syntax highlighting, a intellisense


this week update was peak 


trophy 1005
Aug 2022 1 post
That physgun model is beautiful, great job, RIck. However, your stepper motors should have 4 wires > to a stepper motor driver in line before connecting to >  the SOB. I can see why you decided to simplify it with only 2 wires each, though.
trophy 730
Aug 2022 43 posts
Yay, Razor syntax highlighting and open source financing!
Great work from Conna on the Network culling as well.
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.