using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using Mirror; using Steamworks; using Steamworks.Data; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("ProGolfMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ProGolfMod")] [assembly: AssemblyTitle("ProGolfMod")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ProGolfMod { [BepInPlugin("codex.superbattlegolf.progolfplus", "Pro Golf Plus", "0.1.23")] public sealed class ProGolfPlugin : BaseUnityPlugin { private sealed class DriveCandidate { public PlayerInfo Player; public ulong PlayerGuid; public Vector3 StartPosition; } private sealed class FirstDriveResult { public string PlayerName; public float Distance; public bool IsValid; } private sealed class ClosestToPinResult { public string PlayerName; public float Distance; } private sealed class CartFlipState { public WheelCollider[] Wheels = Array.Empty(); public bool WasUprightOnWheels; public bool FlipInProgress; public int CurrentFlipStreak; public float AccumulatedFlipRadians; public float LastFlipPollTime = -1f; public float SettledSince = -1f; public ulong ResponsiblePlayerGuid; public string ResponsiblePlayerName; } [HarmonyPatch(typeof(CourseManager), "BeginCountdownToMatchEnd")] private static class SkipFirstFinishCountdownPatch { private static bool Prefix(CourseManager __instance) { if (!IsActiveProGolf() || (Object)(object)__instance == (Object)null) { return true; } if (AllActivePlayersResolved(__instance)) { TryAnnounceClosestToPinIfReady(); TryAnnounceHoleStatsIfReady(); return true; } ProGolfPlugin instance = ProGolfPlugin.instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)"Skipped Pro Golf end-of-hole countdown because active players are still playing."); } return false; } } [HarmonyPatch(typeof(CourseManager), "OnPlayerStatesChanged")] private static class AnnounceHoleStatsOnPlayerStateChangedPatch { private static void Postfix(CourseManager __instance) { if (!((Object)(object)__instance == (Object)null) && NetworkServer.active && IsProGolfScoringActive() && AllActivePlayersResolved(__instance)) { TryAnnounceClosestToPinIfReady(); TryAnnounceHoleStatsIfReady(); } } } [HarmonyPatch(typeof(PlayerState), "CompareTo")] private static class ProGolfStrokeFirstPlayerStateSortPatch { private static bool Prefix(PlayerState __instance, PlayerState other, ref int __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) return !TryCompareProGolfPlayerStates(__instance, other, ref __result); } } [HarmonyPatch(typeof(ScoreboardEntry), "PopulateWith")] private static class ProGolfScoreboardEntryStatsPatch { private static void Postfix(ScoreboardEntry __instance, PlayerState playerState) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) UpdateScoreboardEntryProGolfStats(__instance, playerState); } } [HarmonyPatch(typeof(Scoreboard), "Refresh")] private static class ProGolfScoreboardStatCardPatch { private static void Postfix(Scoreboard __instance) { UpdateScoreboardProGolfStatCard(__instance); } } [HarmonyPatch(typeof(CourseManager), "RegisterActivePlayerOnGreen")] private static class CaptureClosestToPinOnGreenPatch { private static void Postfix(PlayerGolfer player) { CaptureClosestToPinOnFirstGreen(player); } } [HarmonyPatch(typeof(CourseManager), "TryPlayHoleMusic")] private static class ForceNormalHoleMusicPatch { private static void Prefix(ref bool hurryUpInstantly) { if (IsActiveProGolf()) { hurryUpInstantly = false; } } } [HarmonyPatch(typeof(CourseManager), "HurryUpHoleMusic")] private static class PreventHurryUpMusicPatch { private static bool Prefix() { return !IsActiveProGolf(); } } [HarmonyPatch(typeof(GolfBall), "OnWillApplyGolfSwingHitPhysics")] private static class BeginLongestDriveTrackingPatch { private static void Prefix(GolfBall __instance) { BeginDriveTracking(__instance); } } [HarmonyPatch(typeof(PlayerGolfer), "OnPlayerHitOwnBall")] private static class TrackPerfectShotPatch { private static void Postfix(PlayerGolfer __instance) { TrackPerfectShot(__instance); } } [HarmonyPatch(typeof(GolfBall), "set_IsStationary")] private static class CompleteLongestDriveTrackingPatch { private static void Postfix(GolfBall __instance, bool value) { if (value) { TryCompleteDriveTracking(__instance); } } } [HarmonyPatch(typeof(CourseManager), "AddPenaltyStroke")] private static class InvalidatePenaltyDrivePatch { private static void Prefix(PlayerGolfer penalizedPlayer) { InvalidateFirstDrive((penalizedPlayer != null) ? penalizedPlayer.PlayerInfo : null); } } [HarmonyPatch(typeof(PlayerGolfer), "ServerEliminate")] private static class HazardEliminationRespawnPatch { private static void Prefix(PlayerGolfer __instance, EliminationReason immediateEliminationReason) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) MarkBallRespawnForHazardElimination(__instance, immediateEliminationReason); } } [HarmonyPatch(typeof(PlayerMovement), "TryBeginRespawn")] private static class BeginRespawnAtBallPatch { private static void Prefix(PlayerMovement __instance, ref RespawnTarget respawnTarget) { RedirectHazardRespawnToBall(__instance, ref respawnTarget); } } [HarmonyPatch(typeof(Checkpoint), "Awake")] private static class HideCheckpointOnAwakePatch { private static void Postfix(Checkpoint __instance) { if (IsActiveProGolf()) { SuppressCheckpointVisuals(__instance); } } } [HarmonyPatch(typeof(PlayerInventorySettings), "get_MaxItems")] private static class MinimumProGolfInventoryPatch { private static void Postfix(ref int __result) { if (IsActiveProGolf()) { __result = 3; } } } [HarmonyPatch(typeof(PlayerInventory), "OnStartServer")] private static class ServerStartLoadoutPatch { private static void Postfix(PlayerInventory __instance) { EnsureProGolfLoadout(__instance); } } [HarmonyPatch(typeof(PlayerInventory), "OnStartLocalPlayer")] private static class LocalStartLoadoutPatch { private static void Postfix(PlayerInventory __instance) { EnsureProGolfLoadout(__instance); } } [HarmonyPatch(typeof(PlayerInventory), "OnBUpdate")] private static class InventoryUpdateLoadoutPatch { private static void Postfix(PlayerInventory __instance) { EnsureProGolfLoadout(__instance); } } [HarmonyPatch(typeof(PlayerInventory), "ServerTryAddItem")] private static class ProGolfItemGrantPatch { private static bool Prefix(PlayerInventory __instance, ItemType itemToAdd, ref bool __result) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Invalid comparison between Unknown and I4 //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 if (!IsActiveProGolf() || !NetworkServer.active) { return true; } EnsureProGolfLoadout(__instance); if ((int)itemToAdd == 6 || (int)itemToAdd == 1 || (int)itemToAdd == 5) { __result = true; return false; } __result = false; return false; } } [HarmonyPatch(typeof(ItemPool), "GetWeightedRandomItem")] private static class RemovePermanentItemsFromItemPoolsPatch { private static bool Prefix(ItemPool __instance, ref ItemType __result) { if (!IsActiveProGolf()) { return true; } return !TryGetWeightedRandomAllowedPickupItem(__instance, out __result); } } [HarmonyPatch(typeof(ItemSpawner), "OnStartServer")] private static class HideInitialItemSpawnersPatch { private static void Postfix(ItemSpawner __instance) { if (IsActiveProGolf() && (Object)(object)__instance != (Object)null) { SuppressItemSpawner(__instance); } } } [HarmonyPatch(typeof(ItemSpawner), "OnBUpdate")] private static class KeepItemSpawnersHiddenPatch { private static void Postfix(ItemSpawner __instance) { if (IsActiveProGolf()) { SuppressItemSpawner(__instance); } } } [HarmonyPatch(typeof(ItemSpawner), "ServerSpawnItemBox")] private static class PreventItemSpawnerRespawnsPatch { private static bool Prefix(ItemSpawner __instance) { if (!IsActiveProGolf()) { return true; } if ((Object)(object)__instance != (Object)null) { SuppressItemSpawner(__instance); } return false; } } [HarmonyPatch(typeof(PlayerInventory), "DecrementUseFromSlotAt")] private static class KeepPermanentItemsLoadedPatch { private static bool Prefix(PlayerInventory __instance, int index) { return !IsReservedPermanentSlot(__instance, index); } } [HarmonyPatch(typeof(PlayerInventory), "RemoveIfOutOfUses")] private static class PreventPermanentItemsRemovalPatch { private static bool Prefix(PlayerInventory __instance, int index) { return !IsReservedPermanentSlot(__instance, index); } } [HarmonyPatch(typeof(PlayerInventory), "DropItem")] private static class PreventDroppingPermanentItemsPatch { private static bool Prefix(PlayerInventory __instance) { return !IsReservedPermanentSlot(__instance, __instance.EquippedItemIndex); } } private const string PluginGuid = "codex.superbattlegolf.progolfplus"; private const string PluginName = "Pro Golf Plus"; private const string PluginVersion = "0.1.23"; private const string LobbyMemberVersionKey = "codex_progolfplus_member_version"; private const string LobbyRequiredVersionKey = "codex_progolfplus_required_version"; private const string LobbyActiveStateKey = "codex_progolfplus_active"; private const string LobbyActiveVersionKey = "codex_progolfplus_active_version"; private const string LobbyAnnouncementTextKey = "codex_progolfplus_announcement_text"; private const string LobbyAnnouncementVersionKey = "codex_progolfplus_announcement_version"; private const string LobbyHoleStatsPayloadKey = "codex_progolfplus_hole_stats_payload"; private const string LobbyHoleStatsVersionKey = "codex_progolfplus_hole_stats_version"; private const int ReservedCartSlotIndex = 0; private const int ReservedCoffeeSlotIndex = 1; private const int ReservedSpringBootsSlotIndex = 2; private const int TotalInventorySlots = 3; private const float CartFlipPollInterval = 0.15f; private const float CartUprightDotThreshold = 0.65f; private const float CartMovingSpeedThreshold = 0.35f; private const float CartMovingAngularThreshold = 0.35f; private const float CartFlipStartAngularThreshold = 1f; private const float CartFlipFullRotationRadians = (float)Math.PI * 2f; private const float CartSettledSeconds = 0.5f; private static ProGolfPlugin instance; private static FieldInfo inventorySlotsField; private static FieldInfo itemPoolSpawnChancesField; private static FieldInfo itemSpawnerVisualsField; private static FieldInfo itemSpawnerPickupColliderField; private static FieldInfo itemSpawnerVisualsFillingObjectField; private static FieldInfo itemSpawnerVisualsIdleObjectField; private static FieldInfo itemSpawnerVisualsFillRendererField; private static FieldInfo itemSpawnerVisualsAnimatorField; private static FieldInfo checkpointVisualCenterField; private static FieldInfo checkpointBaseMeshField; private static FieldInfo checkpointScreenMeshField; private static FieldInfo checkpointAnimatorField; private static FieldInfo scoreboardEntryStatsBackgroundField; private static FieldInfo scoreboardEntryNameField; private static FieldInfo scoreboardItemPickupsStatField; private static FieldInfo scoreboardKnockoutRatioStatField; private static FieldInfo scoreboardStatLabelField; private static MethodInfo scoreboardMarkDirtyMethod; private static bool allLobbyMembersCompatible = true; private static string incompatibleLobbyMembers = string.Empty; private static float nextLobbyPollTime; private static float nextCompatibilityWarningTime; private static bool lastPublishedActiveState; private static string lastObservedActiveVersion = string.Empty; private static string lastObservedHoleStatsVersion = string.Empty; private static readonly Dictionary activeDrives = new Dictionary(); private static readonly Dictionary firstDriveResults = new Dictionary(); private static readonly Dictionary closestToPinResults = new Dictionary(); private static readonly Dictionary perfectShotCounts = new Dictionary(); private static readonly Dictionary cartBestFlipStreaks = new Dictionary(); private static readonly Dictionary cartFlipStates = new Dictionary(); private static readonly HashSet forceNextRespawnAtBall = new HashSet(); private static int longestDriveHoleIndex = int.MinValue; private static bool longestDriveAnnounced; private static bool closestToPinAnnounced; private static bool holeStatsAnnounced; private static string lastObservedAnnouncementVersion = string.Empty; private static string topAnnouncementText = string.Empty; private static string topAnnouncementDetailText = string.Empty; private static float topAnnouncementVisibleUntil; private static float nextCartFlipPollTime; private static GUIStyle topAnnouncementBoxStyle; private static GUIStyle topAnnouncementTextStyle; private static GUIStyle topAnnouncementDetailStyle; private static Texture2D topAnnouncementBoxTexture; private static readonly Dictionary scoreboardEntryStatLabels = new Dictionary(); private Harmony harmony; private ConfigEntry enabledConfig; private ConfigEntry grantCheckIntervalConfig; private ConfigEntry longestDriveMinimumMetersConfig; private float nextGrantCheckTime; private void Awake() { //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Expected O, but got Unknown instance = this; enabledConfig = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Enable Pro Golf Plus."); grantCheckIntervalConfig = ((BaseUnityPlugin)this).Config.Bind("General", "GrantCheckIntervalSeconds", 0.5f, "How often the host checks whether every Pro Golf player needs a cart."); longestDriveMinimumMetersConfig = ((BaseUnityPlugin)this).Config.Bind("Longest Drive", "MinimumDistanceMeters", 15f, "Minimum drive distance required before a Longest Drive popup can appear."); inventorySlotsField = AccessTools.Field(typeof(PlayerInventory), "slots"); itemPoolSpawnChancesField = AccessTools.Field(typeof(ItemPool), "spawnChances"); itemSpawnerVisualsField = AccessTools.Field(typeof(ItemSpawner), "visuals"); itemSpawnerPickupColliderField = AccessTools.Field(typeof(ItemSpawner), "pickUpCollider"); itemSpawnerVisualsFillingObjectField = AccessTools.Field(typeof(ItemSpawnerVisuals), "fillingObj"); itemSpawnerVisualsIdleObjectField = AccessTools.Field(typeof(ItemSpawnerVisuals), "idleObj"); itemSpawnerVisualsFillRendererField = AccessTools.Field(typeof(ItemSpawnerVisuals), "fillMeshRenderer"); itemSpawnerVisualsAnimatorField = AccessTools.Field(typeof(ItemSpawnerVisuals), "animator"); checkpointVisualCenterField = AccessTools.Field(typeof(Checkpoint), "visualCenter"); checkpointBaseMeshField = AccessTools.Field(typeof(Checkpoint), "baseMesh"); checkpointScreenMeshField = AccessTools.Field(typeof(Checkpoint), "screenMesh"); checkpointAnimatorField = AccessTools.Field(typeof(Checkpoint), "animator"); scoreboardEntryStatsBackgroundField = AccessTools.Field(typeof(ScoreboardEntry), "statsBackground"); scoreboardEntryNameField = AccessTools.Field(typeof(ScoreboardEntry), "name"); scoreboardItemPickupsStatField = AccessTools.Field(typeof(Scoreboard), "itemPickups"); scoreboardKnockoutRatioStatField = AccessTools.Field(typeof(Scoreboard), "knockoutRatio"); scoreboardStatLabelField = AccessTools.Field(typeof(ScoreboardStat), "label"); scoreboardMarkDirtyMethod = AccessTools.Method(typeof(Scoreboard), "MarkDirty", (Type[])null, (Type[])null); harmony = new Harmony("codex.superbattlegolf.progolfplus"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Pro Golf Plus 0.1.23 loaded."); } private void OnDestroy() { Harmony obj = harmony; if (obj != null) { obj.UnpatchSelf(); } DestroyTopAnnouncementStyles(); if (instance == this) { instance = null; } } private void OnGUI() { DrawTopAnnouncement(); } private void Update() { PollLobbyCompatibility(); PollCartFlipStats(); if (IsActiveProGolf() && !(Time.unscaledTime < nextGrantCheckTime)) { nextGrantCheckTime = Time.unscaledTime + Mathf.Max(0.25f, grantCheckIntervalConfig.Value); TryEnsureAllPlayersHaveProGolfLoadout(); TrySuppressAllItemSpawners(); TrySuppressCheckpoints(); } } private static bool IsActiveProGolf() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Invalid comparison between Unknown and I4 if ((Object)(object)instance == (Object)null || !instance.enabledConfig.Value) { return false; } if (NetworkServer.active && !allLobbyMembersCompatible) { return false; } MatchSetupRules val = FindMatchSetupRules(); if ((Object)(object)val != (Object)null && (int)val.CurrentPreset == 1) { return IsMatchUnderway(); } return false; } private static bool IsMatchUnderway() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 MatchState matchState = CourseManager.MatchState; if ((int)matchState >= 1) { return (int)matchState < 6; } return false; } private static bool IsProGolfScoringActive() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Invalid comparison between Unknown and I4 if ((Object)(object)instance == (Object)null || !instance.enabledConfig.Value) { return false; } if (NetworkServer.active && !allLobbyMembersCompatible) { return false; } MatchSetupRules val = FindMatchSetupRules(); if ((Object)(object)val != (Object)null && (int)val.CurrentPreset == 1) { return (int)CourseManager.MatchState >= 1; } return false; } private static void ResetLongestDriveIfHoleChanged() { int currentHoleGlobalIndex = CourseManager.CurrentHoleGlobalIndex; if (currentHoleGlobalIndex != longestDriveHoleIndex) { longestDriveHoleIndex = currentHoleGlobalIndex; longestDriveAnnounced = false; closestToPinAnnounced = false; holeStatsAnnounced = false; activeDrives.Clear(); firstDriveResults.Clear(); closestToPinResults.Clear(); perfectShotCounts.Clear(); cartBestFlipStreaks.Clear(); cartFlipStates.Clear(); } } private static void PollLobbyCompatibility() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) if (Time.unscaledTime < nextLobbyPollTime) { return; } nextLobbyPollTime = Time.unscaledTime + 0.5f; Lobby lobby = default(Lobby); if (!BNetworkManager.TryGetSteamLobby(ref lobby)) { if (!NetworkServer.active && !NetworkClient.active) { allLobbyMembersCompatible = true; incompatibleLobbyMembers = string.Empty; } return; } PublishLocalMemberVersion(lobby); PollActiveState(lobby); PollProGolfAnnouncement(lobby); PollProGolfHoleStats(lobby); if (NetworkServer.active) { UpdateLobbyCompatibility(lobby); PublishActiveState(lobby, IsActiveProGolf()); } } private static void PollProGolfHoleStats(Lobby lobby) { string data = ((Lobby)(ref lobby)).GetData("codex_progolfplus_hole_stats_version"); if (!string.IsNullOrEmpty(data) && !(data == lastObservedHoleStatsVersion)) { lastObservedHoleStatsVersion = data; ApplyHoleStatsPayload(((Lobby)(ref lobby)).GetData("codex_progolfplus_hole_stats_payload")); MarkScoreboardsDirty(); } } private static void PublishActiveState(Lobby lobby, bool active) { if (active != lastPublishedActiveState || string.IsNullOrEmpty(((Lobby)(ref lobby)).GetData("codex_progolfplus_active"))) { lastPublishedActiveState = active; ((Lobby)(ref lobby)).SetData("codex_progolfplus_active", active ? "1" : "0"); ((Lobby)(ref lobby)).SetData("codex_progolfplus_active_version", Time.unscaledTime.ToString("R")); ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)$"Published Pro Golf Plus active lobby state: {active}."); } } } private static void PollActiveState(Lobby lobby) { string data = ((Lobby)(ref lobby)).GetData("codex_progolfplus_active_version"); if (!string.IsNullOrEmpty(data) && !(data == lastObservedActiveVersion)) { bool flag = ((Lobby)(ref lobby)).GetData("codex_progolfplus_active") == "1"; lastObservedActiveVersion = data; ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)$"Observed Pro Golf Plus active lobby state: {flag}."); } } } private static void PollProGolfAnnouncement(Lobby lobby) { string data = ((Lobby)(ref lobby)).GetData("codex_progolfplus_announcement_version"); if (!string.IsNullOrEmpty(data) && !(data == lastObservedAnnouncementVersion)) { lastObservedAnnouncementVersion = data; string data2 = ((Lobby)(ref lobby)).GetData("codex_progolfplus_announcement_text"); if (!string.IsNullOrEmpty(data2)) { ShowTopAnnouncement(data2); } } } private static void PublishLocalMemberVersion(Lobby lobby) { if (SteamClient.IsValid) { ((Lobby)(ref lobby)).SetMemberData("codex_progolfplus_member_version", "0.1.23"); } } private static void UpdateLobbyCompatibility(Lobby lobby) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) ((Lobby)(ref lobby)).SetData("codex_progolfplus_required_version", "0.1.23"); List list = new List(); foreach (Friend member in ((Lobby)(ref lobby)).Members) { Friend current = member; string memberData = ((Lobby)(ref lobby)).GetMemberData(current, "codex_progolfplus_member_version"); if (!string.Equals(memberData, "0.1.23", StringComparison.Ordinal)) { string? text; if (!string.IsNullOrEmpty(((Friend)(ref current)).Name)) { text = ((Friend)(ref current)).Name; } else { SteamId id = current.Id; text = ((object)(SteamId)(ref id)).ToString(); } string text2 = text; list.Add(string.IsNullOrEmpty(memberData) ? (text2 + " (missing Pro Golf Plus 0.1.23)") : (text2 + " (Pro Golf Plus " + memberData + ", needs 0.1.23)")); } } allLobbyMembersCompatible = list.Count == 0; incompatibleLobbyMembers = string.Join(", ", list); if (!allLobbyMembersCompatible && Time.unscaledTime >= nextCompatibilityWarningTime) { nextCompatibilityWarningTime = Time.unscaledTime + 10f; ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogWarning((object)("Pro Golf Plus disabled until every lobby member is running Pro Golf Plus 0.1.23: " + incompatibleLobbyMembers)); } } } private static MatchSetupRules FindMatchSetupRules() { if (SingletonNetworkBehaviour.HasInstance) { return SingletonNetworkBehaviour.Instance; } if (SingletonBehaviour.HasInstance) { return SingletonBehaviour.Instance; } return Object.FindFirstObjectByType((FindObjectsInactive)1); } private void TryEnsureAllPlayersHaveProGolfLoadout() { if (!NetworkServer.active) { return; } int num = 0; int num2 = 0; PlayerInventory[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (PlayerInventory val in array) { if (!((Object)(object)val == (Object)null)) { num++; if (EnsureProGolfLoadout(val)) { num2++; } } } if (num2 > 0) { ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)$"Ensured Pro Golf loadout for {num2}/{num} player inventories."); } } } private static void TrySuppressAllItemSpawners() { if (!IsActiveProGolf()) { return; } ItemSpawner[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (ItemSpawner val in array) { if ((Object)(object)val != (Object)null) { SuppressItemSpawner(val); } } } private static void SuppressItemSpawner(ItemSpawner spawner) { if (!((Object)(object)spawner == (Object)null)) { if (NetworkServer.active) { spawner.NetworkhasItemBox = false; spawner.NetworkvisualsFill = 0f; } object? obj = itemSpawnerPickupColliderField?.GetValue(spawner); Collider val = (Collider)((obj is Collider) ? obj : null); if ((Object)(object)val != (Object)null) { val.enabled = false; } object obj2 = itemSpawnerVisualsField?.GetValue(spawner); object? obj3 = itemSpawnerVisualsFillingObjectField?.GetValue(obj2); SetSpawnerVisualObjectActive((GameObject)((obj3 is GameObject) ? obj3 : null), active: false); object? obj4 = itemSpawnerVisualsIdleObjectField?.GetValue(obj2); SetSpawnerVisualObjectActive((GameObject)((obj4 is GameObject) ? obj4 : null), active: false); object? obj5 = itemSpawnerVisualsFillRendererField?.GetValue(obj2); MeshRenderer val2 = (MeshRenderer)((obj5 is MeshRenderer) ? obj5 : null); if ((Object)(object)val2 != (Object)null) { ((Renderer)val2).enabled = false; } object? obj6 = itemSpawnerVisualsAnimatorField?.GetValue(obj2); Behaviour val3 = (Behaviour)((obj6 is Behaviour) ? obj6 : null); if ((Object)(object)val3 != (Object)null) { val3.enabled = false; } Renderer[] componentsInChildren = ((Component)spawner).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].enabled = false; } } } private static void SetSpawnerVisualObjectActive(GameObject gameObject, bool active) { if ((Object)(object)gameObject != (Object)null && gameObject.activeSelf != active) { gameObject.SetActive(active); } } private static void ShowTopAnnouncement(string text) { SplitAnnouncementText(text, out topAnnouncementText, out topAnnouncementDetailText); topAnnouncementVisibleUntil = Time.unscaledTime + (text.StartsWith("Hole Stats:", StringComparison.Ordinal) ? 8f : 6f); } private static void DrawTopAnnouncement() { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(topAnnouncementText) && !(Time.unscaledTime >= topAnnouncementVisibleUntil)) { EnsureTopAnnouncementStyles(); float num = Mathf.Clamp((float)Screen.width * 0.78f, 620f, 1060f); int num2 = ((!string.IsNullOrEmpty(topAnnouncementDetailText)) ? topAnnouncementDetailText.Split(new char[1] { '\n' }).Length : 0); float num3 = (string.IsNullOrEmpty(topAnnouncementDetailText) ? 104f : (100f + Mathf.Max(42f, (float)num2 * 34f))); Rect val = default(Rect); ((Rect)(ref val))..ctor(((float)Screen.width - num) * 0.5f, Mathf.Max(64f, (float)Screen.height * 0.28f), num, num3); GUI.Box(val, GUIContent.none, topAnnouncementBoxStyle); GUI.Label(new Rect(((Rect)(ref val)).x + 26f, ((Rect)(ref val)).y + 20f, ((Rect)(ref val)).width - 52f, 64f), topAnnouncementText, topAnnouncementTextStyle); if (!string.IsNullOrEmpty(topAnnouncementDetailText)) { GUI.Label(new Rect(((Rect)(ref val)).x + 26f, ((Rect)(ref val)).y + 82f, ((Rect)(ref val)).width - 52f, ((Rect)(ref val)).height - 92f), topAnnouncementDetailText, topAnnouncementDetailStyle); } } } private static void EnsureTopAnnouncementStyles() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Expected O, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown //IL_008e: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown if (topAnnouncementBoxStyle == null) { topAnnouncementBoxTexture = CreateStripedGuiTexture(new Color(0.05f, 0.16f, 0.27f, 0.82f), new Color(0.12f, 0.3f, 0.47f, 0.82f)); GUIStyle val = new GUIStyle(GUI.skin.box); val.normal.background = topAnnouncementBoxTexture; val.border = new RectOffset(14, 14, 14, 14); val.padding = new RectOffset(22, 22, 18, 18); topAnnouncementBoxStyle = val; GUIStyle val2 = new GUIStyle(GUI.skin.label) { alignment = (TextAnchor)4, fontSize = 46, fontStyle = (FontStyle)1 }; val2.normal.textColor = Color.white; val2.wordWrap = false; val2.clipping = (TextClipping)1; topAnnouncementTextStyle = val2; GUIStyle val3 = new GUIStyle(topAnnouncementTextStyle) { fontSize = 34, wordWrap = true }; val3.normal.textColor = new Color(0.82f, 0.86f, 0.9f, 1f); topAnnouncementDetailStyle = val3; } } private static void SplitAnnouncementText(string text, out string title, out string detail) { title = text; detail = string.Empty; int num = text.IndexOf(':'); if (num >= 0 && num < text.Length - 1) { title = text.Substring(0, num + 1).Trim(); detail = text.Substring(num + 1).Trim(); } } private static Texture2D CreateGuiTexture(Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown Texture2D val = new Texture2D(1, 1); val.SetPixel(0, 0, color); val.Apply(); ((Object)val).hideFlags = (HideFlags)61; return val; } private static Texture2D CreateStripedGuiTexture(Color baseColor, Color stripeColor) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(64, 64); for (int i = 0; i < 64; i++) { for (int j = 0; j < 64; j++) { bool flag = (j + i) / 8 % 2 == 0; val.SetPixel(j, i, flag ? stripeColor : baseColor); } } ((Texture)val).wrapMode = (TextureWrapMode)0; val.Apply(); ((Object)val).hideFlags = (HideFlags)61; return val; } private static void DestroyTopAnnouncementStyles() { if ((Object)(object)topAnnouncementBoxTexture != (Object)null) { Object.Destroy((Object)(object)topAnnouncementBoxTexture); topAnnouncementBoxTexture = null; } topAnnouncementBoxStyle = null; topAnnouncementTextStyle = null; topAnnouncementDetailStyle = null; } private static void TrySuppressCheckpoints() { if (IsActiveProGolf()) { Checkpoint[] array = Object.FindObjectsByType((FindObjectsSortMode)0); for (int i = 0; i < array.Length; i++) { SuppressCheckpointVisuals(array[i]); } } } private static void SuppressCheckpointVisuals(Checkpoint checkpoint) { if ((Object)(object)checkpoint == (Object)null) { return; } object? obj = checkpointBaseMeshField?.GetValue(checkpoint); MeshRenderer val = (MeshRenderer)((obj is MeshRenderer) ? obj : null); if ((Object)(object)val != (Object)null) { ((Renderer)val).enabled = false; } object? obj2 = checkpointScreenMeshField?.GetValue(checkpoint); MeshRenderer val2 = (MeshRenderer)((obj2 is MeshRenderer) ? obj2 : null); if ((Object)(object)val2 != (Object)null) { ((Renderer)val2).enabled = false; } object? obj3 = checkpointAnimatorField?.GetValue(checkpoint); Behaviour val3 = (Behaviour)((obj3 is Behaviour) ? obj3 : null); if ((Object)(object)val3 != (Object)null) { val3.enabled = false; } object? obj4 = checkpointVisualCenterField?.GetValue(checkpoint); Transform val4 = (Transform)((obj4 is Transform) ? obj4 : null); if ((Object)(object)val4 != (Object)null) { Renderer[] componentsInChildren = ((Component)val4).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].enabled = false; } Collider[] componentsInChildren2 = ((Component)val4).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { componentsInChildren2[i].enabled = false; } } else { Renderer[] componentsInChildren = ((Component)checkpoint).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].enabled = false; } } } private static SyncList GetSlots(PlayerInventory inventory) { return inventorySlotsField?.GetValue(inventory) as SyncList; } private static void EnsureSlotCount(PlayerInventory inventory) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) SyncList slots = GetSlots(inventory); if (slots != null) { while (slots.Count < 3) { slots.Add(InventorySlot.Empty); } while (slots.Count > 3) { slots.RemoveAt(slots.Count - 1); } } } private static bool IsCart(InventorySlot slot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) if ((int)slot.itemType == 6) { return slot.remainingUses > 0; } return false; } private static bool IsCoffee(InventorySlot slot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) if ((int)slot.itemType == 1) { return slot.remainingUses > 0; } return false; } private static bool IsSpringBoots(InventorySlot slot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) if ((int)slot.itemType == 5) { return slot.remainingUses > 0; } return false; } private static bool IsPistol(InventorySlot slot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) if ((int)slot.itemType == 2) { return slot.remainingUses > 0; } return false; } private static bool IsEmpty(InventorySlot slot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) if ((int)slot.itemType != 0) { return slot.remainingUses <= 0; } return true; } private static bool IsReservedPermanentSlot(PlayerInventory inventory, int index) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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) if (!IsActiveProGolf() || !TryGetSlot(inventory, index, out var slot)) { return false; } if ((index != 0 || !IsCart(slot)) && (index != 1 || !IsCoffee(slot))) { if (index == 2) { return IsSpringBoots(slot); } return false; } return true; } private static bool TryGetSlot(PlayerInventory inventory, int index, out InventorySlot slot) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) slot = InventorySlot.Empty; SyncList slots = GetSlots(inventory); if (slots == null || index < 0 || index >= slots.Count) { return false; } slot = slots[index]; return true; } private static bool EnsureProGolfLoadout(PlayerInventory inventory) { if (!IsActiveProGolf() || !NetworkServer.active) { return false; } SyncList slots = GetSlots(inventory); if (slots == null) { return false; } EnsureSlotCount(inventory); return false | SetSlotIfDifferent(slots, 0, (ItemType)6) | SetSlotIfDifferent(slots, 1, (ItemType)1) | SetSlotIfDifferent(slots, 2, (ItemType)5) | ClearNonPermanentItems(slots); } private static bool SetSlotIfDifferent(SyncList slots, int index, ItemType itemType) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_0011: Unknown result type (might be due to invalid IL or missing references) InventorySlot val = slots[index]; if (val.itemType == itemType && val.remainingUses > 0) { return false; } slots[index] = new InventorySlot(itemType, 1); return true; } private static bool ClearNonPermanentItems(SyncList slots) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) bool result = false; for (int i = 0; i < slots.Count; i++) { if (!IsPermanentLoadoutSlot(i) && !IsEmpty(slots[i])) { slots[i] = InventorySlot.Empty; result = true; } } return result; } private static bool IsPermanentLoadoutSlot(int index) { if (index != 0 && index != 1) { return index == 2; } return true; } private static bool IsBlockedProGolfPickupItem(ItemType itemType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 if ((int)itemType != 6 && (int)itemType != 1 && (int)itemType != 5 && (int)itemType != 2) { return (int)itemType == 0; } return true; } private static void MarkBallRespawnForHazardElimination(PlayerGolfer golfer, EliminationReason immediateEliminationReason) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (IsActiveProGolf() && !((Object)(object)golfer == (Object)null) && IsHazardElimination(immediateEliminationReason)) { PlayerInfo playerInfo = golfer.PlayerInfo; PlayerMovement val = ((playerInfo != null) ? playerInfo.Movement : null); GolfBall ownBall = golfer.OwnBall; if (!((Object)(object)val == (Object)null) && !((Object)(object)ownBall == (Object)null)) { forceNextRespawnAtBall.Add(val); } } } private static bool IsHazardElimination(EliminationReason reason) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 if ((int)reason != 5 && (int)reason != 6) { return (int)reason == 23; } return true; } private static void RedirectHazardRespawnToBall(PlayerMovement movement, ref RespawnTarget respawnTarget) { if (IsActiveProGolf() && !((Object)(object)movement == (Object)null) && (int)respawnTarget == 0 && forceNextRespawnAtBall.Remove(movement)) { respawnTarget = (RespawnTarget)1; ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)"Redirected Pro Golf Plus hazard respawn to player's ball."); } } } private static bool AllActivePlayersResolved(CourseManager courseManager) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Invalid comparison between Unknown and I4 //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) SyncList playerStates = CourseManager.PlayerStates; if (playerStates == null) { return false; } int num = 0; int num2 = 0; Enumerator enumerator = playerStates.GetEnumerator(); try { while (enumerator.MoveNext()) { PlayerState current = enumerator.Current; if (current.isConnected && !current.isSpectator && (int)current.matchResolution != -1) { num++; if ((int)current.matchResolution != 0) { num2++; } } } } finally { ((IDisposable)enumerator).Dispose(); } if (num > 0) { return num == num2; } return false; } private static bool TryCompareProGolfPlayerStates(PlayerState self, PlayerState other, ref int result) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) if (!IsProGolfScoringActive()) { return false; } if (self.courseStrokes != other.courseStrokes) { result = self.courseStrokes.CompareTo(other.courseStrokes); return true; } if (self.courseScore != other.courseScore) { result = other.courseScore.CompareTo(self.courseScore); return true; } if (self.wins != other.wins) { result = other.wins.CompareTo(self.wins); return true; } if (self.finishes != other.finishes) { result = other.finishes.CompareTo(self.finishes); return true; } if (self.courseKnockouts != other.courseKnockouts) { result = other.courseKnockouts.CompareTo(self.courseKnockouts); return true; } if (self.losses != other.losses) { result = self.losses.CompareTo(other.losses); return true; } if (!self.scoreTimestamp.Equals(other.scoreTimestamp)) { result = self.scoreTimestamp.CompareTo(other.scoreTimestamp); return true; } result = self.joinIndex.CompareTo(other.joinIndex); return true; } private static bool TryGetWeightedRandomAllowedPickupItem(ItemPool pool, out ItemType item) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Expected I4, but got Unknown item = (ItemType)0; if (!(itemPoolSpawnChancesField?.GetValue(pool) is Array array) || array.Length == 0) { return false; } float num = 0f; foreach (object item2 in array) { ItemType itemType = (ItemType)AccessTools.Field(item2.GetType(), "item").GetValue(item2); float num2 = (float)AccessTools.Field(item2.GetType(), "spawnChanceWeight").GetValue(item2); if (!IsBlockedProGolfPickupItem(itemType) && num2 > 0f) { num += num2; } } if (num <= 0f) { item = (ItemType)3; return true; } float num3 = Random.value * num; foreach (object item3 in array) { ItemType val = (ItemType)AccessTools.Field(item3.GetType(), "item").GetValue(item3); float num4 = (float)AccessTools.Field(item3.GetType(), "spawnChanceWeight").GetValue(item3); if (!IsBlockedProGolfPickupItem(val) && !(num4 <= 0f)) { num3 -= num4; if (num3 <= 0f) { item = (ItemType)(int)val; return true; } } } item = (ItemType)3; return true; } private static void BeginDriveTracking(GolfBall ball) { //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active && IsActiveProGolf() && !((Object)(object)ball == (Object)null) && !((Object)(object)ball.Owner == (Object)null) && !((Object)(object)ball.Owner.PlayerInfo == (Object)null) && !((Object)(object)ball.Owner.PlayerInfo.PlayerId == (Object)null)) { ResetLongestDriveIfHoleChanged(); ulong guid = ball.Owner.PlayerInfo.PlayerId.Guid; if (!firstDriveResults.ContainsKey(guid) && !HasActiveDriveForPlayer(guid)) { activeDrives[ball] = new DriveCandidate { Player = ball.Owner.PlayerInfo, PlayerGuid = guid, StartPosition = ((Component)ball).transform.position }; } } } private static void TryCompleteDriveTracking(GolfBall ball) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active && IsActiveProGolf() && !((Object)(object)ball == (Object)null) && ball.IsStationary && activeDrives.TryGetValue(ball, out var value)) { activeDrives.Remove(ball); if (!((Object)(object)value.Player == (Object)null) && !((Object)(object)value.Player.PlayerId == (Object)null) && !firstDriveResults.ContainsKey(value.PlayerGuid)) { Vector3 val = ((Component)ball).transform.position - value.StartPosition; val.y = 0f; float magnitude = ((Vector3)(ref val)).magnitude; float num = Mathf.Max(0f, instance?.longestDriveMinimumMetersConfig.Value ?? 0f); firstDriveResults[value.PlayerGuid] = new FirstDriveResult { PlayerName = GetPlayerName(value.Player, value.PlayerGuid), Distance = magnitude, IsValid = (magnitude >= num) }; TryAnnounceLongestDriveIfReady(); } } } private static void CaptureClosestToPinOnFirstGreen(PlayerGolfer player) { if (!NetworkServer.active || !IsActiveProGolf()) { return; } object obj; if (player == null) { obj = null; } else { PlayerInfo playerInfo = player.PlayerInfo; obj = ((playerInfo != null) ? playerInfo.PlayerId : null); } if ((Object)obj == (Object)null) { return; } ResetLongestDriveIfHoleChanged(); ulong guid = player.PlayerInfo.PlayerId.Guid; if (!closestToPinResults.ContainsKey(guid) && TryGetDistanceToPinOnGreen(player.OwnBall, out var distanceToPin)) { closestToPinResults[guid] = new ClosestToPinResult { PlayerName = GetPlayerName(player.PlayerInfo, guid), Distance = distanceToPin }; ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)("Captured Closest to Pin first green distance: " + GetPlayerName(player.PlayerInfo, guid) + " " + FormatDistance(distanceToPin) + ".")); } TryAnnounceClosestToPinIfReady(); } } private static void TrackPerfectShot(PlayerGolfer player) { if (!NetworkServer.active || !IsActiveProGolf()) { return; } object obj; if (player == null) { obj = null; } else { PlayerInfo playerInfo = player.PlayerInfo; obj = ((playerInfo != null) ? playerInfo.PlayerId : null); } if ((Object)obj == (Object)null) { return; } ResetLongestDriveIfHoleChanged(); float swingNormalizedCharge = player.SwingNormalizedCharge; if (!(swingNormalizedCharge <= 0.99f) && !(swingNormalizedCharge > 1f)) { ulong guid = player.PlayerInfo.PlayerId.Guid; perfectShotCounts.TryGetValue(guid, out var value); perfectShotCounts[guid] = value + 1; ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)$"Tracked Pro Golf perfect shot: {GetPlayerName(player.PlayerInfo, guid)} ({value + 1})."); } } } private static void PollCartFlipStats() { if (!NetworkServer.active || !IsActiveProGolf()) { cartFlipStates.Clear(); } else { if (Time.unscaledTime < nextCartFlipPollTime) { return; } nextCartFlipPollTime = Time.unscaledTime + 0.15f; ResetLongestDriveIfHoleChanged(); HashSet hashSet = new HashSet(); GolfCartMovement[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (GolfCartMovement val in array) { if (!((Object)(object)val == (Object)null)) { hashSet.Add(val); if (!cartFlipStates.TryGetValue(val, out var value)) { value = new CartFlipState { Wheels = ((Component)val).GetComponentsInChildren(true) }; cartFlipStates[val] = value; } UpdateCartFlipState(val, value); } } List list = new List(); foreach (GolfCartMovement key in cartFlipStates.Keys) { if ((Object)(object)key == (Object)null || !hashSet.Contains(key)) { list.Add(key); } } foreach (GolfCartMovement item in list) { cartFlipStates.Remove(item); } } } private static void UpdateCartFlipState(GolfCartMovement cart, CartFlipState state) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) float num = Vector3.Dot(((Component)cart).transform.up, Vector3.up); bool flag = AreAllCartWheelsGrounded(cart, state); bool flag2 = IsCartMoving(cart); float cartTumbleAngularSpeed = GetCartTumbleAngularSpeed(cart); float unscaledTime = Time.unscaledTime; if (!state.FlipInProgress) { if (num >= 0.65f) { state.WasUprightOnWheels = true; } bool flag3 = !flag || num < 0.65f; if (!state.WasUprightOnWheels || !flag3 || !flag2 || cartTumbleAngularSpeed < 1f) { return; } state.FlipInProgress = true; state.CurrentFlipStreak = 0; state.AccumulatedFlipRadians = 0f; state.LastFlipPollTime = unscaledTime; state.SettledSince = -1f; CaptureCartResponsiblePlayer(cart, state); } CaptureCartResponsiblePlayer(cart, state); AccumulateCartFlipRotation(state, cartTumbleAngularSpeed, unscaledTime); if (flag && num >= 0.65f) { CreditCartFlipStreak(state); ResetCartFlipSession(state, keepUprightReady: true); } else if (flag2) { state.SettledSince = -1f; } else if (state.SettledSince < 0f) { state.SettledSince = Time.unscaledTime; } else if (!(Time.unscaledTime - state.SettledSince < 0.5f)) { CreditCartFlipStreak(state); ResetCartFlipSession(state, keepUprightReady: false); } } private static void ResetCartFlipSession(CartFlipState state, bool keepUprightReady) { state.FlipInProgress = false; state.WasUprightOnWheels = keepUprightReady; state.CurrentFlipStreak = 0; state.AccumulatedFlipRadians = 0f; state.LastFlipPollTime = -1f; state.SettledSince = -1f; state.ResponsiblePlayerGuid = 0uL; state.ResponsiblePlayerName = null; } private static void AccumulateCartFlipRotation(CartFlipState state, float tumbleAngularSpeed, float now) { if (state.LastFlipPollTime < 0f) { state.LastFlipPollTime = now; return; } float num = Mathf.Clamp(now - state.LastFlipPollTime, 0f, 0.5f); state.LastFlipPollTime = now; if (!(num <= 0f)) { state.AccumulatedFlipRadians += tumbleAngularSpeed * num; state.CurrentFlipStreak = Mathf.FloorToInt(state.AccumulatedFlipRadians / ((float)Math.PI * 2f)); } } private static bool AreAllCartWheelsGrounded(GolfCartMovement cart, CartFlipState state) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) WheelCollider[] array = state.Wheels; if (array == null || array.Length < 4) { array = ((Component)cart).GetComponentsInChildren(true); state.Wheels = array ?? Array.Empty(); } if (array != null && array.Length >= 4) { int num = 0; WheelCollider[] array2 = array; foreach (WheelCollider val in array2) { if ((Object)(object)val != (Object)null && val.isGrounded) { num++; } } return num >= 4; } return Vector3.Dot(((Component)cart).transform.up, Vector3.up) >= 0.65f; } private static bool IsCartMoving(GolfCartMovement cart) { //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_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) Rigidbody component = ((Component)cart).GetComponent(); if ((Object)(object)component == (Object)null) { return false; } Vector3 val = component.linearVelocity; if (!(((Vector3)(ref val)).sqrMagnitude > 0.122499995f)) { val = component.angularVelocity; return ((Vector3)(ref val)).sqrMagnitude > 0.122499995f; } return true; } private static float GetCartTumbleAngularSpeed(GolfCartMovement cart) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) Rigidbody component = ((Component)cart).GetComponent(); if ((Object)(object)component == (Object)null) { return 0f; } Vector3 val = Vector3.ProjectOnPlane(component.angularVelocity, Vector3.up); return ((Vector3)(ref val)).magnitude; } private static void CaptureCartResponsiblePlayer(GolfCartMovement cart, CartFlipState state) { if (TryGetCartResponsiblePlayer(cart, out var player) && !((Object)(object)((player != null) ? player.PlayerId : null) == (Object)null)) { state.ResponsiblePlayerGuid = player.PlayerId.Guid; state.ResponsiblePlayerName = GetPlayerName(player, state.ResponsiblePlayerGuid); } } private static bool TryGetCartResponsiblePlayer(GolfCartMovement cart, out PlayerInfo player) { player = null; GolfCartInfo val = ((cart != null) ? cart.GolfCartInfo : null); if ((Object)(object)val == (Object)null && (Object)(object)cart != (Object)null) { val = ((Component)cart).GetComponent() ?? ((Component)cart).GetComponentInParent(); } if ((Object)(object)val == (Object)null) { return false; } try { if (val.TryGetDriver(ref player) && (Object)(object)player != (Object)null) { return true; } } catch (Exception ex) { ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogDebug((object)("Could not read golf cart driver for flip stats: " + ex.Message)); } } player = val.ResponsiblePlayer; return (Object)(object)player != (Object)null; } private static void CreditCartFlipStreak(CartFlipState state) { if (state.ResponsiblePlayerGuid == 0L || state.CurrentFlipStreak <= 0) { return; } cartBestFlipStreaks.TryGetValue(state.ResponsiblePlayerGuid, out var value); if (state.CurrentFlipStreak > value) { cartBestFlipStreaks[state.ResponsiblePlayerGuid] = state.CurrentFlipStreak; string arg = (string.IsNullOrEmpty(state.ResponsiblePlayerName) ? GetPlayerName(null, state.ResponsiblePlayerGuid) : state.ResponsiblePlayerName); ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)$"Tracked Pro Golf best cart flip streak: {arg} ({state.CurrentFlipStreak})."); } } } private static bool TryGetDistanceToPinOnGreen(GolfBall ball, out float distanceToPin) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) distanceToPin = 0f; GolfHole val = FindMainHole(); if ((Object)(object)val == (Object)null || (Object)(object)ball == (Object)null || !val.IsPointInGreenTrigger(((Component)ball).transform.position)) { return false; } Vector3 val2 = ((Component)ball).transform.position - ((Component)val).transform.position; val2.y = 0f; distanceToPin = ((Vector3)(ref val2)).magnitude; return true; } private static GolfHole FindMainHole() { if ((Object)(object)GolfHoleManager.MainHole != (Object)null) { return GolfHoleManager.MainHole; } GolfHole[] array = Object.FindObjectsByType((FindObjectsSortMode)0); GolfHole[] array2 = array; foreach (GolfHole val in array2) { if ((Object)(object)val != (Object)null && val.IsMainHole) { return val; } } if (array.Length == 0) { return null; } return array[0]; } private static bool HasActiveDriveForPlayer(ulong playerGuid) { foreach (DriveCandidate value in activeDrives.Values) { if (value.PlayerGuid == playerGuid) { return true; } } return false; } private static void InvalidateFirstDrive(PlayerInfo player) { if (!NetworkServer.active || !IsActiveProGolf() || (Object)(object)((player != null) ? player.PlayerId : null) == (Object)null) { return; } ResetLongestDriveIfHoleChanged(); ulong guid = player.PlayerId.Guid; bool flag = false; List list = new List(); foreach (KeyValuePair activeDrife in activeDrives) { if (activeDrife.Value.PlayerGuid == guid) { list.Add(activeDrife.Key); flag = true; } } foreach (GolfBall item in list) { activeDrives.Remove(item); } if (!firstDriveResults.ContainsKey(guid) && flag) { firstDriveResults[guid] = new FirstDriveResult { PlayerName = GetPlayerName(player, guid), Distance = 0f, IsValid = false }; TryAnnounceLongestDriveIfReady(); } } private static void TryAnnounceLongestDriveIfReady() { if (longestDriveAnnounced) { return; } List activePlayerGuids = GetActivePlayerGuids(); if (activePlayerGuids.Count == 0) { return; } foreach (ulong item in activePlayerGuids) { if (!firstDriveResults.ContainsKey(item)) { return; } } FirstDriveResult firstDriveResult = null; foreach (ulong item2 in activePlayerGuids) { FirstDriveResult firstDriveResult2 = firstDriveResults[item2]; if (firstDriveResult2.IsValid && (firstDriveResult == null || firstDriveResult2.Distance > firstDriveResult.Distance)) { firstDriveResult = firstDriveResult2; } } longestDriveAnnounced = true; if (firstDriveResult != null) { string text = $"Longest Drive: {firstDriveResult.PlayerName} {Mathf.RoundToInt(firstDriveResult.Distance)}m"; PublishProGolfAnnouncement(text); ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)text); } } } private static void TryAnnounceClosestToPinIfReady() { if (closestToPinAnnounced || !NetworkServer.active || !IsActiveProGolf()) { return; } List activePlayerGuids = GetActivePlayerGuids(); if (activePlayerGuids.Count == 0) { return; } foreach (ulong item in activePlayerGuids) { if (!closestToPinResults.ContainsKey(item)) { return; } } ClosestToPinResult closestToPinResult = null; foreach (ulong item2 in activePlayerGuids) { ClosestToPinResult closestToPinResult2 = closestToPinResults[item2]; if (closestToPinResult == null || closestToPinResult2.Distance < closestToPinResult.Distance) { closestToPinResult = closestToPinResult2; } } closestToPinAnnounced = true; if (closestToPinResult != null) { string text = "Closest to Pin: " + closestToPinResult.PlayerName + " " + FormatDistance(closestToPinResult.Distance); PublishProGolfAnnouncement(text); ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)text); } } } private static void TryAnnounceHoleStatsIfReady() { if (holeStatsAnnounced || !NetworkServer.active || !IsProGolfScoringActive()) { return; } List activePlayerGuids = GetActivePlayerGuids(); if (activePlayerGuids.Count != 0) { holeStatsAnnounced = true; PublishProGolfHoleStats(activePlayerGuids); MarkScoreboardsDirty(); ProGolfPlugin proGolfPlugin = instance; if (proGolfPlugin != null) { ((BaseUnityPlugin)proGolfPlugin).Logger.LogInfo((object)"Published Pro Golf Plus hole stats for scoreboard rows."); } } } private static void PublishProGolfHoleStats(List activePlayers) { string text = BuildHoleStatsPayload(activePlayers); ApplyHoleStatsPayload(text); Lobby val = default(Lobby); if (BNetworkManager.TryGetSteamLobby(ref val)) { string text2 = (lastObservedHoleStatsVersion = $"{CourseManager.CurrentHoleGlobalIndex}:{Time.unscaledTime:R}"); ((Lobby)(ref val)).SetData("codex_progolfplus_hole_stats_payload", text); ((Lobby)(ref val)).SetData("codex_progolfplus_hole_stats_version", text2); } } private static string BuildHoleStatsPayload(List activePlayers) { List list = new List(); foreach (ulong activePlayer in activePlayers) { perfectShotCounts.TryGetValue(activePlayer, out var value); cartBestFlipStreaks.TryGetValue(activePlayer, out var value2); list.Add($"{activePlayer},{value},{value2}"); } return string.Join(";", list); } private static void ApplyHoleStatsPayload(string payload) { if (string.IsNullOrEmpty(payload)) { return; } string[] array = payload.Split(new char[1] { ';' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { ',' }); if (array2.Length == 3 && ulong.TryParse(array2[0], out var result) && int.TryParse(array2[1], out var result2) && int.TryParse(array2[2], out var result3)) { perfectShotCounts[result] = result2; cartBestFlipStreaks[result] = result3; } } } private static void MarkScoreboardsDirty() { Scoreboard[] array = Object.FindObjectsByType((FindObjectsInactive)1, (FindObjectsSortMode)0); foreach (Scoreboard val in array) { if ((Object)(object)val != (Object)null) { scoreboardMarkDirtyMethod?.Invoke(val, null); } } } private static string FormatDistance(float meters) { if (meters < 10f) { return $"{meters:0.0}m"; } return $"{Mathf.RoundToInt(meters)}m"; } private static List GetActivePlayerGuids() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Invalid comparison between Unknown and I4 //IL_003c: Unknown result type (might be due to invalid IL or missing references) List list = new List(); SyncList playerStates = CourseManager.PlayerStates; if (playerStates == null) { return list; } Enumerator enumerator = playerStates.GetEnumerator(); try { while (enumerator.MoveNext()) { PlayerState current = enumerator.Current; if (current.isConnected && !current.isSpectator && (int)current.matchResolution != -1) { list.Add(current.playerGuid); } } return list; } finally { ((IDisposable)enumerator).Dispose(); } } private static void UpdateScoreboardEntryProGolfStats(ScoreboardEntry entry, PlayerState playerState) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)entry == (Object)null) { return; } TextMeshProUGUI orCreateScoreboardEntryStatsLabel = GetOrCreateScoreboardEntryStatsLabel(entry); if (!((Object)(object)orCreateScoreboardEntryStatsLabel == (Object)null)) { if (!IsProGolfScoringActive() || playerState.isSpectator || playerState.playerGuid == 0L) { ((Component)orCreateScoreboardEntryStatsLabel).gameObject.SetActive(false); return; } perfectShotCounts.TryGetValue(playerState.playerGuid, out var value); cartBestFlipStreaks.TryGetValue(playerState.playerGuid, out var value2); ((TMP_Text)orCreateScoreboardEntryStatsLabel).text = $"Perfect {value} | Flip Streak {value2}"; ((Component)orCreateScoreboardEntryStatsLabel).gameObject.SetActive(true); } } private static TextMeshProUGUI GetOrCreateScoreboardEntryStatsLabel(ScoreboardEntry entry) { //IL_004f: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) if (scoreboardEntryStatLabels.TryGetValue(entry, out var value) && (Object)(object)value != (Object)null) { return value; } object? obj = scoreboardEntryStatsBackgroundField?.GetValue(entry); Image val = (Image)((obj is Image) ? obj : null); Transform val2 = (((Object)(object)val != (Object)null) ? ((Component)val).transform : ((Component)entry).transform); GameObject val3 = new GameObject("ProGolfPlusStats"); val3.transform.SetParent(val2, false); RectTransform obj2 = val3.AddComponent(); obj2.anchorMin = new Vector2(0.04f, 0.02f); obj2.anchorMax = new Vector2(0.96f, 0.34f); obj2.offsetMin = Vector2.zero; obj2.offsetMax = Vector2.zero; TextMeshProUGUI val4 = val3.AddComponent(); object? obj3 = scoreboardEntryNameField?.GetValue(entry); TextMeshProUGUI val5 = (TextMeshProUGUI)((obj3 is TextMeshProUGUI) ? obj3 : null); if ((Object)(object)val5 != (Object)null) { ((TMP_Text)val4).font = ((TMP_Text)val5).font; ((TMP_Text)val4).fontSharedMaterial = ((TMP_Text)val5).fontSharedMaterial; } ((TMP_Text)val4).alignment = (TextAlignmentOptions)514; ((TMP_Text)val4).enableAutoSizing = true; ((TMP_Text)val4).fontSizeMin = 10f; ((TMP_Text)val4).fontSizeMax = 17f; ((Graphic)val4).color = new Color(0.82f, 0.88f, 1f, 1f); ((Graphic)val4).raycastTarget = false; ((TMP_Text)val4).text = string.Empty; scoreboardEntryStatLabels[entry] = val4; return val4; } private static void UpdateScoreboardProGolfStatCard(Scoreboard scoreboard) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)scoreboard == (Object)null) && IsProGolfScoringActive()) { PlayerState localPlayerState = CourseManager.GetLocalPlayerState(); if (localPlayerState.playerGuid != 0L && !localPlayerState.isSpectator) { perfectShotCounts.TryGetValue(localPlayerState.playerGuid, out var value); cartBestFlipStreaks.TryGetValue(localPlayerState.playerGuid, out var value2); object? obj = scoreboardItemPickupsStatField?.GetValue(scoreboard); ScoreboardStat stat = (ScoreboardStat)((obj is ScoreboardStat) ? obj : null); object? obj2 = scoreboardKnockoutRatioStatField?.GetValue(scoreboard); object? stat2 = ((obj2 is ScoreboardStat) ? obj2 : null); UpdateScoreboardStat(stat, "Item Pickups", "Perfect Shots", value.ToString()); UpdateScoreboardStat((ScoreboardStat)stat2, "Knockout Ratio", "Best Cart Flip Streak", value2.ToString()); } } } private static void UpdateScoreboardStat(ScoreboardStat stat, string oldTitle, string newTitle, string value) { if (!((Object)(object)stat == (Object)null)) { stat.Initialize(value, (Sprite)null); TryReplaceScoreboardStatTitle(stat, oldTitle, newTitle); } } private static void TryReplaceScoreboardStatTitle(ScoreboardStat stat, string oldTitle, string newTitle) { object? obj = scoreboardStatLabelField?.GetValue(stat); TextMeshProUGUI val = (TextMeshProUGUI)((obj is TextMeshProUGUI) ? obj : null); Transform val2 = (((Object)(object)((Component)stat).transform.parent != (Object)null) ? ((Component)stat).transform.parent : ((Component)stat).transform); int num = 0; while (num < 3 && (Object)(object)val2 != (Object)null) { TMP_Text[] componentsInChildren = ((Component)val2).GetComponentsInChildren(true); foreach (TMP_Text val3 in componentsInChildren) { if ((Object)(object)val3 == (Object)null || val3 == val) { continue; } string text = (val3.text ?? string.Empty).Trim(); if (!text.Equals(oldTitle, StringComparison.OrdinalIgnoreCase) && !text.Equals(newTitle, StringComparison.OrdinalIgnoreCase)) { continue; } Behaviour[] components = ((Component)val3).GetComponents(); foreach (Behaviour val4 in components) { if ((Object)(object)val4 != (Object)null && ((object)val4).GetType().Name == "LocalizeStringEvent") { val4.enabled = false; } } val3.text = newTitle; return; } num++; val2 = val2.parent; } } private static void PublishProGolfAnnouncement(string text) { string text2 = (lastObservedAnnouncementVersion = $"{CourseManager.CurrentHoleGlobalIndex}:{Time.unscaledTime:R}"); ShowTopAnnouncement(text); Lobby val = default(Lobby); if (BNetworkManager.TryGetSteamLobby(ref val)) { ((Lobby)(ref val)).SetData("codex_progolfplus_announcement_text", text); ((Lobby)(ref val)).SetData("codex_progolfplus_announcement_version", text2); } } private static string GetPlayerName(PlayerInfo player, ulong playerGuid) { string text = null; if ((Object)(object)((player != null) ? player.PlayerId : null) != (Object)null) { text = CourseManager.GetPlayerName(player.PlayerId); } if (string.IsNullOrEmpty(text) && playerGuid != 0L) { text = CourseManager.GetPlayerName(playerGuid); } if (!string.IsNullOrEmpty(text)) { return text; } return "Player"; } } }