public ACMIDataEntry genericDataEntry(Actor actor, ACMIDataEntry entry, float customOffset = 0f)
        {
            //Vector3D coords = support.convertPositionToLatLong_raw(actor.transform.position);
            //entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(actor.flightInfo.roll, 2)} | {Math.Round(actor.flightInfo.pitch, 2)} | {Math.Round(actor.flightInfo.heading, 2) - customOffset}";
            Vector3D coords     = support.convertPositionToLatLong_raw(actor.transform.position);
            double   headingNum = Math.Atan2(actor.transform.forward.x, actor.transform.forward.z) * Mathf.Rad2Deg;

            if (headingNum < 0)
            {
                headingNum += 360;
            }


            Vector3 forward = actor.transform.forward;

            forward.y = 0f;

            float pitch = VectorUtils.SignedAngle(forward, actor.transform.forward, Vector3.up);

            Vector3 toDirection = Vector3.ProjectOnPlane(actor.transform.up, forward);
            float   roll        = VectorUtils.SignedAngle(Vector3.up, toDirection, Vector3.Cross(Vector3.up, forward));

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(roll, 2)} | {Math.Round(pitch, 2)} | {Math.Round(headingNum, 2) - customOffset}";

            entry._basicTypes = "Vehicle";
            entry.name        = actor.actorName;
            return(entry);
        }
Beispiel #2
0
        public ACMIDataEntry buildRocketEntry(Rocket rocket, float customOffset = 0f)
        {
            entry = new ACMIDataEntry();

            entry.name = rocket.name.Replace("(Clone)", "");

            Vector3D coords = support.convertPositionToLatLong_raw(rocket.transform.position);

            double headingNum = Math.Atan2(rocket.transform.forward.x, rocket.transform.forward.z) * Mathf.Rad2Deg;

            if (headingNum < 0)
            {
                headingNum += 360;
            }

            Vector3 forward = rocket.transform.forward;

            forward.y = 0f;

            float pitch = VectorUtils.SignedAngle(forward, rocket.transform.forward, Vector3.up);

            Vector3 toDirection = Vector3.ProjectOnPlane(rocket.transform.up, forward);
            float   roll        = VectorUtils.SignedAngle(Vector3.up, toDirection, Vector3.Cross(Vector3.up, forward));

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(roll, 2)} | {Math.Round(pitch, 2)} | {Math.Round(headingNum, 2) - customOffset}";

            entry.objectId = support.GetObjectID(rocket);

            entry._specificTypes = "Rocket";

            return(entry);
        }
        public ACMIDataEntry airVehicleDataEntry(Actor actor, ACMIDataEntry entry, bool isRed, float customOffset = 0f)
        {
            if (actor != null)
            {
                Vector3D coords = support.convertPositionToLatLong_raw(actor.transform.position);
                entry.locData     = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(actor.flightInfo.roll, 2)} | {Math.Round(actor.flightInfo.pitch, 2)} | {Math.Round(actor.flightInfo.heading, 2) - customOffset}";
                entry._basicTypes = "FixedWing";
                entry.callSign    = support.GetObjectCallsign(actor, isRed);
                entry.name        = actor.actorName;
                if (actor.currentlyTargetingActor != null)
                {
                    entry.lockedTarget = support.GetObjectID(actor.currentlyTargetingActor);
                }

                entry.aoa      = Math.Round(actor.flightInfo.aoa, 2).ToString();
                entry.tas      = Math.Round(actor.flightInfo.airspeed, 2).ToString();
                entry.ias      = AerodynamicsController.fetch.IndicatedAirspeed(actor.flightInfo.airspeed, actor.flightInfo.rb.position).ToString();
                entry.altitude = Math.Round(actor.flightInfo.altitudeASL, 2).ToString();
                entry.agl      = Math.Round(actor.flightInfo.radarAltitude).ToString();

                //entry.afterburner = DataGetters.getAfterburners(actor.gameObject);
                //entry.radarMode = DataGetters.getRadarState(actor.gameObject);
                //entry.fuelWeight = DataGetters.getFuelMass(actor.gameObject);

                return(entry);
            }
            else
            {
                support.WriteErrorLog("Actor is null.");
                throw new Exception("Actor is null.");
            }
        }
