public static bool isLevelOnline(LevelNameAndPathPair TestLevel) { if (!SteamworksManager.IsSteamBuild_) { return(true); } var levelSetsManager = G.Sys.LevelSets_; foreach (var Level in levelSetsManager.OfficialLevelNameAndPathPairs_) { if (Level.levelPath_ == TestLevel.levelPath_) { return(true); } } // Checking the private field appears to be the only way to go about this :( var retrievedPublishedFileIds = (List <ulong>)PrivateUtilities.getPrivateField(G.Sys.SteamworksManager_.UGC_, "retrievedPublishedFileIds_"); foreach (var Level in levelSetsManager.WorkshopLevelNameAndPathPairs_) { if (Level.levelPath_ == TestLevel.levelPath_) { var relativePath = levelSetsManager.GetLevelInfo(Level.levelPath_).relativePath_; WorkshopLevelInfo levelInfo = null; G.Sys.SteamworksManager_.UGC_.TryGetWorkshopLevelData(relativePath, out levelInfo); if (levelInfo != null) { var hasLevelId = retrievedPublishedFileIds.Contains((ulong)levelInfo.levelID_); return(hasLevelId); } } } return(false); }
public override void Apply(List <PlaylistLevel> levels) { var levelSetsManager = G.Sys.LevelSets_; var ugc = G.Sys.SteamworksManager_.UGC_; foreach (var level in levels) { WorkshopLevelInfo workshopLevelInfo = null; if (!SteamworksManager.IsSteamBuild_ ? false : ugc.TryGetWorkshopLevelData(levelSetsManager.GetLevelInfo(level.level.levelNameAndPath_.levelPath_).relativePath_, out workshopLevelInfo)) { level.Mode(mode, comparison.Compare(workshopLevelInfo.timeCreated_)); } else { level.Mode(mode, false); } } }
public static string formatLevelInfoText(LevelNameAndPathPair level, GameModeID mode, int index, string levelInfoText) { var resText = levelInfoText; var success = GeneralUtilities.logExceptions(() => { bool isPointsMode = G.Sys.GameManager_.Mode_ is PointsBasedMode; var levelSetsManager = G.Sys.LevelSets_; var levelInfo = levelSetsManager.GetLevelInfo(level.levelPath_); WorkshopLevelInfo workshopLevelInfo = null; if (SteamworksManager.IsSteamBuild_) { G.Sys.SteamworksManager_.UGC_.TryGetWorkshopLevelData(levelInfo.relativePath_, out workshopLevelInfo); } resText = resText .Replace("%NAME%", levelInfo.levelName_) .Replace("%DIFFICULTY%", levelInfo.difficulty_.ToString()) .Replace("%AUTHOR%", getAuthorName(levelInfo)) .Replace("%MODE%", mode.ToString()) .Replace("%INDEX%", index.ToString()); if (levelInfo.SupportsMedals(mode)) { resText = resText .Replace("%MBRONZE%", levelInfo.GetMedalRequirementString(MedalStatus.Bronze, isPointsMode)) .Replace("%MSILVER%", levelInfo.GetMedalRequirementString(MedalStatus.Silver, isPointsMode)) .Replace("%MGOLD%", levelInfo.GetMedalRequirementString(MedalStatus.Gold, isPointsMode)) .Replace("%MDIAMOND%", levelInfo.GetMedalRequirementString(MedalStatus.Diamond, isPointsMode)); } else { resText = resText .Replace("%MBRONZE%", "None") .Replace("%MSILVER%", "None") .Replace("%MGOLD%", "None") .Replace("%MDIAMOND%", "None"); } if (workshopLevelInfo != null) { resText = resText .Replace("%STARS%", SteamworksUGC.GetWorkshopRatingText(workshopLevelInfo)) .Replace("%STARSINT%", ((int)(workshopLevelInfo.voteScore_ / 0.2f + 0.5f)).ToString()) .Replace("%STARSDEC%", (workshopLevelInfo.voteScore_ / 0.2f).ToString("F2")) .Replace("%STARSPCT%", ((int)(workshopLevelInfo.voteScore_ * 100f)).ToString()) .Replace("%CREATED%", GeneralUtilities.ConvertFromUnixTimestamp(workshopLevelInfo.timeCreated_).ToString("d", CultureInfo.CurrentCulture)) .Replace("%UPDATED%", GeneralUtilities.ConvertFromUnixTimestamp(workshopLevelInfo.timeUpdated_).ToString("d", CultureInfo.CurrentCulture)); } else { resText = resText .Replace("%STARS%", "None") .Replace("%STARSINT%", "X") .Replace("%STARSDEC%", "X") .Replace("%STARSPCT%", "X") .Replace("%CREATED%", "") .Replace("%UPDATED%", ""); } var replacements = Cmds.Cmd.all.getCommand <Cmds.LevelCmd>().levelFormatReplacements; foreach (var pair in replacements) { try { resText = Regex.Replace(resText, pair.Key, pair.Value); } catch (ArgumentException) { Console.WriteLine($"Invalid regex replace ({pair.Key}) => ({pair.Value}). You can test your regex at regex101.com."); MessageUtilities.sendMessage(GeneralUtilities.localClient(), $"Invalid regex replace ({pair.Key}) => ({pair.Value}).\nYou can test your regex at regex101.com."); } } }); if (!success) { logExceptions(() => { MessageUtilities.sendMessage(GeneralUtilities.localClient(), "Please check your console and report the level format debug info to a ServerMod developer."); Console.WriteLine("Level format debug info:"); Console.WriteLine($" produced string: {resText}"); Console.WriteLine($" level: {level}; {level?.levelName_}; {level?.levelPath_}"); Console.WriteLine($" mode: {mode};"); Console.WriteLine($" index: {index};"); Console.WriteLine($" levelInfoText: {levelInfoText};"); Console.WriteLine($" G.Sys.GameManager_.Mode_: {G.Sys?.GameManager_?.Mode_};"); Console.WriteLine($" G.Sys.LevelSets_: {G.Sys?.LevelSets_};"); var levelSetsManager = G.Sys?.LevelSets_; var levelInfo = levelSetsManager?.GetLevelInfo(level.levelPath_); Console.WriteLine($" levelInfo: {levelInfo};"); WorkshopLevelInfo workshopLevelInfo = null; if (SteamworksManager.IsSteamBuild_) { G.Sys.SteamworksManager_.UGC_.TryGetWorkshopLevelData(levelInfo.relativePath_, out workshopLevelInfo); } Console.WriteLine($" workshopLevelInfo: {workshopLevelInfo};"); }); } return(resText); }