protected override void ClientWrite(VRage.Library.Collections.BitStream stream,EndpointId forClient, uint timestamp, int maxBitPosition) { base.ClientWrite(stream,forClient,timestamp,maxBitPosition); stream.Write(Entity.WorldMatrix.Translation); MyShipController controller = MySession.Static.ControlledEntity as MyShipController; stream.WriteBool(m_grid != null && controller != null); if (m_grid != null && controller != null) { stream.WriteBool(m_grid.IsStatic); if (m_grid.IsStatic == false) { stream.WriteBool(controller != null); if (controller != null) { stream.WriteInt64(controller.EntityId); Vector2 rotation = controller.RotationIndicator; stream.WriteFloat(rotation.X); stream.WriteFloat(rotation.Y); stream.WriteHalf(controller.RollIndicator); Vector3 position = controller.MoveIndicator; stream.WriteHalf(position.X); stream.WriteHalf(position.Y); stream.WriteHalf(position.Z); Vector3D gridPosition = m_grid.PositionComp.GetPosition(); MyGridPhysicsStateGroup.WriteSubgrids(m_grid, stream, ref forClient, timestamp, maxBitPosition, m_lowPositionOrientation, ref gridPosition, ref m_currentSentPosition); } } } }
protected override void ClientWrite(VRage.Library.Collections.BitStream stream, EndpointId forClient, uint timestamp, int maxBitPosition) { base.ClientWrite(stream, forClient,timestamp,maxBitPosition); stream.WriteBool(m_character != null); if (m_character != null) { stream.WriteBool(m_supportPhysics != null); if (m_supportPhysics != null) { stream.WriteInt64(m_supportPhysics.Entity.EntityId); stream.Write(m_supportPhysics.Entity.PositionComp.GetPosition()); } Vector3 position = m_character.MoveIndicator; stream.WriteHalf(position.X); stream.WriteHalf(position.Y); stream.WriteHalf(position.Z); Vector2 rotate = m_character.RotationIndicator; stream.WriteFloat(rotate.X); stream.WriteFloat(rotate.Y); stream.WriteFloat(m_character.RollIndicator); // Movement state, 2B stream.WriteUInt16((ushort)m_character.GetNetworkMovementState()); // Movement flag. stream.WriteUInt16((ushort)m_character.PreviousMovementFlags); // Flags, 6 bits bool hasJetpack = m_character.JetpackComp != null; stream.WriteBool(hasJetpack ? m_character.JetpackComp.TurnedOn : false); stream.WriteBool(hasJetpack ? m_character.JetpackComp.DampenersTurnedOn : false); stream.WriteBool(m_character.LightEnabled); // TODO: Remove stream.WriteBool(m_character.ZoomMode == MyZoomModeEnum.IronSight); stream.WriteBool(m_character.RadioBroadcaster.WantsToBeEnabled); // TODO: Remove stream.WriteBool(m_character.TargetFromCamera); stream.WriteFloat(m_character.HeadLocalXAngle); stream.WriteFloat(m_character.HeadLocalYAngle); } }
protected override void CustomServerWrite(uint timeStamp, ulong clientId, VRage.Library.Collections.BitStream stream) { stream.WriteBool(m_support != null); if (m_support != null) { stream.WriteInt64(m_support.EntityId); stream.Write(m_support.PositionComp.GetPosition()); } }
void ServerWrite(VRage.Library.Collections.BitStream stream, ulong clientId) { bool clientUpdate = m_clientUpdateFlag[clientId]; stream.WriteBool(clientUpdate); if (clientUpdate) { ClientData clientData = m_serverClientData[clientId]; m_clientUpdateFlag[clientId] = false; stream.WriteUInt32(clientData.TimeStamp); MyTransformD serverData = new MyTransformD(Entity.WorldMatrix); //rotation is calculated same way for both Quaternion serverRotation = serverData.Rotation; serverRotation.Normalize(); clientData.Transform.Rotation.Normalize(); MyTimeStampValues delta = new MyTimeStampValues(); serverRotation = Quaternion.Inverse(serverRotation); Quaternion.Multiply(ref clientData.Transform.Rotation, ref serverRotation, out delta.Transform.Rotation); bool applyRotation = false; double eps = 0.001; if (Math.Abs(Quaternion.Dot(clientData.Transform.Rotation, serverData.Rotation)) < 1 - eps) { applyRotation = true; } bool isValidPosition = true; bool correctServerPosition = false; CalculatePositionDifference(clientId, out isValidPosition, out correctServerPosition, out delta.Transform.Position); bool isValidClientPosition = isValidPosition; if ((correctServerPosition && isValidPosition) || applyRotation) { MatrixD matrix = Entity.WorldMatrix; MatrixD correctionMatrix = MatrixD.Multiply(matrix.GetOrientation(), delta.Transform.TransformMatrix); correctionMatrix.Translation += Entity.WorldMatrix.Translation; if (correctServerPosition) { isValidClientPosition = IsPositionValid(new MyTransformD(correctionMatrix)); } if (isValidClientPosition) { Entity.PositionComp.SetWorldMatrix(correctionMatrix, null, true); MyEntityPhysicsStateGroup support = MySupportHelper.FindPhysics(Entity); if (support != null && support.MoveHandler != null) { support.MoveHandler(ref matrix, ref correctionMatrix); } } else if (applyRotation) { correctionMatrix.Translation = Entity.WorldMatrix.Translation; Entity.PositionComp.SetWorldMatrix(correctionMatrix, null, true); } } stream.WriteBool(!isValidClientPosition); if (!isValidClientPosition) { serverData = new MyTransformD(Entity.WorldMatrix); stream.Write(serverData.Position); CustomServerWrite(m_serverClientData[clientId].TimeStamp, clientId, stream); } } stream.Write(Entity.Physics != null ? Entity.Physics.LinearVelocity * MyEntityPhysicsStateGroup.EffectiveSimulationRatio : Vector3.Zero); stream.Write(Entity.Physics != null ? Entity.Physics.AngularVelocity * MyEntityPhysicsStateGroup.EffectiveSimulationRatio : Vector3.Zero); }
protected virtual void ClientWrite(VRage.Library.Collections.BitStream stream, EndpointId forClient, uint timestamp, int maxBitPosition) { MatrixD matrix = Entity.WorldMatrix; stream.WriteQuaternionNorm(Quaternion.CreateFromForwardUp(matrix.Forward, matrix.Up)); stream.Write(matrix.Translation); }
protected override void CustomServerWrite(uint timeStamp, VRage.Library.Collections.BitStream stream) { MyEntity support = MySupportHelper.FindSupportForCharacterAABB(m_character); stream.WriteBool(support != null); if (support != null) { stream.WriteInt64(support.EntityId); Vector3D pos = support.PositionComp.GetPosition() - m_character.PositionComp.GetPosition(); stream.Write(pos); stream.Write(support.PositionComp.GetPosition()); } }
void ServerWrite(VRage.Library.Collections.BitStream stream, ulong clientId) { stream.WriteUInt32(m_serverClientData[clientId]); var matrix = Entity.WorldMatrix; stream.Write(matrix.Translation); stream.WriteQuaternionNorm(Quaternion.CreateFromForwardUp(matrix.Forward, matrix.Up)); //HalfVector3 linear = Entity.Physics != null ? Vector3.Round(Entity.Physics.LinearVelocity * MyEntityPhysicsStateGroup.EffectiveSimulationRatio, MyEntityPhysicsStateGroup.NUM_DECIMAL_PRECISION) : Vector3.Zero; Vector3 linear = Entity.Physics != null ? Entity.Physics.LinearVelocity * MyEntityPhysicsStateGroup.EffectiveSimulationRatio : Vector3.Zero; stream.Write(linear); Vector3 angular = Entity.Physics != null ? Entity.Physics.AngularVelocity * MyEntityPhysicsStateGroup.EffectiveSimulationRatio : Vector3.Zero; stream.Write(angular); m_clientUpdateFlag[clientId] = false; CustomServerWrite(m_serverClientData[clientId], stream); }