Decompiled source of LobbyKit v1.1.3
LobbyKit.dll
Decompiled 11 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using HarmonyLib; using Il2Cpp; using Il2CppDissonance.Integrations.FishNet; using Il2CppEpic.OnlineServices; using Il2CppEpic.OnlineServices.Lobby; using Il2CppFishNet; using Il2CppFishNet.Component.Transforming; using Il2CppFishNet.Connection; using Il2CppFishNet.Managing; using Il2CppFishNet.Managing.Client; using Il2CppFishNet.Managing.Logging; using Il2CppFishNet.Managing.Server; using Il2CppFishNet.Managing.Timing; using Il2CppFishNet.Object; using Il2CppFishNet.Object.Synchronizing; using Il2CppFishNet.Serializing; using Il2CppFishNet.Transporting; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppPlayEveryWare.EpicOnlineServices.Samples; using Il2CppSystem; using Il2CppSystem.Reflection; using Il2CppTMPro; using Il2CppTankAndHealerStudioAssets; using Il2Cpp_Scripts.Managers; using Il2Cpp_Scripts.Systems.Chat; using Il2Cpp_Scripts.UI.Components; using Il2Cpp_Scripts.UI.Pre_Game; using LobbyKit; using LobbyKit.Features.Anticheat; using LobbyKit.Features.Fixes; using LobbyKit.Features.Lobby; using LobbyKit.Features.Permissions; using LobbyKit.Features.PlayerList; using LobbyKit.Features.Settings; using LobbyKit.Patches; using MelonLoader; using MelonLoader.Preferences; using MelonLoader.Utils; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(LobbyKitCore), "LobbyKit", "1.1.3", "Spyci", null)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("Spyci")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.3")] [assembly: AssemblyInformationalVersion("1.1.3+f32ff69e55d405912b4489cc1e65b498321c45ef")] [assembly: AssemblyProduct("LobbyKit")] [assembly: AssemblyTitle("LobbyKit")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 LobbyKit { public class LobbyKitCore : MelonMod { [HarmonyPatch(typeof(PlayerReferenceManager), "OnPlayerReferenceAdded")] public static class PlayerJoinPatch { private static void Postfix(PlayerReferenceManager __instance, int index) { SyncList<PlayerReference> playerReferences = __instance.GetPlayerReferences(); if (playerReferences == null || index < 0 || index >= playerReferences.Count) { return; } PlayerReference val = playerReferences[index]; if (val != null) { if (val.IsLocalPlayerInstance()) { Instance.localPlayer = val; isHost = val.ConnectionID == 32767; } Instance.PlayerJoinedGame(val); } } } [HarmonyPatch(typeof(PlayerReferenceManager), "OnPlayerReferenceRemoved")] public static class PlayerLeavePatch { private static void Postfix(PlayerReferenceManager __instance, int index, PlayerReference removedItem) { Instance.PlayerLeftGame(removedItem); } } [HarmonyPatch(typeof(PlayerReferenceManager), "Server_AddPlayerReference")] public static class DedicatedServerJoinPatch { private static void Postfix(PlayerReferenceManager __instance, int connectionId) { if (Instance != null && Application.isBatchMode && connectionId != 32767) { isHost = true; PlayerReference val = FindByConnectionId(__instance, connectionId); if (val != null) { Instance.PlayerJoinedGame(val); } } } } [HarmonyPatch(typeof(PlayerReferenceManager), "Server_RemovePlayerReference")] public static class DedicatedServerLeavePatch { private static void Prefix(PlayerReferenceManager __instance, int playerNetId) { if (Instance != null && Application.isBatchMode && playerNetId != 32767) { isHost = true; PlayerReference val = FindByConnectionId(__instance, playerNetId); if (val != null) { Instance.PlayerLeftGame(val); } } } } public static LobbyKitCore Instance; private PlayerReference localPlayer; private readonly List<PlayerReference> players = new List<PlayerReference>(); private readonly Dictionary<int, double> _playerJoinTimes = new Dictionary<int, double>(); private readonly Dictionary<string, double> _playerJoinTimesByProductId = new Dictionary<string, double>(); public static bool isHost; public static bool WasHosting; private static MelonPreferences_Category _preferences; private static MelonPreferences_Category _serverSettings; private static MelonPreferences_Entry<bool> _enableGuestBangCommands; private static MelonPreferences_Entry<string> _serverName; private static MelonPreferences_Entry<int> _serverCapacity; private static MelonPreferences_Entry<int> _searchMinPlayers; private static MelonPreferences_Entry<int> _searchMaxPlayers; private static MelonPreferences_Entry<bool> _searchShowLocked; private static MelonPreferences_Entry<bool> _searchShowModded; private static MelonPreferences_Entry<bool> _searchShowYourLanguageOnly; private static MelonPreferences_Entry<bool> _searchOnlyPeacefulLobbies; private static MelonPreferences_Entry<bool> _searchHidePeacefulLobbies; private static MelonPreferences_Entry<int> _searchRegionMode; private static MelonPreferences_Entry<bool> _isPublicLobby; private static MelonPreferences_Entry<bool> _isPasswordProtected; private static MelonPreferences_Entry<string> _lobbyPassword; private static MelonPreferences_Entry<bool> _isPeacefulMode; private static MelonPreferences_Entry<bool> _isTextChatOnly; private static MelonPreferences_Entry<string> _messageOfTheDay; private static MelonPreferences_Entry<bool> _showJoinMessages; private static MelonPreferences_Entry<bool> _showLeaveMessages; private static MelonPreferences_Entry<int> _joinMessageSize; private static MelonPreferences_Entry<int> _leaveMessageSize; private static MelonPreferences_Entry<bool> _autoRestartOnCrash; private static MelonPreferences_Entry<bool> _showKickBanMessages; private static MelonPreferences_Entry<bool> _blockThrowingSpam; private static MelonPreferences_Entry<bool> _blockPlayerSizeCheat; private static MelonPreferences_Entry<bool> _blockFlyingSleds; private static MelonPreferences_Entry<List<string>> _chatPrefixes; private PlayerReferenceManager _playerReferenceManager; public bool ReferencesLoaded; private string _lastPlayerCountLog; public static bool EnableGuestBangCommands => _enableGuestBangCommands?.Value ?? true; public static string ServerName => _serverName?.Value ?? string.Empty; public static int ServerCapacity => _serverCapacity?.Value ?? 8; public static int SearchMinPlayers => _searchMinPlayers?.Value ?? 1; public static int SearchMaxPlayers => _searchMaxPlayers?.Value ?? 0; public static bool SearchShowLocked => _searchShowLocked?.Value ?? true; public static bool SearchShowModded => _searchShowModded?.Value ?? true; public static bool SearchShowYourLanguageOnly => _searchShowYourLanguageOnly?.Value ?? false; public static bool SearchOnlyPeacefulLobbies => _searchOnlyPeacefulLobbies?.Value ?? false; public static bool SearchHidePeacefulLobbies => _searchHidePeacefulLobbies?.Value ?? false; public static int SearchRegionMode => _searchRegionMode?.Value ?? 1; public static bool IsPublicLobby => _isPublicLobby?.Value ?? true; public static bool IsPasswordProtected => _isPasswordProtected?.Value ?? false; public static string LobbyPassword => _lobbyPassword?.Value ?? string.Empty; public static bool IsPeacefulMode => _isPeacefulMode?.Value ?? false; public static bool IsTextChatOnly => _isTextChatOnly?.Value ?? false; public static string MessageOfTheDay => _messageOfTheDay?.Value ?? string.Empty; public static bool ShowJoinMessages => _showJoinMessages?.Value ?? true; public static bool ShowLeaveMessages => _showLeaveMessages?.Value ?? true; public static int JoinMessageSize => _joinMessageSize?.Value ?? 75; public static int LeaveMessageSize => _leaveMessageSize?.Value ?? 75; public static bool AutoRestartOnCrash => _autoRestartOnCrash?.Value ?? false; public static bool ShowKickBanMessages => _showKickBanMessages?.Value ?? true; public static bool BlockThrowingSpam => _blockThrowingSpam?.Value ?? true; public static bool BlockPlayerSizeCheat => _blockPlayerSizeCheat?.Value ?? true; public static bool BlockFlyingSleds => _blockFlyingSleds?.Value ?? true; private int RemotePlayerCount => players.Count((PlayerReference pl) => pl != null && pl.ConnectionID != 32767); public static string ChatPrefixFor(PermLevel level) { int num = (int)(level - 1); List<string> list = _chatPrefixes?.Value; if (list == null || num < 0 || num >= list.Count || list[num] == null) { return string.Empty; } return list[num]; } public void SavePrefs() { MelonPreferences.Save(); } public override void OnInitializeMelon() { Instance = this; _preferences = MelonPreferences.CreateCategory("LobbyKit", "LobbyKit"); _enableGuestBangCommands = _preferences.CreateEntry<bool>("EnableGuestBangCommands", true, "Enable Guest Bang Commands", "Allow non-host players to use custom bang chat commands like !tp.", false, false, (ValueValidator)null, (string)null); _serverSettings = MelonPreferences.CreateCategory("ServerSettings", "Server Settings"); _serverName = GetOrCreate(_serverSettings, "ServerName", string.Empty, "Server Name", "Custom default lobby/server name. Leave empty to use '<PlayerName>'s Lobby'."); _serverCapacity = GetOrCreate(_serverSettings, "ServerCapacity", 8, "Server Capacity", "Saved default value for the max players slider."); _isPublicLobby = GetOrCreate(_serverSettings, "IsPublicLobby", defaultValue: true, "Public Lobby", "Saved default for public/private lobby."); _isPasswordProtected = GetOrCreate(_serverSettings, "IsPasswordProtected", defaultValue: false, "Password Protected", "Saved default for password protection."); _lobbyPassword = GetOrCreate(_serverSettings, "LobbyPassword", string.Empty, "Lobby Password", "Saved default lobby password."); _isPeacefulMode = GetOrCreate(_serverSettings, "IsPeacefulMode", defaultValue: false, "Peaceful Mode", "Saved default for peaceful mode."); _isTextChatOnly = GetOrCreate(_serverSettings, "IsTextChatOnly", defaultValue: false, "Text Chat Only", "Saved default for text-chat-only mode."); MigrateServerSetting(_preferences, "ServerName", _serverName, string.Empty); MigrateServerSetting(_preferences, "ServerCapacity", _serverCapacity, 8); MigrateServerSetting(_preferences, "IsPublicLobby", _isPublicLobby, defaultValue: true); MigrateServerSetting(_preferences, "IsPasswordProtected", _isPasswordProtected, defaultValue: false); MigrateServerSetting(_preferences, "LobbyPassword", _lobbyPassword, string.Empty); MigrateServerSetting(_preferences, "IsPeacefulMode", _isPeacefulMode, defaultValue: false); MigrateServerSetting(_preferences, "IsTextChatOnly", _isTextChatOnly, defaultValue: false); _searchMaxPlayers = _preferences.CreateEntry<int>("SearchMaxPlayers", 0, "Search Max Players", "Maximum players filter for lobby search. 0 == Any.", false, false, (ValueValidator)null, (string)null); _searchShowLocked = _preferences.CreateEntry<bool>("SearchShowLocked", true, "Search Show Locked", "Include locked lobbies in search results.", false, false, (ValueValidator)null, (string)null); _searchShowModded = _preferences.CreateEntry<bool>("SearchShowModded", true, "Search Show Modded", "Include modded lobbies in search results.", false, false, (ValueValidator)null, (string)null); _searchShowYourLanguageOnly = _preferences.CreateEntry<bool>("SearchShowYourLanguageOnly", false, "Search Your Language Only", "Filter to language-matching lobbies.", false, false, (ValueValidator)null, (string)null); _searchOnlyPeacefulLobbies = _preferences.CreateEntry<bool>("SearchOnlyPeacefulLobbies", false, "Search Only Peaceful Lobbies", "Only show peaceful-mode lobbies in search results.", false, false, (ValueValidator)null, (string)null); _searchHidePeacefulLobbies = _preferences.CreateEntry<bool>("SearchHidePeacefulLobbies", false, "Search Hide Peaceful Lobbies", "Hide peaceful-mode lobbies in search results.", false, false, (ValueValidator)null, (string)null); _searchRegionMode = _preferences.CreateEntry<int>("SearchRegionMode", 1, "Search Region Mode", "Lobby search region filter: 0 near, 1 nearby regions, 2 far, 3 worldwide.", false, false, (ValueValidator)null, (string)null); _messageOfTheDay = _preferences.CreateEntry<string>("MessageOfTheDay", string.Empty, "Message of the Day", "Private chat message sent to each player when they join your hosted lobby. Leave empty to disable.", false, false, (ValueValidator)null, (string)null); _showJoinMessages = _preferences.CreateEntry<bool>("ShowJoinMessages", true, "Show Join Messages", "Broadcast a chat message when a player joins your hosted lobby.", false, false, (ValueValidator)null, (string)null); _showLeaveMessages = _preferences.CreateEntry<bool>("ShowLeaveMessages", true, "Show Leave Messages", "Broadcast a chat message when a player leaves your hosted lobby.", false, false, (ValueValidator)null, (string)null); _joinMessageSize = _preferences.CreateEntry<int>("JoinMessageSize", 75, "Join Message Size", "Font size percentage for join messages (e.g. 75 for 75%).", false, false, (ValueValidator)null, (string)null); _leaveMessageSize = _preferences.CreateEntry<int>("LeaveMessageSize", 75, "Leave Message Size", "Font size percentage for leave messages (e.g. 75 for 75%).", false, false, (ValueValidator)null, (string)null); _autoRestartOnCrash = _preferences.CreateEntry<bool>("AutoRestartOnCrash", false, "Auto-Restart On Crash", "Automatically re-host the lobby when it crashes unexpectedly.", false, false, (ValueValidator)null, (string)null); _showKickBanMessages = _preferences.CreateEntry<bool>("ShowKickBanMessages", true, "Show Kick/Ban Messages", "Broadcast a chat message when a player is kicked or banned from your hosted lobby.", false, false, (ValueValidator)null, (string)null); _blockThrowingSpam = _preferences.CreateEntry<bool>("BlockThrowingSpam", true, "Block Throwing Spam", "Anticheat: rate-limit and kick clients who spam server RPCs (e.g. rapid throwing).", false, false, (ValueValidator)null, (string)null); _blockPlayerSizeCheat = _preferences.CreateEntry<bool>("BlockPlayerSizeCheat", true, "Block Player Size Cheat", "Anticheat: force each player's avatar to their allowed size (default 1, or their !size choice) and clamp any cheated scale back.", false, false, (ValueValidator)null, (string)null); _blockFlyingSleds = _preferences.CreateEntry<bool>("BlockFlyingSleds", true, "Block Flying Sleds", "Anticheat: no-op the client-initiated Cmd_PushSled (a raw AddForce lever used to fly sleds). Boosts use a separate path and are unaffected.", false, false, (ValueValidator)null, (string)null); _chatPrefixes = _preferences.CreateEntry<List<string>>("ChatPrefixes", new List<string> { "<#7DFF7D>[M]</color> ", "<#7DD0FF>[A]</color> ", "<#FFE066>[O]</color> " }, "Chat Prefixes", "Prefixes shown before a name in chat, by level: [Mod, Admin, Owner]. Empty string disables that level's prefix.", false, false, (ValueValidator)null, (string)null); Perms.Initialize(); ChatSystem.SeedCommandLevels(); MelonPreferences.Save(); ((MelonBase)this).HarmonyInstance.PatchAll(); GenericServerRpcRateLimitPatch.ApplyPatches(((MelonBase)this).HarmonyInstance); PlayerScalePacketClamp.Apply(((MelonBase)this).HarmonyInstance); SledPushBlockPatch.Apply(((MelonBase)this).HarmonyInstance); CannonLaunchFix.Apply(((MelonBase)this).HarmonyInstance); MelonCoroutines.Start(PlayerCountLogLoop()); } private static MelonPreferences_Entry<T> GetOrCreate<T>(MelonPreferences_Category category, string identifier, T defaultValue, string displayName, string description = null) { if (!category.HasEntry(identifier)) { return category.CreateEntry<T>(identifier, defaultValue, displayName, description, false, false, (ValueValidator)null, (string)null); } return category.GetEntry<T>(identifier); } private static void MigrateServerSetting<T>(MelonPreferences_Category oldCategory, string key, MelonPreferences_Entry<T> target, T defaultValue) { try { if (oldCategory != null && target != null) { MelonPreferences_Entry<T> val = oldCategory.CreateEntry<T>(key, defaultValue, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); bool flag = EqualityComparer<T>.Default.Equals(val.Value, defaultValue); if (EqualityComparer<T>.Default.Equals(target.Value, defaultValue) && !flag) { target.Value = val.Value; } oldCategory.DeleteEntry(key); } } catch (Exception ex) { MelonLogger.Warning($"[LobbyKit] ServerSettings migrate '{key}' failed: {ex.GetType().Name}: {ex.Message}"); } } public override void OnLateUpdate() { if (BlockPlayerSizeCheat) { PlayerScaleEnforcer.Tick(); } } private IEnumerator PlayerCountLogLoop() { while (true) { yield return (object)new WaitForSecondsRealtime(60f); if (isHost) { int remotePlayerCount = RemotePlayerCount; string value = ((remotePlayerCount > 0) ? (" [" + string.Join(", ", from pl in players where pl != null && pl.ConnectionID != 32767 select ChatSystem.StripRichText(string.IsNullOrWhiteSpace(pl.Username) ? "?" : pl.Username)) + "]") : ""); string text = $"[LobbyKit] Players online: {remotePlayerCount}{value}"; if (!(text == _lastPlayerCountLog)) { _lastPlayerCountLog = text; MelonLogger.Msg(text); } } } } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { ReferencesLoaded = false; ResetLobbyTrackingState("scene loaded"); ChatSystem.ResetSessionState(); MelonCoroutines.Start(LoadReferences()); } private static PlayerReference FindByConnectionId(PlayerReferenceManager prm, int connectionId) { SyncList<PlayerReference> playerReferences = prm.GetPlayerReferences(); if (playerReferences == null) { return null; } for (int i = 0; i < playerReferences.Count; i++) { PlayerReference val = playerReferences[i]; if (val != null && val.ConnectionID == connectionId) { return val; } } return null; } public void PlayerJoinedGame(PlayerReference p) { if (p == null) { return; } if (isHost && p.ConnectionID != 32767 && !p.IsLocalPlayerInstance() && Perms.IsBanned(p.ProductUserId)) { KickAnnouncer.Enqueue(p.ConnectionID, "is banned"); try { ServerManager serverManager = InstanceFinder.ServerManager; if (serverManager != null) { serverManager.Kick(p.ConnectionID, (KickReason)0, (LoggingType)3, ""); } } catch { } MelonLogger.Msg($"[LobbyKit] Banned player kicked on join (conn {p.ConnectionID}, puid {p.ProductUserId})."); return; } if (isHost && p.ConnectionID != 32767) { Perms.RememberName(p.ProductUserId, ChatSystem.StripRichText(p.Username)); } double lobbyUptimeSeconds = GetLobbyUptimeSeconds(); bool flag = p.IsLocalPlayerInstance(); bool flag2 = !players.Any((PlayerReference player) => player != null && player.ConnectionID == p.ConnectionID); if (flag2) { players.Add(p); } if (isHost || flag) { if (!string.IsNullOrWhiteSpace(p.ProductUserId) && _playerJoinTimesByProductId.TryGetValue(p.ProductUserId, out var value) && value > lobbyUptimeSeconds + 1.0) { _playerJoinTimesByProductId[p.ProductUserId] = lobbyUptimeSeconds; } if (flag2) { TrackPlayerJoinTime(p, lobbyUptimeSeconds); } } if (flag) { localPlayer = p; isHost = p.ConnectionID == 32767; if (isHost) { WasHosting = true; SilentCrashDetectionPatches.StartPolling(); } } else if (isHost && flag2) { if (ShowJoinMessages) { string value2 = ChatSystem.AutoCloseTmpRichText(string.IsNullOrWhiteSpace(p.Username) ? "A player" : p.Username); ChatSystem.BroadcastSystemMessage($"<size={JoinMessageSize}%><#FA0>{value2} joined."); } string value3 = ChatSystem.StripRichText(string.IsNullOrWhiteSpace(p.Username) ? "A player" : p.Username); MelonLogger.Msg($"[LobbyKit] + {value3} joined (conn {p.ConnectionID}, puid {p.ProductUserId}) — {RemotePlayerCount} online."); if (PlayerSizeRegistry.AnySizes) { MelonCoroutines.Start(RepushSizesForJoin()); } } if (isHost) { ChatSystem.SendMotdToPlayer(p); } try { string connectionAddress = InstanceFinder.TransportManager.Transport.GetConnectionAddress(p.ConnectionID); Debug.Log(Object.op_Implicit($"Client {p.ConnectionID} connection ID: {connectionAddress}")); } catch (Exception ex) { Debug.LogError(Object.op_Implicit($"Error occurred while fetching connection ID for client {p.ConnectionID}: {ex.Message}")); } } public void PlayerLeftGame(PlayerReference removedPlayer) { if (removedPlayer == null) { return; } bool flag = players.Any((PlayerReference player) => player != null && player.ConnectionID == removedPlayer.ConnectionID); bool flag2 = removedPlayer.IsLocalPlayerInstance(); if (isHost && flag && !flag2) { string value = ChatSystem.AutoCloseTmpRichText(string.IsNullOrWhiteSpace(removedPlayer.Username) ? "A player" : removedPlayer.Username); string value2 = ChatSystem.StripRichText(string.IsNullOrWhiteSpace(removedPlayer.Username) ? "A player" : removedPlayer.Username); int value3 = RemotePlayerCount - 1; if (KickAnnouncer.TryConsume(removedPlayer.ConnectionID, out var reason)) { if (ShowKickBanMessages) { ChatSystem.BroadcastSystemMessage($"<size={LeaveMessageSize}%><#F44>{value} {reason}."); } MelonLogger.Msg($"[LobbyKit] - {value2} {reason} (conn {removedPlayer.ConnectionID}) — {value3} online."); } else { if (ShowLeaveMessages) { ChatSystem.BroadcastSystemMessage($"<size={LeaveMessageSize}%><#FA0>{value} left."); } MelonLogger.Msg($"[LobbyKit] - {value2} left (conn {removedPlayer.ConnectionID}) — {value3} online."); } } players.RemoveAll((PlayerReference player) => player == null || player.ConnectionID == removedPlayer.ConnectionID); _playerJoinTimes.Remove(removedPlayer.ConnectionID); if (!string.IsNullOrWhiteSpace(removedPlayer.ProductUserId)) { _playerJoinTimesByProductId.Remove(removedPlayer.ProductUserId); } ChatSystem.ForgetMotdRecipient(removedPlayer.ConnectionID); ChatSystem.ForgetTeleportRequests(removedPlayer.ConnectionID); PlayerSizeRegistry.Remove(removedPlayer.ConnectionID); if (localPlayer != null && localPlayer.ConnectionID == removedPlayer.ConnectionID) { localPlayer = null; isHost = false; SilentCrashDetectionPatches.StopPolling(); ResetLobbyTrackingState("local player removed"); } } public PlayerReference GetLocalPlayer() { if (localPlayer == null) { return null; } return localPlayer; } public bool TryGetPlayerJoinTime(PlayerReference playerReference, out double joinTimeSeconds) { joinTimeSeconds = 0.0; if (!isHost || playerReference == null) { return false; } return _playerJoinTimes.TryGetValue(playerReference.ConnectionID, out joinTimeSeconds); } public bool TryGetPlayerSessionDuration(PlayerReference playerReference, out double sessionSeconds) { sessionSeconds = 0.0; if (!isHost || playerReference == null) { return false; } double lobbyUptimeSeconds = GetLobbyUptimeSeconds(); if (!_playerJoinTimes.TryGetValue(playerReference.ConnectionID, out var value)) { value = ((playerReference.ConnectionID == 32767) ? 0.0 : lobbyUptimeSeconds); TrackPlayerJoinTime(playerReference, value); } else if (value > lobbyUptimeSeconds + 1.0) { value = ((playerReference.ConnectionID == 32767) ? 0.0 : lobbyUptimeSeconds); TrackPlayerJoinTime(playerReference, value); } sessionSeconds = lobbyUptimeSeconds - value; return true; } public bool TryGetPlayerSessionDuration(string productUserId, out double sessionSeconds) { sessionSeconds = 0.0; if (!isHost || string.IsNullOrWhiteSpace(productUserId)) { return false; } double lobbyUptimeSeconds = GetLobbyUptimeSeconds(); if (!_playerJoinTimesByProductId.TryGetValue(productUserId, out var value)) { value = lobbyUptimeSeconds; _playerJoinTimesByProductId[productUserId] = value; } else if (value > lobbyUptimeSeconds + 1.0) { value = lobbyUptimeSeconds; _playerJoinTimesByProductId[productUserId] = value; } sessionSeconds = lobbyUptimeSeconds - value; return true; } public bool TryGetPlayerListTimerDuration(string productUserId, bool isLobbyOwner, out double sessionSeconds) { sessionSeconds = 0.0; if (string.IsNullOrWhiteSpace(productUserId)) { return false; } if (!isHost) { double lobbyUptimeSeconds = GetLobbyUptimeSeconds(); if (isLobbyOwner) { sessionSeconds = lobbyUptimeSeconds; return true; } if (!IsLocalPlayerProductId(productUserId)) { return false; } if (!_playerJoinTimesByProductId.TryGetValue(productUserId, out var value)) { value = lobbyUptimeSeconds; _playerJoinTimesByProductId[productUserId] = value; } sessionSeconds = lobbyUptimeSeconds - value; return true; } return TryGetPlayerSessionDuration(productUserId, out sessionSeconds); } private bool IsLocalPlayerProductId(string productUserId) { if (localPlayer != null && !string.IsNullOrWhiteSpace(localPlayer.ProductUserId)) { return string.Equals(localPlayer.ProductUserId, productUserId, StringComparison.Ordinal); } return false; } private void TrackPlayerJoinTime(PlayerReference playerReference, double joinTimeSeconds) { _playerJoinTimes[playerReference.ConnectionID] = joinTimeSeconds; if (!string.IsNullOrWhiteSpace(playerReference.ProductUserId)) { _playerJoinTimesByProductId[playerReference.ProductUserId] = joinTimeSeconds; } } public void ResetLobbyTrackingState(string reason = null) { players.Clear(); _playerJoinTimes.Clear(); _playerJoinTimesByProductId.Clear(); if (!string.IsNullOrWhiteSpace(reason)) { Debug.Log(Object.op_Implicit("[LobbyKit] Reset lobby tracking state (" + reason + ").")); } } public static string FormatLobbyJoinTime(double uptimeSeconds) { if (uptimeSeconds < 0.0) { uptimeSeconds = 0.0; } TimeSpan timeSpan = TimeSpan.FromSeconds(uptimeSeconds); if (!(timeSpan.TotalHours >= 1.0)) { return $"{(int)timeSpan.TotalMinutes}:{timeSpan.Seconds:00}"; } return $"{(int)timeSpan.TotalHours}:{timeSpan.Minutes:00}:{timeSpan.Seconds:00}"; } private static double GetLobbyUptimeSeconds() { TimeManager timeManager = InstanceFinder.TimeManager; if ((Object)(object)timeManager == (Object)null) { return Time.unscaledTimeAsDouble; } if (timeManager.Tick != 0) { return timeManager.TicksToTime(timeManager.Tick); } if (timeManager.ServerUptime > 0f) { return timeManager.ServerUptime; } if (timeManager.ClientUptime > 0f) { return timeManager.ClientUptime; } return Time.unscaledTimeAsDouble; } public static void SetEnableGuestBangCommands(bool value) { if (_enableGuestBangCommands != null) { _enableGuestBangCommands.Value = value; MelonPreferences.Save(); } } public static void SetServerName(string value) { if (_serverName != null) { _serverName.Value = value ?? string.Empty; MelonPreferences.Save(); } } public static void SetServerCapacity(int value) { if (_serverCapacity != null) { _serverCapacity.Value = Math.Clamp(value, 1, 64); MelonPreferences.Save(); } } public static void SetSearchMinPlayers(int value) { if (_searchMinPlayers != null) { _searchMinPlayers.Value = Math.Clamp(value, 1, 64); MelonPreferences.Save(); } } public static void SetSearchMaxPlayers(int value) { if (_searchMaxPlayers != null) { _searchMaxPlayers.Value = ((value != 0) ? Math.Clamp(value, 1, 64) : 0); MelonPreferences.Save(); } } public static void SetSearchShowLocked(bool value) { if (_searchShowLocked != null) { _searchShowLocked.Value = value; MelonPreferences.Save(); } } public static void SetSearchShowModded(bool value) { if (_searchShowModded != null) { _searchShowModded.Value = value; MelonPreferences.Save(); } } public static void SetSearchShowYourLanguageOnly(bool value) { if (_searchShowYourLanguageOnly != null) { _searchShowYourLanguageOnly.Value = value; MelonPreferences.Save(); } } public static void SetSearchOnlyPeacefulLobbies(bool value) { if (_searchOnlyPeacefulLobbies != null) { _searchOnlyPeacefulLobbies.Value = value; if (value && _searchHidePeacefulLobbies != null) { _searchHidePeacefulLobbies.Value = false; } MelonPreferences.Save(); } } public static void SetSearchHidePeacefulLobbies(bool value) { if (_searchHidePeacefulLobbies != null) { _searchHidePeacefulLobbies.Value = value; if (value && _searchOnlyPeacefulLobbies != null) { _searchOnlyPeacefulLobbies.Value = false; } MelonPreferences.Save(); } } public static void SetSearchRegionMode(int value) { if (_searchRegionMode != null) { _searchRegionMode.Value = Math.Clamp(value, 0, 3); MelonPreferences.Save(); } } public static void SetIsPublicLobby(bool value) { if (_isPublicLobby != null) { _isPublicLobby.Value = value; MelonPreferences.Save(); } } public static void SetIsPasswordProtected(bool value) { if (_isPasswordProtected != null) { _isPasswordProtected.Value = value; MelonPreferences.Save(); } } public static void SetLobbyPassword(string value) { if (_lobbyPassword != null) { _lobbyPassword.Value = value ?? string.Empty; MelonPreferences.Save(); } } public static void SetIsPeacefulMode(bool value) { if (_isPeacefulMode != null) { _isPeacefulMode.Value = value; MelonPreferences.Save(); } } public static void SetIsTextChatOnly(bool value) { if (_isTextChatOnly != null) { _isTextChatOnly.Value = value; MelonPreferences.Save(); } } public static void SetMessageOfTheDay(string value) { if (_messageOfTheDay != null) { _messageOfTheDay.Value = value ?? string.Empty; MelonPreferences.Save(); } } public static void SetShowJoinMessages(bool value) { if (_showJoinMessages != null) { _showJoinMessages.Value = value; MelonPreferences.Save(); } } public static void SetShowLeaveMessages(bool value) { if (_showLeaveMessages != null) { _showLeaveMessages.Value = value; MelonPreferences.Save(); } } public static void SetJoinMessageSize(int value) { if (_joinMessageSize != null) { _joinMessageSize.Value = Math.Clamp(value, 50, 100); MelonPreferences.Save(); } } public static void SetLeaveMessageSize(int value) { if (_leaveMessageSize != null) { _leaveMessageSize.Value = Math.Clamp(value, 50, 100); MelonPreferences.Save(); } } public static void SetBlockThrowingSpam(bool value) { if (_blockThrowingSpam != null) { _blockThrowingSpam.Value = value; MelonPreferences.Save(); } } public static void SetBlockPlayerSizeCheat(bool value) { if (_blockPlayerSizeCheat != null) { _blockPlayerSizeCheat.Value = value; MelonPreferences.Save(); } } public static void SetBlockFlyingSleds(bool value) { if (_blockFlyingSleds != null) { _blockFlyingSleds.Value = value; MelonPreferences.Save(); } } public static void SetChatPrefix(PermLevel level, string value) { if (_chatPrefixes == null) { return; } int num = (int)(level - 1); if (num >= 0) { List<string> list = _chatPrefixes.Value ?? new List<string>(); while (list.Count <= num) { list.Add(string.Empty); } list[num] = value ?? string.Empty; _chatPrefixes.Value = list; MelonPreferences.Save(); } } public static void SetAutoRestartOnCrash(bool value) { if (_autoRestartOnCrash != null) { _autoRestartOnCrash.Value = value; MelonPreferences.Save(); } } public static void SetShowKickBanMessages(bool value) { if (_showKickBanMessages != null) { _showKickBanMessages.Value = value; MelonPreferences.Save(); } } private static IEnumerator RepushSizesForJoin() { float[] array = new float[6] { 0f, 0.1f, 2f, 2f, 3f, 5f }; float[] array2 = array; foreach (float num in array2) { yield return (object)new WaitForSecondsRealtime(num); PlayerScalePacketClamp.RepushAllSizes(); } } private IEnumerator LoadReferences() { while ((Object)_playerReferenceManager == (Object)null) { _playerReferenceManager = PlayerReferenceManager.Instance; yield return null; } ReferencesLoaded = true; Debug.Log(Object.op_Implicit("[Core] Scene references loaded successfully.")); } } internal static class NativeUiBackend { private static int _lastAutoCaptureFrame = -1; private static readonly Color FallbackPanelColor = new Color(0.09f, 0.5f, 0.74f, 0.97f); private static readonly Color FallbackInputColor = new Color(0.95f, 0.96f, 0.98f, 1f); private static readonly Color FallbackToggleCheckColor = new Color(0.17f, 0.74f, 0.45f, 1f); internal static NativeUiTemplateSet Defaults { get; } = new NativeUiTemplateSet(); private static void SetDefaults(NativeUiTemplateSet references, bool overwriteExisting = true) { if (references != null) { Defaults.Button = PickDefault<Button>(Defaults.Button, references.Button, overwriteExisting); Defaults.Label = PickDefault<TMP_Text>(Defaults.Label, references.Label, overwriteExisting); Defaults.HeaderLabel = PickDefault<TMP_Text>(Defaults.HeaderLabel, references.HeaderLabel, overwriteExisting); Defaults.ButtonLabel = PickDefault<TMP_Text>(Defaults.ButtonLabel, references.ButtonLabel, overwriteExisting); Defaults.ToggleLabel = PickDefault<TMP_Text>(Defaults.ToggleLabel, references.ToggleLabel, overwriteExisting); Defaults.SliderLabel = PickDefault<TMP_Text>(Defaults.SliderLabel, references.SliderLabel, overwriteExisting); Defaults.InputText = PickDefault<TMP_Text>(Defaults.InputText, references.InputText, overwriteExisting); Defaults.InputPlaceholder = PickDefault<TMP_Text>(Defaults.InputPlaceholder, references.InputPlaceholder, overwriteExisting); Defaults.InputField = PickDefault<TMP_InputField>(Defaults.InputField, references.InputField, overwriteExisting); Defaults.Toggle = PickDefault<Toggle>(Defaults.Toggle, references.Toggle, overwriteExisting); Defaults.Slider = PickDefault<MySliderUI>(Defaults.Slider, references.Slider, overwriteExisting); Defaults.Scrollbar = PickDefault<Scrollbar>(Defaults.Scrollbar, references.Scrollbar, overwriteExisting); Defaults.Background = PickDefault<Image>(Defaults.Background, references.Background, overwriteExisting); Defaults.Shadow = PickDefault<Shadow>(Defaults.Shadow, references.Shadow, overwriteExisting); Defaults.Panel = PickDefault<GameObject>(Defaults.Panel, references.Panel, overwriteExisting); } } private static void SetDefault(Button template, bool overwriteExisting = true) { Defaults.Button = PickDefault<Button>(Defaults.Button, template, overwriteExisting); Defaults.ButtonLabel = PickDefault<TMP_Text>(Defaults.ButtonLabel, ((Object)(object)template != (Object)null) ? ((Component)template).GetComponentInChildren<TMP_Text>(true) : null, overwriteExisting); Defaults.Shadow = PickDefault<Shadow>(Defaults.Shadow, ((Object)(object)template != (Object)null) ? ((Component)template).GetComponent<Shadow>() : null, overwriteExisting); } internal static void CaptureDefaultsFrom(Transform root, bool overwriteExisting = false) { if (!((Object)(object)root == (Object)null)) { Button val = FindButtonTemplate(root); Toggle val2 = FindToggleTemplate(root); MySliderUI componentInChildren = ((Component)root).GetComponentInChildren<MySliderUI>(true); TMP_InputField componentInChildren2 = ((Component)root).GetComponentInChildren<TMP_InputField>(true); TMP_Text buttonLabel = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponentInChildren<TMP_Text>(true) : null); TMP_Text toggleLabel = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponentInChildren<TMP_Text>(true) : null); TMP_Text sliderLabel = (((Object)(object)componentInChildren != (Object)null) ? ((Component)componentInChildren).GetComponentInChildren<TMP_Text>(true) : null); TMP_Text inputText = (((Object)(object)componentInChildren2 != (Object)null) ? componentInChildren2.textComponent : null); TMP_Text inputPlaceholder = (((Object)(object)componentInChildren2 != (Object)null && (Object)(object)componentInChildren2.placeholder != (Object)null) ? ((Component)componentInChildren2.placeholder).GetComponent<TMP_Text>() : null); SetDefaults(new NativeUiTemplateSet { Button = val, Label = ((Component)root).GetComponentInChildren<TMP_Text>(true), ButtonLabel = buttonLabel, ToggleLabel = toggleLabel, SliderLabel = sliderLabel, InputText = inputText, InputPlaceholder = inputPlaceholder, InputField = componentInChildren2, Toggle = val2, Slider = componentInChildren, Scrollbar = ((Component)root).GetComponentInChildren<Scrollbar>(true), Background = FindBackgroundImage(root), Shadow = ((Component)root).GetComponentInChildren<Shadow>(true), Panel = FindPanelTemplate(root) }, overwriteExisting); } } internal static void CaptureSceneDefaults(bool overwriteExisting = false) { GameObject val = FindNamedObject("UI_CreateLobby"); if ((Object)(object)val != (Object)null) { CaptureCreateLobbyDefaults(val.transform, overwriteExisting); CaptureDefaultsFrom(val.transform, overwriteExisting); } Button val2 = FindNamedComponent<Button>(new string[3] { "(Button) HOST", "(Button) Join", "(Button) JOIN" }); if ((Object)(object)val2 != (Object)null) { SetDefault(val2, overwriteExisting); } TMP_Text candidate = FindNamedComponent<TMP_Text>(new string[3] { "(Text) quick changes", "(Text) SECTION TITLE", "(Text) chat related section" }); Defaults.HeaderLabel = PickDefault<TMP_Text>(Defaults.HeaderLabel, candidate, overwriteExisting); GameObject obj = FindNamedObject("UI_MainMenu"); object obj2; if (obj == null) { obj2 = null; } else { Transform obj3 = obj.transform.Find("Panel"); obj2 = ((obj3 != null) ? ((Component)obj3).gameObject : null); } GameObject val3 = (GameObject)obj2; if ((Object)(object)val3 != (Object)null) { CaptureDefaultsFrom(val3.transform, overwriteExisting); } } internal static UiElement Assume(GameObject gameObject) { return new UiElement(gameObject); } internal static UiElement Assume(Component component) { return new UiElement(((Object)(object)component != (Object)null) ? component.gameObject : null); } internal static UiElement Assume(Transform transform) { return new UiElement(((Object)(object)transform != (Object)null) ? ((Component)transform).gameObject : null); } internal static UiElement Find(string sceneObjectName) { return new UiElement(string.IsNullOrEmpty(sceneObjectName) ? null : FindNamedObject(sceneObjectName)); } internal static UiElement Create(string name, Transform parent = null, bool active = true) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown GameObject val = new GameObject(string.IsNullOrEmpty(name) ? "UI Element" : name); if ((Object)(object)parent != (Object)null) { val.transform.SetParent(parent, false); } EnsureRectTransform(val); val.SetActive(active); return new UiElement(val); } internal static UiElement Clone(GameObject template, Transform parent, string name = null, int? siblingIndex = null, bool active = true) { if ((Object)(object)template == (Object)null) { return new UiElement(null); } GameObject val = Object.Instantiate<GameObject>(template, parent); if ((Object)(object)val == (Object)null) { return new UiElement(null); } if (!string.IsNullOrEmpty(name)) { ((Object)val).name = name; } if (siblingIndex.HasValue) { val.transform.SetSiblingIndex(siblingIndex.Value); } val.SetActive(active); return new UiElement(val); } internal static T CloneComponent<T>(T template, Transform parent, string name = null, int? siblingIndex = null, bool active = true) where T : Component { return Clone(((Object)(object)template != (Object)null) ? ((Component)template).gameObject : null, parent, name, siblingIndex, active).Get<T>(); } internal static TMP_InputField CloneInputField(TMP_InputField template, Transform parent, string name = null, string text = null, string placeholder = null, int? siblingIndex = null, bool clearListeners = true) { TMP_InputField val = NativeUiBackend.CloneComponent<TMP_InputField>(template, parent, name, siblingIndex, active: true); if ((Object)(object)val == (Object)null) { return null; } if (clearListeners) { ClearInputFieldEvents(val); } if (text != null) { val.text = text; } TMP_Text val2 = (((Object)(object)val.placeholder != (Object)null) ? ((Component)val.placeholder).GetComponent<TMP_Text>() : null); if ((Object)(object)val2 != (Object)null && placeholder != null) { SetText(val2, placeholder); } return val; } internal static Toggle CloneToggle(Toggle template, Transform parent, string name = null, string label = null, bool? isOn = null, UnityAction<bool> onValueChanged = null, int? siblingIndex = null, bool clearListeners = true) { Toggle val = NativeUiBackend.CloneComponent<Toggle>(template, parent, name, siblingIndex, active: true); if ((Object)(object)val == (Object)null) { return null; } if (label != null) { SetText(((Component)val).GetComponentInChildren<TMP_Text>(true), label); } if (clearListeners) { ((UnityEventBase)val.onValueChanged).RemoveAllListeners(); } if (isOn.HasValue) { val.isOn = isOn.Value; } ApplyToggleStyle(val, template); if ((Delegate)(object)onValueChanged != (Delegate)null) { ((UnityEvent<bool>)(object)val.onValueChanged).AddListener(onValueChanged); } return val; } internal static TMP_Text CreatePlainLabel(Transform parent, string text, string name = "Label", TMP_Text template = null, bool active = true) { TextMeshProUGUI obj = Create(string.IsNullOrEmpty(name) ? "Label" : name, parent, active).GameObject.AddComponent<TextMeshProUGUI>(); ApplyTextStyle((TMP_Text)(object)obj, template ?? Defaults.Label); ((Graphic)obj).raycastTarget = false; SetText((TMP_Text)(object)obj, text); return (TMP_Text)(object)obj; } internal static MySliderUI CreateSlider(Transform parent, string name = "Slider", MySliderUI template = null, float? minValue = null, float? maxValue = null, float? value = null, UnityAction<float> onValueChanged = null, int? siblingIndex = null, bool active = true, bool clearListeners = true) { CaptureSceneDefaultsIf((Object)(object)template == (Object)null && (Object)(object)Defaults.Slider == (Object)null); MySliderUI val = NativeUiBackend.CloneComponent<MySliderUI>(template ?? Defaults.Slider, parent, name, siblingIndex, active: true); if ((Object)(object)val == (Object)null || (Object)(object)val.slider == (Object)null) { return val; } if (clearListeners) { ((UnityEventBase)val.slider.onValueChanged).RemoveAllListeners(); val.OnSliderValueFinishedChanging = null; } if (minValue.HasValue) { val.slider.minValue = minValue.Value; } if (maxValue.HasValue) { val.slider.maxValue = maxValue.Value; } if (value.HasValue) { val.slider.SetValueWithoutNotify(value.Value); } if ((Delegate)(object)onValueChanged != (Delegate)null) { ((UnityEvent<float>)(object)val.slider.onValueChanged).AddListener(onValueChanged); } val.UpdateSliderValueDisplay(); ((Component)val).gameObject.SetActive(active); return val; } private static Scrollbar CreateScrollbar(Transform parent, string name = "Scrollbar", Scrollbar template = null, float? value = null, float? size = null, UnityAction<float> onValueChanged = null, int? siblingIndex = null, bool active = true, bool clearListeners = true) { CaptureSceneDefaultsIf((Object)(object)template == (Object)null && (Object)(object)Defaults.Scrollbar == (Object)null); Scrollbar val = NativeUiBackend.CloneComponent<Scrollbar>(template ?? Defaults.Scrollbar, parent, name, siblingIndex, active: true); if ((Object)(object)val == (Object)null) { return null; } if (clearListeners) { ((UnityEventBase)val.onValueChanged).RemoveAllListeners(); } if (size.HasValue) { val.size = size.Value; } if (value.HasValue) { val.value = value.Value; } if ((Delegate)(object)onValueChanged != (Delegate)null) { ((UnityEvent<float>)(object)val.onValueChanged).AddListener(onValueChanged); } ((Component)val).gameObject.SetActive(active); return val; } internal static ScrollViewport CreateScrollViewport(Transform parent, string name = "Scroll Viewport", Vector2? sizeDelta = null, Scrollbar scrollbarTemplate = null) { //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Expected O, but got Unknown //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Expected O, but got Unknown //IL_0213: Expected O, but got Unknown //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_030c: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = Create(name, parent).GameObject; if (sizeDelta.HasValue) { RectTransform rectTransform = EnsureRectTransform(gameObject); Vector2? sizeDelta2 = sizeDelta; SetRect(rectTransform, null, sizeDelta2); } float? flexibleHeight = 1f; float? flexibleWidth = 1f; SetLayout(gameObject, null, null, flexibleWidth, flexibleHeight); ScrollRect val = gameObject.GetComponent<ScrollRect>() ?? gameObject.AddComponent<ScrollRect>(); Image val2 = CreateBackground(gameObject.transform, "Viewport Background", Defaults.Background ?? (((Object)(object)Defaults.Panel != (Object)null) ? Defaults.Panel.GetComponent<Image>() : null)); RectTransform val3 = EnsureRectTransform(((Component)val2).gameObject); val3.anchorMin = new Vector2(0f, 0f); val3.anchorMax = new Vector2(1f, 1f); val3.offsetMin = Vector2.zero; val3.offsetMax = new Vector2(-42f, 0f); GameObject val4 = new GameObject("Content"); val4.transform.SetParent((Transform)(object)val3, false); RectTransform val5 = EnsureRectTransform(val4); val5.anchorMin = new Vector2(0f, 1f); val5.anchorMax = new Vector2(1f, 1f); val5.pivot = new Vector2(0.5f, 1f); val5.anchoredPosition = Vector2.zero; val5.sizeDelta = new Vector2(0f, 0f); SetVerticalLayout(val4, new RectOffset(0, 16, 0, 0), 8f); val4.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2; val.content = val5; val.viewport = val3; val.horizontal = false; val.vertical = true; val.movementType = (MovementType)2; Scrollbar val6 = null; if (scrollbarTemplate == null) { scrollbarTemplate = Defaults.Scrollbar; } if ((Object)(object)scrollbarTemplate != (Object)null) { val6 = CreateScrollbar(gameObject.transform, "Scrollbar", scrollbarTemplate); if ((Object)(object)val6 != (Object)null) { RectTransform obj = EnsureRectTransform(((Component)val6).gameObject); obj.anchorMin = new Vector2(1f, 0f); obj.anchorMax = new Vector2(1f, 1f); obj.pivot = new Vector2(1f, 0.5f); obj.anchoredPosition = new Vector2(-24f, 0f); obj.sizeDelta = new Vector2(18f, 0f); val.verticalScrollbar = val6; val.verticalScrollbarVisibility = (ScrollbarVisibility)0; } } (((Component)val2).gameObject.GetComponent<Mask>() ?? ((Component)val2).gameObject.AddComponent<Mask>()).showMaskGraphic = false; return new ScrollViewport { Root = gameObject, ViewportRect = val3, ContentRect = val5, ScrollRect = val, Scrollbar = val6 }; } internal static UiElement CreatePanel(Transform parent, string name = "Panel", GameObject template = null, Vector2? sizeDelta = null, Vector2? anchoredPosition = null, int? siblingIndex = null, bool active = true, bool cloneTemplate = false) { //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) CaptureSceneDefaultsIf((Object)(object)template == (Object)null && (Object)(object)Defaults.Panel == (Object)null && (Object)(object)Defaults.Background == (Object)null); Image val = (((Object)(object)template == (Object)null) ? FindLobbyPanelBackground() : null); GameObject val2 = template ?? (((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null) ?? Defaults.Panel ?? (((Object)(object)Defaults.Background != (Object)null) ? ((Component)Defaults.Background).gameObject : null); if (cloneTemplate && (Object)(object)val2 != (Object)null) { UiElement uiElement = Clone(val2, parent, name, siblingIndex, active); NormalizeClonedUiRoot(uiElement.GameObject); SetRect(uiElement.RectTransform, anchoredPosition, sizeDelta); return uiElement; } UiElement uiElement2 = Create(name, parent, active); if (siblingIndex.HasValue) { uiElement2.SiblingIndex(siblingIndex.Value); } Image val3 = val ?? (((Object)(object)val2 != (Object)null) ? val2.GetComponent<Image>() : null); if (val3 == null) { val3 = Defaults.Background; } Image val4 = CopyImage(val3, uiElement2.GameObject); if ((Object)(object)val4 != (Object)null) { ((Graphic)val4).raycastTarget = true; if ((Object)(object)val2 == (Object)null && (Object)(object)Defaults.Background == (Object)null) { ((Graphic)val4).color = FallbackPanelColor; } } else if ((Object)(object)val2 == (Object)null && (Object)(object)Defaults.Background == (Object)null) { val4 = uiElement2.GameObject.AddComponent<Image>(); ((Graphic)val4).color = FallbackPanelColor; ((Graphic)val4).raycastTarget = true; } Shadow val5 = (((Object)(object)val3 != (Object)null) ? ((Component)val3).GetComponent<Shadow>() : null); if (val5 == null) { val5 = (((Object)(object)val2 != (Object)null) ? val2.GetComponent<Shadow>() : null); } if (val5 == null) { val5 = Defaults.Shadow; } if ((Object)(object)val5 != (Object)null) { CopyShadow(val5, uiElement2.GameObject); } LayoutElement val6 = (((Object)(object)val2 != (Object)null) ? val2.GetComponent<LayoutElement>() : null); if ((Object)(object)val6 != (Object)null) { CopyLayout(val6, uiElement2.GameObject); } SetRect(uiElement2.RectTransform, anchoredPosition, sizeDelta); return uiElement2; } internal static Image CreateBackground(Transform parent, string name = "Background", Image template = null, Color? color = null, Vector2? sizeDelta = null, Vector2? anchoredPosition = null, int? siblingIndex = null, bool active = true) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) CaptureSceneDefaultsIf((Object)(object)template == (Object)null && (Object)(object)Defaults.Background == (Object)null); UiElement uiElement = Create(name, parent, active); if (siblingIndex.HasValue) { uiElement.SiblingIndex(siblingIndex.Value); } Image val = CopyImage(template ?? Defaults.Background ?? (((Object)(object)Defaults.Button != (Object)null) ? ((Component)Defaults.Button).GetComponent<Image>() : null), uiElement.GameObject); if ((Object)(object)val == (Object)null) { return null; } if (color.HasValue) { ((Graphic)val).color = color.Value; } else if ((Object)(object)template == (Object)null && (Object)(object)Defaults.Background == (Object)null && (Object)(object)Defaults.Button == (Object)null) { ((Graphic)val).color = FallbackPanelColor; } SetRect((Component)(object)val, anchoredPosition, sizeDelta); return val; } internal static Image CreateScreenBackdrop(Transform parent, string name = "Backdrop", Image template = null, Color? color = null) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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) UiElement uiElement = Create(name, parent); Image val = CopyImage(template, uiElement.GameObject); if ((Object)(object)val == (Object)null) { return null; } ((Graphic)val).color = (Color)(((??)color) ?? (((Object)(object)template != (Object)null) ? ((Graphic)template).color : new Color(0f, 0f, 0f, 0.45f))); ((Graphic)val).raycastTarget = true; Stretch(uiElement.GameObject); return val; } internal static RectTransform EnsureRectTransform(GameObject gameObject) { if ((Object)(object)gameObject == (Object)null) { return null; } RectTransform component = gameObject.GetComponent<RectTransform>(); if (!((Object)(object)component != (Object)null)) { return gameObject.AddComponent<RectTransform>(); } return component; } internal static void SetRect(Component component, Vector2? anchoredPosition = null, Vector2? sizeDelta = null, Vector2? anchorMin = null, Vector2? anchorMax = null, Vector2? pivot = null, Vector3? scale = null) { SetRect(((Object)(object)component != (Object)null) ? component.GetComponent<RectTransform>() : null, anchoredPosition, sizeDelta, anchorMin, anchorMax, pivot, scale); } internal static void SetRect(RectTransform rectTransform, Vector2? anchoredPosition = null, Vector2? sizeDelta = null, Vector2? anchorMin = null, Vector2? anchorMax = null, Vector2? pivot = null, Vector3? scale = null) { //IL_0016: 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) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)rectTransform == (Object)null)) { if (anchoredPosition.HasValue) { rectTransform.anchoredPosition = anchoredPosition.Value; } if (sizeDelta.HasValue) { rectTransform.sizeDelta = sizeDelta.Value; } if (anchorMin.HasValue) { rectTransform.anchorMin = anchorMin.Value; } if (anchorMax.HasValue) { rectTransform.anchorMax = anchorMax.Value; } if (pivot.HasValue) { rectTransform.pivot = pivot.Value; } if (scale.HasValue) { ((Transform)rectTransform).localScale = scale.Value; } } } internal static void SetCanvasGroups(Transform root, float alpha = 1f, bool interactable = true, bool blocksRaycasts = true, bool includeInactive = true, bool setRootActive = false) { if ((Object)(object)root == (Object)null) { return; } if (setRootActive) { ((Component)root).gameObject.SetActive(true); } foreach (CanvasGroup componentsInChild in ((Component)root).GetComponentsInChildren<CanvasGroup>(includeInactive)) { componentsInChild.alpha = alpha; componentsInChild.interactable = interactable; componentsInChild.blocksRaycasts = blocksRaycasts; } } internal static void ActivatePathToRoot(Transform start, Transform root) { Transform val = start; while ((Object)(object)val != (Object)null) { ((Component)val).gameObject.SetActive(true); if (!((Object)(object)val == (Object)(object)root)) { val = val.parent; continue; } break; } } internal static void SetChildrenActive(Transform parent, bool active, string skipNameContains = null) { if ((Object)(object)parent == (Object)null) { return; } for (int i = 0; i < parent.childCount; i++) { Transform child = parent.GetChild(i); if (!((Object)(object)child == (Object)null) && (string.IsNullOrEmpty(skipNameContains) || !((Object)child).name.Contains(skipNameContains))) { ((Component)child).gameObject.SetActive(active); } } } internal static VerticalLayoutGroup SetVerticalLayout(GameObject gameObject, RectOffset padding = null, float spacing = 0f, bool childControlWidth = true, bool childControlHeight = true, bool childForceExpandWidth = true, bool childForceExpandHeight = false) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gameObject == (Object)null) { return null; } VerticalLayoutGroup val = gameObject.GetComponent<VerticalLayoutGroup>(); if ((Object)(object)val == (Object)null) { val = gameObject.AddComponent<VerticalLayoutGroup>(); } ((LayoutGroup)val).padding = (RectOffset)(((object)padding) ?? ((object)new RectOffset())); ((HorizontalOrVerticalLayoutGroup)val).spacing = spacing; ((HorizontalOrVerticalLayoutGroup)val).childControlWidth = childControlWidth; ((HorizontalOrVerticalLayoutGroup)val).childControlHeight = childControlHeight; ((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = childForceExpandWidth; ((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = childForceExpandHeight; return val; } internal static HorizontalLayoutGroup SetHorizontalLayout(GameObject gameObject, float spacing = 0f, RectOffset padding = null, bool childControlWidth = true, bool childControlHeight = true, bool childForceExpandWidth = false, bool childForceExpandHeight = false) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gameObject == (Object)null) { return null; } HorizontalLayoutGroup val = gameObject.GetComponent<HorizontalLayoutGroup>(); if ((Object)(object)val == (Object)null) { val = gameObject.AddComponent<HorizontalLayoutGroup>(); } ((LayoutGroup)val).padding = (RectOffset)(((object)padding) ?? ((object)new RectOffset())); ((HorizontalOrVerticalLayoutGroup)val).spacing = spacing; ((HorizontalOrVerticalLayoutGroup)val).childControlWidth = childControlWidth; ((HorizontalOrVerticalLayoutGroup)val).childControlHeight = childControlHeight; ((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = childForceExpandWidth; ((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = childForceExpandHeight; return val; } internal static UiElement CreateHorizontalRow(Transform parent, string name = "Row", float height = 38f, float spacing = 14f) { UiElement uiElement = Create(name, parent); SetHorizontalLayout(uiElement.GameObject, spacing); GameObject gameObject = uiElement.GameObject; float? preferredHeight = height; SetFixedLayoutSize(gameObject, null, preferredHeight); return uiElement; } internal static UiElement CreateFlexRow(Transform parent, string name = "Row", float height = 38f, float spacing = 14f, RectOffset padding = null) { UiElement uiElement = Create(name, parent); SetHorizontalLayout(uiElement.GameObject, spacing, padding, childControlWidth: false); GameObject gameObject = uiElement.GameObject; float? preferredHeight = height; SetFixedLayoutSize(gameObject, null, preferredHeight); return uiElement; } internal static GridTrackRow CreateGridTrackRow(Transform parent, string name = "Row", float height = 38f, float spacing = 14f, RectOffset padding = null, params float[] trackWidths) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) UiElement uiElement = Create(name, parent); GameObject gameObject = uiElement.GameObject; float? preferredHeight = height; SetFixedLayoutSize(gameObject, null, preferredHeight); if (trackWidths == null || trackWidths.Length == 0) { trackWidths = new float[3] { 0f, 0f, 1f }; } RectTransform[] array = (RectTransform[])(object)new RectTransform[trackWidths.Length]; float num = 0f; for (int i = 0; i < trackWidths.Length; i++) { if (trackWidths[i] > 0f) { num += trackWidths[i]; } } for (int j = 0; j < trackWidths.Length; j++) { RectTransform val = EnsureRectTransform(Create($"{name} Track {j}", uiElement.GameObject.transform).GameObject); val.anchorMin = new Vector2(0f, 0.5f); val.anchorMax = new Vector2(0f, 0.5f); val.pivot = new Vector2(0f, 0.5f); val.anchoredPosition = Vector2.zero; val.sizeDelta = new Vector2(0f, height); array[j] = val; } GridTrackRow gridTrackRow = new GridTrackRow(uiElement.GameObject, array); LayoutGridTracks(gridTrackRow, spacing, padding, trackWidths); return gridTrackRow; } internal static void LayoutGridTracks(GridTrackRow gridRow, float spacing = 14f, RectOffset padding = null, params float[] trackWidths) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: 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_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) if (gridRow == null || gridRow.Tracks == null || gridRow.Tracks.Length == 0) { return; } RectTransform val = (((Object)(object)gridRow.GameObject != (Object)null) ? gridRow.GameObject.GetComponent<RectTransform>() : null); if ((Object)(object)val == (Object)null) { return; } float num = ((padding != null) ? ((float)padding.left) : 0f); float num2 = ((padding != null) ? ((float)padding.right) : 0f); Rect rect = val.rect; float num3; if (!(((Rect)(ref rect)).width > 0f)) { num3 = val.sizeDelta.x; } else { rect = val.rect; num3 = ((Rect)(ref rect)).width; } float num4 = num3; if (num4 <= 0f) { Transform parent = ((Transform)val).parent; RectTransform val2 = (RectTransform)(object)((parent is RectTransform) ? parent : null); if (val2 != null) { rect = val2.rect; float num5; if (!(((Rect)(ref rect)).width > 0f)) { num5 = val2.sizeDelta.x; } else { rect = val2.rect; num5 = ((Rect)(ref rect)).width; } num4 = num5; } } if (num4 <= 0f) { return; } if (trackWidths == null || trackWidths.Length != gridRow.Tracks.Length) { trackWidths = new float[gridRow.Tracks.Length]; } float num6 = 0f; for (int i = 0; i < trackWidths.Length; i++) { if (trackWidths[i] > 0f) { num6 += trackWidths[i]; } } float num7 = Mathf.Max(0f, num4 - num - num2 - spacing * (float)Mathf.Max(0, trackWidths.Length - 1)); float num8 = ((num6 > 0f) ? (num7 / num6) : 0f); float num9 = num; for (int j = 0; j < gridRow.Tracks.Length; j++) { RectTransform val3 = gridRow.Tracks[j]; if (!((Object)(object)val3 == (Object)null)) { float num10 = ((trackWidths[j] > 0f) ? (trackWidths[j] * num8) : 0f); val3.anchorMin = new Vector2(0f, 0.5f); val3.anchorMax = new Vector2(0f, 0.5f); val3.pivot = new Vector2(0f, 0.5f); val3.anchoredPosition = new Vector2(num9, 0f); float num11; if (!(val3.sizeDelta.y > 0f)) { rect = val.rect; num11 = ((Rect)(ref rect)).height; } else { num11 = val3.sizeDelta.y; } val3.sizeDelta = new Vector2(num10, num11); num9 += num10 + spacing; } } } internal static LayoutElement SetFixedLayoutSize(GameObject gameObject, float? preferredWidth = null, float? preferredHeight = null, float? flexibleWidth = null, float? flexibleHeight = null) { LayoutElement val = SetLayout(gameObject, preferredWidth, preferredHeight, flexibleWidth, flexibleHeight, preferredWidth, preferredHeight); if ((Object)(object)val != (Object)null) { val.ignoreLayout = false; val.layoutPriority = 1; } return val; } internal static LayoutElement SetLayout(GameObject gameObject, float? preferredWidth = null, float? preferredHeight = null, float? flexibleWidth = null, float? flexibleHeight = null, float? minWidth = null, float? minHeight = null) { if ((Object)(object)gameObject == (Object)null) { return null; } LayoutElement val = gameObject.GetComponent<LayoutElement>(); if ((Object)(object)val == (Object)null) { val = gameObject.AddComponent<LayoutElement>(); } if (preferredWidth.HasValue) { val.preferredWidth = preferredWidth.Value; } if (preferredHeight.HasValue) { val.preferredHeight = preferredHeight.Value; } if (flexibleWidth.HasValue) { val.flexibleWidth = flexibleWidth.Value; } if (flexibleHeight.HasValue) { val.flexibleHeight = flexibleHeight.Value; } if (minWidth.HasValue) { val.minWidth = minWidth.Value; } if (minHeight.HasValue) { val.minHeight = minHeight.Value; } return val; } internal static void StabilizeClonedControl(GameObject gameObject) { //IL_0016: 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) if ((Object)(object)gameObject == (Object)null) { return; } LeanTween.cancel(gameObject); gameObject.transform.localScale = Vector3.one; foreach (ContentSizeFitter componentsInChild in gameObject.GetComponentsInChildren<ContentSizeFitter>(true)) { if ((Object)(object)componentsInChild != (Object)null) { ((Behaviour)componentsInChild).enabled = false; } } foreach (Selectable componentsInChild2 in gameObject.GetComponentsInChildren<Selectable>(true)) { if ((Object)(object)componentsInChild2 != (Object)null) { componentsInChild2.transition = (Transition)1; } } foreach (AnimationSelectableUi componentsInChild3 in gameObject.GetComponentsInChildren<AnimationSelectableUi>(true)) { if (!((Object)(object)componentsInChild3 == (Object)null)) { LeanTween.cancel(((Component)componentsInChild3).gameObject); ((Component)componentsInChild3).transform.localScale = Vector3.one; ((Behaviour)componentsInChild3).enabled = false; componentsInChild3.OnSelect = null; componentsInChild3.OnDeselect = null; Object.Destroy((Object)(object)componentsInChild3); } } foreach (Component componentsInChild4 in gameObject.GetComponentsInChildren<Component>(true)) { if ((Object)(object)componentsInChild4 != (Object)null && ((MemberInfo)((Object)componentsInChild4).GetIl2CppType()).Name == "AnimationSelectableUi") { Behaviour val = (Behaviour)(object)((componentsInChild4 is Behaviour) ? componentsInChild4 : null); if (val != null) { val.enabled = false; } Object.Destroy((Object)(object)componentsInChild4); } } NormalizeClonedUiRoot(gameObject); } internal static void SetTextMetrics(TMP_Text textComponent, float fontSize, TextAlignmentOptions alignment = (TextAlignmentOptions)513, bool autoSize = false, float minFontSize = 12f) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)textComponent == (Object)null)) { textComponent.fontSize = fontSize; textComponent.fontSizeMax = fontSize; textComponent.fontSizeMin = minFontSize; textComponent.enableAutoSizing = autoSize; textComponent.alignment = alignment; textComponent.fontStyle = (FontStyles)0; textComponent.enableWordWrapping = false; textComponent.overflowMode = (TextOverflowModes)1; textComponent.characterSpacing = 0f; textComponent.wordSpacing = 0f; textComponent.lineSpacing = 0f; textComponent.paragraphSpacing = 0f; textComponent.ForceMeshUpdate(false, false); } } internal static void SetInputTextStyle(TMP_InputField input, float fontSize, TextAlignmentOptions alignment = (TextAlignmentOptions)4097, bool autoSize = false, float minFontSize = 14f) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)input == (Object)null) { return; } if ((Object)(object)input.textComponent != (Object)null) { if ((Object)(object)Defaults.InputText != (Object)null) { ApplyTextStyle(input.textComponent, Defaults.InputText); } SetTextMetrics(input.textComponent, fontSize, alignment, autoSize, minFontSize); } TMP_Text val = (((Object)(object)input.placeholder != (Object)null) ? ((Component)input.placeholder).GetComponent<TMP_Text>() : null); if ((Object)(object)val != (Object)null) { TMP_Text val2 = Defaults.InputPlaceholder ?? Defaults.InputText; if ((Object)(object)val2 != (Object)null) { ApplyTextStyle(val, val2); } SetTextMetrics(val, fontSize, alignment, autoSize, minFontSize); } } internal static TMP_Text SetText(TMP_Text textComponent, string text, bool removeLocalization = true) { if ((Object)(object)textComponent == (Object)null) { return null; } if (removeLocalization) { RemoveLocalization((Component)(object)textComponent); } textComponent.text = text ?? string.Empty; textComponent.ForceMeshUpdate(false, false); return textComponent; } internal static void RemoveLocalization(Component component) { if ((Object)(object)component == (Object)null) { return; } foreach (Component component2 in component.GetComponents<Component>()) { if (!((Object)(object)component2 == (Object)null)) { string name = ((MemberInfo)((Object)component2).GetIl2CppType()).Name; if (name.Contains("LocalizeStringEvent") || name.Contains("Localisation") || name.Contains("Localization")) { Object.Destroy((Object)(object)component2); } } } } internal static void ApplyTextStyle(TMP_Text target, TMP_Text template = null) { //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_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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) if (!((Object)(object)target == (Object)null)) { if (template == null) { template = Defaults.Label; } if ((Object)(object)template == (Object)null) { ((Graphic)target).color = Color.white; return; } target.font = template.font; target.fontSharedMaterial = template.fontSharedMaterial; target.fontStyle = template.fontStyle; ((Graphic)target).color = ((Graphic)template).color; target.alignment = template.alignment; target.enableWordWrapping = template.enableWordWrapping; target.overflowMode = template.overflowMode; target.characterSpacing = template.characterSpacing; target.wordSpacing = template.wordSpacing; target.lineSpacing = template.lineSpacing; target.paragraphSpacing = template.paragraphSpacing; } } internal static void ApplyToggleStyle(Toggle toggle, Toggle template = null) { //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: 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_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0134: 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) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)toggle == (Object)null)) { if (template == null) { template = Defaults.Toggle; } Image val = FindChildImage(((Object)(object)template != (Object)null) ? ((Component)template).transform : null, "Background"); Image val2 = FindChildImage(((Object)(object)template != (Object)null) ? ((Component)template).transform : null, "Checkmark"); GameObject val3 = FindOrCreateChild(((Component)toggle).transform, "Background"); Image val4 = CopyImage(val ?? Defaults.Background, val3); if ((Object)(object)val4 != (Object)null && (Object)(object)val == (Object)null && (Object)(object)Defaults.Background == (Object)null) { ((Graphic)val4).color = FallbackInputColor; } RectTransform val5 = EnsureRectTransform(val3); RectTransform val6 = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<RectTransform>() : null); if ((Object)(object)val6 != (Object)null) { CopyRect(val6, val5); } else { val5.anchorMin = new Vector2(0f, 0.5f); val5.anchorMax = new Vector2(0f, 0.5f); val5.pivot = new Vector2(0.5f, 0.5f); val5.anchoredPosition = new Vector2(10f, 0f); ((Transform)val5).localScale = Vector3.one; val5.sizeDelta = new Vector2(20f, 20f); } GameObject val7 = FindOrCreateChild(val3.transform, "Checkmark"); Image val8 = CopyImage(val2, val7); if ((Object)(object)val8 != (Object)null && (Object)(object)val2 == (Object)null) { ((Graphic)val8).color = FallbackToggleCheckColor; } RectTransform val9 = EnsureRectTransform(val7); RectTransform val10 = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponent<RectTransform>() : null); if ((Object)(object)val10 != (Object)null) { CopyRect(val10, val9); } else { val9.anchorMin = new Vector2(0.5f, 0.5f); val9.anchorMax = new Vector2(0.5f, 0.5f); val9.pivot = new Vector2(0.5f, 0.5f); val9.anchoredPosition = Vector2.zero; ((Transform)val9).localScale = Vector3.one; val9.sizeDelta = new Vector2(10f, 10f); } ((Selectable)toggle).targetGraphic = (Graphic)(object)val4; toggle.graphic = (Graphic)(object)val8; if ((Object)(object)((Component)toggle).GetComponent<MyToggleUI>() == (Object)null) { ((Component)toggle).gameObject.AddComponent<MyToggleUI>(); } if ((Object)(object)template != (Object)null) { ((Selectable)toggle).transition = ((Selectable)template).transition; ((Selectable)toggle).colors = ((Selectable)template).colors; ((Selectable)toggle).spriteState = ((Selectable)template).spriteState; ((Selectable)toggle).animationTriggers = ((Selectable)template).animationTriggers; ((Selectable)toggle).navigation = ((Selectable)template).navigation; } ApplyTextStyle(((Component)toggle).GetComponentInChildren<TMP_Text>(true), ((Object)(object)template != (Object)null) ? ((Component)template).GetComponentInChildren<TMP_Text>(true) : (Defaults.ToggleLabel ?? Defaults.Label)); NormalizeClonedUiRoot(((Component)toggle).gameObject); } } private static Image SetImageColor(Component component, Color color) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) Image val = (((Object)(object)component != (Object)null) ? component.GetComponent<Image>() : null); if ((Object)(object)val != (Object)null) { ((Graphic)val).color = color; } return val; } private static Shadow SetShadowColor(Component component, Color color) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) Shadow val = (((Object)(object)component != (Object)null) ? component.GetComponent<Shadow>() : null); if ((Object)(object)val != (Object)null) { val.effectColor = color; } return val; } internal static void SetButtonColors(Button button, Color imageColor, Color shadowColor) { //IL_0001: 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) SetImageColor((Component)(object)button, imageColor); SetShadowColor((Component)(object)button, shadowColor); } internal static Shadow CopyShadow(Shadow template, GameObject target) { if (!((Object)(object)target != (Object)null)) { return null; } return CopyShadow(template, (Component)(object)target.transform); } internal static Shadow CopyShadow(Shadow template, Component component) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)component == (Object)null) { return null; } Shadow val = component.GetComponent<Shadow>(); if ((Object)(object)val == (Object)null) { val = component.gameObject.AddComponent<Shadow>(); } if ((Object)(object)template != (Object)null) { val.effectColor = template.effectColor; val.effectDistance = template.effectDistance; val.useGraphicAlpha = template.useGraphicAlpha; } return val; } internal static Image CopyImage(Image template, GameObject target) { //IL_0040: 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) if ((Object)(object)target == (Object)null) { return null; } Image val = target.GetComponent<Image>(); if ((Object)(object)val == (Object)null) { val = target.AddComponent<Image>(); } if ((Object)(object)template != (Object)null) { CopyGraphic((Graphic)(object)template, (Graphic)(object)val); val.sprite = template.sprite; val.type = template.type; val.preserveAspect = template.preserveAspect; val.fillCenter = template.fillCenter; val.fillMethod = template.fillMethod; val.fillAmount = template.fillAmount; val.fillClockwise = template.fillClockwise; val.fillOrigin = template.fillOrigin; val.pixelsPerUnitMultiplier = template.pixelsPerUnitMultiplier; } return val; } private static void CopyGraphic(Graphic template, Graphic target) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)template == (Object)null) && !((Object)(object)target == (Object)null)) { target.color = template.color; target.material = template.material; target.raycastTarget = template.raycastTarget; } } private static void CopyRect(RectTransform template, RectTransform target) { //IL_0015: 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_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)template == (Object)null) && !((Object)(object)target == (Object)null)) { target.anchorMin = template.anchorMin; target.anchorMax = template.anchorMax; target.pivot = template.pivot; target.anchoredPosition = template.anchoredPosition; target.sizeDelta = template.sizeDelta; target.offsetMin = template.offsetMin; target.offsetMax = template.offsetMax; ((Transform)target).localScale = Vector3.one; } } private static LayoutElement CopyLayout(LayoutElement template, GameObject target) { if ((Object)(object)target == (Object)null) { return null; } LayoutElement val = target.GetComponent<LayoutElement>(); if ((Object)(object)val == (Object)null) { val = target.AddComponent<LayoutElement>(); } if ((Object)(object)template != (Object)null) { val.ignoreLayout = template.ignoreLayout; val.minWidth = template.minWidth; val.minHeight = template.minHeight; val.preferredWidth = template.preferredWidth; val.preferredHeight = template.preferredHeight; val.flexibleWidth = template.flexibleWidth; val.flexibleHeight = template.flexibleHeight; val.layoutPriority = template.layoutPriority; } return val; } private static void ClearInputFieldEvents(TMP_InputField inputField) { if (!((Object)(object)inputField == (Object)null)) { ((UnityEventBase)inputField.onValueChanged).RemoveAllListeners(); ((UnityEventBase)inputField.onSubmit).RemoveAllListeners(); ((UnityEventBase)inputField.onSelect).RemoveAllListeners(); ((UnityEventBase)inputField.onDeselect).RemoveAllListeners(); } } private static T PickDefault<T>(T current, T candidate, bool overwriteExisting) where T : class { if (candidate == null) { return current; } if (!overwriteExisting && current != null) { return current; } return candidate; } private static void CaptureSceneDefaultsIf(bool shouldCapture) { if (shouldCapture && _lastAutoCaptureFrame != Time.frameCount) { _lastAutoCaptureFrame = Time.frameCount; CaptureSceneDefaults(); } } private static void CaptureCreateLobbyDefaults(Transform root, bool overwriteExisting) { if (!((Object)(object)root == (Object)null)) { Transform obj = root.Find("Panels/Lobby Settings (mini)/(Image) Background"); Image val = ((obj != null) ? ((Component)obj).GetComponent<Image>() : null); Transform obj2 = root.Find("Panels/Lobby Settings (mini)/(Button) CONFIRM HOST"); object obj3 = ((obj2 != null) ? ((Component)obj2).GetComponent<Button>() : null); if (obj3 == null) { Transform obj4 = root.Find("Panels/Lobby Settings (mini)/ButtonContainer/(Button) Close Menu"); obj3 = ((obj4 != null) ? ((Component)obj4).GetComponent<Button>() : null); } Button val2 = (Button)obj3; Transform obj5 = root.Find("Panels/Lobby Settings (mini)/CustomLobbyNameInput"); object obj6 = ((obj5 != null) ? ((Component)obj5).GetComponent<TMP_InputField>() : null); if (obj6 == null) { Transform obj7 = root.Find("Panels/Lobby Settings (mini)/password toggles/(Input) lobby setting password"); obj6 = ((obj7 != null) ? ((Component)obj7).GetComponent<TMP_InputField>() : null); } TMP_InputField val3 = (TMP_InputField)obj6; Transform obj8 = root.Find("Panels/Lobby Settings (mini)/lobby type toggles/(Toggle) Game Type public/private"); object obj9 = ((obj8 != null) ? ((Component)obj8).GetComponent<Toggle>() : null); if (obj9 == null) { Transform obj10 = root.Find("Panels/Lobby Settings (mini)/password toggles/(Toggle) uses password"); obj9 = ((obj10 != null) ? ((Component)obj10).GetComponent<Toggle>() : null); } Toggle val4 = (Toggle)obj9; Transform obj11 = root.Find("Panels/Lobby Settings (mini)/(Slider) player count slider"); MySliderUI val5 = ((obj11 != null) ? ((Component)obj11).GetComponent<MySliderUI>() : null); Scrollbar componentInChildren = ((Component)root).GetComponentInChildren<Scrollbar>(true); Transform obj12 = root.Find("Panels/Lobby Settings (mini)/(Text) Settings Text"); object obj13 = ((obj12 != null) ? ((Component)obj12).GetComponent<TMP_Text>() : null); if (obj13 == null) { Transform obj14 = root.Find("Panels/Lobby Settings (mini)/(Text) Lobby Settings"); obj13 = ((obj14 != null) ? ((Component)obj14).GetComponent<TMP_Text>() : null) ?? ((val2 != null) ? ((Component)val2).GetComponentInChildren<TMP_Text>(true) : null) ?? ((val4 != null) ? ((Component)val4).GetComponentInChildren<TMP_Text>(true) : null); } TMP_Text label = (TMP_Text)obj13; TMP_Text inputText = (((Object)(object)val3 != (Object)null) ? val3.textComponent : null); TMP_Text inputPlaceholder = (((Object)(object)val3 != (Object)null && (Object)(object)val3.placeholder != (Object)null) ? ((Component)val3.placeholder).GetComponent<TMP_Text>() : null); SetDefaults(new NativeUiTemplateSet { Button = val2, Label = label, ButtonLabel = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponentInChildren<TMP_Text>(true) : null), ToggleLabel = (((Object)(object)val4 != (Object)null) ? ((Component)val4).GetComponentInChildren<TMP_Text>(true) : null), SliderLabel = (((Object)(object)val5 != (Object)null) ? ((Component)val5).GetComponentInChildren<TMP_Text>(true) : null), InputText = inputText, InputPlaceholder = inputPlaceholder, InputField = val3, Toggle = val4, Slider = val5, Scrollbar = componentInChildren, Background = val, Shadow = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<Shadow>() : null), Panel = (((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null) }, overwriteExisting); } } private static Button FindButtonTemplate(Transform root) { if ((Object)(object)root == (Object)null) { return null; } Button val = null; foreach (Button componentsInChild in ((Component)root).GetComponentsInChildren<Button>(true)) { if (!((Object)(object)componentsInChild == (Object)null) && !((Object)(object)((Component)componentsInChild).GetComponent<Image>() == (Object)null)) { string text = ((Object)componentsInChild).name.ToLowerInvariant(); if (text.Contains("host") || text.Contains("join") || text.Contains("settings") || text.Contains("create")) { return componentsInChild; } if (val == null) { val = componentsInChild; } } } return val; } private static Toggle FindToggleTemplate(Transform root) { if ((Object)(object)root == (Object)null) { return null; } Toggle val = null; foreach (Toggle componentsInChild in ((Component)root).GetComponentsInChildren<Toggle>(true)) { if (!((Object)(object)componentsInChild == (Object)null)) { if ((Object)(object)((Component)componentsInChild).GetComponent<MyToggleUI>() != (Object)null && (Object)(object)FindChildImage(((Component)componentsInChild).transform, "Background") != (Object)null && (Object)(object)FindChildImage(((Component)componentsInChild).transform, "Checkmark") != (Object)null) { return componentsInChild; } if (val == null) { val = componentsInChild; } } } return val; } private static T FindNamedComponent<T>(params string[] names) where T : Component { for (int i = 0; i < names.Length; i++) { GameObject val = FindNamedObject(names[i]); T val2 = (((Object)(object)val != (Object)null) ? val.GetComponent<T>() : default(T)); if ((Object)(object)val2 != (Object)null) { return val2; } } return default(T); } private static GameObject FindNamedObject(string name) { if (string.IsNullOrEmpty(name)) { return null; } GameObject val = GameObject.Find(name); if ((Object)(object)val != (Object)null) { return val; } foreach (GameObject item in Resources.FindObjectsOfTypeAll<GameObject>()) { if ((Object)(object)item != (Object)null && ((Object)item).name == name) { return item; } } return null; } private static GameObject FindPanelTemplate(Transform root) { Image val = FindBackgroundImage(root); if (!((Object)(object)val != (Object)null)) { return null; } return ((Component)val).gameObject; } private static Image FindLobbyPanelBackground() { GameObject obj = FindNamedObject("UI_CreateLobby"); Transform val = ((obj != null) ? obj.transform.Find("Panels/Lobby Settings (mini)/(Image) Background") : null); Image val2 = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<Image>() : null); if ((Object)(object)val2 != (Object)null) { return val2; } foreach (GameObject item in Resources.FindObjectsOfTypeAll<GameObject>()) { if (!((Object)(object)item == (Object)null) && !(((Object)item).name != "(Image) Background")) { val2 = item.GetComponent<Image>(); if ((Object)(object)val2 != (Object)null && HasAncestor(item.transform, "Lobby Settings")) { return val2; } } } return null; } private static bool HasAncestor(Transform transform, string nameContains) { Transform val = transform; while ((Object)(object)val != (Object)null) { if (((Object)val).name.Contains(nameContains)) { return true; } val = val.parent; } return false; } private static Image FindBackgroundImage(Transform root) { if ((Object)(object)root == (Object)null) { return null; } Image val = null; foreach (Image componentsInChild in ((Component)root).GetComponentsInChildren<Image>(true)) { string text = ((Object)componentsInChild).name.ToLowerInvariant(); string text2 = (((Object)(object)componentsInChild.sprite != (Object)null) ? ((Object)componentsInChild.sprite).name.ToLowerInvariant() : string.Empty); if (!IsControlImage(componentsInChild) && !text.Contains("fade") && !text.Contains("icon") && !text2.Contains("icon")) { if (text.Contains("panel") || text.Contains("background")) { return componentsInChild; } if ((Object)(object)val == (Object)null) { val = componentsInChild; } } } return val ?? ((Component)root).GetComponentInChildren<Image>(true); } private static GameObject FindOrCreateChild(Transform parent, string name) { if ((Object)(object)parent == (Object)null) { return null; } Image val = FindChildImage(parent, name); if ((Object)(object)val != (Object)null) { return ((Component)val).gameObject; } Transform val2 = parent.Find(name); if ((Object)(object)val2 != (Object)null) { return ((Component)val2).gameObject; } return Create(name, parent).GameObject; } private static Image FindChildImage(Transform root, string name) { if ((Object)(object)root == (Object)null || string.IsNullOrEmpty(name)) { return null; } foreach (Image componentsInChild in ((Component)root).GetComponentsInChildren<Image>(true)) { if ((Object)(object)componentsInChild != (Object)null && ((Object)componentsInChild).name == name) { return componentsInChild; } } return null; } private static void NormalizeClonedUiRoot(GameObject gameObject) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gameObject == (Object)null) { return; } foreach (RectTransform componentsInChild in gameObject.GetComponentsInChildren<RectTransform>(true)) { if ((Object)(object)componentsInChild != (Object)null) { ((Transform)componentsInChild).localScale = Vector3.one; } } } internal static RectTransform Stretch(GameObject gameObject) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001d: 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) RectTransform obj = EnsureRectTransform(gameObject); obj.anchorMin = Vector2.zero; obj.anchorMax = Vector2.one; obj.offsetMin = Vector2.zero; obj.offsetMax = Vector2.zero; return obj; } private static bool IsControlImage(Image image) { if ((Object)(object)image == (Object)null) { return false; } Transform val = ((Component)image).transform; while ((Object)(object)val != (Object)null) { if ((Object)(object)((Component)val).GetComponent<Button>() != (Object)null || (Object)(object)((Component)val).GetComponent<Toggle>() != (Object)null || (Object)(object)((Component)val).GetComponent<Slider>() != (Object)null || (Object)(object)((Component)val).GetComponent<Scrollbar>() != (Object)null || (Object)(object)((Component)val).GetComponent<TMP_InputField>() != (Object)null) { return true; } val = val.parent; } return false; } } internal static class SleddingUiAdapter { public static UiElement Assume(GameObject gameObject) { return NativeUiBackend.Assume(gameObject); } public static UiElement Assume(Component component) { return NativeUiBackend.Assume(component); } public static UiElement Assume(Transform transform) { return NativeUiBackend.Assume(transform); } public static UiElement Find(string sceneObjectName) { return NativeUiBackend.Find(sceneObjectName); } public static void CaptureSceneTemplates(bool overwriteExisting = false) { NativeUiTemplates.CaptureScene(overwriteExisting); } public static void CaptureTemplatesFrom(Transform root, bool overwriteExisting = false) { NativeUiTemplates.CaptureFrom(root, overwriteExisting); } } internal static class SleddingUiPaths { public const string CreateLobbyRoot = "UI_CreateLobby"; public const string BackgroundFade = "UI_BackgroundFade"; public const string MainMenuRoot = "UI_MainMenu"; public const string MainMenuPanel = "Panel"; public const string HostButton = "(Button) HOST"; public const string JoinButton = "(Button) Join"; public const string JoinButtonUpper = "(Button) JOIN"; public const string QuitButton = "(Button) Quit"; public const string SettingsHeaderQuickChanges = "(Text) quick changes"; public const string SettingsHeaderSectionTitle = "(Text) SECTION TITLE"; public const string SettingsHeaderChatRelated = "(Text) chat related section"; public const string LobbySettingsPanelBackground = "Panels/Lobby Settings (mini)/(Image) Background"; public const string LobbyConfirmHostButton = "Panels/Lobby Settings (mini)/(Button) CONFIRM HOST"; public const string LobbyCloseButton = "Panels/Lobby Settings (mini)/ButtonContainer/(Button) Close Menu"; public const string LobbyRootCloseButton = "ButtonContainer/(Button) Close Menu"; public const string CustomLobbyNameInput = "Panels/Lobby Settings (mini)/CustomLobbyNameInput"; public const string LobbyPasswordInput = "Panels/Lobby Settings (mini)/password toggles/(Input) lobby setting password"; public const string LobbyPublicPrivateToggle = "Panels/Lobby Settings (mini)/lobby type toggles/(Toggle) Game Type public/private"; public const string LobbyPasswordToggle = "Panels/Lobby Settings (mini)/password toggles/(Toggle) uses password"; public const string LobbyPlayerCountSlider = "Panels/Lobby Settings (mini)/(Slider) player count slider"; public const string LobbySettingsText = "Panels/Lobby Settings (mini)/(Text) Settings Text"; public const string LobbySettingsTitleText = "Panels/Lobby Settings (mini)/(Text) Lobby Settings"; public const string BackgroundImageName = "(Image) Background"; public const string LobbySettingsAncestorName = "Lobby Settings"; public const string BackgroundFadeNameContains = "BackgroundFade"; public const string PanelsNameContains = "Panels"; public const string EditorNameContains = "Editor"; } public class UiElement { public GameObject GameObject { get; } public Transform Transform { get { if (!((Object)(object)GameObject != (Object)null)) { return null; } return GameObject.transform; } } public RectTransform RectTransform { get { if (!((Object)(object)GameObject != (Object)null)) { return null; } return GameObject.GetComponent<RectTransform>(); } } public bool Exists => (Object)(object)GameObject != (Object)null; public UiElement(GameObject gameObject) { GameObject = gameObject; } public T Get<T>() where