Esempio n. 1
0
    public void ProcessInputMessages()
    {
        // Get the message
        NetInputMessage msg = _inputMessageQueue.Dequeue();

        // Find out who sent it
        PhotonPlayer photonPlayer = PhotonUtils.GetPlayerById(msg.PhotonPlayerId);

        if (photonPlayer == null)
        {
            return;
        }

        // Get remote player instance
        var remotePlayer = _remotePlayers.Find(x => x.Player.ID == photonPlayer.ID);

        if (remotePlayer == null)
        {
            Transform target = null;
            foreach (var go in GameObject.FindGameObjectsWithTag("NetworkPlayer"))
            {
                if (go.GetComponent <PhotonView>().ownerId == photonPlayer.ID)
                {
                    target = go.transform;
                }
            }

            if (target == null)
            {
                Debug.LogErrorFormat("Could not find Transform component for PhotonPlayer {0}", photonPlayer.ID);
            }
            else
            {
                remotePlayer = new ServerPlayer()
                {
                    Player = photonPlayer, Target = target
                };
                _remotePlayers.Add(remotePlayer);
            }
        }

        if (remotePlayer == null)
        {
            return;
        }

        Player player = remotePlayer.Target.GetComponent <Player>();

        player.Client_SyncServer();

        Server_ApplyInput(msg.Inputs, remotePlayer);

        player.PositionBuffer.Push(remotePlayer.Position.x, remotePlayer.Position.y, player.Syncer.ServerDelta(Time.deltaTime));

        NetStateMessage stateMsg = new NetStateMessage
        {
            Position       = remotePlayer.Position,
            LastTick       = msg.Identifier,
            PhotonPlayerId = remotePlayer.Player.ID
        };

        var options = new RaiseEventOptions {
            TargetActors = PhotonUtils.GetPlayerIdsInRoom()
        };


        // Broadcast new state of the client
        PhotonNetwork.RaiseEvent((byte)EventCodes.STOC_ClientInputAcknowledge, stateMsg, false, options);
    }
Esempio n. 2
0
    public void OnEventRaised(byte eventCode, object content, int senderID)
    {
        bool isMaster = PhotonNetwork.isMasterClient;
        bool isMine   = photonView.isMine;

        switch (eventCode)
        {
        case (byte)EventCodes.CTOS_ClientInput:
            if (!isMaster)
            {
                break;
            }

            var msg = (NetInputMessage)content;
            msg.PhotonPlayerId = senderID;
            msg.Time           = Time.time;

            Server_ReceiveInput(msg, senderID);
            break;

        case (byte)EventCodes.STOC_ClientInputAcknowledge:
            var stateMsg = (NetStateMessage)content;

            var photonPlayer = PhotonUtils.GetPlayerById(stateMsg.PhotonPlayerId);
            if (photonPlayer == null)
            {
                break;
            }

            var photonPlayerTransform = PhotonUtils.GetPhotonPlayerTransform(photonPlayer);
            if (photonPlayerTransform == null)
            {
                break;
            }

            bool isMyAck = PhotonNetwork.player.ID == stateMsg.PhotonPlayerId;

            if (isMyAck)
            {
                photonPlayerTransform.position = stateMsg.Position;

                // Server Reconciliation
                if (Conciliation)
                {
                    int j = 0;
                    while (j < _inputBuffer.Count)
                    {
                        var input = _inputBuffer[j];

                        if (input.TickNr <= stateMsg.LastTick)
                        {
                            _inputBuffer.Remove(input);
                        }
                        else
                        {
                            ApplyInput(new List <Inputs> {
                                input
                            }, transform);
                            j++;
                        }
                    }
                }

                PositionBuffer.Push(stateMsg.Position.x, stateMsg.Position.y, Syncer.ServerDelta(Time.deltaTime));
            }
            else
            {
                // Entity Interpolation
                if (Interpolation)
                {
                    Player p = photonPlayerTransform.GetComponent <Player>();

                    p.Client_SyncServer();
                    p.PositionBuffer.Push(stateMsg.Position.x, stateMsg.Position.y, p.Syncer.ServerDelta(Time.deltaTime));
                }
                else
                {
                    photonPlayerTransform.position = stateMsg.Position;
                }
            }
            break;

        default:
            Debug.LogErrorFormat("Unknown event code {0} from {1}", eventCode, senderID);
            break;
        }
    }