Example #1
0
    public static LockstepInputs CreateLockstepInputs(UserInputs userInputs)
    {
        LockstepInputs lockstepInputs = new LockstepInputs();

        lockstepInputs.UserInputs = new UserInputs[1][] { new UserInputs[] { userInputs } };
        lockstepInputs.TickId     = userInputs.TickId;
        lockstepInputs.DeltaTime  = (Fix64)0.02f;
        return(lockstepInputs);
    }
Example #2
0
 public bool Simulate(ref LockstepInputs lockstepInputs)
 {
     time -= (float)lockstepInputs.DeltaTime;
     if (time <= 0 && Next())
     {
         time = Current.NextSecond;
         lockstepInputs.TickId     = tickId;
         lockstepInputs.UserInputs = new UserInputs[1][] { new UserInputs[] { Current.UserInputs } };
         tickId++;
         return(true);
     }
     return(false);
 }
Example #3
0
 public static void AddToTimeline(LockstepInputs inputs)
 {
     if (inputs.TickId < 0)
     {
         Index = 0;
         lockstepInputs.Clear();
         OnRestart?.Invoke();
     }
     if (inputs.TickId != lockstepInputs.Count)
     {
         return;
     }
     lockstepInputs.Add(inputs);
     inputTrackDict.Add(inputs.TickId, new List <Dictionary <int, Dictionary <Type, List <IInput> > > >());
     if (inputs.UserInputs != null && inputs.UserInputs.Length > 0)
     {
         for (int i = 0; i < inputs.UserInputs.Length; i++)
         {
             var dict = new Dictionary <int, Dictionary <Type, List <IInput> > >();
             for (int j = 0; j < inputs.UserInputs[i].Length; j++)
             {
                 var userInputs = inputs.UserInputs[i][j];
                 dict.Add(userInputs.UserId, new Dictionary <Type, List <IInput> >());
                 if (userInputs.InputData != null)
                 {
                     for (int k = 0; k < userInputs.InputData.Length; k++)
                     {
                         var input = MessagePackUtility.Deserialize <IInput>(userInputs.InputData[k]);
                         var type  = input.GetType();
                         if (!dict[userInputs.UserId].ContainsKey(type))
                         {
                             dict[userInputs.UserId].Add(type, new List <IInput>());
                         }
                         dict[userInputs.UserId][type].Add(input);
                     }
                 }
             }
             inputTrackDict[inputs.TickId].Add(dict);
         }
     }
 }
    public override void OnEnable()
    {
        base.OnEnable();

        NetworkSystem.Receive(RequestCode.Input).Subscribe(data =>
        {
            if (data.Mode == SessionMode.Offline)
            {
                UserInputs userInputs         = MessagePackUtility.Deserialize <UserInputs>(data.Value);
                userInputs.UserId             = 0;
                LockstepInputs lockstepInputs = LockstepUtility.CreateLockstepInputs(userInputs);
                NetworkSystem.Publish(RequestCode.Lockstep, MessagePackUtility.Serialize(lockstepInputs));
            }
        }).AddTo(this.Disposer);

        NetworkSystem.Receive(RequestCode.Lockstep).Subscribe(data =>
        {
            LockstepInputs lockstepInputs = MessagePackUtility.Deserialize <LockstepInputs>(data.Value);
            LockstepUtility.AddToTimeline(lockstepInputs);
        }).AddTo(this.Disposer);
    }
Example #5
0
        public LockstepInputs MoveNext(Fix64 deltaTime)
        {
            int tickId     = TickId;
            var inputs     = new LockstepInputs();
            var inputsDict = new Dictionary <int, Dictionary <int, List <UserInputs> > >();

            inputs.TickId    = tickId;
            inputs.DeltaTime = deltaTime;

            if (userInputsDict.ContainsKey(tickId) && userInputsDict[tickId].Count > 0)
            {
                for (int i = 0; i < userInputsDict[tickId].Count; i++)
                {
                    var userInputs = userInputsDict[tickId][i];
                    var userId     = userInputs.UserId;

                    if (!inputsDict.ContainsKey(userId))
                    {
                        inputsDict.Add(userId, new Dictionary <int, List <UserInputs> >());
                    }
                    if (!inputsDict[userId].ContainsKey(userInputs.Index))
                    {
                        inputsDict[userId].Add(userInputs.Index, new List <UserInputs>());
                    }
                    inputsDict[userId][userInputs.Index].Add(userInputs);
                }
            }

            var index          = 0;
            var e              = inputsDict.GetEnumerator();
            var userInputsList = new List <List <UserInputs> >();

            while (true)
            {
                userInputsList.Add(new List <UserInputs>());
                while (e.MoveNext())
                {
                    var count = e.Current.Value.Count;
                    if (index < count)
                    {
                        var keys = new int[count];
                        e.Current.Value.Keys.CopyTo(keys, 0);
                        userInputsList[index].AddRange(e.Current.Value[keys[index]]);
                    }
                }
                if (userInputsList[index].Count <= 0)
                {
                    userInputsList.RemoveAt(index);
                    break;
                }
                index++;
            }

            inputs.UserInputs = new UserInputs[userInputsList.Count][];
            for (int i = 0; i < userInputsList.Count; i++)
            {
                inputs.UserInputs[i] = new UserInputs[userInputsList[i].Count];
                userInputsList[i].CopyTo(inputs.UserInputs[i], 0);
            }

            lockstepInputs.Add(inputs);
            return(inputs);
        }