S&box Wiki

Custom Asset Types

Custom Asset Types

Custom assets are things you can define yourself. They give you a nice inspector window and they're hotloaded in-game, which means you can whip things up pretty quickly if you're using them.

You can find plenty of examples of assets throughout s&box, here's a snippet from the clothing asset:

[Library( "clothing" ), AutoGenerate] public partial class Clothing : Asset { [Property] public string Title { get; set; } [Property, ResourceType( "vmdl" )] public string Model { get; set; } // ... }
  • [Library( "clothing" )] specifies the file extension our assets use will be .clothing
  • Because we specified [AutoGenerate] on our asset class a .asset file will automatically generate for us.
  • Properties that should be editable via the inspector in your asset should be marked with [Property]
If your Property type isn't automatically converted to a valid FGD type, use [FGDType( "insert_type_here" )] until it is supported.

Using the inspector

Now that you have everything set up, you can use the inspector tool to edit your first weapon.

  1. Click the "Inspector" icon in the asset browser.
  1. Pick your asset type.
  1. Set up your weapon however you want.
  1. Save your asset into your addon's config directory - call it "MyWeapon.weapon"

Accessing assets

All assets are loaded when you first start the game, there are several ways you can access them:


When assets are loaded they are stored in a dictionary with their path, you can access these with Resource.FromPath<T>.

// Property allows for hot-loading public Clothing Clothing { get; set; } // ... // Load the weapon data from a path Clothing = Resource.FromPath<Clothing>( "config/tshirt.clothing" );


When assets are loaded they call their PostLoad method, you can use this to store a list of your assets for later use.

public partial class Clothing : Asset { // Access these statically with Clothing.All public static IReadOnlyList<Clothing> All => _all; internal static List<Clothing> _all = new(); protected override void PostLoad() { base.PostLoad(); if ( !_all.Contains( this ) ) _all.Add( this ); } }

Special Pages



Render Time: 12ms

DB GetPage 1
Generate Html 1
SaveChanges (1) 5
Render Body 0
Render Sidebar 1