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