S&box Wiki

Revision Difference

Networked_Types#530537

<cat>Code.Misc</cat>⤶ <title>Networked Types</title>⤶ ⤶ Networked types allow you to synchronize class members between client and server, this is most commonly used for entities but can be used on any class that is derived from `NetworkClass`⤶ ⤶ #Creating a networked member⤶ ⤶ Adding the `[Net]` or any of the other attributes listed below to a property will mark it to be networked.⤶ ⤶ ```⤶ [Net]⤶ public float HeadSize { get; set; }⤶ ```⤶ ⤶ <warning>Classes containing networked members have to be marked as `partial` in order to work properly.</warning>⤶ ⤶ There are several different attributes you can use instead of `[Net]` that each behave slightly differently:⤶ ⤶ * `[Net]` - Networks to everyone⤶ * `[NetPredicted]` - Same as `[Net]` but allows the value to be predicted⤶ * `[NetLocal]` - Only networks to the player it's set on or `Entity.Owner`⤶ * `[NetLocalPredicted]` - Same as `[NetLocal]` but allows the value to be predicted⤶ ⤶ ⤶ #Custom types⤶ ⤶ Before you can start networking your own types you have to make sure they're supported. Entities are supported by default and you don't have to worry about them.⤶ ⤶ For non-entity classes the easiest method is to have it inherit from `NetworkClass` but if you want to you can do it the manual way as well.⤶ ⤶ #The manual way (Serialization)⤶ ⤶ This method is mainly used for structs but you can use it for classes as well if you'd like.⤶ ⤶ ##Structs⤶ ⤶ Structs are fairly simple to set up as you just have to add two member functions, one for writing and one for reading the serialized data.⤶ ⤶ ```⤶ public void Write( BinaryWriter writer )⤶ {⤶ writer.Write( (float)x );⤶ writer.Write( (float)y );⤶ writer.Write( (float)z );⤶ }⤶ ⤶ public Vector3 Read( BinaryReader reader )⤶ {⤶ return new Vector3( reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() );⤶ }⤶ ```⤶ ⤶ ##Classes⤶ ⤶ For classes you have to be a bit more crafty, members don't work here since a class can be `null` and we have to handle updating existing instances. Static functions work just fine for this.⤶ ⤶ ```⤶ public static class MyClassExtension⤶ {⤶ public static void Write( this MyClass self, System.IO.BinaryWriter writer )⤶ {⤶ if ( self == null )⤶ {⤶ writer.Write( false );⤶ return;⤶ }⤶ ⤶ writer.Write( true );⤶ ⤶ writer.Write( self.Age );⤶ writer.Write( self.Sex );⤶ writer.Write( self.Location );⤶ }⤶ ⤶ public static MyClass Read( this MyClass self, System.IO.BinaryReader reader )⤶ {⤶ int notNull = reader.ReadBoolean();⤶ if ( notNull == 0 ) return null;⤶ ⤶ if ( self == null ) self = new MyClass();⤶ ⤶ self.Age = self.Age.Read( reader );⤶ self.Sex = self.Sex.Read( reader );⤶ self.Location = self.Location.Read( reader );⤶ ⤶ return self;⤶ }⤶ }⤶ ```⤶ ⤶ [Extension methods](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods) can als be used here (and are used in the example) to let you add support to classes you're unable to access for some reason.