public static VesselUpdate VeselUpdateFromBytes(byte[] messageData) { VesselUpdate update = Recycler <VesselUpdate> .GetObject(); using (MessageReader mr = new MessageReader(messageData)) { update.planetTime = mr.Read <double>(); update.vesselID = new Guid(mr.Read <string>()); update.bodyName = mr.Read <string>(); update.rotation = mr.Read <float[]>(); update.angularVelocity = mr.Read <float[]>(); //FlightState variables update.flightState = new FlightCtrlState(); update.flightState.mainThrottle = mr.Read <float>(); update.flightState.wheelThrottleTrim = mr.Read <float>(); update.flightState.X = mr.Read <float>(); update.flightState.Y = mr.Read <float>(); update.flightState.Z = mr.Read <float>(); update.flightState.killRot = mr.Read <bool>(); update.flightState.gearUp = mr.Read <bool>(); update.flightState.gearDown = mr.Read <bool>(); update.flightState.headlight = mr.Read <bool>(); update.flightState.wheelThrottle = mr.Read <float>(); update.flightState.roll = mr.Read <float>(); update.flightState.yaw = mr.Read <float>(); update.flightState.pitch = mr.Read <float>(); update.flightState.rollTrim = mr.Read <float>(); update.flightState.yawTrim = mr.Read <float>(); update.flightState.pitchTrim = mr.Read <float>(); update.flightState.wheelSteer = mr.Read <float>(); update.flightState.wheelSteerTrim = mr.Read <float>(); //Action group controls update.actiongroupControls = mr.Read <bool[]>(); //Position/velocity update.isSurfaceUpdate = mr.Read <bool>(); if (update.isSurfaceUpdate) { update.position = mr.Read <double[]>(); update.velocity = mr.Read <double[]>(); update.acceleration = mr.Read <double[]>(); update.terrainNormal = mr.Read <float[]>(); } else { update.orbit = mr.Read <double[]>(); } update.sasEnabled = mr.Read <bool>(); if (update.sasEnabled) { update.autopilotMode = mr.Read <int>(); update.lockedRotation = mr.Read <float[]>(); } return(update); } }
public void PositionVessel(ClientObject client, VesselUpdate update) { if (update.isSurfaceUpdate) { VesselInfo vi = GetVesselInfo(update.vesselID); vi.UpdateLanded(update.position[0], update.position[1], update.position[2], Vector.Length(update.velocity)); } else { VesselInfo vi = GetVesselInfo(update.vesselID); int planetReference = PlanetInfo.GetReference(update.bodyName); if (planetReference != -1) { Orbit o = new Orbit(update.orbit, planetReference); vi.UpdateOrbit(o); } } }
public override void OnMessageReceived(ClientObject client, ClientMessage messageData) { if (!inited) { return; } if (messageData.type == ClientMessageType.VESSEL_PROTO) { using (MessageReader mr = new MessageReader(messageData.data)) { double planetTime = mr.Read <double>(); bool vesselIdOK = Guid.TryParse(mr.Read <string>(), out Guid vesselID); bool isDockingUpdate = mr.Read <bool>(); bool isFlyingUpdate = mr.Read <bool>(); byte[] possibleCompressedBytes = mr.Read <byte[]>(); byte[] vesselData = Compression.DecompressIfNeeded(possibleCompressedBytes); if (vesselIdOK) { UpdateVessel(client, vesselID, vesselData); } } } if (messageData.type == ClientMessageType.VESSEL_UPDATE) { VesselUpdate vu = VesselUpdate.VeselUpdateFromBytes(messageData.data); PositionVessel(client, vu); Recycler <VesselUpdate> .ReleaseObject(vu); } if (messageData.type == ClientMessageType.VESSEL_REMOVE) { using (MessageReader mr = new MessageReader(messageData.data)) { double planetTime = mr.Read <double>(); if (Guid.TryParse(mr.Read <string>(), out Guid vesselID)) { RemoveVessel(client, vesselID); } } } }