void Write(BitStream stream) { // TODO: Make sure sleeping, server controlled entities are not moving locally (or they can be but eventually their position should be corrected) stream.WriteBool(MySession.ControlledEntity != null); if (MySession.ControlledEntity == null) { Vector3D pos = MySpectatorCameraController.Static.Position; stream.WriteDouble(pos.X); stream.WriteDouble(pos.Y); stream.WriteDouble(pos.Z); } else { var controlledEntity = MySession.ControlledEntity.Entity.GetTopMostParent(); // Send controlled entity every other frame to server if (MyMultiplayer.Static.FrameCounter % 2 == 0) { // TODO: Write additional client data, context if (controlledEntity != null && controlledEntity.SyncFlag && ((MySyncEntity)controlledEntity.SyncObject).ResponsibleForUpdate(Sync.Clients.LocalClient)) { stream.WriteInt64(controlledEntity.EntityId); switch (MyGuiScreenTerminal.GetCurrentScreen()) { case MyTerminalPageEnum.Inventory: stream.WriteInt32((int)MyContextKind.Inventory, 2); break; case MyTerminalPageEnum.ControlPanel: stream.WriteInt32((int)MyContextKind.Terminal, 2); break; case MyTerminalPageEnum.Production: stream.WriteInt32((int)MyContextKind.Production, 2); break; default: stream.WriteInt32((int)MyContextKind.None, 2); break; } if (MyGuiScreenTerminal.InteractedEntity != null) { stream.WriteInt64(MyGuiScreenTerminal.InteractedEntity.EntityId); } else { stream.WriteInt64(0); } ((MySyncEntity)controlledEntity.SyncObject).SerializePhysics(stream, null); } } } }