/// <summary>
        /// This method relay the vessel update to players in other planets
        /// </summary>
        public static void RelayToFarPlayers()
        {
            while (ServerContext.ServerRunning)
            {
                try
                {
                    if (IncomingFarUpdates.TryDequeue(out var vesselUpdate) && VesselsDictionary.ContainsKey(vesselUpdate.Key))
                    {
                        var farClients = VesselsDictionary.Where(v => !Equals(v.Key, vesselUpdate.Key) && v.Value != null &&
                                                                 v.Value.BodyName != vesselUpdate.Value.BodyName)
                                         .Select(v => v.Key);

                        foreach (var farClient in farClients.Where(c => ServerContext.Clients.ContainsKey(c.Endpoint)))
                        {
                            MessageQueuer.RelayMessage <VesselSrvMsg>(farClient, vesselUpdate.Value);
                        }
                    }
                }
                catch (Exception e)
                {
                    LunaLog.Error($"Error in RelayToFarPlayers method! Details: {e}");
                }
                Thread.Sleep(GeneralSettings.SettingsStore.FarDistanceUpdateIntervalMs);
            }
        }
예제 #2
0
        public static void HandleFlagListRequestMessage(ClientStructure client)
        {
            var flagList    = new Dictionary <string, FlagInfo>();
            var serverFlags = FileHandler.GetFilesInPath(FlagPath, SearchOption.AllDirectories);

            foreach (var serverFlag in serverFlags)
            {
                var flagName = Path.GetFileNameWithoutExtension(serverFlag)?.Replace('$', '/');

                //2 playes have the same flag name so in this case we only send the first one
                if (string.IsNullOrEmpty(flagName) || flagList.ContainsKey(flagName))
                {
                    continue;
                }

                var flagOwner = Path.GetDirectoryName(serverFlag);
                if (flagOwner == null)
                {
                    continue;
                }
                flagList.Add(flagName, new FlagInfo
                {
                    Owner    = flagOwner,
                    FlagData = File.ReadAllBytes(serverFlag),
                    FlagName = flagName
                });
            }

            var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <FlagListResponseMsgData>();

            msgData.FlagFiles = flagList.Values.ToArray();
            msgData.FlagCount = msgData.FlagFiles.Length;

            MessageQueuer.SendToClient <FlagSrvMsg>(client, msgData);
        }
예제 #3
0
        private static void HandleVesselDock(ClientStructure client, VesselBaseMsgData message)
        {
            var msgData = (VesselDockMsgData)message;

            LunaLog.Debug($"Docking message received! Dominant vessel: {msgData.DominantVesselId}");

            if (VesselContext.RemovedVessels.Contains(msgData.WeakVesselId))
            {
                return;
            }

            if (VesselStoreSystem.VesselExists(msgData.DominantVesselId))
            {
                LunaLog.Debug($"Saving DOCKED vessel {msgData.DominantVesselId} from {client.PlayerName}. Bytes: {msgData.NumBytes}");
            }
            VesselDataUpdater.RawConfigNodeInsertOrUpdate(msgData.DominantVesselId, Encoding.UTF8.GetString(msgData.FinalVesselData, 0, msgData.NumBytes));

            //Now remove the weak vessel but DO NOT add to the removed vessels as they might undock!!!
            LunaLog.Debug($"Removing weak docked vessel {msgData.WeakVesselId}");
            VesselStoreSystem.RemoveVessel(msgData.WeakVesselId);

            MessageQueuer.RelayMessage <VesselSrvMsg>(client, msgData);

            //Tell all clients to remove the weak vessel
            var removeMsgData = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselRemoveMsgData>();

            removeMsgData.VesselId = msgData.WeakVesselId;

            MessageQueuer.SendToAllClients <VesselSrvMsg>(removeMsgData);
        }