Beispiel #4
0
        public ACMIDataEntry buildDataEntry(Actor actor)
        {
            entry          = new ACMIDataEntry();
            entry.objectId = support.GetObjectID(actor);

            //actorName = actor's name in the mission
            //name = actor's unit name

            bool isRed;

            if (actor.team.ToString() == "Allied")
            {
                entry.color = "Blue";
                isRed       = false;
            }
            else
            {
                entry.color = "Red";
                isRed       = true;
            }

            if (PilotSaveManager.current.pilotName == actor.actorName)
            {
                entry = actorProcessor.airVehicleDataEntry(actor, entry, isRed, customSceneOffset);
                entry = actorProcessor.playerVehicleDataEntry(actor, entry, isRed, customSceneOffset);
            }
            else if (actor.role == Actor.Roles.Air)
            {
                //support.WriteLog("Air");
                entry = actorProcessor.airVehicleDataEntry(actor, entry, isRed, customSceneOffset);
            }
            else if (actor.role == Actor.Roles.Ground)
            {
                //support.WriteLog("Ground");
                entry = actorProcessor.groundVehicleDataEntry(actor, entry, customSceneOffset);
            }
            else if (actor.role == Actor.Roles.GroundArmor)
            {
                //support.WriteLog("GroundArmor");
                entry = actorProcessor.groundVehicleDataEntry(actor, entry, customSceneOffset);
            }
            else if (actor.role == Actor.Roles.Ship)
            {
                //support.WriteLog("Ship");
                entry = actorProcessor.shipVehicleDataEntry(actor, entry, customSceneOffset);
            }
            else if (actor.role == Actor.Roles.Missile)
            {
                //support.WriteLog("Missile");
                entry = actorProcessor.missileDataEntry(actor, entry, customSceneOffset);
            }
            else
            {
                //support.WriteLog("Other");
                entry = actorProcessor.genericDataEntry(actor, entry, customSceneOffset);
            }

            return(entry);
        }
        public ACMIDataEntry shipVehicleDataEntry(Actor actor, ACMIDataEntry entry, float customOffset = 0f)
        {
            Vector3D coords = support.convertPositionToLatLong_raw(actor.transform.position);

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)}";
            entry.name    = actor.actorName;

            return(entry);
        }
Beispiel #6
0
        public void getAirports()
        {
            VTMapManager[] mm = FindObjectsOfType <VTMapManager>();
            foreach (AirportManager manager in mm[0].airports)
            {
                newEntry = actorProcessor.airportEntry(manager);

                dataLog.Append("\n" + newEntry.ACMIString());
            }
        }
Beispiel #7
0
        public ACMIDataEntry buildBulletEntry(Bullet bullet)
        {
            entry = new ACMIDataEntry();

            entry.objectId = support.GetObjectID(bullet);

            Vector3D coords = support.convertPositionToLatLong_raw(bullet.transform.position);

            entry.locData        = $"{coords.y} | {coords.x} | {coords.z}";
            entry._specificTypes = "Bullet";

            return(entry);
        }
Beispiel #8
0
        public ACMIDataEntry buildChaffEntry(ChaffCountermeasure.Chaff chaff)
        {
            ACMIDataEntry entry = new ACMIDataEntry();

            entry.objectId = support.GetObjectID(chaff);

            Vector3D coords = support.convertPositionToLatLong_raw(chaff.position);

            entry.locData        = $"{coords.y} | {coords.x} | {coords.z}";
            entry._specificTypes = "Chaff";

            return(entry);
        }
