2 Achegas ff1ec1c8b5 ... e510ca6ee2

Autor SHA1 Mensaxe Data
  zansimple e510ca6ee2 修复同步信息功能 hai 4 días
  zansimple 8d881f326c 添加与前端同步功能 hai 4 días

+ 3 - 6
SimulationServer/Component/TaskComponent.cs

@@ -8,12 +8,9 @@ public class TaskComponent : Component
     public static bool SimulationStart = false;
     public static bool SingleServer = true;
     public static DateTime TaskTime;
-
-    // 根据任务id 排列任务执行顺序
-    public List<BaseMission> Missions = new List<BaseMission>();
-
-    public List<List<AircraftEntity>> asyncAircrafts = new List<List<AircraftEntity>>();
-
     public static Weather Weather;
     public static int Speed = 100;
+    
+    // 根据任务id 排列任务执行顺序
+    public List<BaseMission> Missions = new List<BaseMission>();
 }

+ 1 - 4
SimulationServer/Component/TaskComponentSystem.cs

@@ -31,10 +31,7 @@ public static class TaskComponentSystem
         return null;
     }
     
-    public static void AddAircrafts(this TaskComponent taskComponent,  List<AircraftEntity> aircrafts)
-    {
-       taskComponent.asyncAircrafts.Add(aircrafts);
-    }
+   
     
     public static void Start(this TaskComponent taskComponent)
     {

+ 0 - 92
SimulationServer/Entity/Aircrafts/AircraftEntity.cs

@@ -118,97 +118,5 @@ public class AircraftEntity : Entity
             AircraftId = AircraftId,
             TurningPoints = TurningPoints
         });
-        // if (TaskComponent.SimulationStart)
-        // {
-        //     Game.EventSystem.Publish(new AircraftTurningPoints
-        //     {
-        //         AircraftId = AircraftId,
-        //         TurningPoints = TurningPoints
-        //     });
-        //     
-        //     SyncInfo();
-        // }
-        // else
-        // {
-        //     Game.EventSystem.Publish(new AircraftTurningPoints
-        //     {
-        //         AircraftId = AircraftId,
-        //         TurningPoints = TurningPoints
-        //     });
-        // }
     }
-
-    public virtual void StartAsync()
-    {
-        
-    }
-    
-    
-    
-    
-    // 同步信息
-    public virtual void SyncInfo()
-    {
-        if(Init.IsSingleServer)
-            return;
-
-        SyncAircraftInfo();
-    }
-    
-    
-    public virtual async UniTaskVoid SyncAircraftInfo()
-    {
-        var location = FXJHGenerate.GetAllCurrentLocation(TurningPoints, SimulationTime);
-        
-        SyncLocation(location.Item1, location.Item3);
-
-        if (location.Item2)
-        {
-            SyncOver = true;
-            SyncOverAction?.Invoke();
-
-            if ((mission is MHMission) == false)
-            {
-                mission.IsOver = true;
-            }
-           
-            
-            return;
-        }
-        
-        SimulationTime += Init.SimulationSpeed;
-        await Task.Delay(TimeSpan.FromSeconds(1f));
-        SyncAircraftInfo().Forget();
-    }
-    
-    public void SyncLocation(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()}");
-        }
-    }
-
-
-   
-   
 }

+ 32 - 34
SimulationServer/Entity/Aircrafts/AircraftMH.cs

@@ -111,8 +111,6 @@ public class AircraftMH : AircraftEntity
         
        base.End();
     }
-    
-    
 
     // 更新
     public override void Update(double time)
@@ -185,38 +183,38 @@ public class AircraftMH : AircraftEntity
 
 
     
-    public override async UniTaskVoid SyncAircraftInfo()
-    {
-        var location = FXJHGenerate.GetAllCurrentLocation(TurningPoints, SimulationTime);
-        
-        if (FireGrids.Count > 0 )
-        {
-            Fire.FireGrid fireGrid = FireGrids.First();
-            // 发送火焰数据
-            if (SimulationTime > fireGrid.Time)
-            {
-                //洒水了
-                S2C_FireSpread fireSpread = new S2C_FireSpread();
-                fireSpread.AircraftId = AircraftId;
-                fireSpread.FirePointId = mhRescueMission.FireGround.FirePointName;
-                fireSpread.FireGrids = fireGrid.FireGrids;
-                fireSpread.FiredGrids = fireGrid.FiredGrids;
-                SessionComponent.Instance.Session.Send(fireSpread);
-                FireGrids.RemoveAt(0);
-            }
-        }
-        SyncLocation(location.Item1, location.Item3);
-        
-        if (location.Item2)
-        {
-            SyncOver = true;
-            SyncOverAction?.Invoke();
-            return;
-        }
-        SimulationTime += Init.SimulationSpeed;
-        await Task.Delay(TimeSpan.FromSeconds(1f));
-        SyncAircraftInfo().Forget();
-    }
+    // public async UniTaskVoid SyncAircraftInfo()
+    // {
+    //     var location = FXJHGenerate.GetAllCurrentLocation(TurningPoints, SimulationTime);
+    //     
+    //     if (FireGrids.Count > 0 )
+    //     {
+    //         Fire.FireGrid fireGrid = FireGrids.First();
+    //         // 发送火焰数据
+    //         if (SimulationTime > fireGrid.Time)
+    //         {
+    //             //洒水了
+    //             S2C_FireSpread fireSpread = new S2C_FireSpread();
+    //             fireSpread.AircraftId = AircraftId;
+    //             fireSpread.FirePointId = mhRescueMission.FireGround.FirePointName;
+    //             fireSpread.FireGrids = fireGrid.FireGrids;
+    //             fireSpread.FiredGrids = fireGrid.FiredGrids;
+    //             SessionComponent.Instance.Session.Send(fireSpread);
+    //             FireGrids.RemoveAt(0);
+    //         }
+    //     }
+    //     SyncLocation(location.Item1, location.Item3);
+    //     
+    //     if (location.Item2)
+    //     {
+    //         SyncOver = true;
+    //         SyncOverAction?.Invoke();
+    //         return;
+    //     }
+    //     SimulationTime += Init.SimulationSpeed;
+    //     await Task.Delay(TimeSpan.FromSeconds(1f));
+    //     SyncAircraftInfo().Forget();
+    // }
 }
 
 [ObjectSystem]

