Example #1
0
    void ApplyInputs(Quantum.Frame f)
    {
        for (Int32 i = 0; i < f.RuntimeConfig.Players.Length; i++)
        {
            var data = f.GetRawInput(i);
            if (data == null || data.Length == 0)
            {
                f.SetPlayerInput(i, default(Quantum.Input));
                continue;
            }

            // copy into stream
            _inputStreamRead.Reset();
            _inputStreamRead.CopyFromArray(data);

            Quantum.Input input;

            // try read input and assign it
            if (ReadInputFromStream(out input))
            {
                f.SetPlayerInput(i, input);
            }
            else
            {
                Quantum.Log.Error("Received invalid input data from player {0}, could not deserialize.", i);
                f.SetPlayerInput(i, default(Quantum.Input));
            }
        }
    }
Example #2
0
    public void OnGameStart(DeterministicFrame f)
    {
        _inputStreamRead  = new Quantum.ByteStream(new Byte[1024]);
        _inputStreamWrite = new Quantum.ByteStream(new Byte[1024]);
        _localPlayers     = _session.LocalPlayerIndices.Select(x => (Quantum.PlayerRef)x).ToArray();

        // set public delegates for converting between photon/quantum players
        PhotonPlayerToQuantumPlayer = PlayerToIndex;
        QuantumPlayerToPhotonPlayer = IndexToPlayer;

        // sort runtime players
        SortRuntimePlayers();

        // init event invoker
        InitEventInvoker(_session.RollbackWindow);

        // init systems on latest frame
        InitSystems(f);

        _frame                  = (Quantum.Frame)f;
        _framePredicted         = _frame;
        _framePredictedPrevious = _frame;
        _frameVerified          = _frame;

        for (Int32 i = QuantumCallbacks.Instances.Count - 1; i >= 0; --i)
        {
            try {
                QuantumCallbacks.Instances[i].OnGameStart();
            }
            catch (Exception exn) {
                Quantum.Log.Exception(exn);
            }
        }
    }
Example #3
0
    public void OnUpdateDone()
    {
        if (_session.IsReplayFinished)
        {
            IsReplayFinished = true;
        }

        _framePredicted         = _frame = (Quantum.Frame)_session.FramePredicted;
        _framePredictedPrevious = (Quantum.Frame)_session.FramePredictedPrevious;
        _frameVerified          = (Quantum.Frame)_session.FrameVerified;

        FrameInterpolationFactor = UnityEngine.Mathf.Clamp01((Single)_session.AccumulatedTime / _frame.DeltaTime.AsFloat);

        Quantum.Core.DebugDraw.DrawAll();

        for (Int32 i = QuantumCallbacks.Instances.Count - 1; i >= 0; --i)
        {
            try {
                QuantumCallbacks.Instances[i].OnUpdateView();
            }
            catch (Exception exn) {
                Quantum.Log.Exception(exn);
            }
        }

        SyncMap();
    }
Example #4
0
    public void OnDestroy()
    {
        _frame                  = null;
        _framePredicted         = null;
        _framePredictedPrevious = null;
        _frameVerified          = null;

        _localPlayers = null;

        RuntimeConfig    = null;
        SimulationConfig = null;

        PhotonPlayerToQuantumPlayer = null;
        QuantumPlayerToPhotonPlayer = null;

        IsReplay         = false;
        IsReplayFinished = false;

        FrameInterpolationFactor = 0;
    }
    void InvokeEvents(Quantum.Frame f)
    {
        // store previous frame value so we can restore it
        var previousFrameValue = _frame;

        try {
            // set current frame we are invoking the events for
            _frame = f;

            HashSet <Int32>[] triggered;

            // grab or create new triggered set lookup
            if (_eventsTriggered.TryGetValue(f.Number, out triggered) == false)
            {
                _eventsTriggered.Add(f.Number, triggered = TriggeredSetPool.Alloc());
            }

            // grab event head
            var head = (IEventBaseInternal)(((IFrameInternal)f).EventHead);

            // step over each event
            while (head != null)
            {
                if (head.EventIsSynced)
                {
                    if (f.IsVerified)
                    {
                        RaiseEvent(head);
                    }
                }
                else
                {
                    // calculate hash code
                    var hash = head.GetHashCode();

                    // if this was already raised, do nothing
                    if (triggered[head.Id].Contains(hash) == false)
                    {
                        // dont trigger this again
                        triggered[head.Id].Add(hash);

                        // trigger event
                        RaiseEvent(head);
                    }
                }

                // next
                head = head.EventTail;
            }

            // frame is verified?
            if (f.IsVerified)
            {
                // remove triggered set
                _eventsTriggered.Remove(f.Number);

                // free it
                TriggeredSetPool.Free(triggered);
            }
        }
        finally {
            // restore frame value
            _frame = previousFrameValue;
        }
    }