RoomSystem.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace ET
  5. {
  6. [FriendOf(typeof(Room))]
  7. public static class RoomSystem
  8. {
  9. public static Room Room(this Entity entity)
  10. {
  11. return entity.Domain as Room;
  12. }
  13. public static void Init(this Room self, List<LockStepUnitInfo> unitInfos, long startTime, int frame = -1)
  14. {
  15. self.StartTime = startTime;
  16. self.AuthorityFrame = frame;
  17. self.PredictionFrame = frame;
  18. self.Replay.UnitInfos = unitInfos;
  19. self.FrameBuffer = new FrameBuffer(frame);
  20. self.FixedTimeCounter = new FixedTimeCounter(self.StartTime, 0, LSConstValue.UpdateInterval);
  21. LSWorld lsWorld = self.LSWorld;
  22. lsWorld.Frame = frame + 1;
  23. lsWorld.AddComponent<LSUnitComponent>();
  24. for (int i = 0; i < unitInfos.Count; ++i)
  25. {
  26. LockStepUnitInfo unitInfo = unitInfos[i];
  27. LSUnitFactory.Init(lsWorld, unitInfo);
  28. self.PlayerIds.Add(unitInfo.PlayerId);
  29. }
  30. }
  31. public static void Update(this Room self, OneFrameInputs oneFrameInputs)
  32. {
  33. LSWorld lsWorld = self.LSWorld;
  34. // 设置输入到每个LSUnit身上
  35. LSUnitComponent unitComponent = lsWorld.GetComponent<LSUnitComponent>();
  36. foreach (var kv in oneFrameInputs.Inputs)
  37. {
  38. LSUnit lsUnit = unitComponent.GetChild<LSUnit>(kv.Key);
  39. LSInputComponent lsInputComponent = lsUnit.GetComponent<LSInputComponent>();
  40. lsInputComponent.LSInput = kv.Value;
  41. }
  42. if (!self.IsReplay)
  43. {
  44. // 保存当前帧场景数据
  45. self.SaveLSWorld();
  46. self.Record(self.LSWorld.Frame);
  47. }
  48. lsWorld.Update();
  49. }
  50. public static LSWorld GetLSWorld(this Room self, SceneType sceneType, int frame)
  51. {
  52. MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
  53. memoryBuffer.Seek(0, SeekOrigin.Begin);
  54. LSWorld lsWorld = MongoHelper.Deserialize(typeof (LSWorld), memoryBuffer) as LSWorld;
  55. lsWorld.SceneType = sceneType;
  56. memoryBuffer.Seek(0, SeekOrigin.Begin);
  57. return lsWorld;
  58. }
  59. public static void SaveLSWorld(this Room self)
  60. {
  61. int frame = self.LSWorld.Frame;
  62. Log.Debug($"11111111111111111 Save world: {frame}");
  63. MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
  64. memoryBuffer.Seek(0, SeekOrigin.Begin);
  65. memoryBuffer.SetLength(0);
  66. MongoHelper.Serialize(self.LSWorld, memoryBuffer);
  67. memoryBuffer.Seek(0, SeekOrigin.Begin);
  68. long hash = memoryBuffer.GetBuffer().Hash(0, (int) memoryBuffer.Length);
  69. self.FrameBuffer.SetHash(frame, hash);
  70. }
  71. // 记录需要存档的数据
  72. public static void Record(this Room self, int frame)
  73. {
  74. OneFrameInputs oneFrameInputs = self.FrameBuffer.FrameInputs(frame);
  75. OneFrameInputs saveInput = new();
  76. oneFrameInputs.CopyTo(saveInput);
  77. self.Replay.FrameInputs.Add(saveInput);
  78. if (frame % LSConstValue.SaveLSWorldFrameCount == 0)
  79. {
  80. MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
  81. byte[] bytes = memoryBuffer.ToArray();
  82. self.Replay.Snapshots.Add(bytes);
  83. }
  84. }
  85. }
  86. }