Beispiel #1
0
        /// <summary>
        /// Deserializes all active <see cref="ReplayEvent"/> from the state and dispatches any events to the <see cref="OnReplayEvent(ReplayEvent)"/> handler.
        /// </summary>
        /// <param name="state">The <see cref="ReplayState"/> to read the variable data from</param>
        protected virtual void ReplayDeserializeEvents(ReplayState state)
        {
            // Read the event size
            short size = state.Read16();

            // Read all events
            for (int i = 0; i < size; i++)
            {
                // Create the event
                ReplayEvent evt = new ReplayEvent();

                // Read the event id
                evt.eventID = state.ReadByte();

                // Read the data size
                byte dataSize = state.ReadByte();

                // Read the event data
                evt.eventData = state.ReadState(dataSize);

                try
                {
                    // Trigger the event callback
                    OnReplayEvent(evt);
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                }
            }
        }
        /// <summary>
        /// Called by the replay system when a replay event has occured.
        /// </summary>
        /// <param name="replayEvent">The <see cref="ReplayEvent"/> that was triggered</param>
        public override void OnReplayEvent(ReplayEvent replayEvent)
        {
            switch ((ReplayEvents)replayEvent.eventID)
            {
            // Listen for sound event
            case ReplayEvents.PlaySound:
            {
                // We cannot replay sounds during reverse playback
                if (PlaybackDirection == PlaybackDirection.Backward)
                {
                    break;
                }

                // Require valid source
                if (observedAudioSource != null)
                {
                    // Set the audio source to play at the playback speed
                    observedAudioSource.pitch = ReplayTime.TimeScale;

                    // Play the audio
                    observedAudioSource.Play();
                }
                break;
            }
            }
        }
Beispiel #3
0
 public void AddEvent(float eventTime, ReplayEvent.EventType eventType)
 {
     if (_canRecord || Registry.replayViewer.enabled)
     {
         ReplayEvent newEvent = (ReplayEvent)ScriptableObject.CreateInstance("ReplayEvent");
         newEvent.Initialize(eventTime - _startTime, eventType);
         _eventList.Add(newEvent);
     }
 }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject     obj         = JToken.ReadFrom(reader) as JObject;
        Type        type        = Type.GetType(obj["type"].Value <string>());
        ReplayEvent replayEvent = Activator.CreateInstance(type) as ReplayEvent;

        replayEvent.Deserialize(obj["data"] as JObject);
        return(replayEvent);
    }
        public void AddCustomEvent()
        {
            var @event = new ReplayEvent();

            @event.AdminId = SyncManager.Instance.UserId;
            @event.Camera  = CameraControl.GetCurrentCameraSessionTime();
            @event.Type    = ReplayEvent.EventTypes.Interesting;

            this.AddEvent(@event);
        }
        private void UpdateEvent(ReplayEvent @event)
        {
            var existing = this.State.Events.SingleOrDefault(e => e.Id == @event.Id);

            if (existing != null)
            {
                this.State.Events.Remove(existing);
            }

            this.State.Events.Add(@event);
        }
Beispiel #7
0
    IEnumerator Replay()
    {
        _isPlayingReplay = true;
        int   index           = 0;
        float replayStartTime = Time.time;

        while (index < _eventList.Count)
        {
            ReplayEvent currentEvent = _eventList[index];
            yield return(new WaitForSeconds(replayStartTime + currentEvent.timeTriggered - Time.time));

            if (currentEvent.eventType == ReplayEvent.EventType.PressedRight)
            {
                Registry.inputHandler.OnPressedRight();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.ReleasedRight)
            {
                Registry.inputHandler.OnReleasedRight();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.PressedLeft)
            {
                Registry.inputHandler.OnPressedLeft();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.ReleasedLeft)
            {
                Registry.inputHandler.OnReleasedLeft();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.PressedJump)
            {
                Registry.inputHandler.OnPressedJump();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.ReleasedJump)
            {
                Registry.inputHandler.OnReleasedJump();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.PressedUse)
            {
                Registry.inputHandler.OnPressedUse();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.PressedPickUp)
            {
                Registry.inputHandler.OnPressedPickUp();
            }
            else if (currentEvent.eventType == ReplayEvent.EventType.PressedReset)
            {
                Registry.inputHandler.OnPressedReset();
            }

            index++;
        }

        _isPlayingReplay = false;
        Debug.Log("Replay has ended");
    }
        public void AddEvent(ReplayEvent @event)
        {
            var container = new ReplayEventContainer(@event);

            container.RelativePosition = @event.Camera.SessionTime / this.SessionTime;
            this.Events.Add(container);
            this.UpdateEventPosition(container);

            var command = SyncCommandHelper.AddEvent(@event);

            SyncManager.Instance.SendStateUpdate(command);
        }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ReplayEvent replayEvent = value as ReplayEvent;

        writer.WriteStartObject();
        {
            writer.WritePropertyName("type"); writer.WriteValue(value.GetType().ToString());
            writer.WritePropertyName("data"); writer.WriteStartObject();
            {
                replayEvent.Serialize(writer);
            }
            writer.WriteEndObject();
        }
        writer.WriteEndObject();
    }
