Revision Difference
Networked_Types#530574
<cat>Code.Misc</cat>⤶
<cat>Code.Network</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 also be used here (and are used in the example) to let you add support to classes you're unable to access for some reason.