public int TestForState(int frameId) { int count = frameQueue.Count; if (count == 0) { return(-1); } int num = count - 1; FrameState frameState = frameQueue[num]; int frameId2 = frameState.frameId; if (frameId >= frameId2) { return((frameId != frameId2) ? (-1) : num); } FrameState frameState2 = frameQueue[0]; int frameId3 = frameState2.frameId; if (frameId <= frameId3) { return((frameId != frameId3) ? (-1) : 0); } int num2 = 0; while (num2 < num) { int num3 = num + num2 >> 1; FrameState frameState3 = frameQueue[num3]; int frameId4 = frameState3.frameId; if (frameId == frameId4) { return(num3); } if (frameId < frameId4) { num = num3 - 1; } else { num2 = num3 + 1; } } if (num2 == num) { FrameState frameState4 = frameQueue[num2]; if (frameState4.frameId == frameId) { return(num2); } } return(-1); }
public void LimitHistory() { int num = 1024; if (frameQueue.Count > num) { FrameState frameState = frameQueue[frameQueue.Count - num]; DropOldStates(frameState.frameId); } if (eventQueue.Count > num) { FrameState frameState2 = eventQueue[eventQueue.Count - num]; DropOldEvents(frameState2.frameId); } }
public void DropOldEvents(int frameId) { while (eventQueue.Count > 0) { FrameState frameState = eventQueue[0]; if (frameState.frameId < frameId) { FrameState frameState2 = eventQueue[0]; frameState2.stream.Release(); eventQueue.RemoveAt(0); continue; } break; } }
public NetStream GetState(int frameId, bool rewind = false) { for (int i = 0; i < frameQueue.Count; i++) { FrameState frameState = frameQueue[i]; if (frameState.frameId == frameId) { FrameState frameState2 = frameQueue[i]; NetStream stream = frameState2.stream; if (rewind) { stream.Seek(0); } return(stream); } } return(null); }
public void PushState(int frameId, NetStream state) { int num = frameQueue.Count; while (num - 1 > 0) { FrameState frameState = frameQueue[num - 1]; if (frameState.frameId <= frameId) { break; } num--; } frameQueue.Insert(num, new FrameState { frameId = frameId, stream = state }); }
public bool GetState(int frame, float fraction, out int frame0id, out NetStream frame0, out NetStream frame1, out float mix) { frame0 = null; frame1 = null; frame0id = -1; try { for (int num = frameQueue.Count - 1; num >= 0; num--) { FrameState frameState = frameQueue[num]; if (frameState.frameId <= frame) { FrameState frameState2 = frameQueue[num]; frame0id = frameState2.frameId; if (num < frameQueue.Count - 1) { FrameState frameState3 = frameQueue[num + 1]; int frameId = frameState3.frameId; if (AllowDiscontinuous && frameId >= frame0id + 60) { if ((float)(frameId - frame) <= 0.25f + fraction) { FrameState frameState4 = frameQueue[num + 1]; frame1 = NetStream.AllocStream(frameState4.stream); frame0 = NetStream.AllocStream(frame1); frame0id = frameId; mix = 1f; return(true); } FrameState frameState5 = frameQueue[num]; frame0 = NetStream.AllocStream(frameState5.stream); frame1 = NetStream.AllocStream(frame0); mix = 0f; return(true); } FrameState frameState6 = frameQueue[num]; frame0 = NetStream.AllocStream(frameState6.stream); FrameState frameState7 = frameQueue[num + 1]; frame1 = NetStream.AllocStream(frameState7.stream); mix = ((float)(frame - frame0id) + fraction) / (float)(frameId - frame0id); return(true); } FrameState frameState8 = frameQueue[num]; frame0 = NetStream.AllocStream(frameState8.stream); frame1 = NetStream.AllocStream(frame0); mix = 0f; return(true); } } mix = 0f; return(false); } catch (Exception) { if (frame0 != null) { frame0 = frame0.Release(); } if (frame1 != null) { frame1 = frame1.Release(); } throw; } }
public void Apply() { if (exitingLevel || !isStarted) { return; } if (ReplayRecorder.isPlaying) { ReplayRecorder.instance.Play(this); return; } if (!validated) { validated = true; int num = CalculateMaxDeltaSizeInBits(netId); int num2 = NetHost.CalcMaxPossibleSizeForContainerContentsTier0() * 8; if (num > num2) { Debug.LogErrorFormat(this, "Net Scope \"{0}\" (netid={1}) might produce a data packet larger than {2} bytes, which could fail to send on some platforms! Estimated worst-case size of this scope is {3} bytes; maximum safe limit is {4} bytes", base.name, netId, NetStream.CalculateSizeForTier(0), (num + 7) / 8, num2 >> 3); } } if (NetGame.isClient) { lock (frames.framesLock) { if (frames.frameQueue.Count == 0) { return; } FrameState frameState = frames.frameQueue[frames.frameQueue.Count - 1]; int frameId = frameState.frameId; if (frameId < renderedFrame) { maxLagFrames = Mathf.Min(30, maxLagFrames + 1); framesWithImprovedLagCount = 0; couldImproveBy = 30; renderedFrame = frameId; } if (frameId - maxLagFrames > renderedFrame) { renderedFrame = frameId - maxLagFrames; } if (renderedFrame + 1 <= frameId) { framesWithImprovedLagCount++; couldImproveBy = Mathf.Min(couldImproveBy, frameId - (renderedFrame + 1)); if (framesWithImprovedLagCount > 600 && maxLagFrames > 2) { maxLagFrames--; couldImproveBy--; if (couldImproveBy == 0) { framesWithImprovedLagCount = 0; couldImproveBy = 30; } } } else { framesWithImprovedLagCount = 0; couldImproveBy = 30; } lagReceiveToRender = frameId - renderedFrame; } int num3 = RenderState(frames, renderedFrame, fraction / Time.fixedDeltaTime); int num4 = PlaybackEvents(frames, 0, renderedFrame); lock (frames.framesLock) { frames.DropOldEvents(num4 + 1); lastFrame0idx = num3; int frameId2 = Mathf.Min(lastBaseFrame, lastFrame0idx - 30); frames.DropOldStates(frameId2); } } }
public void NotifyClients(int serverFrameId, int timeId, NetStream fullMaster, NetHost conn) { NetStream netStream = null; int num = -1; int num2 = -1; try { lock (remoteStates) { if (conn.isDyingForScopes) { Debug.LogFormat("Attempt to send delta to client (id {0}) that is disconnecting - caught and rejected", conn.hostId); return; } RemoteState remoteState = GetRemoteState(conn.hostId); num = remoteState.acknowledgedFrame; if (num > 0) { lock (frames.framesLock) { NetStream state = frames.GetState(num); if (state != null) { netStream = NetStream.AllocStream(state); } } } if (netStream != null) { remoteState.lastFullStateFrame = -1; remoteState.firstFullStateFrame = -1; } else { int num3 = (!(suppressThrottling <= 0f)) ? 1 : 30; if (remoteState.lastFullStateFrame != -1 && timeId - remoteState.lastFullStateFrame < num3) { return; } remoteState.lastFullStateFrame = timeId; if (remoteState.firstFullStateFrame == -1) { remoteState.firstFullStateFrame = serverFrameId; } } } num2 = conn.GetWriteFrameId(serverFrameId); bool flag = true; if (AllowSuspendCollect) { flag = (netStream == null || serverFrameId != num); } if (flag) { NetStream netStream2 = NetStream.AllocStream(fullMaster); try { netStream2.Seek(0); NetStream netStream3 = NetGame.BeginMessage(NetMsgId.Delta); try { netStream3.WriteNetId(netId); netStream3.WriteFrameId((netStream != null) ? num : 0, num2); netStream3.WriteFrameId(serverFrameId, num2); if (num > 0) { NetGame.instance.clientLatency.ReportLatency(serverFrameId - num - 1); } for (int i = 0; i < list.Count; i++) { list[i].CalculateDelta(netStream, netStream2, netStream3); } NetGame.instance.SendUnreliable(conn, netStream3, num2); ReportDeltaBits(netStream3.position); } finally { if (netStream3 != null) { netStream3 = netStream3.Release(); } } } finally { if (netStream2 != null) { netStream2 = netStream2.Release(); } } } } finally { if (netStream != null) { netStream = netStream.Release(); } } num = -1; lock (remoteStates) { if (conn.isDyingForScopes) { Debug.LogFormat("Attempt to send delta to client (id {0}) that is disconnecting - caught and rejected [2]", conn.hostId); return; } num = GetRemoteState(conn.hostId).acknowledgedEvent; } NetStream netStream4 = NetGame.BeginMessage(NetMsgId.Event); try { netStream4.WriteNetId(netId); bool flag2 = false; lock (frames.framesLock) { for (int j = 0; j < frames.eventQueue.Count; j++) { FrameState frameState = frames.eventQueue[j]; if (frameState.frameId > num) { flag2 = true; NetStream netStream5 = netStream4; FrameState frameState2 = frames.eventQueue[j]; netStream5.WriteFrameId(frameState2.frameId, num2); NetStream netStream6 = netStream4; FrameState frameState3 = frames.eventQueue[j]; netStream6.WriteStream(frameState3.stream); } } } if (flag2) { netStream4.WriteFrameId(0, num2); NetGame.instance.SendUnreliable(conn, netStream4, num2); ReportEvenBits(netStream4.position); } } finally { if (netStream4 != null) { netStream4 = netStream4.Release(); } } }
public void Collect() { bool flag = !NetGame.isClient && !ReplayRecorder.isPlaying; if (!isMasterSet || isMaster != flag) { isMasterSet = true; isMaster = flag; for (int i = 0; i < list.Count; i++) { list[i].SetMaster(isMaster); } } if (!exitingLevel && (NetGame.isServer || ReplayRecorder.isRecording)) { bool flag2 = !AllowSuspendCollect || !SuspendCollect || SnapshotCollect || ReplayRecorder.isRecording || !NetGame.isServer; SnapshotCollect = false; NetStream netStream = null; NetStream netStream2 = null; try { if (flag2) { netStream = NetStream.AllocStream(); for (int j = 0; j < list.Count; j++) { list[j].CollectState(netStream); } } if (eventStream != null && eventStream.position > 0) { eventStream.WriteNetId(0u); netStream2 = eventStream; eventStream = null; } if (ReplayRecorder.isRecording) { ReplayRecorder.instance.SubmitFrame(this, netStream, netStream2); } if (NetGame.isServer) { lock (remoteStates) { lock (frames.framesLock) { int num = 0; if (frames.frameQueue.Count > 0) { FrameState frameState = frames.frameQueue[0]; num = frameState.frameId; } int num2 = NetGame.serverFrameId - 60; foreach (KeyValuePair <uint, RemoteState> remoteState in remoteStates) { RemoteState value = remoteState.Value; if (value.acknowledgedFrame > 0) { if (value.acknowledgedFrame < num) { value.acknowledgedFrame = -1; } else { num2 = Mathf.Min(num2, value.acknowledgedFrame); } } if (value.firstFullStateFrame > 0) { if (value.firstFullStateFrame < num) { value.firstFullStateFrame = num; } else { num2 = Mathf.Min(num2, value.firstFullStateFrame); } } } if (frames.frameQueue.Count > 0) { int a = num2; FrameState frameState2 = frames.frameQueue[frames.frameQueue.Count - 1]; num2 = Mathf.Min(a, frameState2.frameId); } frames.DropOldEvents(NetGame.serverFrameId - 10); if (netStream2 != null) { frames.PushEvents(NetGame.serverFrameId, netStream2); } netStream2 = null; frames.DropOldStates(num2); if (netStream != null) { frames.PushState(NetGame.serverFrameId, netStream.AddRef()); } frames.LimitHistory(); if (NetGame.currentLevelInstanceID != 0 || !NetGame.isServer || this is NetPlayer) { bool flag3 = false; try { int frameId = NetGame.serverFrameId; if (netStream == null) { int num3 = frames.frameQueue.Count - 1; if (num3 >= 0) { FrameState frameState3 = frames.frameQueue[num3]; frameId = frameState3.frameId; FrameState frameState4 = frames.frameQueue[num3]; netStream = frameState4.stream.AddRef(); flag3 = true; } } if (netStream != null) { NetGame.instance.NotifyClients(this, frameId, NetGame.serverFrameId, netStream); } } finally { if (flag3 && netStream != null) { netStream = netStream.Release(); } } } } } } } finally { if (netStream != null) { netStream = netStream.Release(); } if (netStream2 != null) { netStream2 = netStream2.Release(); } } } }