public InputSubmissionId SubmitInput(SimInput input)
        {
            if (input == null)
            {
                Log.Error("Trying to submit a null input");
                return(InputSubmissionId.Invalid);
            }

            var session = GetSession();

            if (session != null && session is SessionClientInterface clientSession)
            {
                // CLIENT
                var syncSystem = World.GetExistingSystem <ReceiveSimulationSyncSystem>();
                if (syncSystem != null && syncSystem.IsSynchronizing)
                {
                    Log.Info("Discarding input since we are syncing to the simulation");
                    return(InputSubmissionId.Invalid);
                }

                var submissionId = InputSubmissionId.Generate();
                clientSession.SendNetMessageToServer(new NetMessageInputSubmission()
                {
                    submissionId = submissionId,
                    input        = input
                });
                return(submissionId);
            }
            else
            {
                // SERVER AND LOCAL
                var submissionId = InputSubmissionId.Generate();
                World.GetOrCreateSystem <ConstructSimulationTickSystem>()
                .SubmitInputInternal(
                    input: input,
                    instigatorConnection: null, // local connection => null
                    submissionId: submissionId);
                return(submissionId);
            }
        }
示例#2
0
 public InputSubmissionId(InputSubmissionId other)
 {
     this.Value = other.Value;
 }
示例#3
0
        //public bool IsLocallySubmittedInputInQueue(InputSubmissionId inputSubmissionId)
        //{
        //    foreach (var item in _inputSubmissionQueue)
        //    {
        //        if (item.InstigatorConnectionId == uint.MaxValue && item.ClientSubmissionId == inputSubmissionId)
        //            return true;
        //    }

        //    return false;
        //}

        public void SubmitInputInternal(SimInput input, INetworkInterfaceConnection instigatorConnection, InputSubmissionId submissionId)
        {
            if (ValidateInput(input, instigatorConnection))
            {
                Log.Info(SimulationIO.LogChannel, $"Accepted sim input from '{(instigatorConnection == null ? "local player" : instigatorConnection.Id.ToString())}': {input}");

                _inputSubmissionQueue.Enqueue(new SimInputSubmission()
                {
                    Input = input,
                    InstigatorConnectionId = instigatorConnection == null ? uint.MaxValue : instigatorConnection.Id,
                    ClientSubmissionId     = submissionId
                });
            }
            else
            {
                Log.Info(SimulationIO.LogChannel, $"Refused sim input from '{(instigatorConnection == null ? "local player" : instigatorConnection.Id.ToString())}': {input}");
            }
        }