public void SetPlayerStateUpdatesReceivedFromServer(PlayerStateUpdates playerStateUpdates)
    {
        clientPlayer.SetActorPositionalState(playerStateUpdates.positionUpdates);
        clientPlayer.SetActorEventActionState(playerStateUpdates.playerEvents);
        clientPlayer.SetActorAnimationState(playerStateUpdates.playerAnimationEvents);
        clientPlayer.SetAuthoratativeStates(playerStateUpdates.playerAuthoratativeStates);
        if (hasAuthority)
        {
            localPlayer.SetAuthoratativeStates(playerStateUpdates.playerAuthoratativeStates);

            if (localPlayer.isPetrified || localPlayer.isPushed)
            {
                localPlayer.SetActorPositionalState(playerStateUpdates.positionUpdates);
            }

            serverPlayer.SetActorPositionalState(playerStateUpdates.positionUpdates);
            serverPlayer.SetActorEventActionState(playerStateUpdates.playerEvents);
            serverPlayer.SetActorAnimationState(playerStateUpdates.playerAnimationEvents);
            serverPlayer.SetAuthoratativeStates(playerStateUpdates.playerAuthoratativeStates);
            UpdateServerPredictedPosition(playerStateUpdates);
            if (Vector3.Distance(serverPlayer.actorTransform.position, localPlayer.actorTransform.position) >= positionThreshold)
            {
                Debug.Log(serverPlayer.actorTransform.position + "local---server" + localPlayer.actorTransform.position + "<color=red>Corrected player position</color>" + playerStateUpdates.playerProcessedSequenceNumber);
                Debug.Break();
                PositionUpdates positionUpdates = new PositionUpdates(serverPlayer.actorTransform.position, serverPlayer.currentMovePointCellPosition, serverPlayer.previousMovePointCellPosition);
                localPlayer.SetActorPositionalState(positionUpdates);
            }
        }
        else
        {
            clientPlayer.ProcessInputEventControl();
            clientPlayer.ProcessInputAnimationControl();
        }
    }
Esempio n. 2
0
 //authoratatively is performed(but is locally is also done)-correction happens
 public void SetActorPositionalState(PositionUpdates positionUpdates)
 {
     actorTransform.position       = positionUpdates.updatedActorPosition;
     currentMovePointCellPosition  = positionUpdates.updatedBlockActorPosition;
     previousMovePointCellPosition = positionUpdates.updatedPreviousBlockActorPosition;
     Facing = GridManager.instance.GetFaceDirectionFromCurrentPrevPoint(currentMovePointCellPosition, previousMovePointCellPosition, this);
 }
