bool IPacketHandler.OnPacket(byte packetId, Context context, Network.ByteInStream stream) { Actor actor = stream.ReadActor(); ushort size = stream.ReadUShort(); if (actor != null) { if (context.IsServer) { if (stream.Player.OwnedActors.Contains(actor)) { return actor.Synchronizable.UnpackSyncData(stream); } else { log.Warn("Got synchronized data from {0} for {1}, but that player does not own that actor", stream.Player, actor); } } else { return actor.Synchronizable.UnpackSyncData(stream); } } stream.Skip(4); stream.Skip(size); return true; }
bool IPacketHandler.OnPacket(byte packetId, Context context, Network.ByteInStream stream) { Actor actor; ushort actorId = stream.ReadUShort(); byte size = stream.ReadByte(); if (context.GetActor(actorId, out actor)) { if (verify(context, actor, stream)) { if (actor.HasStateStream) { actor.LastStateStreamUpdateTime = context.Time.LocalTime; actor.StateStreamer.Unpack(stream); if (context.IsServer) { foreach (Player s in actor.Subscribers) { s.Connection.Queue(actor, false); } } return true; } else { log.Error("{0} does not have a state stream, yet it received state stream packet from {1}", actor, stream.Connection.Player); } } else { log.Warn("{0} is not allowed to send transform replication to {1}, ignoring", stream.Connection.Player, actor); } } stream.Skip(size); return true; }
public void Unpack(Network.ByteInStream stream) { if (compressPosition) { position = new Vector3( HalfUtilities.Unpack(stream.ReadUShort()), HalfUtilities.Unpack(stream.ReadUShort()), HalfUtilities.Unpack(stream.ReadUShort()) ); } else { position = stream.ReadVector3(); } if (yawOnly) { yaw = stream.ReadByte() * 1.40625f; rotation = Quaternion.RotationAxis(Vector3.Up, yaw * SlimMath.Single.Deg2Rad); } else { rotation = Quaternion.RotationAxis( new Vector3( HalfUtilities.Unpack(stream.ReadUShort()), HalfUtilities.Unpack(stream.ReadUShort()), HalfUtilities.Unpack(stream.ReadUShort()) ), (stream.ReadByte() * 1.40625f * SlimMath.Single.Deg2Rad) ); } buffer.Push(Actor.Context.Time.GameTime, new State { Position = position, Rotation = rotation } ); }