RoomSystem.cs 3.3 KB

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