public string Serialize(MainForm mainForm, bool bIsFinalExport = false) { List <string> referencedIslandNames = new List <string>(); foreach (IslandInstanceData instance in islandInstances) { Island referenceIsland = instance.GetReferencedIsland(mainForm.islands); if (referenceIsland == null) { continue; } if (referenceIsland.sublevelNames == null || referenceIsland.sublevelNames.Count == 0) { string emptyIslandName = referenceIsland.name; if (!referencedIslandNames.Contains(emptyIslandName)) { referencedIslandNames.Add(emptyIslandName); } } } foreach (string islandName in referencedIslandNames) { MessageBox.Show(string.Format("The island \"{0}\" has no defined sublevels and will not appear ingame", islandName), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } AtlasGridData ProjectObj = new AtlasGridData().SetFromData(cellSize, servers, islandInstances, discoZones, spawnRegions, WorldAtlasId, WorldFriendlyName, MetaWorldURL, coordsScaling, showServerInfo, showLines, alphaBackground, showBackground, backgroundImgPath, mainForm, idGenerator, regionsIdGenerator, mainForm.spawners.spawnersInfo, bUseUTCTime, Day0, globalTransitionMinZ, AdditionalCmdLineParams, OverrideShooterGameModeDefaultGameIni, LastImageOverrideUTC, showDiscoZoneInfo, discoZonesImagePath, shipPaths, shipPathsIdGenerator, showShipPathsInfo, ModIDs, showIslandNames, showForeground, foregroundImgPath, globalGameplaySetup, serverTemplates, bIsFinalExport, MapImageURL, AuthListURL, WorldAtlasPassword, columnUTCOffset); ProjectObj.BaseServerArgs = BaseServerArgs; ProjectObj.totalGridsX = numOfCellsX; ProjectObj.totalGridsY = numOfCellsY; if (!bIsFinalExport) { ProjectObj.LocalS3URL = LocalS3URL; ProjectObj.LocalS3AccessKeyId = LocalS3AccessKeyId; ProjectObj.LocalS3SecretKey = LocalS3SecretKey; ProjectObj.LocalS3BucketName = LocalS3BucketName; ProjectObj.LocalS3Region = LocalS3Region; ProjectObj.TribeLogConfig = TribeLogConfig; ProjectObj.SharedLogConfig = SharedLogConfig; ProjectObj.TravelDataConfig = TravelDataConfig; ProjectObj.DatabaseConnections = DatabaseConnections; } else { ProjectObj.LocalS3URL = null; ProjectObj.LocalS3AccessKeyId = null; ProjectObj.LocalS3SecretKey = null; ProjectObj.LocalS3BucketName = null; ProjectObj.LocalS3Region = null; ProjectObj.TribeLogConfig = null; ProjectObj.SharedLogConfig = null; ProjectObj.TravelDataConfig = null; ProjectObj.DatabaseConnections = null; ProjectObj.serverTemplates.Clear(); } return(JsonConvert.SerializeObject(ProjectObj, Formatting.Indented, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore })); }
public void Deserialize(string json, MainForm mainForm) { try { AtlasGridData deserializedProject = JsonConvert.DeserializeObject <AtlasGridData>(json, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Populate, NullValueHandling = NullValueHandling.Ignore }); if (deserializedProject.TribeLogConfig == null) { deserializedProject.TribeLogConfig = new TribeLogConfigInfo(); } if (deserializedProject.SharedLogConfig == null) { deserializedProject.SharedLogConfig = new SharedLogConfigInfo(); } if (deserializedProject.TravelDataConfig == null) { deserializedProject.TravelDataConfig = new BackupConfigInfo(); } this.cellSize = deserializedProject.gridSize; idGenerator = deserializedProject.idGenerator; regionsIdGenerator = deserializedProject.regionsIdGenerator; int maxX = 0, maxY = 0; List <ServerData> targetServerList = /*deserializedProject.originalServers != null ? deserializedProject.originalServers : */ deserializedProject.servers; foreach (ServerData deserializedServer in targetServerList) { if (deserializedServer.gridX > maxX) { maxX = deserializedServer.gridX; } if (deserializedServer.gridY > maxY) { maxY = deserializedServer.gridY; } Server s = new Server(deserializedServer.gridX, deserializedServer.gridY); s.MachineIdTag = deserializedServer.MachineIdTag; s.ip = deserializedServer.ip; s.port = deserializedServer.port; s.gamePort = deserializedServer.gamePort; s.seamlessDataPort = deserializedServer.seamlessDataPort; s.isHomeServer = deserializedServer.isHomeServer; s.AdditionalCmdLineParams = deserializedServer.AdditionalCmdLineParams; s.OverrideShooterGameModeDefaultGameIni = deserializedServer.OverrideShooterGameModeDefaultGameIni; s.name = deserializedServer.name; s.floorZDist = deserializedServer.floorZDist; s.transitionMinZ = deserializedServer.transitionMinZ; s.utcOffset = deserializedServer.utcOffset; s.GlobalBiomeSeamlessServerGridPreOffsetValues = deserializedServer.GlobalBiomeSeamlessServerGridPreOffsetValues; s.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater = deserializedServer.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater; s.OceanDinoDepthEntriesOverride = deserializedServer.OceanDinoDepthEntriesOverride; s.OceanEpicSpawnEntriesOverrideValues = deserializedServer.OceanEpicSpawnEntriesOverrideValues; s.oceanEpicSpawnEntriesOverrideTemplateName = deserializedServer.oceanEpicSpawnEntriesOverrideTemplateName; s.NPCShipSpawnEntriesOverrideTemplateName = deserializedServer.NPCShipSpawnEntriesOverrideTemplateName; s.regionOverrides = deserializedServer.regionOverrides; s.waterColorR = deserializedServer.waterColorR; s.waterColorG = deserializedServer.waterColorG; s.waterColorB = deserializedServer.waterColorB; s.skyStyleIndex = deserializedServer.skyStyleIndex; s.serverIslandPointsMultiplier = deserializedServer.serverIslandPointsMultiplier; s.ServerCustomDatas1 = deserializedServer.ServerCustomDatas1; s.ServerCustomDatas2 = deserializedServer.ServerCustomDatas2; s.ClientCustomDatas1 = deserializedServer.ClientCustomDatas1; s.ClientCustomDatas2 = deserializedServer.ClientCustomDatas2; s.oceanFloatsamCratesOverride = deserializedServer.oceanFloatsamCratesOverride; s.treasureMapLootTablesOverride = deserializedServer.treasureMapLootTablesOverride; s.lastModifiedUTC = deserializedServer.lastModified; s.lastImageOverrideUTC = deserializedServer.lastImageOverride; s.serverTemplateName = deserializedServer.serverTemplateName; if (s.serverTemplateName == null) { s.serverTemplateName = ""; } if (s.floorZDist <= 0) { s.floorZDist = 0; } s.islandLocked = deserializedServer.islandLocked; s.discoLocked = deserializedServer.discoLocked; s.pathsLocked = deserializedServer.pathsLocked; s.extraSublevels = deserializedServer.extraSublevels; servers.Add(s); foreach (IslandInstanceData deserializedIslandInstance in deserializedServer.islandInstances) { if (!mainForm.islands.ContainsKey(deserializedIslandInstance.name)) { continue; } //PointF worldPoint = s.RelativeToWorldPoint(cellSize, new PointF(deserializedIsland.additionalTranslationX, deserializedIsland.additionalTranslationY)); //islandInstances.Add(new IslandInstance(deserializedIsland.name, worldPoint.X, worldPoint.Y, deserializedIsland.additionalRotationYaw)); bool bRepeatedId = false; foreach (IslandInstanceData prevIslands in islandInstances) { if (prevIslands.id == deserializedIslandInstance.id) { bRepeatedId = true; break; } } if (deserializedIslandInstance.id == 0 || bRepeatedId) { deserializedIslandInstance.id = GenerateNewId(); } deserializedIslandInstance.SyncOverridesWithTemplates(mainForm); deserializedIslandInstance.maxTreasureQuality = deserializedIslandInstance.minTreasureQuality = -1; deserializedIslandInstance.useNpcVolumesForTreasures = false; deserializedIslandInstance.islandTreasureBottleSupplyCrateOverrides = ""; deserializedIslandInstance.islandPoints = 1; //deserializedIslandInstance.spawnPointRegionOverride = -1; islandInstances.Add(deserializedIslandInstance); } foreach (DiscoveryZoneData deserializedDiscoZone in deserializedServer.discoZones) { bool bRepeatedId = false; foreach (DiscoveryZoneData prevDiscoZones in discoZones) { if (prevDiscoZones.id == deserializedDiscoZone.id) { bRepeatedId = true; break; } } if (deserializedDiscoZone.id == 0 || bRepeatedId) { deserializedDiscoZone.id = GenerateUniqueDiscoZoneId(); } discoZones.Add(deserializedDiscoZone); } foreach (SpawnRegionData spawnRegion in deserializedServer.spawnRegions) { spawnRegion.X = deserializedServer.gridX; spawnRegion.Y = deserializedServer.gridY; spawnRegions.Add(spawnRegion); } } numOfCellsX = maxX + 1; numOfCellsY = maxY + 1; WorldFriendlyName = deserializedProject.WorldFriendlyName; WorldAtlasId = deserializedProject.WorldAtlasId; AuthListURL = deserializedProject.AuthListURL; MetaWorldURL = deserializedProject.MetaWorldURL; coordsScaling = deserializedProject.coordsScaling; showServerInfo = deserializedProject.showServerInfo; showDiscoZoneInfo = deserializedProject.showDiscoZoneInfo; showIslandNames = deserializedProject.showIslandNames; showShipPathsInfo = deserializedProject.showShipPathsInfo; showLines = deserializedProject.showLines; alphaBackground = deserializedProject.alphaBackground; showBackground = deserializedProject.showBackground; showForeground = deserializedProject.showForeground; backgroundImgPath = deserializedProject.backgroundImgPath; foregroundImgPath = deserializedProject.foregroundImgPath; discoZonesImagePath = deserializedProject.discoZonesImagePath; ModIDs = deserializedProject.ModIDs; MapImageURL = deserializedProject.MapImageURL; BaseServerArgs = deserializedProject.BaseServerArgs; LocalS3URL = deserializedProject.LocalS3URL; LocalS3AccessKeyId = deserializedProject.LocalS3AccessKeyId; LocalS3SecretKey = deserializedProject.LocalS3SecretKey; LocalS3BucketName = deserializedProject.LocalS3BucketName; LocalS3Region = deserializedProject.LocalS3Region; globalGameplaySetup = deserializedProject.globalGameplaySetup; TribeLogConfig = deserializedProject.TribeLogConfig; TravelDataConfig = deserializedProject.TravelDataConfig; SharedLogConfig = deserializedProject.SharedLogConfig; DatabaseConnections = deserializedProject.DatabaseConnections; bUseUTCTime = deserializedProject.bUseUTCTime; columnUTCOffset = deserializedProject.columnUTCOffset; globalTransitionMinZ = deserializedProject.globalTransitionMinZ; AdditionalCmdLineParams = deserializedProject.AdditionalCmdLineParams; OverrideShooterGameModeDefaultGameIni = deserializedProject.OverrideShooterGameModeDefaultGameIni; Day0 = deserializedProject.Day0; LastImageOverrideUTC = deserializedProject.lastImageOverride; WorldAtlasPassword = deserializedProject.WorldAtlasPassword; if (deserializedProject.shipPaths != null) { shipPaths = deserializedProject.shipPaths; foreach (ShipPathData shipPath in shipPaths) { foreach (BezierNodeData bezierNode in shipPath.Nodes) { bezierNode.shipPath = shipPath; } } } shipPathsIdGenerator = deserializedProject.shipPathsIdGenerator; serverTemplates = deserializedProject.serverTemplates; if (serverTemplates == null) { serverTemplates = new List <ServerTemplateData>(); } successfullyLoaded = true; } catch (Exception e) { MessageBox.Show("Failed to parse project json, Message: " + e.Message, "Error"); } }
public static AtlasGridData SetFromData(this AtlasGridData Data, float gridSize, List <Server> serverList, List <IslandInstanceData> islandInstances, List <DiscoveryZoneData> discoZones, List <SpawnRegionData> spawnRegions, string WorldAtlasId, string WorldFriendlyName, string MetaWorldURL, float coordsScaling, bool showServerInfo, bool showLines, bool alphaBackground, bool showBackground, string backgroundImgPath, MainForm mainForm, int idGenerator, int regionsIdGenerator, List <SpawnerInfoData> spawnerOverrideTemplates, bool bUseUTCTime, string Day0, float globalTransitionMinZ, string AdditionalCmdLineParams, Dictionary <string, string> OverrideShooterGameModeDefaultGameIni, DateTime lastImageOverride, bool showDiscoZoneInfo, string discoZonesImagePath, List <ShipPathData> shipPaths, int shipPathsIdGenerator, bool showShipPathsInfo, string modIDs, bool showIslandNames, bool showForeground, string foregroundImgPath, string globalGameplaySetup, List <ServerTemplateData> serverTemplates, bool bIsFinalExport, string MapImageURL, string AuthListURL, string WorldAtlasPassword, float columnUTCOffset) { Data.gridSize = gridSize; foreach (Server server in serverList) { List <IslandInstanceData> serverIslands = new List <IslandInstanceData>(); foreach (IslandInstanceData instance in islandInstances) { if (server.IsWorldPointInServer(new System.Drawing.PointF(instance.worldX, instance.worldY), gridSize)) { serverIslands.Add(instance); } } List <DiscoveryZoneData> serverDiscos = new List <DiscoveryZoneData>(); foreach (DiscoveryZoneData instance in discoZones) { if (server.IsWorldPointInServer(new System.Drawing.PointF(instance.worldX, instance.worldY), gridSize)) { serverDiscos.Add(instance); } } List <SpawnRegionData> serverSpawnRegions = new List <SpawnRegionData>(); foreach (SpawnRegionData region in spawnRegions) { if (server.gridX == region.X && server.gridY == region.Y) { serverSpawnRegions.Add(region); } } if (!bIsFinalExport) { Data.servers.Add(new ServerData().SetFrom(server, gridSize, server.gridX, server.gridY, server.MachineIdTag, server.ip, server.port, server.gamePort, server.seamlessDataPort, serverIslands, serverDiscos, serverSpawnRegions, mainForm, server.isHomeServer, server.AdditionalCmdLineParams, server.OverrideShooterGameModeDefaultGameIni, server.name, server.floorZDist, server.transitionMinZ, server.utcOffset, server.OceanDinoDepthEntriesOverride, server.oceanFloatsamCratesOverride, server.treasureMapLootTablesOverride, server.lastModifiedUTC, server.lastImageOverrideUTC, server.GlobalBiomeSeamlessServerGridPreOffsetValues, server.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater, server.islandLocked, server.discoLocked, server.pathsLocked, server.extraSublevels, server.oceanEpicSpawnEntriesOverrideTemplateName, server.NPCShipSpawnEntriesOverrideTemplateName, server.regionOverrides, server.waterColorR, server.waterColorG, server.waterColorB, server.skyStyleIndex, server.serverIslandPointsMultiplier, server.ServerCustomDatas1, server.ServerCustomDatas2, server.ClientCustomDatas1, server.ClientCustomDatas2, server.serverTemplateName, server.OceanEpicSpawnEntriesOverrideValues)); } else { //Sublevels need to be overridden here to be processed in the constructor List <string> overridenExtraSublevels = server.extraSublevels; if (!string.IsNullOrEmpty(server.serverTemplateName)) { ServerTemplateData serverTemplate = mainForm.currentProject.GetServerTemplateByName(server.serverTemplateName); if (serverTemplate != null && server.extraSublevels.Count == 0) { overridenExtraSublevels = serverTemplate.extraSublevels; } } //ServerSerializationObject exportServerObj = new ServerSerializationObject(server, gridSize, server.gridX, server.gridY, server.MachineIdTag, server.ip, server.port, ServerData exportServerObj = new ServerData().SetFrom(server, gridSize, server.gridX, server.gridY, server.MachineIdTag, server.ip, server.port, server.gamePort, server.seamlessDataPort, serverIslands, serverDiscos, serverSpawnRegions, mainForm, server.isHomeServer, server.AdditionalCmdLineParams, server.OverrideShooterGameModeDefaultGameIni, server.name, server.floorZDist, server.transitionMinZ, server.utcOffset, server.OceanDinoDepthEntriesOverride, server.oceanFloatsamCratesOverride, server.treasureMapLootTablesOverride, server.lastModifiedUTC, server.lastImageOverrideUTC, server.GlobalBiomeSeamlessServerGridPreOffsetValues, server.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater, server.islandLocked, server.discoLocked, server.pathsLocked, overridenExtraSublevels, server.oceanEpicSpawnEntriesOverrideTemplateName, server.NPCShipSpawnEntriesOverrideTemplateName, server.regionOverrides, server.waterColorR, server.waterColorG, server.waterColorB, server.skyStyleIndex, server.serverIslandPointsMultiplier, server.ServerCustomDatas1, server.ServerCustomDatas2, server.ClientCustomDatas1, server.ClientCustomDatas2, server.serverTemplateName, server.OceanEpicSpawnEntriesOverrideValues); //Apply template if (!string.IsNullOrEmpty(server.serverTemplateName)) { ServerTemplateData serverTemplate = mainForm.currentProject.GetServerTemplateByName(server.serverTemplateName); if (serverTemplate != null) { //Overrides exportServerObj.floorZDist = server.floorZDist != 0 ? server.floorZDist : serverTemplate.floorZDist; exportServerObj.transitionMinZ = server.transitionMinZ != 0 ? server.transitionMinZ : serverTemplate.transitionMinZ; exportServerObj.oceanEpicSpawnEntriesOverrideTemplateName = !string.IsNullOrEmpty(server.oceanEpicSpawnEntriesOverrideTemplateName) ? server.oceanEpicSpawnEntriesOverrideTemplateName : serverTemplate.oceanEpicSpawnEntriesOverrideTemplateName; exportServerObj.NPCShipSpawnEntriesOverrideTemplateName = !string.IsNullOrEmpty(server.NPCShipSpawnEntriesOverrideTemplateName) ? server.NPCShipSpawnEntriesOverrideTemplateName : serverTemplate.NPCShipSpawnEntriesOverrideTemplateName; exportServerObj.waterColorR = server.waterColorR != 0 ? server.waterColorR : serverTemplate.waterColorR; exportServerObj.waterColorG = server.waterColorG != 0 ? server.waterColorG : serverTemplate.waterColorG; exportServerObj.waterColorB = server.waterColorB != 0 ? server.waterColorB : serverTemplate.waterColorB; exportServerObj.skyStyleIndex = server.skyStyleIndex != 0 ? server.skyStyleIndex : serverTemplate.skyStyleIndex; exportServerObj.serverIslandPointsMultiplier = server.serverIslandPointsMultiplier != 1.0f ? server.serverIslandPointsMultiplier : serverTemplate.serverIslandPointsMultiplier; exportServerObj.GlobalBiomeSeamlessServerGridPreOffsetValues = !string.IsNullOrEmpty(server.GlobalBiomeSeamlessServerGridPreOffsetValues) ? server.GlobalBiomeSeamlessServerGridPreOffsetValues : serverTemplate.GlobalBiomeSeamlessServerGridPreOffsetValues; exportServerObj.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater = !string.IsNullOrEmpty(server.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater) ? server.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater : serverTemplate.GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater; exportServerObj.OceanDinoDepthEntriesOverride = !string.IsNullOrEmpty(server.OceanDinoDepthEntriesOverride) ? server.OceanDinoDepthEntriesOverride : serverTemplate.OceanDinoDepthEntriesOverride; exportServerObj.OceanEpicSpawnEntriesOverrideValues = !string.IsNullOrEmpty(server.OceanEpicSpawnEntriesOverrideValues) ? server.OceanEpicSpawnEntriesOverrideValues : serverTemplate.OceanEpicSpawnEntriesOverrideValues; exportServerObj.oceanFloatsamCratesOverride = !string.IsNullOrEmpty(server.oceanFloatsamCratesOverride) ? server.oceanFloatsamCratesOverride : serverTemplate.oceanFloatsamCratesOverride; exportServerObj.treasureMapLootTablesOverride = !string.IsNullOrEmpty(server.treasureMapLootTablesOverride) ? server.treasureMapLootTablesOverride : serverTemplate.treasureMapLootTablesOverride; exportServerObj.regionOverrides = !string.IsNullOrEmpty(server.regionOverrides) ? server.regionOverrides : serverTemplate.regionOverrides; //Appends exportServerObj.AdditionalCmdLineParams = exportServerObj.AdditionalCmdLineParams + serverTemplate.AdditionalCmdLineParams; foreach (KeyValuePair <string, string> kvp in serverTemplate.OverrideShooterGameModeDefaultGameIni) { if (!exportServerObj.OverrideShooterGameModeDefaultGameIni.ContainsKey(kvp.Key)) { exportServerObj.OverrideShooterGameModeDefaultGameIni.Add(kvp.Key, kvp.Value); } } //Splice these together cleanly: if (!string.IsNullOrWhiteSpace(exportServerObj.ServerCustomDatas1)) { exportServerObj.ServerCustomDatas1 = exportServerObj.ServerCustomDatas1.TrimEnd(','); } if (!string.IsNullOrWhiteSpace(exportServerObj.ServerCustomDatas2)) { exportServerObj.ServerCustomDatas2 = exportServerObj.ServerCustomDatas2.TrimEnd(','); } if (!string.IsNullOrWhiteSpace(exportServerObj.ClientCustomDatas1)) { exportServerObj.ClientCustomDatas1 = exportServerObj.ClientCustomDatas1.TrimEnd(','); } if (!string.IsNullOrWhiteSpace(exportServerObj.ClientCustomDatas2)) { exportServerObj.ClientCustomDatas2 = exportServerObj.ClientCustomDatas2.TrimEnd(','); } if (!string.IsNullOrWhiteSpace(serverTemplate.ServerCustomDatas1)) { exportServerObj.ServerCustomDatas1 = exportServerObj.ServerCustomDatas1 + "," + serverTemplate.ServerCustomDatas1.TrimStart(','); } if (!string.IsNullOrWhiteSpace(serverTemplate.ServerCustomDatas2)) { exportServerObj.ServerCustomDatas2 = exportServerObj.ServerCustomDatas2 + "," + serverTemplate.ServerCustomDatas2.TrimStart(','); } if (!string.IsNullOrWhiteSpace(serverTemplate.ClientCustomDatas1)) { exportServerObj.ClientCustomDatas1 = exportServerObj.ClientCustomDatas1 + "," + serverTemplate.ClientCustomDatas1.TrimStart(','); } if (!string.IsNullOrWhiteSpace(serverTemplate.ClientCustomDatas2)) { exportServerObj.ClientCustomDatas2 = exportServerObj.ClientCustomDatas2 + "," + serverTemplate.ClientCustomDatas2.TrimStart(','); } } } Data.servers.Add(exportServerObj); } } Data.MetaWorldURL = MetaWorldURL; Data.WorldFriendlyName = WorldFriendlyName; Data.WorldAtlasId = WorldAtlasId; Data.coordsScaling = coordsScaling; Data.showServerInfo = showServerInfo; Data.showDiscoZoneInfo = showDiscoZoneInfo; Data.showShipPathsInfo = showShipPathsInfo; Data.showLines = showLines; Data.alphaBackground = alphaBackground; Data.showBackground = showBackground; Data.showForeground = showForeground; Data.backgroundImgPath = backgroundImgPath; Data.foregroundImgPath = foregroundImgPath; Data.idGenerator = idGenerator; Data.regionsIdGenerator = regionsIdGenerator; Data.spawnerOverrideTemplates = spawnerOverrideTemplates; Data.bUseUTCTime = bUseUTCTime; Data.columnUTCOffset = columnUTCOffset; Data.globalTransitionMinZ = globalTransitionMinZ; Data.AdditionalCmdLineParams = AdditionalCmdLineParams; Data.OverrideShooterGameModeDefaultGameIni = OverrideShooterGameModeDefaultGameIni; Data.Day0 = Day0; Data.discoZonesImagePath = discoZonesImagePath; Data.lastImageOverride = lastImageOverride; Data.ModIDs = modIDs; Data.MapImageURL = MapImageURL; Data.AuthListURL = AuthListURL; if (shipPaths != null) { Data.shipPaths = shipPaths; } Data.shipPathsIdGenerator = shipPathsIdGenerator; Data.showIslandNames = showIslandNames; Data.globalGameplaySetup = globalGameplaySetup; if (serverTemplates == null) { serverTemplates = new List <ServerTemplateData>(); } Data.serverTemplates = serverTemplates.ToList(); Data.WorldAtlasPassword = WorldAtlasPassword; return(Data); }