Esempio n. 3
0
    public static void SpawnedPlayer(Packet packet)
    {
        int        id                                = packet.ReadInt();
        string     username                          = packet.ReadString();
        Vector3    position                          = packet.ReadVector3();
        Vector3Int blockposition                     = packet.ReadVector3Int();
        Vector3Int previousBlockposition             = packet.ReadVector3Int();
        bool       isFiringPrimaryProjectile         = packet.ReadBool();
        bool       isPrimaryMoveAnimationBeingPlayed = packet.ReadBool();
        bool       isPlacingBoulderAnimationPlayed   = packet.ReadBool();
        bool       isPetrified                       = packet.ReadBool();
        bool       isPushed                          = packet.ReadBool();
        int        faceDirection                     = packet.ReadInt();
        int        previousfaceDirection             = packet.ReadInt();
        int        playerProcessingSequenceNumber    = packet.ReadInt();
        int        playerServerSequenceNumber        = packet.ReadInt();

        Debug.Log("<color=red>Sequence no spawned on: </color>" + playerProcessingSequenceNumber);

        PositionUpdates           positionUpdates           = new PositionUpdates(position, blockposition, previousBlockposition);
        PlayerEvents              playerEvents              = new PlayerEvents(isFiringPrimaryProjectile);
        PlayerAnimationEvents     playerAnimtaionEvents     = new PlayerAnimationEvents(isPrimaryMoveAnimationBeingPlayed, isPlacingBoulderAnimationPlayed);
        PlayerAuthoratativeStates playerAuthoratativeStates = new PlayerAuthoratativeStates(isPetrified, isPushed);

        PlayerStateUpdates playerStateUpdates = new PlayerStateUpdates(playerServerSequenceNumber, playerProcessingSequenceNumber, playerAuthoratativeStates, positionUpdates, playerEvents, playerAnimtaionEvents);

        ClientSideGameManager.instance.SpawnPlayer(id, username, faceDirection, previousfaceDirection, playerStateUpdates);
    }
 public PlayerStateUpdates(int playerServerSequenceNumber, int playerProcessedSequenceNumber, PlayerAuthoratativeStates playerAuthoratativeStates, PositionUpdates positionUpdates, PlayerEvents playerEvents, PlayerAnimationEvents playerAnimationEvents)
 {
     this.playerServerSequenceNumber    = playerServerSequenceNumber;
     this.playerProcessedSequenceNumber = playerProcessedSequenceNumber;
     this.positionUpdates           = positionUpdates;
     this.playerEvents              = playerEvents;
     this.playerAuthoratativeStates = playerAuthoratativeStates;
     this.playerAnimationEvents     = playerAnimationEvents;
 }
    private void FixedUpdate()
    {
        //Remote clients
        for (int i = 0; i < (int)currentStateProcessingModeOnClient; i++)
        {
            PlayerStateUpdates updateCorrespondingToSeq;
            if (playerStateUpdatesDic.TryGetValue(serverSequenceNumberToBeProcessed + 1, out updateCorrespondingToSeq))
            {
                //Debug.Log("<color=yellow>Remote Client of id "+id+" is Processing seqence no </color>" + updateCorrespondingToSeq.playerServerSequenceNumber+" and the processed sequence no: "+ updateCorrespondingToSeq.playerProcessedSequenceNumber);
                playerStateUpdatesDic.Remove(updateCorrespondingToSeq.playerServerSequenceNumber);
                serverSequenceNumberToBeProcessed = updateCorrespondingToSeq.playerServerSequenceNumber;
                playerSequenceNumberProcessed     = updateCorrespondingToSeq.playerProcessedSequenceNumber;
                latestPlayerStateUpdate           = updateCorrespondingToSeq;

                PositionUpdates positionUpdates = new PositionUpdates(updateCorrespondingToSeq.positionUpdates.updatedActorPosition
                                                                      , updateCorrespondingToSeq.positionUpdates.updatedBlockActorPosition
                                                                      , updateCorrespondingToSeq.positionUpdates.updatedPreviousBlockActorPosition);

                PlayerEvents playerEvents = new PlayerEvents(updateCorrespondingToSeq.playerEvents.firedPrimaryMoveProjectile);

                PlayerAnimationEvents playerAnimtaionEvents = new PlayerAnimationEvents(updateCorrespondingToSeq.playerAnimationEvents.isPrimaryMoveAnimationBeingPlayed
                                                                                        , updateCorrespondingToSeq.playerAnimationEvents.isPlacingBoulderAnimationPlayed);

                PlayerAuthoratativeStates playerAuthoratativeStates = new PlayerAuthoratativeStates(updateCorrespondingToSeq.playerAuthoratativeStates.isPetrified
                                                                                                    , updateCorrespondingToSeq.playerAuthoratativeStates.isPushed);

                PlayerStateUpdates playerStateUpdates = new PlayerStateUpdates(serverSequenceNumberToBeProcessed
                                                                               , playerSequenceNumberProcessed
                                                                               , playerAuthoratativeStates
                                                                               , positionUpdates
                                                                               , playerEvents
                                                                               , playerAnimtaionEvents);

                SetPlayerStateUpdatesReceivedFromServer(playerStateUpdates);
            }
            else
            {
                if (latestPlayerStateUpdate.playerServerSequenceNumber != 0)
                {
                    serverSequenceNumberToBeProcessed = serverSequenceNumberToBeProcessed + 1;
                    PlayerStateUpdates playerStateUpdates = new PlayerStateUpdates(serverSequenceNumberToBeProcessed
                                                                                   , latestPlayerStateUpdate.playerProcessedSequenceNumber
                                                                                   , latestPlayerStateUpdate.playerAuthoratativeStates
                                                                                   , latestPlayerStateUpdate.positionUpdates
                                                                                   , latestPlayerStateUpdate.playerEvents
                                                                                   , latestPlayerStateUpdate.playerAnimationEvents);
                    SetPlayerStateUpdatesReceivedFromServer(playerStateUpdates);
                }
                Debug.LogError("latestPlayerStateUpdate.playerServerSequenceNumber " + latestPlayerStateUpdate.playerServerSequenceNumber);
                Debug.LogError("Could not find any posudates for  seq: " + (serverSequenceNumberToBeProcessed + 1));
            }
        }

        if (hasAuthority)
        {
            bool[] inputs = new bool[]
            {
                localInputController.up,
                localInputController.left,
                localInputController.down,
                localInputController.right,
                localInputController.shoot,
                localInputController.push,
                localInputController.placeORRemovalBoulder
            };
            localSequenceNumber++;

            ProcessInputsLocally(inputs, previousInputs);
            RecordLocalClientActions(localSequenceNumber, inputs, previousInputs);

            //////Debug.Log("<color=blue>inputsequence </color>"+ playerMovingCommandSequenceNumber + "<color=blue>inputs </color> "+ inputs[0]+" "+inputs[1]+" "+inputs[2]+" "+inputs[3]);

            inputCommandsToBeSentToServerCollection.Add(new InputCommands(inputs, previousInputs, localSequenceNumber));
            previousInputs = inputs;

            //Local client sending data
            if (inputCommandsToBeSentToServerCollection.Count >= snapShotsInOnePacket)
            {
                if (previousHistoryForInputCommandsToBeSentToServerCollection.Count > packetHistorySize)
                {
                    previousHistoryForInputCommandsToBeSentToServerCollection.RemoveAt(0);
                }
                ClientSend.PlayerInput(inputCommandsToBeSentToServerCollection, previousHistoryForInputCommandsToBeSentToServerCollection);

                previousHistoryForInputCommandsToBeSentToServerCollection.Add(new PreviousInputPacks(inputCommandsToBeSentToServerCollection.ToArray()));

                inputCommandsToBeSentToServerCollection.Clear();

                //Debug.Log("<color=red>--------------------------------------------------------------------</color>");
            }
        }

        UpdateProcessMode();
        snapShotBufferSize = GetTheLastestSequenceNoInDic() - serverSequenceNumberToBeProcessed;
        //Debug.Log("<color=cyan>Dic Count </color>" + positionUpdates.Count);
    }
