LSHelper.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using ET.Client;
  2. namespace ET
  3. {
  4. public static class LSHelper
  5. {
  6. // 回滚
  7. public static void Rollback(Room room, int frame)
  8. {
  9. Log.Debug($"roll back start {frame}");
  10. room.RemoveComponent<LSWorld>();
  11. FrameBuffer frameBuffer = room.FrameBuffer;
  12. // 回滚
  13. room.AddComponent(frameBuffer.GetLSWorld(frame));
  14. OneFrameInputs realFrameInput = frameBuffer[frame];
  15. // 执行RealFrame
  16. room.Update(realFrameInput, frame);
  17. // 重新执行预测的帧
  18. for (int i = room.RealFrame + 1; i <= room.PredictionFrame; ++i)
  19. {
  20. OneFrameInputs oneFrameInputs = frameBuffer[i];
  21. CopyOtherInputsTo(room, realFrameInput, oneFrameInputs); // 重新预测消息
  22. room.Update(oneFrameInputs, i);
  23. }
  24. RollbackHelper.Rollback(room);
  25. Log.Debug($"roll back finish {frame}");
  26. }
  27. // 重新调整预测消息,只需要调整其他玩家的输入
  28. private static void CopyOtherInputsTo(Room room, OneFrameInputs from, OneFrameInputs to)
  29. {
  30. long myId = room.GetComponent<RoomClientUpdater>().MyId;
  31. foreach (var kv in from.Inputs)
  32. {
  33. if (kv.Key == myId)
  34. {
  35. continue;
  36. }
  37. to.Inputs[kv.Key] = kv.Value;
  38. }
  39. }
  40. }
  41. }