예제 #4
0
        public static void HandleMessage(ClientStructure client, IClientMessageBase message)
        {
            var data = (GroupBaseMsgData)message.Data;

            switch (data.GroupMessageType)
            {
            case GroupMessageType.ListRequest:

                var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <GroupListResponseMsgData>();
                msgData.Groups      = GroupSystem.Groups.Values.ToArray();
                msgData.GroupsCount = msgData.Groups.Length;
                MessageQueuer.SendToClient <GroupSrvMsg>(client, msgData);

                //We don't use this message anymore so we can recycle it
                message.Recycle();
                break;

            case GroupMessageType.CreateGroup:
                GroupSystem.CreateGroup(client.PlayerName, ((GroupCreateMsgData)data).GroupName);
                break;

            case GroupMessageType.RemoveGroup:
                GroupSystem.RemoveGroup(client.PlayerName, ((GroupRemoveMsgData)data).GroupName);
                break;

            case GroupMessageType.GroupUpdate:
                GroupSystem.UpdateGroup(client.PlayerName, ((GroupUpdateMsgData)data).Group);
                break;
            }
        }
예제 #5
0
        public override void HandleMessage(ClientStructure client, IClientMessageBase message)
        {
            var messageData = message.Data as PlayerColorBaseMsgData;

            switch (messageData?.PlayerColorMessageType)
            {
            case PlayerColorMessageType.Request:
                SendAllPlayerColors(client);

                //We don't use this message anymore so we can recycle it
                message.Recycle();
                break;

            case PlayerColorMessageType.Set:
                var data = (PlayerColorSetMsgData)messageData;
                if (data.PlayerColor.PlayerName != client.PlayerName)
                {
                    return;
                }

                Array.Copy(data.PlayerColor.Color, client.PlayerColor, data.PlayerColor.Color.Length);
                MessageQueuer.RelayMessage <PlayerColorSrvMsg>(client, data);
                break;
            }
        }
예제 #6
0
        private static void HandleVesselDock(ClientStructure client, VesselBaseMsgData message)
        {
            var msgData = (VesselDockMsgData)message;

            LunaLog.Debug($"Docking message received! Dominant vessel: {msgData.DominantVesselId}");

            if (VesselContext.RemovedVessels.Contains(msgData.WeakVesselId))
            {
                return;
            }

            var path = Path.Combine(ServerContext.UniverseDirectory, "Vessels", $"{msgData.DominantVesselId}.txt");

            if (!File.Exists(path))
            {
                LunaLog.Debug($"Saving vessel {msgData.DominantVesselId} from {client.PlayerName}");
            }
            FileHandler.WriteToFile(path, msgData.FinalVesselData, msgData.NumBytes);

            //Now remove the weak vessel
            LunaLog.Debug($"Removing weak docked vessel {msgData.WeakVesselId}");
            Universe.RemoveFromUniverse(Path.Combine(ServerContext.UniverseDirectory, "Vessels",
                                                     $"{msgData.WeakVesselId}.txt"));
            VesselContext.RemovedVessels.Add(msgData.WeakVesselId);

            MessageQueuer.RelayMessage <VesselSrvMsg>(client, msgData);

            //Tell all clients to remove the weak vessel
            var removeMsgData = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselRemoveMsgData>();

            removeMsgData.VesselId = msgData.WeakVesselId;

            MessageQueuer.SendToAllClients <VesselSrvMsg>(removeMsgData);
        }
예제 #7
0
        private static void HandleVesselProto(ClientStructure client, VesselBaseMsgData message)
        {
            var msgData = (VesselProtoMsgData)message;

            if (VesselContext.RemovedVessels.Contains(msgData.Vessel.VesselId))
            {
                return;
            }

            if (msgData.Vessel.NumBytes == 0)
            {
                LunaLog.Warning($"Received a vessel with 0 bytes ({msgData.Vessel.VesselId}) from {client.PlayerName}.");
                return;
            }

            var path = Path.Combine(ServerContext.UniverseDirectory, "Vessels", $"{msgData.Vessel.VesselId}.txt");

            if (!File.Exists(path))
            {
                LunaLog.Debug($"Saving vessel {msgData.Vessel.VesselId} from {client.PlayerName}. Bytes: {msgData.Vessel.NumBytes}");
            }

            FileHandler.WriteToFile(path, msgData.Vessel.Data, msgData.Vessel.NumBytes);

            MessageQueuer.RelayMessage <VesselSrvMsg>(client, msgData);
        }
