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); }
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."); } }
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); }
public void getAirports() { VTMapManager[] mm = FindObjectsOfType <VTMapManager>(); foreach (AirportManager manager in mm[0].airports) { newEntry = actorProcessor.airportEntry(manager); dataLog.Append("\n" + newEntry.ACMIString()); } }
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); }
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); }
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); }
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); } }