public override void Deserialize(Bitstream msg) { var count = msg.ReadUInt16(); count = (ushort)Math.Max((int)count, 0); count = (ushort)Math.Min((int)count, 100); State = new List<PlayerStateData>(count); if (count > 0) { ushort objType = msg.ReadByte(); PlayerId = msg.ReadVariableUInt32(); if (_ownerType == null) { _ownerType = ObjectMapper.LookupType(objType); _lookupItem = DataLookupTable.Get(_ownerType.GetTypeInfo()); } } NetworkObject pState = PlayerId > 0 ? ObjectMapper.GetCurrentPlayerState(PlayerId) : null; for (int i = 0; i < count; ++i) { NetworkObject data = Activator.CreateInstance(_ownerType) as NetworkObject; DataObjectPacket.ReadNetObject(_lookupItem, msg, data, pState); pState = data; State.Add(data as PlayerStateData); } if (State.Count > 0 && PlayerId > 0) ObjectMapper.SetCurrentPlayerState(PlayerId, State.Last()); }
public override void Serialize(Bitstream msg) { var count = State.Count; msg.Write((ushort)State.Count); if (count > 0 && _ownerType == null) { _ownerType = State[0].GetType(); _lookupItem = DataLookupTable.Get(_ownerType.GetTypeInfo()); } if (count > 0) { ushort objTypeId = ObjectMapper.LookupType(_ownerType); msg.Write((byte)objTypeId); msg.WriteVariableUInt32(PlayerId); } PlayerStateData pState = PreviousState; foreach (var o in State) { DataObjectPacket.WriteNetObject(_lookupItem, msg, o, pState); pState = o; } }
internal static void WriteNetObject(DataSerializationItem item, Bitstream msg, NetworkObject owner, NetworkObject baseline = null) { if (owner is DefinitionNetworkObject) { if ((owner as DefinitionNetworkObject).Destroy) { msg.Write(true); return; } else { msg.Write(false); } } foreach (var prop in item.Properties) { if (UseBaseline(prop, owner, baseline)) { msg.Write(true); continue; } else { msg.Write(false); } switch (prop.Type) { case DataTypes.BOOL: var b = prop.Get<bool>(owner); msg.Write(b); break; case DataTypes.UBYTE: msg.Write(prop.Get<byte>(owner)); break; case DataTypes.UINT: msg.WriteVariableUInt32(prop.Get<uint>(owner)); break; case DataTypes.BYTE: msg.Write(prop.Get<sbyte>(owner)); break; case DataTypes.INT: msg.WriteVariableInt32(prop.Get<int>(owner)); break; case DataTypes.ULONG: msg.Write(prop.Get<ulong>(owner)); break; case DataTypes.LONG: msg.Write(prop.Get<long>(owner)); break; case DataTypes.FLOAT: msg.Write(prop.Get<float>(owner)); break; case DataTypes.DOUBLE: msg.Write(prop.Get<double>(owner)); break; case DataTypes.STRING: msg.Write(prop.Get<string>(owner)); break; case DataTypes.VECTOR2: msg.Write(prop.Get<Vector2>(owner)); break; case DataTypes.NETPROP: var childProp = prop.ChildProperty; if (childProp != null) { var o = prop.Get<NetworkObject>(owner); var baselinebackup = baseline; if (baseline != null) { var childBase = prop.Get<NetworkObject>(baseline); baseline = childBase; } WriteNetObject(childProp, msg, o, baseline); baseline = baselinebackup; } break; } } }
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; } } }