예제 #8
0
        /// <summary>
        /// Sends the crafts in a folder
        /// </summary>
        public static void SendCraftList(ClientStructure client, CraftLibraryListRequestMsgData data)
        {
            var crafts       = new List <CraftBasicInfo>();
            var playerFolder = Path.Combine(CraftPath, data.FolderName);

            foreach (var craftType in Enum.GetNames(typeof(CraftType)))
            {
                var craftTypeFolder = Path.Combine(playerFolder, craftType);
                if (Directory.Exists(craftTypeFolder))
                {
                    foreach (var file in Directory.GetFiles(craftTypeFolder))
                    {
                        var craftName = Path.GetFileNameWithoutExtension(file);
                        crafts.Add(new CraftBasicInfo
                        {
                            CraftName  = craftName,
                            CraftType  = (CraftType)Enum.Parse(typeof(CraftType), craftType),
                            FolderName = data.FolderName
                        });
                    }
                }
            }

            var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <CraftLibraryListReplyMsgData>();

            msgData.FolderName        = data.FolderName;
            msgData.PlayerCrafts      = crafts.ToArray();
            msgData.PlayerCraftsCount = crafts.Count;

            MessageQueuer.SendToClient <CraftLibrarySrvMsg>(client, msgData);
            if (msgData.PlayerCraftsCount > 0)
            {
                LunaLog.Debug($"Sending {msgData.PlayerCraftsCount} ({data.FolderName}) crafts to: {client.PlayerName}");
            }
        }
예제 #9
0
        /// <summary>
        /// Sends the requested craft
        /// </summary>
        public static void SendCraft(ClientStructure client, CraftLibraryDownloadRequestMsgData data)
        {
            var lastTime = LastRequest.GetOrAdd(client.PlayerName, DateTime.MinValue);

            if (DateTime.Now - lastTime > TimeSpan.FromMilliseconds(CraftSettings.SettingsStore.MinCraftLibraryRequestIntervalMs))
            {
                LastRequest.AddOrUpdate(client.PlayerName, DateTime.Now, (key, existingVal) => DateTime.Now);
                var file = Path.Combine(CraftPath, data.CraftRequested.FolderName, data.CraftRequested.CraftType.ToString(),
                                        $"{data.CraftRequested.CraftName}.craft");

                if (FileHandler.FileExists(file))
                {
                    var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <CraftLibraryDataMsgData>();
                    msgData.Craft.CraftType  = data.CraftRequested.CraftType;
                    msgData.Craft.Data       = FileHandler.ReadFile(file);
                    msgData.Craft.NumBytes   = msgData.Craft.Data.Length;
                    msgData.Craft.FolderName = data.CraftRequested.FolderName;
                    msgData.Craft.CraftName  = data.CraftRequested.CraftName;

                    LunaLog.Debug($"Sending craft ({ByteSize.FromBytes(msgData.Craft.NumBytes).KiloBytes}{ByteSize.KiloByteSymbol}): {data.CraftRequested.CraftName} to: {client.PlayerName}.");
                    MessageQueuer.SendToClient <CraftLibrarySrvMsg>(client, msgData);
                }
            }
            else
            {
                LunaLog.Warning($"{client.PlayerName} is requesting crafts too fast!");
            }
        }
예제 #10
0
        private static void RunDekessler()
        {
            var vesselList = FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Vessels"));
            var removalCount = 0;
            foreach (var vesselFilePath in vesselList)
            {
                var vesselId = Path.GetFileNameWithoutExtension(vesselFilePath);

                if (!File.Exists(vesselFilePath)) continue;

                var vesselIsDebris = FileHandler.ReadFileLines(vesselFilePath).Select(l=> l.ToLower())
                    .Any(l => l.Contains("type = ") && l.Contains("debris"));

                if (vesselId != null && vesselIsDebris)
                {
                    LunaLog.Normal($"Removing debris vessel: {vesselId}");

                    //Delete it from the universe
                    Universe.RemoveFromUniverse(vesselFilePath);

                    //Send a vessel remove message
                    var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData<VesselRemoveMsgData>();
                    msgData.VesselId = Guid.Parse(vesselId);

                    MessageQueuer.SendToAllClients<VesselSrvMsg>(msgData);

                    removalCount++;
                }
            }

            if (removalCount > 0)
                LunaLog.Normal($"Removed {removalCount} debris");
        }
