internal static void ReadNetObject(DataSerializationItem item, Bitstream msg, NetworkObject owner, NetworkObject baseline=null)
{
if (owner is DefinitionNetworkObject)
{
var d = msg.ReadBool();
if (d)
{
(owner as DefinitionNetworkObject).Destroy = true;
return;
}
}
foreach (var prop in item.Properties)
{
var useBaseline = msg.ReadBool();
if (useBaseline)
{
if (baseline != null)
{
ApplyBaseline(prop, owner, baseline);
}
else
{
throw new InvalidOperationException("Can't find baseline!");
}
continue;
}
switch (prop.Type)
{
case DataTypes.BOOL:
prop.Set(owner, msg.ReadBool());
break;
case DataTypes.UBYTE:
prop.Set(owner, msg.ReadByte());
break;
case DataTypes.UINT:
prop.Set(owner, msg.ReadVariableUInt32());
break;
case DataTypes.BYTE:
prop.Set(owner, msg.ReadSByte());
break;
case DataTypes.INT:
prop.Set(owner, msg.ReadVariableInt32());
break;
case DataTypes.ULONG:
prop.Set(owner, msg.ReadUInt64());
break;
case DataTypes.LONG:
prop.Set(owner, msg.ReadInt64());
break;
case DataTypes.FLOAT:
prop.Set(owner, msg.ReadFloat());
break;
case DataTypes.DOUBLE:
prop.Set(owner, msg.ReadDouble());
break;
case DataTypes.STRING:
prop.Set(owner, msg.ReadString());
break;
case DataTypes.VECTOR2:
prop.Set(owner, msg.ReadVector2());
break;
case DataTypes.NETPROP:
var childProp = prop.ChildProperty;
if (childProp != null)
{
var o = (NetworkObject)prop.CreateChildProperty();
if (o != null)
{
var child = (NetworkObject)prop.Get<NetworkObject>(baseline);
ReadNetObject(childProp, msg, o, child);
prop.Set(owner, o);
}
}
break;
}
}
}