Beispiel #10
0
        /// <summary>
        /// Push an event to the replay system for recording.
        /// </summary>
        /// <param name="eventID">The event id to uniquley identify the event type</param>
        /// <param name="state">The state data for the event or null if no state data is required</param>
        public void ReplayRecordEvent(byte eventID, ReplayState state = null)
        {
            // Create the replay event
            ReplayEvent evt = new ReplayEvent
            {
                eventID   = eventID,
                eventData = state,
            };

            // Check for null state
            if (evt.eventData == null)
            {
                evt.eventData = new ReplayState();
            }

            // Push to event queue
            replayEvents.Enqueue(evt);
        }
Beispiel #11
0
        public void ReplaySubject()
        {
            var rs = new ReplayEvent <int>(2);
            var l1 = new List <int>();
            var l2 = new List <int>();
            var l3 = new List <int>();
            var d  = rs.Subscribe(l1.Add);

            rs.OnNext(1);
            rs.OnNext(2);
            rs.Subscribe(l2.Add);
            rs.OnNext(3);
            rs.OnNext(4);
            rs.Subscribe(l3.Add);
            d.Dispose();
            rs.OnNext(5);
            ListEq(l1, new[] { 1, 2, 3, 4 });
            ListEq(l2, new[] { 1, 2, 3, 4, 5 });
            ListEq(l3, new[] { 3, 4, 5 });
        }
Beispiel #12
0
        public void AddOfftrackPenalty(DriverOfftrackLimit limit)
        {
            Penalty penalty;

            penalty        = Penalty.Create();
            penalty.Reason = "Ignoring track limits";
            penalty.Camera = CameraControl.GetCurrentCameraSessionTime();
            penalty.Lap    = limit.Driver.Driver.Live.Lap.ToString();
            SyncManager.Instance.State.Penalties.Add(penalty);

            // Create incident event
            var @event = new ReplayEvent();

            @event.Type    = ReplayEvent.EventTypes.Incident;
            @event.AdminId = SyncManager.Instance.UserId;
            @event.Camera  = penalty.Camera;
            // _mainModel.ReplayBarModel.AddEvent(@event);

            penalty.StartInvestigation(limit.Driver.Driver.Id, SyncManager.Instance.User);

            SyncManager.Instance.SendStateUpdate(SyncCommandHelper.AddPenalty(penalty));
        }
