コード例 #1
0
        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);
            }
        }
コード例 #2
0
 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);
         }
     }
 }
コード例 #3
0
 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);
             }
         }
     }
 }