RoomSystem.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 void Init(this Room self, List<LockStepUnitInfo> unitInfos, long startTime)
  10. {
  11. self.StartTime = startTime;
  12. self.FixedTimeCounter = new FixedTimeCounter(self.StartTime, 0, LSConstValue.UpdateInterval);
  13. LSWorld lsWorld = self.LSWorld;
  14. lsWorld.AddComponent<LSUnitComponent>();
  15. for (int i = 0; i < unitInfos.Count; ++i)
  16. {
  17. LockStepUnitInfo unitInfo = unitInfos[i];
  18. LSUnitFactory.Init(lsWorld, unitInfo);
  19. self.PlayerIds.Add(unitInfo.PlayerId);
  20. }
  21. }
  22. public static void Update(this Room self, OneFrameInputs oneFrameInputs, int frame)
  23. {
  24. LSWorld lsWorld = self.LSWorld;
  25. if (!self.IsReplay)
  26. {
  27. // 保存当前帧场景数据
  28. self.SaveLSWorld(frame);
  29. if (frame <= self.AuthorityFrame) // 只有AuthorityFrame帧才保存录像数据
  30. {
  31. self.Record(frame);
  32. }
  33. }
  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. lsWorld.Update();
  43. }
  44. public static LSWorld GetLSWorld(this Room self, int frame)
  45. {
  46. MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
  47. return MongoHelper.Deserialize(typeof (LSWorld), memoryBuffer) as LSWorld;
  48. }
  49. public static void SaveLSWorld(this Room self, int frame)
  50. {
  51. MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
  52. memoryBuffer.Seek(0, SeekOrigin.Begin);
  53. memoryBuffer.SetLength(0);
  54. MongoHelper.Serialize(self.LSWorld, memoryBuffer);
  55. memoryBuffer.Seek(0, SeekOrigin.Begin);
  56. }
  57. public static void Record(this Room self, int frame)
  58. {
  59. OneFrameInputs oneFrameInputs = self.FrameBuffer.FrameInputs(frame);
  60. OneFrameInputs saveInput = new();
  61. oneFrameInputs.CopyTo(saveInput);
  62. self.Record.FrameInputs.Add(saveInput);
  63. if (frame % LSConstValue.SaveLSWorldFrameCount == 0)
  64. {
  65. MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
  66. self.Record.Snapshots.Add(memoryBuffer.ToArray());
  67. }
  68. }
  69. }
  70. }