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