protected void SerializeFriction(BitStream stream, MyEntity entity) { MyPhysicsBody pb = entity.Physics as MyPhysicsBody; if (pb == null || pb.RigidBody == null) { if (stream.Writing) stream.WriteFloat(0); else stream.ReadFloat(); return; } HkRigidBody rb = pb.RigidBody; if (stream.Writing) stream.WriteFloat(rb.Friction); else rb.Friction = stream.ReadFloat(); }
private void SerializeRopeData(BitStream stream, bool applyWhenReading, List<MyCubeGrid> gridsGroup = null) { if (MyRopeComponent.Static == null) return; if (stream.Writing) { m_tmpRopes.Clear(); m_tmpRopeGrids.Clear(); m_tmpRopeGrids.Add(Entity); Debug.Assert(gridsGroup != null); if (gridsGroup != null) { foreach (var grid in gridsGroup) m_tmpRopeGrids.Add(grid); } MyRopeComponent.Static.GetRopesForGrids(m_tmpRopeGrids, m_tmpRopes); MyRopeData ropeData; stream.WriteUInt16((ushort)m_tmpRopes.Count); foreach (var rope in m_tmpRopes) { var ropeProxyTarget = MyMultiplayer.Static.ReplicationLayer.GetProxyTarget((IMyEventProxy)rope); NetworkId ropeNetworkId = MyMultiplayer.Static.ReplicationLayer.GetNetworkIdByObject(ropeProxyTarget); stream.WriteNetworkId(ropeNetworkId); //TODO - MyRopeComponent should be rewritten to singleton MyRopeComponent.GetRopeData(rope.EntityId, out ropeData); stream.WriteFloat(ropeData.CurrentRopeLength); } m_tmpRopes.Clear(); m_tmpRopeGrids.Clear(); } else { uint ropesCount = stream.ReadUInt16(); for (uint i = 0; i < ropesCount; ++i) { NetworkId ropeNetworkId = stream.ReadNetworkId(); float ropeLength = stream.ReadFloat(); MyRopeReplicable replicable = MyMultiplayer.Static.ReplicationLayer.GetObjectByNetworkId(ropeNetworkId) as MyRopeReplicable; MyRope rope = replicable != null ? replicable.Instance : null; if (rope != null && applyWhenReading) MyRopeComponent.Static.SetRopeLengthSynced(rope.EntityId, ropeLength); } } }
public override bool Serialize(BitStream stream, EndpointId forClient,uint timeStamp, byte packetId, int maxBitPosition) { base.Serialize(stream, forClient,timeStamp, packetId, maxBitPosition); if (stream.Writing) { // Head and spine stuff, 36 - 152b (4.5B - 19 B) stream.WriteHalf(Entity.HeadLocalXAngle); // 2B stream.WriteHalf(Entity.HeadLocalYAngle); // 2B // TODO: Spine has only one angle (bending forward backward) // Getting EULER angles from Matrix seems good way to get it (z-component) stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.SpineBone)); // 1b / 30b stream.WriteQuaternionNormCompressedIdentity(Entity.GetAdditionalRotation(Entity.Definition.HeadBone)); // 1b / 30b // Movement state, 2B stream.WriteUInt16((ushort)Entity.GetCurrentMovementState()); // Movement flag. stream.WriteUInt16((ushort)Entity.MovementFlags); // Flags, 6 bits bool hasJetpack = Entity.JetpackComp != null; stream.WriteBool(hasJetpack ? Entity.JetpackComp.TurnedOn : false); stream.WriteBool(hasJetpack ? Entity.JetpackComp.DampenersTurnedOn : false); stream.WriteBool(Entity.LightEnabled); // TODO: Remove stream.WriteBool(Entity.ZoomMode == MyZoomModeEnum.IronSight); stream.WriteBool(Entity.RadioBroadcaster.WantsToBeEnabled); // TODO: Remove stream.WriteBool(Entity.TargetFromCamera); stream.WriteNormalizedSignedVector3(Entity.MoveIndicator, 8); float speed = Entity.Physics.CharacterProxy != null ? Entity.Physics.CharacterProxy.Speed : 0.0f; stream.WriteFloat(speed); stream.WriteFloat(Entity.RotationIndicator.X); stream.WriteFloat(Entity.RotationIndicator.Y); stream.WriteFloat(Entity.RollIndicator); } else { Vector3 move; MyCharacterNetState charNetState = ReadCharacterState(stream); if (!IsControlledLocally && !Entity.Closed) { Entity.SetStateFromNetwork(ref charNetState); } } return true; }