예제 #11
0
        public override void HandleMessage(ClientStructure client, IMessageData messageData)
        {
            var message = messageData as KerbalBaseMsgData;
            switch (message?.KerbalMessageType)
            {
                case KerbalMessageType.Request:
                    var kerbalFiles = FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Kerbals"));
                    var kerbalsData = kerbalFiles.Select(k => new KeyValuePair<string, byte[]>(Path.GetFileNameWithoutExtension(k),
                        FileHandler.ReadFile(k)));

                    LunaLog.Debug($"Sending {client.PlayerName} {kerbalFiles.Length} kerbals...");

                    var newMessageData = new KerbalReplyMsgData
                    {
                        KerbalsData = kerbalsData.ToArray()
                    };

                    MessageQueuer.SendToClient<KerbalSrvMsg>(client, newMessageData);
                    break;
                case KerbalMessageType.Proto:
                    var data = (KerbalProtoMsgData)message;

                    LunaLog.Debug($"Saving kerbal {data.KerbalName} from {client.PlayerName}");

                    var path = Path.Combine(ServerContext.UniverseDirectory, "Kerbals", $"{data.KerbalName}.txt");
                    FileHandler.WriteToFile(path, data.KerbalData);

                    MessageQueuer.RelayMessage<KerbalSrvMsg>(client, data);
                    break;
                default:
                    throw new NotImplementedException("Kerbal type not implemented");
            }
        }
