Esempio n. 1
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;
        }
    }