|
@@ -0,0 +1,186 @@
|
|
|
+using Cysharp.Threading.Tasks;
|
|
|
+using KYFramework;
|
|
|
+using KYFramework.Network;
|
|
|
+using Model;
|
|
|
+using Point = KYFramework.Network.Point;
|
|
|
+
|
|
|
+
|
|
|
+namespace SimulationServer;
|
|
|
+
|
|
|
+public class ReplayMission : Entity
|
|
|
+{
|
|
|
+ // 任务Id
|
|
|
+ public string MissionId;
|
|
|
+ // 任务开始时间
|
|
|
+ public string MissionStartDate;
|
|
|
+
|
|
|
+ // 下个任务id列表
|
|
|
+ public List<string> NextMissionId;
|
|
|
+
|
|
|
+ // 是否是回放
|
|
|
+ public bool IsReplay;
|
|
|
+
|
|
|
+ public bool IsOver;
|
|
|
+
|
|
|
+ public bool StartByTime;
|
|
|
+
|
|
|
+ // 任务飞机
|
|
|
+ public List<AircraftEntity> AircraftEntities = new List<AircraftEntity>();
|
|
|
+
|
|
|
+ #region 报告
|
|
|
+ public Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>> singleReport = new();
|
|
|
+ // <sheet,<指标名,值列表>>
|
|
|
+ public Dictionary<string, Dictionary<string, List<string>>> totalReport = new();
|
|
|
+
|
|
|
+ // <sheet,<指标名,值列表>>
|
|
|
+ public Dictionary<string, Dictionary<string, List<string>>> equipReport = new ();
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ private double _simulationTime;
|
|
|
+
|
|
|
+ public void Start()
|
|
|
+ {
|
|
|
+ IsReplay = true;
|
|
|
+ _simulationTime = ReplayComponent.Time;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void SendReport()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Next()
|
|
|
+ {
|
|
|
+ if (NextMissionId.Count <= 0)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var replaySys = Game.Scene.GetComponent<ReplayComponent>();
|
|
|
+
|
|
|
+ foreach (string nextMission in NextMissionId)
|
|
|
+ {
|
|
|
+ var mission = replaySys.ReplayMissions.Find(m => m.MissionId == nextMission);
|
|
|
+ if (mission != null)
|
|
|
+ {
|
|
|
+ mission.Start();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 开始同步信息
|
|
|
+ public void StartSync()
|
|
|
+ {
|
|
|
+ AircraftEntities.ForEach(aircraft =>
|
|
|
+ {
|
|
|
+ SyncAircraftInfo(aircraft, ReplayComponent.Time - _simulationTime).Forget();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual async UniTaskVoid SyncAircraftInfo(AircraftEntity entity, double time)
|
|
|
+ {
|
|
|
+ var location = FXJHGenerate.GetAllCurrentLocation(entity.TurningPoints, time);
|
|
|
+
|
|
|
+ SyncLocation(entity.AircraftId,entity.TaskName,location.Item1, location.Item3);
|
|
|
+
|
|
|
+ await Task.Delay(TimeSpan.FromSeconds(1f));
|
|
|
+
|
|
|
+ if (location.Item2)
|
|
|
+ {
|
|
|
+ AircraftEntities.Remove(entity);
|
|
|
+ }
|
|
|
+ StartSync();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void SyncLocation(string aircraftId, string taskName,CurrentLocation location, int index)
|
|
|
+ {
|
|
|
+ // 同步信息到客户端
|
|
|
+ if (location != null)
|
|
|
+ {
|
|
|
+ // 同步信息到客户端
|
|
|
+ S2C_TurningPoint s2CTurningPointOutput = new S2C_TurningPoint();
|
|
|
+ s2CTurningPointOutput.AircraftID = aircraftId;
|
|
|
+ s2CTurningPointOutput.TaskId = taskName;
|
|
|
+ //s2CTurningPointOutput.TurningPointName = fly.TurningPointName;
|
|
|
+
|
|
|
+ s2CTurningPointOutput.PresentMission = location.PresentMission;
|
|
|
+
|
|
|
+ s2CTurningPointOutput.PresentLocation = new Point()
|
|
|
+ {
|
|
|
+ Altitude = location.CurrentHei,
|
|
|
+ Latitude = location.CurrentLat,
|
|
|
+ Longitude = location.CurrentLon
|
|
|
+ };
|
|
|
+
|
|
|
+ s2CTurningPointOutput.NextTurningPointIndex = index;
|
|
|
+ s2CTurningPointOutput.PresentVelocity = location.Currentvelo;
|
|
|
+ SessionComponent.Instance.Session.Send(s2CTurningPointOutput);
|
|
|
+ //Log.Info($"飞机{aircraft.Name} 当前位置: {location.ToJson()}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+[ObjectSystem]
|
|
|
+public class ReplayMissionAwakeSystem : AwakeSystem<ReplayMission, BaseMission>
|
|
|
+{
|
|
|
+ public override void Awake(ReplayMission self, BaseMission mission)
|
|
|
+ {
|
|
|
+ self.MissionId = mission.MissionId;
|
|
|
+ self.MissionStartDate = mission.StartTime.ToString();
|
|
|
+ self.NextMissionId = mission.MissionInformation.NextTaskId;
|
|
|
+ self.StartByTime = mission.MissionInformation.MissionTrigger != "任务触发";
|
|
|
+ self.AircraftEntities = mission.Aircrafts;
|
|
|
+ self.singleReport = mission.singleReport;
|
|
|
+ self.totalReport = mission.totalReport;
|
|
|
+ self.equipReport = mission.equipReport;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+[ObjectSystem]
|
|
|
+public class ReplayMissionMHAwakeSystem : AwakeSystem<ReplayMission, BaseMission, MHTask>
|
|
|
+{
|
|
|
+ public override void Awake(ReplayMission self, BaseMission baseMission, MHTask task)
|
|
|
+ {
|
|
|
+ self.MissionId = task.MissionInformation.MissionName;
|
|
|
+ self.MissionStartDate = task.StartTime.ToString();
|
|
|
+ self.NextMissionId = task.MissionInformation.NextTaskId;
|
|
|
+ self.StartByTime = task.MissionInformation.MissionTrigger != "任务触发";
|
|
|
+ self.AircraftEntities = task.Aircrafts;
|
|
|
+ self.singleReport = baseMission.singleReport;
|
|
|
+ self.totalReport = baseMission.totalReport;
|
|
|
+ self.equipReport = baseMission.equipReport;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+[ObjectSystem]
|
|
|
+public class ReplayMissionUpdateSystem : UpdateSystem<ReplayMission>
|
|
|
+{
|
|
|
+ public override void Update(ReplayMission self)
|
|
|
+ {
|
|
|
+ if (self.IsReplay)
|
|
|
+ {
|
|
|
+ if(self.AircraftEntities.Count <= 0)
|
|
|
+ {
|
|
|
+ self.IsOver = true;
|
|
|
+ self.SendReport();
|
|
|
+ self.Next();
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!self.IsReplay && self.StartByTime)
|
|
|
+ {
|
|
|
+ // 仿真时间
|
|
|
+ var simulationTime = TaskComponent.TaskTime;
|
|
|
+ // 当前时间
|
|
|
+ var currentTime = simulationTime.AddSeconds(ReplayComponent.Time);
|
|
|
+ // 判断任务时间 与当前时间
|
|
|
+ if (DateTime.Parse(self.MissionStartDate) <= currentTime)
|
|
|
+ {
|
|
|
+ self.Start();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|