Beispiel #9
0
        public ACMIDataEntry buildFlareEntry(CMFlare flare)
        {
            ACMIDataEntry entry = new ACMIDataEntry();

            entry.objectId = support.GetObjectID(flare);

            Vector3D coords = support.convertPositionToLatLong_raw(flare.transform.position);

            entry.locData        = $"{coords.y} | {coords.x} | {coords.z}";
            entry._specificTypes = "Flare";

            return(entry);
        }
        public ACMIDataEntry airportEntry(AirportManager airport)
        {
            ACMIDataEntry entry = new ACMIDataEntry();

            support.WriteLog($"Processing Airport {airport.airportName}");
            support.UpdateID(airport, false);

            entry.objectId = support.GetObjectID(airport);

            if (airport.team == Teams.Allied)
            {
                entry.color = "Blue";
            }
            else
            {
                entry.color = "Red";
            }

            Vector3D coords = support.convertPositionToLatLong_raw(airport.transform.position);

            double headingNum = Math.Atan2(airport.transform.forward.x, airport.transform.forward.z) * Mathf.Rad2Deg;

            if (headingNum < 0)
            {
                headingNum += 360;
            }


            Vector3 forward = airport.transform.forward;

            forward.y = 0f;

            float pitch = VectorUtils.SignedAngle(forward, airport.transform.forward, Vector3.up);

            Vector3 toDirection = Vector3.ProjectOnPlane(airport.transform.up, forward);
            float   roll        = VectorUtils.SignedAngle(Vector3.up, toDirection, Vector3.Cross(Vector3.up, forward));

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(roll, 2)} | {Math.Round(pitch, 2)} | {Math.Round(headingNum, 2)}";

            entry.fullName = airport.airportName;

            entry.width  = "200";
            entry.length = "80";
            entry.height = "2";

            entry._specificTypes = "Airport";
            entry.shape          = "airbase1.obj";

            return(entry);
        }
        public ACMIDataEntry playerVehicleDataEntry(Actor actor, ACMIDataEntry entry, bool isRed, float customOffset = 0f)
        {
            Vector3D coords = support.convertPositionToLatLong_raw(actor.transform.position);

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(actor.flightInfo.roll, 2)} | {Math.Round(actor.flightInfo.pitch, 2)} | {Math.Round(actor.flightInfo.heading, 2) - customOffset}";



            Actor targettedActor = DataGetters.getRadarLockTarget(actor.gameObject, actor);

            if (targettedActor != null)
            {
                entry.lockedTarget = support.GetObjectID(targettedActor);
            }

            entry.pilot    = actor.actorName;
            entry.callSign = support.GetObjectCallsign(actor, isRed);
            entry.name     = actor.name.Replace("(Clone)", "");

            return(entry);
        }
        public string ACMIString(ACMIDataEntry oldEntry = null)
        {
            string outputString = "";

            if (oldEntry != null)
            {
                if (oldEntry.BuildString() != this.BuildString())
                {
                    outputString = shortString();
                }
            }
            else
            {
                outputString = BuildString();
            }
            if (outputString.StartsWith(","))
            {
                outputString = outputString.Substring(1);
            }

            return(outputString);
        }
