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)); } } }
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); } } }
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(); }
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; } }