Exemplo n.º 1
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 void RelayOldVesselMessages()
        {
            while (ServerContext.ServerRunning)
            {
                foreach (var keyVal in OldVesselMessages.Where(m => !m.Value.IsEmpty))
                {
                    var subspaceTime = WarpSystem.GetCurrentSubspaceTime(keyVal.Key);

                    while (keyVal.Value.TryPeek(out var msg) && subspaceTime >= msg.SentTime)
                    {
                        keyVal.Value.TryDequeue(out msg);
                        MessageQueuer.SendMessageToSubspace <VesselSrvMsg>(msg, keyVal.Key);
                    }
                }

                Thread.Sleep(GeneralSettings.SettingsStore.SendReceiveThreadTickMs);
            }
        }
Exemplo n.º 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 subspaceTime = WarpSystem.GetCurrentSubspaceTime(subspaceId);

            //Here we get the PAST subspace that is closest in time to the one we got as parameter
            var pastSubspaces = WarpSystem.GetPastSubspaces(subspaceId);

            if (pastSubspaces.Any())
            {
                var closestPastSubspace = WarpContext.Subspaces
                                          .Where(s => pastSubspaces.Contains(s.Key))
                                          .OrderByDescending(s => s.Value)
                                          .Select(s => s.Key)
                                          .First();

                var originalqueue = OldVesselMessages[closestPastSubspace];

                var messages = new VesselBaseMsgData[originalqueue.Count];
                originalqueue.CopyTo(messages, 0);

                var messageQueue = new ConcurrentQueue <VesselBaseMsgData>(messages);

                //Now we remove the messages that are too old for this subspace
                VesselBaseMsgData msg;
                while (messageQueue.TryDequeue(out msg))
                {
                    if (msg.SentTime >= subspaceTime)
                    {
                        break;
                    }
                }

                OldVesselMessages.TryAdd(subspaceId, messageQueue);
            }
        }
Exemplo n.º 3
0
        public void HandleNewSubspace(ClientStructure client, WarpNewSubspaceMsgData message)
        {
            LunaLog.Debug($"{client.PlayerName} created a new subspace. Id {WarpContext.NextSubspaceId}");

            //Create Subspace
            WarpContext.Subspaces.TryAdd(WarpContext.NextSubspaceId, message.ServerTimeDifference);
            VesselRelaySystem.CreateNewSubspace(WarpContext.NextSubspaceId);

            //Tell all Clients about the new Subspace
            var newMessageData = new WarpNewSubspaceMsgData
            {
                ServerTimeDifference = message.ServerTimeDifference,
                PlayerCreator        = message.PlayerCreator,
                SubspaceKey          = WarpContext.NextSubspaceId
            };

            MessageQueuer.SendToAllClients <WarpSrvMsg>(newMessageData);

            WarpSystem.SaveSubspace(WarpContext.NextSubspaceId, message.ServerTimeDifference); //Save to disk
            WarpContext.NextSubspaceId++;
        }