예제 #1
0
 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);
     }
 }
예제 #2
0
    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);
    }