Beispiel #13
0
        public void TacViewDataLogACMI()
        {
            actors = TargetManager.instance.allActors;

            acmiString = "";

            // Processing game actors

            foreach (var actor in actors)
            {
                if (actor != null)
                {
                    acmiString = "";
                    support.UpdateID(actor);

                    newEntry = buildDataEntry(actor);

                    // If this is already a tracked actor
                    if (knownActors.ContainsKey(support.GetObjectID(actor)))
                    {
                        oldEntry = knownActors[support.GetObjectID(actor)];

                        // Diff the old entry and the new entry. Update the old entry with the new entry.
                        //acmiString = newEntry.ACMIString();
                        acmiString = newEntry.ACMIString(oldEntry);
                        knownActors[support.GetObjectID(actor)] = newEntry;
                    }
                    else
                    {
                        acmiString = newEntry.ACMIString();
                        knownActors.Add(support.GetObjectID(actor), newEntry);
                    }
                    if ((acmiString != "") && (acmiString.Contains(",")))
                    {
                        dataLog.Append("\n" + acmiString);
                    }
                }
                else
                {
                    //support.WriteLog("Error - Got a null actor!");
                }
            }

            // Getting flares and processing them
            acmiString = "";
            foreach (var flare in getFlares())
            {
                acmiString = "";
                support.UpdateID(flare);

                newEntry = buildFlareEntry(flare);

                if (knownActors.ContainsKey(support.GetObjectID(flare)))
                {
                    oldEntry   = knownActors[support.GetObjectID(flare)];
                    acmiString = newEntry.ACMIString(oldEntry);
                    knownActors[support.GetObjectID(flare)] = newEntry;
                }
                else
                {
                    acmiString = newEntry.ACMIString();
                    knownActors.Add(support.GetObjectID(flare), newEntry);
                }
                if (acmiString != "")
                {
                    dataLog.Append("\n" + acmiString);
                }
            }
            // Getting Chaff and processing them
            acmiString = "";
            foreach (var chaff in getChaff())
            {
                acmiString = "";
                support.UpdateID(chaff);

                newEntry = buildChaffEntry(chaff);

                if (knownActors.ContainsKey(support.GetObjectID(chaff)))
                {
                    oldEntry   = knownActors[support.GetObjectID(chaff)];
                    acmiString = newEntry.ACMIString(oldEntry);
                    knownActors[support.GetObjectID(chaff)] = newEntry;
                }
                else
                {
                    acmiString = newEntry.ACMIString();
                    knownActors.Add(support.GetObjectID(chaff), newEntry);
                }
                if (acmiString != "")
                {
                    dataLog.Append("\n" + acmiString);
                }
            }

            // Getting bullets and processing them
            foreach (var bullet in getBullets())
            {
                /* If this isn't active, don't update it or use it */
                if (!bullet.isActiveAndEnabled)
                {
                    continue;
                }

                support.UpdateID(bullet);

                newEntry   = buildBulletEntry(bullet);
                acmiString = "";
                if (knownActors.ContainsKey(support.GetObjectID(bullet)))
                {
                    oldEntry   = knownActors[support.GetObjectID(bullet)];
                    acmiString = newEntry.ACMIString(oldEntry);
                    knownActors[support.GetObjectID(bullet)] = newEntry;
                }
                else
                {
                    acmiString = newEntry.ACMIString();
                    knownActors.Add(support.GetObjectID(bullet), newEntry);
                }
                if (acmiString != "")
                {
                    dataLog.Append("\n" + acmiString);
                }
            }

            foreach (var rocket in getRockets())
            {
                /* If this isn't active, don't update it or use it */
                if (!rocket.isActiveAndEnabled)
                {
                    continue;
                }

                support.UpdateID(rocket);

                newEntry   = buildRocketEntry(rocket);
                acmiString = "";
                if (knownActors.ContainsKey(support.GetObjectID(rocket)))
                {
                    oldEntry   = knownActors[support.GetObjectID(rocket)];
                    acmiString = newEntry.ACMIString(oldEntry);
                    knownActors[support.GetObjectID(rocket)] = newEntry;
                }
                else
                {
                    acmiString = newEntry.ACMIString();
                    knownActors.Add(support.GetObjectID(rocket), newEntry);
                }
                if (acmiString != "")
                {
                    dataLog.Append("\n" + acmiString);
                }
            }


            foreach (var actor in support.ClearAndGetOldObjectIds())
            {
                /* If we weren't updated, then we don't exist anymore */

                // Need to handle checks for non vehicle actors
                //if (knownActors[actor]._basicTypes.Contains("FixedWing") ||
                //    knownActors[actor]._basicTypes.Contains("Vehicle"))
                //{
                //    /* If this is a vehicle, we can send the destroyed ACMI event */
                //    dataLog.Append("\n" +acmi.ACMIEvent("Destroyed", null, actor));
                //}

                dataLog.Append("\n" + $"-{actor}");
                knownActors.Remove(actor);
            }
        }
        public ACMIDataEntry groundVehicleDataEntry(Actor actor, ACMIDataEntry entry, float customOffset = 0f)
        {
            Vector3D coords     = support.convertPositionToLatLong_raw(actor.transform.position);
            double   headingNum = Math.Atan2(actor.transform.forward.x, actor.transform.forward.z) * Mathf.Rad2Deg;

            if (headingNum < 0)
            {
                headingNum += 360;
            }


            Vector3 forward = actor.transform.forward;

            forward.y = 0f;

            float pitch = VectorUtils.SignedAngle(forward, actor.transform.forward, Vector3.up);

            Vector3 toDirection = Vector3.ProjectOnPlane(actor.transform.up, forward);
            float   roll        = VectorUtils.SignedAngle(Vector3.up, toDirection, Vector3.Cross(Vector3.up, forward));

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(roll, 2)} | {Math.Round(pitch, 2)} | {Math.Round(headingNum, 2) - customOffset}";

            entry.name = actor.actorName;

            if (actor.currentlyTargetingActor != null)
            {
                entry.lockedTarget = support.GetObjectID(actor.currentlyTargetingActor);
            }


            // This is all done in the VTOL XML file now! Easier to update.
            //if (actor.name.Contains("Infantry ")){
            //    entry._specificTypes = "Infantry";
            //    entry._objectClass = "Ground";

            //} else if (actor.name.Contains("Tank"))
            //{
            //    entry._specificTypes = "Tank";
            //    entry._basicTypes = "Vehicle";
            //    entry._objectClass = "Ground";
            //}
            //else if (actor.name.Contains("APC"))
            //{
            //    entry._basicTypes = "Armor";
            //    entry._objectClass = "Ground";
            //}
            ////else if (actor.name.Contains("MPA-155"))
            ////{
            ////    entry._basicTypes = "Armor";
            ////    entry._objectClass = "Ground";
            ////}
            //else if (actor.name.Contains("SAM FireCtrl Radar"))
            //{
            //    entry._basicTypes = "AntiAircraft";
            //}
            //else if (actor.name.Contains("SAM Launcher"))
            //{
            //    entry._basicTypes = "AntiAircraft";
            //}
            //else if (actor.name.Contains("SMC Radar"))
            //{
            //    entry._basicTypes = "AntiAircraft";
            //}
            //else if (actor.name.Contains("Radar"))
            //{
            //    entry._basicTypes = "AntiAircraft";
            //}
            //else if (actor.name.Contains("SAM Battery"))
            //{
            //    entry._basicTypes = "AntiAircraft";
            //}
            //else
            //{
            //    entry._basicTypes = "Vehicle";
            //    entry._objectClass = "Ground";
            //}



            return(entry);
        }
        public ACMIDataEntry missileDataEntry(Actor actor, ACMIDataEntry entry, float customOffset = 0f)
        {
            Vector3D coords = support.convertPositionToLatLong_raw(actor.transform.position);

            double headingNum = Math.Atan2(actor.transform.forward.x, actor.transform.forward.z) * Mathf.Rad2Deg;

            if (headingNum < 0)
            {
                headingNum += 360;
            }


            Vector3 forward = actor.transform.forward;

            forward.y = 0f;

            float pitch = VectorUtils.SignedAngle(forward, actor.transform.forward, Vector3.up);

            Vector3 toDirection = Vector3.ProjectOnPlane(actor.transform.up, forward);
            float   roll        = VectorUtils.SignedAngle(Vector3.up, toDirection, Vector3.Cross(Vector3.up, forward));

            entry.locData = $"{Math.Round(coords.y, 7)} | {Math.Round(coords.x, 7)} | {Math.Round(coords.z, 7)} | {Math.Round(roll, 2)} | {Math.Round(pitch, 2)} | {Math.Round(headingNum, 2) - customOffset}";

            Missile missile = Traverse.Create(actor).Field("missile").GetValue() as Missile;

            if (missile != null)
            {
                switch (missile.guidanceMode)
                {
                case Missile.GuidanceModes.Radar:
                    entry._basicTypes = "Missile";
                    if (missile.lockingRadar != null && missile.lockingRadar.IsLocked())
                    {
                        entry.lockedTargetMode = "1";
                        entry.lockedTarget     = support.GetObjectID(missile.lockingRadar.currentLock.actor);
                    }
                    else
                    {
                        entry.lockedTargetMode = "0";
                    }
                    break;

                case Missile.GuidanceModes.Optical:
                    entry._basicTypes = "Missile";
                    if (missile.opticalTargetActor != null)
                    {
                        entry.lockedTargetMode = "1";
                        entry.lockedTarget     = support.GetObjectID(missile.opticalTargetActor);
                    }
                    else
                    {
                        entry.lockedTargetMode = "0";
                    }
                    break;

                case Missile.GuidanceModes.AntiRad:
                    entry._basicTypes = "Missile";
                    if (missile.antiRadTargetActor != null)
                    {
                        entry.lockedTargetMode = "1";
                        entry.lockedTarget     = support.GetObjectID(missile.antiRadTargetActor);
                    }
                    else
                    {
                        entry.lockedTargetMode = "0";
                    }
                    break;

                case Missile.GuidanceModes.Heat:
                    entry._basicTypes = "Missile";
                    if (missile.heatSeeker.likelyTargetActor != null)
                    {
                        entry.lockedTargetMode = "1";
                        entry.lockedTarget     = support.GetObjectID(missile.heatSeeker.likelyTargetActor);
                    }
                    else
                    {
                        entry.lockedTargetMode = "0";
                    }
                    break;

                case Missile.GuidanceModes.GPS:
                case Missile.GuidanceModes.Bomb:
                    entry._basicTypes = "Bomb";
                    break;
                }
            }


            entry.name     = actor.actorName;
            entry.callSign = actor.actorName;
            return(entry);
        }
        public string ACMIStringOld(ACMIDataEntry oldEntry = null)
        {
            // This is no longer used currently. The comparison function is too expensive due to the reflection/recursion to be called on every actor, on every scene.

            string outputString = "";

            if (oldEntry != null)
            {
                string data  = "";
                var    Diffs = this.DetailedCompare <ACMIDataEntry>(oldEntry);
                foreach (var entry in Diffs)
                {
                    data += "," + entry.valB;
                }
                if (data != "")
                {
                    outputString = $"{objectId}{data}";
                }
            }
            else
            {
                bool           moreProps = false;
                PropertyInfo[] fi        = this.GetType().GetProperties();
                foreach (PropertyInfo f in fi)
                {
                    if (f.GetValue(this) != null)
                    {
                        if (f.ToString() == "objectId")
                        {
                            moreProps = true;
                        }
                        if (!f.ToString().Contains(" _"))
                        {
                            if (!f.GetValue(this).ToString().EndsWith("="))
                            {
                                outputString += "," + f.GetValue(this);
                            }
                        }
                    }
                }
                if (this.objectType() != "")
                {
                    moreProps     = true;
                    outputString += $",Type={this.objectType()}";
                }

                if (!moreProps)
                {
                    outputString = "";
                }
            }
            if (outputString != "")
            {
                if (outputString.StartsWith(","))
                {
                    return(outputString.Substring(1));
                }
                else
                {
                    return(outputString);
                }
            }
            else
            {
                return(outputString);
            }
        }