コード例 #1
0
        /// <summary>
        /// Creates a new subspace and sets its message queue from a past subspace.
        /// Must be called AFTER the subspace is created in the warp context.
        /// </summary>
        public static void CreateNewSubspace(int subspaceId)
        {
            //If the new subspace is the most advanced in time skip all this method
            if (!WarpSystem.GetFutureSubspaces(subspaceId).Any())
            {
                return;
            }

            var pastSubspaces = WarpSystem.GetPastSubspaces(subspaceId);

            if (pastSubspaces.Any())
            {
                //Here we get the PAST subspace that is closest in time to the one we got as parameter
                var closestPastSubspace = WarpContext.Subspaces
                                          .Where(s => pastSubspaces.Contains(s.Key))
                                          .OrderByDescending(s => s.Value)
                                          .Select(s => s.Key)
                                          .First();

                //Now we are going to get all the messages from that PAST subspace and remove the ones that are too old for our new subspace.
                //Te idea is that we are going to use a queue with a lot of messages that came from future and use for our new subspace
                //But in that queue there might be messages that are too old so we can remove them to save space
                var subspaceTime = WarpSystem.GetCurrentSubspaceTime(subspaceId);
                var messageQueue = DbCollection.Find(v => v.SubspaceId == closestPastSubspace && v.Msg.SentTime < subspaceTime).ToList();

                //Once we've got the queue clean of old messages we add it do the db
                //so the future subspaces fill up our queue.
                messageQueue.ForEach(m => m.SubspaceId = subspaceId);
                DbCollection.InsertBulk(messageQueue);
                DbCollection.EnsureIndex(x => x.Id);
                DbCollection.EnsureIndex(x => x.SubspaceId);
                DbCollection.EnsureIndex(x => x.GameTime);
            }
        }
コード例 #2
0
        /// <summary>
        /// Creates a new subspace and sets its message queue from a past subspace.
        /// Must be called AFTER the subspace is created in the warp context.
        /// </summary>
        public static void CreateNewSubspace(int subspaceId)
        {
            //If the new subspace is the most advanced in time skip all this method
            if (!WarpSystem.GetFutureSubspaces(subspaceId).Any())
            {
                return;
            }

            var pastSubspaces = WarpSystem.GetPastSubspaces(subspaceId);

            if (pastSubspaces.Any())
            {
                //Here we get the PAST subspace that is closest in time to the one we've got as a parameter
                var closestPastSubspace = WarpContext.Subspaces
                                          .Where(s => pastSubspaces.Contains(s.Key))
                                          .OrderByDescending(s => s.Value)
                                          .Select(s => s.Key)
                                          .First();

                //Now we clone it's message queue
                if (OldSubspaceVesselMessages.TryGetValue(closestPastSubspace, out var vesselsAndQueues))
                {
                    foreach (var vesselQueue in vesselsAndQueues)
                    {
                        var messageQueue = vesselQueue.Value.CloneConcurrentQueue();

                        //As we cloned a queue from a PAST subspace, we may have many messages
                        //that are TOO OLD as we are in a future subspace. Therefore, we remove the old
                        //messages for this subspace
                        var subspaceTime = WarpSystem.GetCurrentSubspaceTime(subspaceId);

                        while (messageQueue.TryDequeue(out var relayItem))
                        {
                            if (relayItem.Msg.SentTime >= subspaceTime)
                            {
                                break;
                            }
                        }

                        //Once we've got the queue clean of old messages we add it do the dictionary
                        //so the future subspaces fill up our queue.
                        OldSubspaceVesselMessages.TryAdd(subspaceId, new ConcurrentDictionary <Guid, ConcurrentQueue <VesselRelayItem> >
                        {
                            [vesselQueue.Key] = messageQueue
                        });
                    }
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// This method should be called in a thread.
        /// It runs over the old messages and sends them once the subspace time matches the message send time.
        /// </summary>
        public static async void RelayOldVesselMessages()
        {
            while (ServerContext.ServerRunning)
            {
                var messagesByGroup = DbCollection.FindAll().GroupBy(m => m.SubspaceId);
                foreach (var subspace in messagesByGroup)
                {
                    var subspaceTime = WarpSystem.GetCurrentSubspaceTime(subspace.Key);
                    var msgToSend    = subspace.Where(m => subspaceTime >= m.Msg.SentTime).ToList();
                    msgToSend.ForEach(m =>
                    {
                        MessageQueuer.SendMessageToSubspace <VesselSrvMsg>(m.Msg, m.SubspaceId);
                        DbCollection.Delete(m.Id);
                    });
                }

                DataBase.Shrink();
                await Task.Delay(IntervalSettings.SettingsStore.SendReceiveThreadTickMs);
            }
        }
コード例 #4
0
        /// <summary>
        /// This method should be called in a thread.
        /// It runs over the old messages and sends them once the subspace time matches the message send time.
        /// </summary>
        public static async void RelayOldVesselMessages()
        {
            while (ServerContext.ServerRunning)
            {
                foreach (var subspaceVessels in OldSubspaceVesselMessages.Where(m => !m.Value.IsEmpty))
                {
                    var subspaceTime = WarpSystem.GetCurrentSubspaceTime(subspaceVessels.Key);

                    foreach (var queue in subspaceVessels.Value)
                    {
                        while (queue.Value.TryPeek(out var relayItem) && subspaceTime >= relayItem.Msg.SentTime)
                        {
                            queue.Value.TryDequeue(out relayItem);
                            MessageQueuer.SendMessageToSubspace <VesselSrvMsg>(relayItem?.Msg, subspaceVessels.Key);
                        }
                    }
                }

                await Task.Delay(GeneralSettings.SettingsStore.SendReceiveThreadTickMs);
            }
        }