private void ReceivePacketHandler(Packet packet) { if (packet.type == PacketType.Message) { if (LSState == LockStepState.None) { LSState = LockStepState.Prepare; } } else if (packet.type == PacketType.LockStep) { PlayersInputBuffer pib = new PlayersInputBuffer(); pib.Parse(packet.data); RUShortInt CFrame = LSFrame + RUShortInt.Reverse(NetConfig.PDBL); int index = pib.buffer.FindIndex((PlayersInput each) => each.frame == CFrame); if (index > 0) { pib.buffer.RemoveRange(0, index); } SLSBuffer.Merge(pib); } }
private bool LockStepUpdate() { float speedTo = 1; RUShortInt CFrame = LSFrame + RUShortInt.Reverse(NetConfig.PDBL); List <PlayersInput> buffer = SLSBuffer.buffer; int lsIndex = buffer.FindIndex(0, buffer.Count, (PlayersInput each) => each.frame == CFrame); if (lsIndex == -1) { speedTo = 0; } else { RUShortInt minFrame = buffer[0].frame; RUShortInt maxFrame = buffer[buffer.Count - 1].frame; if (CFrame == minFrame) { uint dist = (maxFrame - minFrame).value; speedTo = dist <= NetConfig.PDBL ? 1 : 2; } else { speedTo = 0; } } gameSpeed = speedTo; if (gameSpeed > 0) { ApplyPlayersInput(SLSBuffer.buffer[0]); SLSBuffer.buffer.RemoveAt(0); return(true); } return(false); }