Beispiel #13
0
        /// <summary>
        /// Serializes all awaiting <see cref="ReplayEvent"/> to the state.
        /// </summary>
        /// <param name="state">The <see cref="ReplayState"/> to write the varaible data to</param>
        protected virtual void ReplaySerializeEvents(ReplayState state)
        {
            // Get the number of events
            short size = (short)replayEvents.Count;

            // Write the size to the state
            state.Write(size);

            // Write all events
            while (replayEvents.Count > 0)
            {
                // Get the next event
                ReplayEvent evt = replayEvents.Dequeue();

                // Write the event id
                state.Write(evt.eventID);

                // Write the size and event data
                state.Write((byte)evt.eventData.Size);
                state.Write(evt.eventData);
            }
        }
        private void UpdateEvents()
        {
            this.Events.Clear();

#if DEBUG
            var debugEvents = new List <ReplayEvent>();
            var ev          = new ReplayEvent();
            ev.AdminId = SyncManager.Instance.UserId;
            ev.Camera  = CameraDetails.ChangeReplayTime(400, 4);
            ev.Type    = ReplayEvent.EventTypes.Interesting;
            ev.Text    = "Test event 1";
            debugEvents.Add(ev);

            ev         = new ReplayEvent();
            ev.AdminId = SyncManager.Instance.UserId;
            ev.Camera  = CameraDetails.ChangeReplayTime(500, 7);
            ev.Type    = ReplayEvent.EventTypes.Incident;
            ev.Text    = "Test event 2";
            debugEvents.Add(ev);

            ev         = new ReplayEvent();
            ev.AdminId = SyncManager.Instance.UserId;
            ev.Camera  = CameraDetails.ChangeReplayTime(850, 7);
            ev.Type    = ReplayEvent.EventTypes.Interesting;
            ev.Text    = "Test event 3";
            debugEvents.Add(ev);

            foreach (var @event in debugEvents)
            {
#else
            foreach (var @event in SyncManager.Instance.State.Events)
            {
#endif
                var container = new ReplayEventContainer(@event);
                container.RelativePosition = @event.Camera.SessionTime / this.SessionTime;
                this.Events.Add(container);
            }
            this.UpdateEventPositions();
        }
Beispiel #15
0
        public void AddDriver(DriverContainer driver, PenaltyContainer parentPenalty = null)
        {
            Penalty penalty;

            if (parentPenalty == null)
            {
                penalty        = Penalty.Create();
                penalty.Camera = CameraControl.GetCurrentCameraSessionTime();
                penalty.Lap    = driver.Driver.Live.Lap.ToString();
                SyncManager.Instance.State.Penalties.Add(penalty);

                // Create incident event
                var @event = new ReplayEvent();
                @event.Type    = ReplayEvent.EventTypes.Incident;
                @event.AdminId = SyncManager.Instance.UserId;
                @event.Camera  = penalty.Camera;
                //_mainModel.ReplayBarModel.AddEvent(@event);
            }
            else
            {
                penalty = parentPenalty.Penalty;
            }

            penalty.StartInvestigation(driver.Driver.Id, SyncManager.Instance.User);

            if (parentPenalty == null)
            {
                SyncManager.Instance.SendStateUpdate(SyncCommandHelper.AddPenalty(penalty));
                EditPenalty(penalty);
            }
            else
            {
                SyncManager.Instance.SendPenaltyUpdate(penalty);
            }

            this.UpdatePenalties();
        }
Beispiel #16
0
 public void ActionReplay()
 {
     ReplayEvent?.Invoke();
 }
Beispiel #17
0
    public IEnumerator FinalKillCam(ReplayEvents killCamEvents)
    {
        mainPlayer.EnableShooting(false);
        yield return(new WaitForSeconds(3));

        enemyManager.KillAllEnemies();

        gameStatus     = GameStatus.KillCam;
        Time.timeScale = 0.5f;
        uiManager.SetScreensActive(gameStatus);

        //init enemies
        Dictionary <long, string> enemyDeathDelay = killCamEvents.killTimes.ToDictionary(item => long.Parse(item.Key), item => item.Value);
        long initialTime = long.Parse(killCamEvents.events.First().Value.First().Key);

        enemyManager.Initialize(killCamEvents.enemies, levels[currentLevel].transform, levels[currentLevel].GetPlayerPads(), true, enemyDeathDelay, initialTime);
        enemyManager.StartGame();
        yield return(enemyManager);

        Dictionary <string, ReplayEvent> events;
        long timestamp;

        foreach (KeyValuePair <string, Dictionary <string, ReplayEvent> > playerEvent in killCamEvents.events)
        {
            var    split   = playerEvent.Key.Split(':');
            string enemyId = split[0];
            string id      = split[1];
            events = playerEvent.Value;

            Debug.Log($"Replaying enemy {enemyId} kill event by player {id}");

            //set camera
            mainCamera.position = allPlayers[id].playerCamera.position;
            mainCamera.rotation = allPlayers[id].playerCamera.rotation;
            mainCamera.SetParent(allPlayers[id].playerCamera, true);

            long prevTime = long.Parse(events.Keys.First());
            foreach (string ts in events.Keys)
            {
                timestamp = long.Parse(ts);
                yield return(new WaitForSeconds((timestamp - prevTime) / 1000f));

                prevTime = timestamp;
                ReplayEvent e = events[ts];
                if (e.type == "remoteState")
                {
                    RemoteStateUpdateReceived(e.remoteState);
                }
                else if (e.type == "enemyKilled")
                {
                    EnemyKilledMessageReceived(e.enemyKilled);
                }
            }

            allPlayers[id].SetShooting(false);
        }


        Time.timeScale = 1f;
        yield return(new WaitForSeconds(3));

        currentLevel++;
        StartCoroutine(TransitionFromLevel(false));
    }
Beispiel #18
0
 /// <summary>
 /// Called by the replay system when an event has been received during playback.
 /// </summary>
 /// <param name="replayEvent">The event that was received</param>
 public virtual void OnReplayEvent(ReplayEvent replayEvent)
 {
 }
Beispiel #19
0
 public ReplayEventContainer(ReplayEvent @event)
 {
     _event     = @event;
     this.Admin = SyncManager.Instance.Users.FromId(@event.AdminId);
 }