S&box Wiki

Entity Components

Entities can have components. These components are networked, so are also available on the client.

Defining Components

public partial class MyComponent : EntityComponent { [Net] public string MyVariable { get; set; } }

Components can also have Events.

public partial class FlyingComponent : EntityComponent { [Event.Tick] public void OnTick() { Entity.Velocity += Vector3.Up * 16.0f; } }

Creating Components

You can create, get and remove components from an Entity at any time, in this example we simply assign them on Spawn.

public partial class MyEntity : Entity { public override Spawn() { var c = Components.Create<MyComponent>(); var c = Components.GetOrCreate<MyComponent>(); var c = Components.Get<MyComponent>(); var c = new MyComponent(); Components.Add( c ); Components.Remove( c ); Components.RemoveAll(); foreach ( var c in Components.GetAll<MyComponent>() ) { } foreach ( var c in Components.GetAll<EntityComponent>() ) { } } }

Binding Components

If you need to frequently access a component and want a reference that is networked between server and client, you can set up the component as a property with the BindComponent attribute.

public partial class MyEntity : Entity { [BindComponent] public MyComponent Component { get; } public override void Spawn() { Components.Create<MyComponent>(); base.Spawn(); } }

Component will now refer to the same networked component on both client and server.

  • Note that you still need to create the component, and you should do so only from the server.
  • You also do not need to assign the component to the property, which should have no setter.

Footnotes

  • Clients are also entities and can have components on Client.Components