public static void RequestPositionFromServer(MyFloatingObject floatingObject) { FloatingObjectRequestPosMsg msg = new FloatingObjectRequestPosMsg(); msg.EntityId = floatingObject.EntityId; MySession.Static.SyncLayer.SendMessageToServer(ref msg); }
private static void OnFloatingObjectsRequestPosCallback(ref FloatingObjectRequestPosMsg msg, MyNetworkClient sender) { MyFloatingObject floatingObject; MyEntity entity = null; MyEntities.TryGetEntityById(msg.EntityId, out entity); floatingObject = entity as MyFloatingObject; if (floatingObject != null) { MatrixD matrix = floatingObject.WorldMatrix; Vector3D translation = matrix.Translation; Quaternion rotation = Quaternion.CreateFromRotationMatrix(matrix.GetOrientation()); if (MyPerGameSettings.EnableFloatingObjectsActiveSync) { m_rigidBodyList.Clear(); Sandbox.Engine.Physics.MyPhysics.GetPenetrationsShape(floatingObject.Physics.RigidBody.GetShape(), ref translation, ref rotation, m_rigidBodyList, Sandbox.Engine.Physics.MyPhysics.NotCollideWithStaticLayer); tmp_list.Clear(); foreach (var body in m_rigidBodyList) { var physicsBody = body.Body.UserObject as MyPhysicsBody; if (physicsBody != null) { var collidingFloatingObject = physicsBody.Entity as MyFloatingObject; if (collidingFloatingObject != null && !tmp_list.Contains(collidingFloatingObject)) { tmp_list.Add(collidingFloatingObject); if (tmp_list.Count > MAX_SYNC_ON_REQUEST) { break; } } } } foreach (var floatOb in tmp_list) { UpdatePosition(floatOb, false, sender); } } UpdatePosition(floatingObject, false, sender); } else { //System.Diagnostics.Debug.Fail("Requested floating object wasn't found!"); } }