예제 #12
0
        public override void HandleMessage(ClientStructure client, IMessageData messageData)
        {
            var baseMsg = (FacilityBaseMsgData)messageData;

            switch (baseMsg.FacilityMessageType)
            {
            case FacilityMessageType.Upgrade:
                var upgradeMsg = (FacilityUpgradeMsgData)messageData;
                LunaLog.Normal($"{client.PlayerName} UPGRADED facility {upgradeMsg.ObjectId} to level: {upgradeMsg.Level}");
                break;

            case FacilityMessageType.Repair:
                LunaLog.Normal($"{client.PlayerName} REPAIRED facility {baseMsg.ObjectId}");
                break;

            case FacilityMessageType.Collapse:
                LunaLog.Normal($"{client.PlayerName} DESTROYED facility {baseMsg.ObjectId}");
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            //We don't do anything on the server side with this messages so just relay them.
            MessageQueuer.RelayMessage <FacilitySrvMsg>(client, messageData);
        }
예제 #13
0
        private static void RunNuke()
        {
            var vesselList   = FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Vessels"));
            var removalCount = 0;

            foreach (var vesselFilePath in vesselList)
            {
                var vesselId = Path.GetFileNameWithoutExtension(vesselFilePath);
                var landed   = FileHandler.ReadFileLines(vesselFilePath).Select(l => l.ToLower())
                               .Any(l => l.Contains("landed at = ") && (l.Contains("ksc") || l.Contains("runway")));

                if (vesselId != null && landed)
                {
                    LunaLog.Normal($"Removing vessel {vesselId} from KSC");

                    //Delete it from the universe
                    Universe.RemoveFromUniverse(vesselFilePath);

                    //Send a vessel remove message
                    //Send it with a delete time of 0 so it shows up for all Players.
                    MessageQueuer.SendToAllClients <VesselSrvMsg>(new VesselRemoveMsgData
                    {
                        VesselId = Guid.Parse(vesselId)
                    });

                    removalCount++;
                }
            }

            if (removalCount > 0)
            {
                LunaLog.Normal($"Nuked {removalCount} vessels around the KSC");
            }
        }
예제 #14
0
        /// <summary>
        /// This method relays a message to the other clients in the same subspace and in case there are other players
        /// in older subspaces it stores it for further processing
        /// </summary>
        public static void HandleVesselMessage(ClientStructure client, VesselBaseMsgData msg)
        {
            if (client.Subspace == -1)
            {
                return;
            }

            MessageQueuer.RelayMessageToSubspace <VesselSrvMsg>(client, msg);

            if (GeneralSettings.SettingsStore.ShowVesselsInThePast)
            {
                foreach (var subspace in WarpSystem.GetFutureSubspaces(client.Subspace))
                {
                    MessageQueuer.RelayMessageToSubspace <VesselSrvMsg>(client, msg, subspace);
                }
            }

            //The client is running in the future so here we adjust the real sent time of the message
            msg.SentTime += WarpSystem.GetSubspaceTimeDifference(client.Subspace);
            foreach (var subspace in WarpSystem.GetPastSubspaces(client.Subspace))
            {
                if (!OldVesselMessages.ContainsKey(client.Subspace))
                {
                    OldVesselMessages.TryAdd(subspace, new ConcurrentQueue <VesselBaseMsgData>());
                }

                OldVesselMessages[subspace].Enqueue(msg);
            }
        }
예제 #15
0
        public static void LoadQuicksave(ClientStructure client, QuicksaveLoadRequestMsgData data)
        {
            Task.Run(() =>
            {
                var quicksaveFile = GetQuicksaveFile(data.QuicksaveInfo.Name, data.QuicksaveInfo.VesselId);
                if (!File.Exists(quicksaveFile))
                {
                    LunaLog.Warning($"Could not find quicksave {quicksaveFile}");
                    return;
                }

                var vesselData        = File.ReadAllText(quicksaveFile);
                var msgData           = ServerContext.ServerMessageFactory.CreateNewMessageData <QuicksaveLoadReplyMsgData>();
                msgData.QuicksaveInfo = new QuicksaveInfo
                {
                    Name     = data.QuicksaveInfo.Name,
                    Date     = data.QuicksaveInfo.Date,
                    VesselId = data.QuicksaveInfo.VesselId,
                    Data     = Encoding.UTF8.GetBytes(vesselData),
                    NumBytes = vesselData.Length
                };

                MessageQueuer.SendToClient <QuicksaveSrvMsg>(client, msgData);
                RemoveOldQuicksaves();
            });
        }
예제 #16
0
        public void HandleUploadFileMessage(ClientStructure client, CraftLibraryUploadMsgData message)
        {
            var playerPath = Path.Combine(Path.Combine(ServerContext.UniverseDirectory, "Crafts"),
                                          message.PlayerName);

            if (!FileHandler.FolderExists(playerPath))
            {
                FileHandler.FolderCreate(playerPath);
            }
            var typePath = Path.Combine(playerPath, message.UploadType.ToString());

            if (!FileHandler.FolderExists(typePath))
            {
                FileHandler.FolderCreate(typePath);
            }
            var craftFile = Path.Combine(typePath, $"{message.UploadName}.craft");

            FileHandler.WriteToFile(craftFile, message.CraftData);
            LunaLog.Debug($"Saving {message.UploadName}, Type: {message.UploadType} from {message.PlayerName}");

            var newMessageData = new CraftLibraryAddMsgData
            {
                PlayerName = message.PlayerName,
                UploadName = message.UploadName,
                UploadType = message.UploadType
            };

            MessageQueuer.RelayMessage <CraftLibrarySrvMsg>(client, newMessageData);
        }
예제 #17
0
 public static void Shutdown(string reason)
 {
     MessageQueuer.SendConnectionEndToAll(reason);
     Thread.Sleep(250);
     ServerStarting = false;
     ServerRunning  = false;
 }
예제 #18
0
        private static void HandleVesselsRequest(ClientStructure client)
        {
            var sendVesselCount = 0;

            var vesselList = new List <VesselInfo>();

            foreach (var file in FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Vessels")))
            {
                var vesselData = FileHandler.ReadFile(file);
                if (Guid.TryParse(Path.GetFileNameWithoutExtension(file), out var vesselId))
                {
                    sendVesselCount++;
                    vesselList.Add(new VesselInfo
                    {
                        Data     = vesselData,
                        NumBytes = vesselData.Length,
                        VesselId = vesselId
                    });
                }
            }

            var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselsReplyMsgData>();

            msgData.VesselsData  = vesselList.ToArray();
            msgData.VesselsCount = vesselList.Count;

            MessageQueuer.SendToClient <VesselSrvMsg>(client, msgData);
            LunaLog.Debug($"Sending {client.PlayerName} {sendVesselCount} vessels");
        }
예제 #19
0
        private static void HandleVesselsSync(ClientStructure client, VesselBaseMsgData message)
        {
            var msgData = (VesselSyncMsgData)message;

            var vesselsToSend = GetCurrentVesselIds().Except(msgData.VesselIds).ToArray();

            foreach (var vesselId in vesselsToSend)
            {
                var vesselData = FileHandler.ReadFile(Path.Combine(ServerContext.UniverseDirectory, "Vessels", $"{vesselId}.txt"));
                if (vesselData.Length > 0)
                {
                    var protoMsg = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselProtoMsgData>();
                    protoMsg.Vessel.Data     = vesselData;
                    protoMsg.Vessel.NumBytes = vesselData.Length;
                    protoMsg.Vessel.VesselId = vesselId;

                    MessageQueuer.SendToClient <VesselSrvMsg>(client, protoMsg);
                }
            }

            if (vesselsToSend.Length > 0)
            {
                LunaLog.Debug($"Sending {client.PlayerName} {vesselsToSend.Length} vessels");
            }
        }
예제 #20
0
        public static void SendAllSubspaces(ClientStructure client)
        {
            LunaLog.Debug($"Sending {client.PlayerName} {WarpContext.Subspaces.Count} possible subspaces");

            var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <WarpSubspacesReplyMsgData>();

            var subspaces = WarpContext.Subspaces.ToArray().Select(s =>
            {
                var players = ClientRetriever.GetAuthenticatedClients()
                              .Where(c => !Equals(c, client) && c.Subspace == s.Key)
                              .Select(c => c.PlayerName)
                              .ToArray();

                return(new SubspaceInfo
                {
                    PlayerCount = players.Length,
                    Players = players,
                    SubspaceKey = s.Key,
                    SubspaceTime = s.Value.Time
                });
            }).ToArray();


            msgData.Subspaces     = subspaces;
            msgData.SubspaceCount = subspaces.Length;

            MessageQueuer.SendToClient <WarpSrvMsg>(client, msgData);
        }
예제 #21
0
        public static void UpdateGroup(string clientPlayerName, Group group)
        {
            if (Groups.TryGetValue(group.Name, out var existingGroup))
            {
                if (existingGroup.Owner == clientPlayerName)
                {
                    //We are the owner of the group so we can do whatever we want
                    if (Groups.TryUpdate(group.Name, group, existingGroup))
                    {
                        var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <GroupUpdateMsgData>();
                        msgData.Group = group;

                        MessageQueuer.SendToAllClients <GroupSrvMsg>(msgData);
                        Task.Run(() => SaveGroups());
                    }
                }
                else
                {
                    //We are not the owner of the group so the only thing we can do is to add ourself to the "invited" hashset
                    if (group.Owner == existingGroup.Owner && Common.ScrambledEquals(group.Members, existingGroup.Members))
                    {
                        var invited = group.Invited.Except(existingGroup.Invited).ToArray();
                        if (invited.Length == 1 && invited[0] == clientPlayerName && Groups.TryUpdate(group.Name, group, existingGroup))
                        {
                            var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <GroupUpdateMsgData>();
                            msgData.Group = group;

                            MessageQueuer.SendToAllClients <GroupSrvMsg>(msgData);
                            Task.Run(() => SaveGroups());
                        }
                    }
                }
            }
        }
예제 #22
0
        private static void HandleVesselsRequest(ClientStructure client, IMessageData messageData)
        {
            var sendVesselCount   = 0;
            var cachedVesselCount = 0;
            var clientRequested   = (messageData as VesselsRequestMsgData)?.RequestList ?? new string[0];

            var vesselList = new List <KeyValuePair <string, byte[]> >();

            foreach (var file in FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Vessels")))
            {
                var vesselId     = Path.GetFileNameWithoutExtension(file);
                var vesselData   = FileHandler.ReadFile(file);
                var vesselObject = Common.CalculateSha256Hash(vesselData);
                if (clientRequested.Contains(vesselObject))
                {
                    sendVesselCount++;
                    vesselList.Add(new KeyValuePair <string, byte[]>(vesselId, vesselData));
                }
                else
                {
                    cachedVesselCount++;
                }
            }

            MessageQueuer.SendToClient <VesselSrvMsg>(client, new VesselsReplyMsgData {
                VesselsData = vesselList.ToArray()
            });
            LunaLog.Debug($"Sending {client.PlayerName} {sendVesselCount} vessels, cached: {cachedVesselCount}...");
        }
예제 #23
0
        private static void RunNuke()
        {
            var vesselList   = FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Vessels"));
            var removalCount = 0;

            foreach (var vesselFilePath in vesselList)
            {
                var vesselId = Path.GetFileNameWithoutExtension(vesselFilePath);

                var landed = FileHandler.ReadFileLines(vesselFilePath).Select(l => l.ToLower())
                             .Any(l => l.Contains("landedat = ") && (l.Contains("ksc") || l.Contains("runway")));

                if (vesselId != null && landed && !LockSystem.LockQuery.ControlLockExists(new Guid(vesselId)))
                {
                    LunaLog.Normal($"Removing vessel {vesselId} from KSC");

                    //Delete it from the universe
                    Universe.RemoveFromUniverse(vesselFilePath);

                    //Send a vessel remove message
                    var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselRemoveMsgData>();
                    msgData.VesselId = Guid.Parse(vesselId);

                    MessageQueuer.SendToAllClients <VesselSrvMsg>(msgData);

                    removalCount++;
                }
            }

            if (removalCount > 0)
            {
                LunaLog.Normal($"Nuked {removalCount} vessels around the KSC");
            }
        }
        /// <summary>
        /// This method relay the update to players in the same planet but farther than 25km
        /// </summary>
        public static void RelayToMediumDistancePlayers()
        {
            while (ServerContext.ServerRunning)
            {
                try
                {
                    KeyValuePair <ClientStructure, VesselPositionMsgData> vesselUpdate;
                    if (IncomingMediumUpdates.TryDequeue(out vesselUpdate) && VesselsDictionary.ContainsKey(vesselUpdate.Key))
                    {
                        IncomingFarUpdates.Enqueue(vesselUpdate);

                        var mediumDistanceClients = VesselsDictionary.Where(
                            v => !Equals(v.Key, vesselUpdate.Key) && v.Value != null &&
                            v.Value.BodyName == vesselUpdate.Value.BodyName &&
                            CalculateDistance(v.Value, vesselUpdate.Value) >
                            GeneralSettings.SettingsStore.CloseDistanceInMeters)
                                                    .Select(v => v.Key);

                        foreach (
                            var mediumDistanceClient in
                            mediumDistanceClients.Where(c => ServerContext.Clients.ContainsKey(c.Endpoint)))
                        {
                            MessageQueuer.RelayMessage <VesselSrvMsg>(mediumDistanceClient, vesselUpdate.Value);
                        }
                    }
                }
                catch (Exception e)
                {
                    LunaLog.Error($"Error in RelayToMediumDistancePlayers method! Details: {e}");
                }
                Thread.Sleep(GeneralSettings.SettingsStore.MediumDistanceUpdateIntervalMs);
            }
        }
예제 #25
0
        public static void HandleMessage(ClientStructure client, IClientMessageBase message)
        {
            var messageData = message.Data as PlayerStatusBaseMsgData;

            switch (messageData?.PlayerStatusMessageType)
            {
            case PlayerStatusMessageType.Request:
                SendOtherPlayerStatusesToNewPlayer(client);
                //We don't use this message anymore so we can recycle it
                message.Recycle();
                break;

            case PlayerStatusMessageType.Set:
                var data = (PlayerStatusSetMsgData)messageData;
                if (data.PlayerStatus.PlayerName != client.PlayerName)
                {
                    return;
                }

                client.PlayerStatus.VesselText = data.PlayerStatus.VesselText;
                client.PlayerStatus.StatusText = data.PlayerStatus.StatusText;
                MessageQueuer.RelayMessage <PlayerStatusSrvMsg>(client, data);
                break;
            }
        }
예제 #26
0
        private static void RunNuke()
        {
            uint removalCount = 0;

            var vesselList = VesselStoreSystem.CurrentVessels.ToArray();

            foreach (var vesselKeyVal in vesselList)
            {
                if (vesselKeyVal.Value.Fields.GetSingle("landed").Value.ToLower() == "true" &&
                    vesselKeyVal.Value.Fields.GetSingle("landedAt").Value.ToLower().Contains("ksc") ||
                    vesselKeyVal.Value.Fields.GetSingle("landedAt").Value.ToLower().Contains("runway") ||
                    vesselKeyVal.Value.Fields.GetSingle("landedAt").Value.ToLower().Contains("launchpad"))
                {
                    LunaLog.Normal($"Removing vessel: {vesselKeyVal.Key} from KSC");

                    VesselStoreSystem.RemoveVessel(vesselKeyVal.Key);

                    //Send a vessel remove message
                    var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselRemoveMsgData>();
                    msgData.VesselId = vesselKeyVal.Key;

                    MessageQueuer.SendToAllClients <VesselSrvMsg>(msgData);

                    removalCount++;
                }
            }

            if (removalCount > 0)
            {
                LunaLog.Normal($"Nuked {removalCount} vessels around the KSC");
            }
        }
예제 #27
0
        private static void RunDekessler()
        {
            var removalCount = 0;

            var vesselList = VesselStoreSystem.CurrentVesselsInXmlFormat.ToArray();

            foreach (var vesselKeyVal in vesselList)
            {
                if (IsVesselDebris(vesselKeyVal.Key, vesselKeyVal.Value))
                {
                    LunaLog.Normal($"Removing debris vessel: {vesselKeyVal.Key}");

                    VesselStoreSystem.RemoveVessel(vesselKeyVal.Key);

                    //Send a vessel remove message
                    var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselRemoveMsgData>();
                    msgData.VesselId = vesselKeyVal.Key;

                    MessageQueuer.SendToAllClients <VesselSrvMsg>(msgData);

                    removalCount++;
                }
            }

            if (removalCount > 0)
            {
                LunaLog.Normal($"Removed {removalCount} debris");
            }
        }
예제 #28
0
        public override void Execute(string commandArgs)
        {
            string playerName;
            string reason;

            CommandSystemHelperMethods.SplitCommand(commandArgs, out playerName, out reason);
            reason = string.IsNullOrEmpty(reason) ? "No reason specified" : reason;

            if (!string.IsNullOrEmpty(playerName))
            {
                var player = ClientRetriever.GetClientByName(playerName);

                if (player != null)
                {
                    MessageQueuer.SendConnectionEnd(player, $"You were banned from the server: {reason}");
                }

                Add(playerName);
                LunaLog.Normal($"Player '{playerName}' was banned from the server: {reason}");
            }
            else
            {
                LunaLog.Normal($"Player: {playerName} not found");
            }
        }
예제 #29
0
        private static void HandleVesselsSync(ClientStructure client, VesselBaseMsgData message)
        {
            var msgData = (VesselSyncMsgData)message;

            var allVessels = VesselStoreSystem.CurrentVesselsInXmlFormat.Keys.ToList();

            for (var i = 0; i < msgData.VesselsCount; i++)
            {
                allVessels.Remove(msgData.VesselIds[i]);
            }

            var vesselsToSend = allVessels;

            foreach (var vesselId in vesselsToSend)
            {
                var vesselData = VesselStoreSystem.GetVesselInConfigNodeFormat(vesselId);
                if (vesselData.Length > 0)
                {
                    var protoMsg = ServerContext.ServerMessageFactory.CreateNewMessageData <VesselProtoMsgData>();
                    protoMsg.Vessel.Data     = Encoding.UTF8.GetBytes(vesselData);
                    protoMsg.Vessel.NumBytes = vesselData.Length;
                    protoMsg.Vessel.VesselId = vesselId;

                    MessageQueuer.SendToClient <VesselSrvMsg>(client, protoMsg);
                }
            }

            if (allVessels.Count > 0)
            {
                LunaLog.Debug($"Sending {client.PlayerName} {vesselsToSend.Count} vessels");
            }
        }
예제 #30
0
        public static void RunDekessler(string commandText)
        {
            var vesselList   = FileHandler.GetFilesInPath(Path.Combine(ServerContext.UniverseDirectory, "Vessels"));
            var removalCount = 0;

            foreach (var vesselFilePath in vesselList)
            {
                var vesselIsDebris = FileHandler.ReadFileLines(vesselFilePath)
                                     .Any(l => l.Contains("Type = ") && l.Contains("Debris"));

                if (vesselIsDebris)
                {
                    var vesselId = Path.GetFileNameWithoutExtension(vesselFilePath);
                    LunaLog.Normal("Removing vessel: " + vesselId);

                    //Delete it from the universe
                    Universe.RemoveFromUniverse(vesselFilePath);

                    //Send a vessel remove message
                    //Send it with a delete time of 0 so it shows up for all Players.
                    MessageQueuer.SendToAllClients <VesselSrvMsg>(new VesselRemoveMsgData
                    {
                        PlanetTime = 0,
                        VesselId   = Guid.Parse(vesselId)
                    });

                    removalCount++;
                    LunaLog.Debug("Removed debris vessel " + vesselId);
                }
            }
            LunaLog.Normal("Removed " + removalCount + " debris");
        }