using System; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("PaceRef")] [assembly: AssemblyDescription("Enhanced scoreboard and pace reference mod for Distance")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PaceRef")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("b8c7f4e2-9a3d-4f1b-8e5c-7d2a1f9e3b6a")] [assembly: AssemblyFileVersion("1.0.3.0")] [assembly: AssemblyVersion("1.0.3.0")] namespace PaceRef { public static class Constants { public static class Config { public const string SectionName = "PaceRef - Enhanced Scoreboard"; public const string SampleSize = "Sample Size"; public const string SampleSizeDescription = "Set the number of samples to use for calculating the average time."; } public const string PluginGuid = "F2E8A3C7-9D1B-4F6E-8A5C-3E7D2F9B1A4E"; public const string PluginName = "PaceRef - Enhanced Scoreboard"; public const string HarmonyId = "de.kilika.distance.PaceRef"; } [BepInPlugin("F2E8A3C7-9D1B-4F6E-8A5C-3E7D2F9B1A4E", "PaceRef - Enhanced Scoreboard", "1.0.0")] public sealed class Mod : BaseUnityPlugin { internal static ManualLogSource Logger { get; private set; } internal static ConfigEntry SampleSizeConfig { get; set; } private void Awake() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) Logger = Logger.CreateLogSource("PaceRef - Enhanced Scoreboard"); ConfigDescription val = new ConfigDescription("Set the number of samples to use for calculating the average time.", (AcceptableValueBase)(object)new AcceptableValueRange(10, 1000), new object[0]); SampleSizeConfig = ((BaseUnityPlugin)this).Config.Bind("PaceRef - Enhanced Scoreboard", "Sample Size", 100, val); Harmony val2 = new Harmony("de.kilika.distance.PaceRef"); Logger.LogInfo((object)"Loading PaceRef..."); val2.PatchAll(); Logger.LogInfo((object)"PaceRef loaded successfully!"); } } internal static class ScoreboardBuilder { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func <>9__4_0; public static Func <>9__4_1; internal string b__4_0(int ms) { return GUtils.GetFormattedMS((double)ms); } internal string b__4_1(int score) { return score.ToString("N0", CultureInfo.InvariantCulture) + " eV"; } } internal static string Build(int[] scores, int sampleSize, GameModeID gameModeId) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (Math.Min(sampleSize, scores.Length) == 0) { return NguiLabel("No scores yet!"); } int[] array = scores.Take(sampleSize).ToArray(); int arg = scores[0]; int arg2 = (int)array.Average(); Func formatter = GetFormatter(gameModeId); return NguiLabel("Global Best:") + " " + NguiValue(formatter(arg)) + "\n" + NguiLabel("Top " + array.Length + " Avg:") + " " + NguiValue(formatter(arg2)); } private static string NguiLabel(string text) { return "[c][AAAAAA]" + text + "[-][/c]"; } private static string NguiValue(string text) { return "[c][FFFFFF]" + text + "[-][/c]"; } private static bool IsTimeMode(GameModeID gameModeID) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 return (int)gameModeID != 2; } private static Func GetFormatter(GameModeID gameModeId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) object obj; if (!IsTimeMode(gameModeId)) { obj = <>c.<>9__4_1; if (obj == null) { return <>c.<>9__4_1 = (int score) => score.ToString("N0", CultureInfo.InvariantCulture) + " eV"; } } else { obj = (Func)((int ms) => GUtils.GetFormattedMS((double)ms)); } return (Func)obj; } } } namespace PaceRef.Patches { [HarmonyPatch(typeof(PauseMenuLogic), "SetupPauseMenuLevelInfo")] internal class PauseMenuLogic_AddDetailedScoreBoardPanel { [HarmonyPostfix] public static void SetupPauseMenuLevelInfo_Postfix(PauseMenuLogic __instance) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown string levelPath_ = G.Sys.GameManager_.LevelPath_; GameModeID gameModeID = G.Sys.GameManager_.Mode_.GameModeID_; G.Sys.SteamworksManager_.Leaderboard_.DownloadLeaderboardInfo(levelPath_, gameModeID, (OnLeaderboardDownloaded)delegate(bool success, Entry[] entries, int count) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (entries != null && entries.Length != 0) { string scoreboardData = ScoreboardBuilder.Build(entries.Select((Entry e) => ((Entry)e).Score_).ToArray(), Mod.SampleSizeConfig.Value, gameModeID); AddScoreboardDataToLabel(__instance, scoreboardData); } }, (RangeRequestType)0, 1, Mod.SampleSizeConfig.Value, false); } private static void AddScoreboardDataToLabel(PauseMenuLogic pauseMenuLogic, string scoreboardData) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) UILabel levelInfoLabel_ = pauseMenuLogic.levelInfoLabel_; Transform val = ((Component)levelInfoLabel_).transform.parent.Find("PaceRef Scoreboard"); if ((Object)(object)val != (Object)null) { NGUITools.Destroy((Object)(object)((Component)val).gameObject); } GameObject obj = NGUITools.AddChild(((Component)((Component)levelInfoLabel_).transform.parent).gameObject); ((Object)obj).name = "PaceRef Scoreboard"; UILabel val2 = obj.AddComponent(); val2.bitmapFont = levelInfoLabel_.bitmapFont; val2.trueTypeFont = levelInfoLabel_.trueTypeFont; val2.fontSize = levelInfoLabel_.fontSize; ((UIWidget)val2).color = ((UIWidget)levelInfoLabel_).color; ((UIWidget)val2).width = ((UIWidget)levelInfoLabel_).width; ((UIWidget)val2).pivot = ((UIWidget)levelInfoLabel_).pivot; ((UIWidget)val2).depth = ((UIWidget)levelInfoLabel_).depth; val2.overflowMethod = (Overflow)3; val2.text = scoreboardData; ((UIWidget)val2).MakePixelPerfect(); Vector3 localPosition = ((Component)levelInfoLabel_).transform.localPosition; obj.transform.localPosition = new Vector3(localPosition.x, localPosition.y - (float)((UIWidget)levelInfoLabel_).height - 8f, localPosition.z); int num = 8 + ((UIWidget)val2).height + 8; GrowPanelWidget(((Component)levelInfoLabel_).transform.parent, num); ShiftLogoDown(((Component)levelInfoLabel_).transform.parent, "UITexture - Medal", num / 2); ShiftLogoDown(((Component)levelInfoLabel_).transform.parent, "Medal Logo", num / 2); } private static void ShiftLogoDown(Transform parent, string childName, int shift) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) Transform val = parent.Find(childName); if (!((Object)(object)val == (Object)null)) { Vector3 localPosition = val.localPosition; val.localPosition = new Vector3(localPosition.x, localPosition.y - (float)shift, localPosition.z); } } private static void GrowPanelWidget(Transform panelLevelInfo, int extraHeight) { UIWidget component = ((Component)panelLevelInfo).GetComponent(); if (!((Object)(object)component == (Object)null) && (Object)(object)((UIRect)component).bottomAnchor.target != (Object)null) { AnchorPoint bottomAnchor = ((UIRect)component).bottomAnchor; bottomAnchor.absolute -= extraHeight; } } } }