Esempio n. 6
0
        public Client(string host, int tcpPort, int udpPort)
        {
            NetworkBridge.Log("Creating client...");

            Socket           = new Socket(host, tcpPort, udpPort);
            Current          = this;
            Side.NetworkSide = Side.Client;

            Thread tcpThread = new Thread(() => {
                Stream tcp = Socket.Tcp.GetStream();
                while (!Closed)
                {
                    // NetworkBridge.Log("Waiting to read TCP...");
                    byte[] raw  = new byte[Socket.PacketSize];
                    int read    = tcp.Read(raw, 0, raw.Length);
                    byte[] trim = new byte[read];
                    Array.Copy(raw, 0, trim, 0, trim.Length);

                    if (Closed)
                    {
                        break;
                    }

                    ByteBuffer bufIn = new ByteBuffer(trim);
                    // bufIn.Debug(0, bufIn.Length);
                    // NetworkBridge.Log("Sub-Buffers: ");
                    List <ByteBuffer> buffers = new List <ByteBuffer>();
                    while (bufIn.Pointer != bufIn.Length)
                    {
                        int len        = bufIn.ReadInt();
                        ByteBuffer buf = new ByteBuffer(bufIn.ReadBytes(len));
                        // buf.Debug(0, buf.Length);
                        buffers.Add(buf);
                    }
                    try {
                        // Debug.Log("Executing buffers: ");
                        foreach (ByteBuffer buffer in buffers)
                        {
                            // buffer.Debug(0, buffer.Length);
                            NetworkData.HandleClientData(buffer);
                        }
                    } catch (Exception e) {
                        NetworkBridge.Invoke(() => Debug.LogException(e));
                    }
                }
            });

            tcpThread.IsBackground = true;
            tcpThread.Start();

            Thread udpThread = new Thread(() => {
                while (IsConnected)
                {
                    byte[] raw       = Socket.Udp.Receive(ref Socket.UdpRemote);
                    ByteBuffer bufIn = new ByteBuffer(raw);
                    try {
                        NetworkData.HandleClientData(bufIn);
                    } catch (Exception e) {
                        Debug.LogException(e);
                    }
                }
            });

            udpThread.IsBackground = true;
            udpThread.Start();

            Thread authThread = new Thread(() => {
                Thread.Sleep(100);

                Out.WriteByte(NetworkData.Management);
                Out.WriteByte(NetworkData.Authenticate);
                WriteTcp();

                NetworkBridge.Log("Wrote authentication information.");
            });

            authThread.IsBackground = true;
            authThread.Start();

            OnAuthenticate += (sender, args) => {
                Thread updateThread = new Thread(() => {
                    while (IsConnected)
                    {
                        lock (UdpBuffers) {
                            if (UdpBuffers.Count > 0)
                            {
                                WriteUdp();
                                UdpBuffers.Clear();
                                PositionUpdates.Clear();
                                RotationUpdates.Clear();
                                ScaleUpdates.Clear();
                            }
                        }

                        Thread.Sleep((int)(1000 / (float)TickRate));
                    }
                });
                updateThread.IsBackground = true;
                updateThread.Start();
            };
        }
    private void FixedUpdate()
    {
        serverInstanceHero.ProcessAuthoratativeEvents();

        for (int i = 0; i < (int)currentInputProcessingModeOnServer; i++)
        {
            CheckForPushRequestOnServer(playerSequenceNumberProcessed + 1);
            CheckForPlaceBoulderRequestOnServer(playerSequenceNumberProcessed + 1);
            CheckForRemovingBoulderRequestOnServer(playerSequenceNumberProcessed + 1);
            CheckForPetrificationRequestOnPlayer(playerSequenceNumberProcessed + 1);

            InputCommands inputPackageCorrespondingToSeq;

            if (inputUpdatesFromClientToServerDic.TryGetValue(playerSequenceNumberProcessed + 1, out inputPackageCorrespondingToSeq))
            {
                inputUpdatesFromClientToServerDic.Remove(inputPackageCorrespondingToSeq.sequenceNumber);
                latestPlayerInputPackage      = inputPackageCorrespondingToSeq;
                playerSequenceNumberProcessed = inputPackageCorrespondingToSeq.sequenceNumber;

                serverInstanceHero.ProcessMovementInputs(inputPackageCorrespondingToSeq.commands
                                                         , inputPackageCorrespondingToSeq.previousCommands);
                serverInstanceHero.ProcessEventsInputs(inputPackageCorrespondingToSeq.commands, inputPackageCorrespondingToSeq.previousCommands);
                serverInstanceHero.ProcessAnimationsInputs(inputPackageCorrespondingToSeq.commands, inputPackageCorrespondingToSeq.previousCommands);

                serverInstanceHero.ProcessInputMovementsControl();
                serverInstanceHero.ProcessInputEventControl();
                serverInstanceHero.ProcessInputAnimationControl();
                //Debug.Log(serverInstanceHero.movePoint.position + "Block pos "+serverInstanceHero.GetBlockPosition()+"<color=yellow>Processing seqence no </color>" + inputPackageCorrespondingToSeq.sequenceNumber + "<color=green>position </color>" + serverInstanceHero.actorTransform.position + "<color=green>inputs </color>" + inputPackageCorrespondingToSeq.commands[0] + inputPackageCorrespondingToSeq.commands[1] + inputPackageCorrespondingToSeq.commands[2] + inputPackageCorrespondingToSeq.commands[3]+" Previous Commands "+ inputPackageCorrespondingToSeq.previousCommands[0] + inputPackageCorrespondingToSeq.previousCommands[1] + inputPackageCorrespondingToSeq.previousCommands[2] + inputPackageCorrespondingToSeq.previousCommands[3]);
            }
            else
            {
                if (latestPlayerInputPackage.sequenceNumber != 0)
                {
                    //Debug.LogError("Could not find any inputToProcess for  seq: " + (sequenceNumberProcessed + 1));
                    playerSequenceNumberProcessed = playerSequenceNumberProcessed + 1;

                    serverInstanceHero.ProcessMovementInputs(latestPlayerInputPackage.commands
                                                             , latestPlayerInputPackage.previousCommands);
                    serverInstanceHero.ProcessEventsInputs(latestPlayerInputPackage.commands, latestPlayerInputPackage.previousCommands);
                    serverInstanceHero.ProcessAnimationsInputs(latestPlayerInputPackage.commands, latestPlayerInputPackage.previousCommands);

                    serverInstanceHero.ProcessInputMovementsControl();
                    serverInstanceHero.ProcessInputEventControl();
                    serverInstanceHero.ProcessInputAnimationControl();
                }
            }
        }

        serverLocalSequenceNumber++;

        //////Debug.Log("<color=blue>inputsequence </color>"+ playerMovingCommandSequenceNumber + "<color=blue>inputs </color> "+ inputs[0]+" "+inputs[1]+" "+inputs[2]+" "+inputs[3]);
        PlayerAuthoratativeStates playerAuthoratativeStates = new PlayerAuthoratativeStates(serverInstanceHero.isPetrified, serverInstanceHero.isPushed);
        PositionUpdates           positionUpdates           = new PositionUpdates(serverInstanceHero.actorTransform.position, serverInstanceHero.currentMovePointCellPosition, serverInstanceHero.previousMovePointCellPosition);
        PlayerEvents          playerEvents          = new PlayerEvents(serverInstanceHero.isFiringPrimaryProjectile);
        PlayerAnimationEvents playerAnimationEvents = new PlayerAnimationEvents(serverInstanceHero.primaryMoveUseAnimationAction.isBeingUsed, serverInstanceHero.isPlacingBoulderAnimationPlayed);

        PlayerStateUpdates       playerStateUpdates       = new PlayerStateUpdates(serverLocalSequenceNumber, playerSequenceNumberProcessed, playerAuthoratativeStates, positionUpdates, playerEvents, playerAnimationEvents);
        PlayerStateServerUpdates playerStateServerUpdates = new PlayerStateServerUpdates(id, playerStateUpdates);

        //Debug.LogError("Server sequence number : "+ serverLocalSequenceNumber+" player sequence number processeed: "+ playerSequenceNumberProcessed+" player position : "+serverInstanceHero.actorTransform.position);

        playerStateListOnServer.Add(playerStateServerUpdates);

        if (playerStateListOnServer.Count >= snapShotsInOnePacket)
        {
            if (previousPlayerUpdatedStatePacks.Count > packetHistorySize)
            {
                previousPlayerUpdatedStatePacks.RemoveAt(0);
            }
            ServerSend.PlayerStateSend(playerStateListOnServer, previousPlayerUpdatedStatePacks);

            previousPlayerUpdatedStatePacks.Add(new PreviousPlayerUpdatedStatePacks(playerStateListOnServer.ToArray()));

            playerStateListOnServer.Clear();

            //Debug.Log("<color=red>--------------------------------------------------------------------</color>");
        }

        UpdateClientInputsProcessMode();
        snapShotBufferSize = GetTheLastestSequenceNoInDic() - playerSequenceNumberProcessed;
        //Debug.Log("<color=cyan>Dic Count </color>"+inputUpdatesFromClientToServerDic.Count);
    }
