RoomSystem.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.IO;
  3. namespace ET
  4. {
  5. [FriendOf(typeof(Room))]
  6. public static class RoomSystem
  7. {
  8. public static void Init(this Room self, Room2C_Start room2CStart)
  9. {
  10. self.StartTime = room2CStart.StartTime;
  11. self.FixedTimeCounter = new FixedTimeCounter(self.StartTime, 0, LSConstValue.UpdateInterval);
  12. LSWorld lsWorld = self.GetComponent<LSWorld>();
  13. lsWorld.AddComponent<LSUnitComponent>();
  14. for (int i = 0; i < room2CStart.UnitInfo.Count; ++i)
  15. {
  16. LockStepUnitInfo unitInfo = room2CStart.UnitInfo[i];
  17. LSUnitFactory.Init(lsWorld, unitInfo);
  18. self.PlayerIds.Add(unitInfo.PlayerId);
  19. }
  20. }
  21. public static void Update(this Room self, OneFrameInputs oneFrameInputs, int frame)
  22. {
  23. LSWorld lsWorld = self.GetComponent<LSWorld>();
  24. // 保存当前帧场景数据
  25. self.FrameBuffer.SaveLSWorld(frame, lsWorld);
  26. if (frame <= self.RealFrame) // 只有Real帧才保存录像数据
  27. {
  28. self.SaveData(frame);
  29. }
  30. // 设置输入到每个LSUnit身上
  31. LSUnitComponent unitComponent = lsWorld.GetComponent<LSUnitComponent>();
  32. foreach (var kv in oneFrameInputs.Inputs)
  33. {
  34. LSUnit lsUnit = unitComponent.GetChild<LSUnit>(kv.Key);
  35. LSInputComponent lsInputComponent = lsUnit.GetComponent<LSInputComponent>();
  36. lsInputComponent.LSInput = kv.Value;
  37. }
  38. lsWorld.Update();
  39. }
  40. public static void SaveData(this Room self, int frame)
  41. {
  42. OneFrameInputs oneFrameInputs = self.FrameBuffer[frame];
  43. OneFrameInputs saveInput = new();
  44. oneFrameInputs.CopyTo(saveInput);
  45. self.SaveData.MessagesList.Add(saveInput);
  46. if (frame % LSConstValue.SaveLSWorldFrameCount == 0)
  47. {
  48. MemoryBuffer memoryBuffer = self.FrameBuffer.GetMemoryBuffer(frame);
  49. self.SaveData.LSWorlds.Add(memoryBuffer.ToArray());
  50. }
  51. }
  52. }
  53. }