+ 4 - 4
SimulationServer/Entity/Missions/BaseMission.cs

@@ -47,7 +47,6 @@ public class BaseMission : Entity
         var delayTime = StartTime - TaskComponent.TaskTime;
         await Task.Delay(delayTime);
         Log.Info($"任务[{MissionInformation.MissionName}]开始");
-        Game.Scene.GetComponent<TaskComponent>().AddAircrafts(Aircrafts);
         Start();
     }
 
@@ -74,7 +73,9 @@ public class BaseMission : Entity
             //Aircrafts.ForEach(a => a.End());
         }
         
-        List<AircraftEntity> aircrafts = new List<AircraftEntity>();
+        Game.Scene.GetComponent<ReplayComponent>().AddReplayMission(this);
+       
+        
         
         if(MissionInformation.NextTaskId == null)
             return;
@@ -87,10 +88,9 @@ public class BaseMission : Entity
                 
                 nextMission?.Reset();
                 nextMission?.Start();
-                aircrafts.AddRange(nextMission.Aircrafts);
+                
                 var task = Game.Scene.GetComponent<TaskComponent>().GetTask(NextMissionId);
                 task?.Start();
-                aircrafts.AddRange(task.Aircrafts);
             }
         }
     }

+ 3 - 1
SimulationServer/Entity/Missions/MHMissions/MHMission.cs

@@ -302,7 +302,6 @@ public class MHMission : BaseMission
             aircrafts.AddRange(task.Aircrafts);
         }
 
-
         // 根据飞机下次洒水的时间排序 
         aircrafts.Sort((a, b) => a.T.CompareTo(b.T));
 
@@ -315,6 +314,9 @@ public class MHMission : BaseMission
     {
         IsRunning = false;
         Tasks.ForEach(t => t.End());
+        
+        Game.Scene.GetComponent<ReplayComponent>().AddReplayMission(this);
+        
         SaveMH();
         SaveTotalMH();
         ReportMH();

+ 2 - 1
SimulationServer/Entity/Missions/MHMissions/MHTask.cs

@@ -25,7 +25,6 @@ public class MHTask : Entity
     
     public virtual void Start()
     {
-        Game.Scene.GetComponent<TaskComponent>().AddAircrafts(Aircrafts);
         Aircrafts.ForEach(aircraft =>
         {
             aircraft.Start();
@@ -42,6 +41,8 @@ public class MHTask : Entity
            aircraft.End();
         });
         IsRunning = false;
+        
+       
     }
     
     

+ 1 - 1
SimulationServer/Init.cs

@@ -36,8 +36,8 @@ public static class Init
 
             // 任务
             Game.Scene.AddComponent<TaskComponent>();
-
             Game.Scene.AddComponent<JYComponent>();
+            Game.Scene.AddComponent<ReplayComponent>();
 
             Log.Info("服务器启动完成!");
             Game.EventSystem.Publish(new ServerStart());

+ 41 - 0
SimulationServer/Replay/ReplayComponent.cs

@@ -0,0 +1,41 @@
+using Cysharp.Threading.Tasks;
+using KYFramework;
+
+namespace SimulationServer;
+
+public class ReplayComponent : Component
+{
+    public static double Time = 0;
+    
+    public List<ReplayMission> ReplayMissions = new List<ReplayMission>();
+    
+    public void AddReplayMission(BaseMission baseMission)
+    {
+        ReplayMission replayMission = ComponentFactory.CreateWithParent<ReplayMission,BaseMission>(this,baseMission);
+        ReplayMissions.Add(replayMission);
+    }
+    
+    public void AddReplayMission(MHMission mhMission)
+    {
+        foreach (var task in mhMission.Tasks)
+        {
+            ReplayMission replayMission = ComponentFactory.CreateWithParent<ReplayMission,MHMission,MHTask>(this,mhMission,task);
+            ReplayMissions.Add(replayMission); 
+        }
+       
+    }
+
+    // 时间自增
+    public async UniTaskVoid Start()
+    {
+        if(ReplayMissions.Count <= 0) return;
+        
+        Time += Init.SimulationSpeed;
+        await Task.Delay(TimeSpan.FromSeconds(1f));
+        Start().Forget();
+    }
+}
+
+
+
+

+ 186 - 0
SimulationServer/Replay/ReplayMission.cs

@@ -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();
+            }
+        }
+    }
+}
+