Esempio n. 8
0
    public static void PlayerStateUpdated(Packet packet)
    {
        int dataCount = packet.ReadInt();

        for (int i = 0; i < dataCount; i++)
        {
            int        id                                    = packet.ReadInt();
            Vector3    position                              = packet.ReadVector3();
            Vector3Int blockposition                         = packet.ReadVector3Int();
            Vector3Int previousBlockposition                 = packet.ReadVector3Int();
            bool       isFiringPrimaryProjectile             = packet.ReadBool();
            bool       isPrimaryMoveAnimationBeingPlayed     = packet.ReadBool();
            bool       isPlacingBoulderAnimationPlayed       = packet.ReadBool();
            bool       isPetrified                           = packet.ReadBool();
            bool       isPushed                              = packet.ReadBool();
            int        playerProcessedsequenceNumberReceived = packet.ReadInt();
            int        playerServerSequenceNumberReceived    = packet.ReadInt();

            PositionUpdates           positionUpdates           = new PositionUpdates(position, blockposition, previousBlockposition);
            PlayerEvents              playerEvents              = new PlayerEvents(isFiringPrimaryProjectile);
            PlayerAnimationEvents     playerAnimtaionEvents     = new PlayerAnimationEvents(isPrimaryMoveAnimationBeingPlayed, isPlacingBoulderAnimationPlayed);
            PlayerAuthoratativeStates playerAuthoratativeStates = new PlayerAuthoratativeStates(isPetrified, isPushed);

            PlayerStateUpdates playerStateUpdates = new PlayerStateUpdates(playerServerSequenceNumberReceived, playerProcessedsequenceNumberReceived, playerAuthoratativeStates, positionUpdates, playerEvents, playerAnimtaionEvents);
            //Debug.LogError("<color=blue>Receiving updated position for movement </color>playerUpdatedPositionSequenceNumber: " + sequenceNumberReceived + " position: " + position);
            if (ClientSideGameManager.players.ContainsKey(id))
            {
                ClientSideGameManager.players[id].masterController.AccumulateDataToBePlayedOnClientFromServer(playerStateUpdates);
            }
            else
            {
                Debug.LogError("Player of id doesnot exists: " + id);
            }
            //if (!ClientSideGameManager.players[id].masterController.hasAuthority)
            //{
            //    Debug.LogWarning("<color=red>Receiving remote player data</color>"+sequenceNumberReceived);
            //}
            //else
            //{
            //    Debug.LogWarning("<color=green>Receiving my player data</color>"+sequenceNumberReceived);
            //}
        }

        int previousPlayerUpdatedPositionPacks = packet.ReadInt();

        for (int i = 0; i < previousPlayerUpdatedPositionPacks; i++)
        {
            int previousPlayerUpdatedPositionPacksCount = packet.ReadInt();

            for (int j = 0; j < previousPlayerUpdatedPositionPacksCount; j++)
            {
                int        previousHistoryPlayerId                    = packet.ReadInt();
                Vector3    previousHistoryPositionUpdate              = packet.ReadVector3();
                Vector3Int previousHistoryBlockPositionUpdate         = packet.ReadVector3Int();
                Vector3Int previousHistoryPreviousBlockPositionUpdate = packet.ReadVector3Int();
                bool       isFiringPrimaryProjectile                  = packet.ReadBool();
                bool       isPrimaryMoveAnimationBeingPlayed          = packet.ReadBool();
                bool       isPlacingBoulderAnimationPlayed            = packet.ReadBool();
                bool       isPetrified = packet.ReadBool();
                bool       isPushed    = packet.ReadBool();
                int        previousHistoryPlayerProcessingSequenceNo = packet.ReadInt();
                int        previousHistoryServerSequenceNo           = packet.ReadInt();

                PositionUpdates           positionUpdates           = new PositionUpdates(previousHistoryPositionUpdate, previousHistoryBlockPositionUpdate, previousHistoryPreviousBlockPositionUpdate);
                PlayerEvents              playerEvents              = new PlayerEvents(isFiringPrimaryProjectile);
                PlayerAnimationEvents     playerAnimtaionEvents     = new PlayerAnimationEvents(isPrimaryMoveAnimationBeingPlayed, isPlacingBoulderAnimationPlayed);
                PlayerAuthoratativeStates playerAuthoratativeStates = new PlayerAuthoratativeStates(isPetrified, isPushed);

                PlayerStateUpdates playerStateUpdates = new PlayerStateUpdates(previousHistoryServerSequenceNo, previousHistoryPlayerProcessingSequenceNo, playerAuthoratativeStates, positionUpdates, playerEvents, playerAnimtaionEvents);
                if (ClientSideGameManager.players.ContainsKey(previousHistoryPlayerId))
                {
                    ClientSideGameManager.players[previousHistoryPlayerId].masterController.AccumulateDataToBePlayedOnClientFromServer(playerStateUpdates);
                }
                else
                {
                    Debug.LogError("Player of id doesnot exists: " + previousHistoryPlayerId);
                }
            }
        }
    }