using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("DevIslandUnlocked")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("DevIslandUnlocked")] [assembly: AssemblyTitle("DevIslandUnlocked")] [assembly: AssemblyVersion("1.0.0.0")] [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 DevIslandUnlocked { [BepInPlugin("com.howtofish.devislandunlocked", "Dev Island Unlocked", "1.1.0")] public sealed class Plugin : BaseUnityPlugin { public const string Guid = "com.howtofish.devislandunlocked"; public const string Name = "Dev Island Unlocked"; public const string Version = "1.1.0"; private static readonly Vector3 DevIslandWorldPosition = Vector3.zero; private static readonly Color DevIslandRadarColor = new Color(0f, 0.85f, 1f, 1f); internal static ManualLogSource Log; internal static Plugin Instance; private ConfigEntry _enabled; private ConfigEntry _showRadarDot; private ConfigEntry _debugLogging; private bool _injected; private bool _injectAttemptStarted; private object _radarUi; private object _devMapDot; private MethodInfo _radarUpdateDotMethod; private float _nextRadarAcquireTime; private void Awake() { Instance = this; Log = ((BaseUnityPlugin)this).Logger; _enabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Unlock DevIsland as a normal navigable island."); _showRadarDot = ((BaseUnityPlugin)this).Config.Bind("Radar", "ShowDevIslandDot", true, "Show DevIsland on the native island radar."); _debugLogging = ((BaseUnityPlugin)this).Config.Bind("Debug", "VerboseLogging", false, "Enable extra diagnostic logging."); SceneManager.sceneLoaded += OnSceneLoaded; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Dev Island Unlocked v1.1.0 loaded."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"DevIsland is never moved. Navigation and radar use the proven logical position (0,0,0)."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Navigation uses the native cloned IslandSpawner plus a collider-trigger bridge; no global player-position fallback is used."); } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void Update() { if (_enabled.Value) { if (!_injected) { TryInjectDevIsland(); } if (_injected && _showRadarDot.Value) { EnsureDevIslandRadarDot(); UpdateDevIslandRadarDot(); } } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (_enabled.Value) { if (_debugLogging.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[SCENE] Loaded '{((Scene)(ref scene)).name}', buildIndex={((Scene)(ref scene)).buildIndex}, mode={mode}."); } if (string.Equals(((Scene)(ref scene)).name, "DevIsland", StringComparison.OrdinalIgnoreCase)) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[DEV ISLAND] Loaded at its original baked world position. No scene objects were repositioned."); } _radarUi = null; _devMapDot = null; _radarUpdateDotMethod = null; _nextRadarAcquireTime = Time.unscaledTime + 0.75f; } } private void TryInjectDevIsland() { //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0408: Unknown result type (might be due to invalid IL or missing references) if (_injectAttemptStarted) { return; } object obj = FindLiveObjectByTypeName("IslandManager"); if (obj == null) { return; } Type type = obj.GetType(); FieldInfo fieldInfo = FindField(type, "_islandInfos"); FieldInfo fieldInfo2 = FindField(type, "_scenes"); if (fieldInfo == null || fieldInfo2 == null) { return; } Array array = fieldInfo.GetValue(obj) as Array; IList list = fieldInfo2.GetValue(obj) as IList; if (array == null || list == null || array.Length < 5 || list.Count < 7) { return; } _injectAttemptStarted = true; try { if (array.Length >= 6 && HasLogicalDevIsland(array)) { _injected = true; ((BaseUnityPlugin)this).Logger.LogInfo((object)"[DEV ISLAND] An existing logical DevIsland entry was detected. Reusing it."); return; } if (!string.Equals(list[6]?.ToString(), "DevIsland", StringComparison.OrdinalIgnoreCase)) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] Expected _scenes[6] to be DevIsland, but it was not. Injection cancelled for safety."); return; } if (array.Length != 5) { ((BaseUnityPlugin)this).Logger.LogWarning((object)($"[DEV ISLAND] IslandInfo length is {array.Length}, not the expected native length 5. " + "Another island-expansion mod may already be active. Injection cancelled to avoid index conflicts.")); return; } object value = array.GetValue(4); if (value == null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] IslandInfo[4] (Island5) is null."); return; } Type type2 = value.GetType(); FieldInfo fieldInfo3 = FindField(type2, "_spawnPosition"); FieldInfo fieldInfo4 = FindField(type2, "_warning"); if (fieldInfo3 == null || fieldInfo4 == null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] IslandInfo no longer exposes _spawnPosition/_warning."); return; } object? value2 = fieldInfo3.GetValue(value); GameObject val = (GameObject)((value2 is GameObject) ? value2 : null); object? value3 = fieldInfo4.GetValue(value); GameObject val2 = (GameObject)((value3 is GameObject) ? value3 : null); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] Could not get Island5 navigation trigger."); return; } GameObject val3 = CloneIslandTriggerHolder(val); if ((Object)(object)val3 == (Object)null) { return; } Transform val4 = FindChildRecursive(val3.transform, ((Object)val).name); if ((Object)(object)val4 == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] Could not find cloned Island5 spawn inside holder."); Object.Destroy((Object)(object)val3); return; } Vector3 val5 = DevIslandWorldPosition - val4.position; Transform transform = val3.transform; transform.position += val5; GameObject gameObject = ((Component)val4).gameObject; ((Object)gameObject).name = "IslandPosition6_DevIslandUnlocked"; GameObject val6 = null; if ((Object)(object)val2 != (Object)null) { Transform val7 = FindChildRecursive(val3.transform, ((Object)val2).name); if ((Object)(object)val7 != (Object)null) { val6 = ((Component)val7).gameObject; ((Object)val6).name = "IslandWarning6_DevIslandUnlocked"; } } Type type3 = AccessTools.TypeByName("IslandSpawner"); if (type3 == null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] IslandSpawner type not found."); Object.Destroy((Object)(object)val3); return; } Component component = gameObject.GetComponent(type3); if ((Object)(object)component == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] Cloned trigger has no IslandSpawner."); Object.Destroy((Object)(object)val3); return; } FieldInfo fieldInfo5 = FindField(type3, "_islandIndex"); if (fieldInfo5 == null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[DEV ISLAND] IslandSpawner._islandIndex not found."); Object.Destroy((Object)(object)val3); return; } fieldInfo5.SetValue(component, Convert.ChangeType(5, fieldInfo5.FieldType)); DevIslandTriggerBridge devIslandTriggerBridge = gameObject.GetComponent(); if ((Object)(object)devIslandTriggerBridge == (Object)null) { devIslandTriggerBridge = gameObject.AddComponent(); } devIslandTriggerBridge.IslandIndex = 5; object obj2 = Activator.CreateInstance(type2, nonPublic: true); fieldInfo3.SetValue(obj2, gameObject); fieldInfo4.SetValue(obj2, val6); Array array2 = Array.CreateInstance(type2, 6); Array.Copy(array, array2, 5); array2.SetValue(obj2, 5); fieldInfo.SetValue(obj, array2); ((Object)val3).name = "IslandPositionHolder6_DevIslandUnlocked"; val3.SetActive(true); gameObject.SetActive(true); _injected = true; ((BaseUnityPlugin)this).Logger.LogWarning((object)"[DEV ISLAND] Unlocked successfully: logical island index 5 -> _scenes[6] DevIsland."); ((BaseUnityPlugin)this).Logger.LogInfo((object)($"[DEV ISLAND] Navigation trigger position={gameObject.transform.position}. " + "DevIsland scene position remains untouched.")); Collider[] componentsInChildren = val3.GetComponentsInChildren(true); ManualLogSource logger = ((BaseUnityPlugin)this).Logger; string[] obj3 = new string[5] { $"[DEV ISLAND] Navigation holder active={val3.activeInHierarchy}, ", $"spawnActive={gameObject.activeInHierarchy}, colliders={componentsInChildren.Length}, ", "spawnerEnabled=", null, null }; Behaviour val8 = (Behaviour)(object)((component is Behaviour) ? component : null); obj3[3] = ((val8 != null) ? val8.enabled.ToString() : "n/a"); obj3[4] = "."; logger.LogInfo((object)string.Concat(obj3)); _radarUi = null; _devMapDot = null; _radarUpdateDotMethod = null; } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"[DEV ISLAND] Injection failed: {arg}"); } } private bool HasLogicalDevIsland(Array infos) { if (infos == null || infos.Length < 6) { return false; } object value = infos.GetValue(5); if (value == null) { return false; } object? obj = FindField(value.GetType(), "_spawnPosition")?.GetValue(value); GameObject val = (GameObject)((obj is GameObject) ? obj : null); if ((Object)(object)val == (Object)null) { return false; } Type type = AccessTools.TypeByName("IslandSpawner"); Component val2 = ((type != null) ? val.GetComponent(type) : null); FieldInfo fieldInfo = (((Object)(object)val2 != (Object)null) ? FindField(((object)val2).GetType(), "_islandIndex") : null); if (fieldInfo == null) { return false; } try { return Convert.ToInt32(fieldInfo.GetValue(val2)) == 5; } catch { return false; } } private GameObject CloneIslandTriggerHolder(GameObject sourceSpawn) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown Transform parent = sourceSpawn.transform.parent; GameObject val; if ((Object)(object)parent != (Object)null) { val = Object.Instantiate(((Component)parent).gameObject); } else { val = new GameObject("IslandPositionHolder6_DevIslandUnlocked"); ((Object)Object.Instantiate(sourceSpawn, val.transform)).name = ((Object)sourceSpawn).name; } ((Object)val).name = "IslandPositionHolder6_DevIslandUnlocked"; return val; } private void EnsureDevIslandRadarDot() { if ((_devMapDot != null && _radarUi != null) || Time.unscaledTime < _nextRadarAcquireTime) { return; } _nextRadarAcquireTime = Time.unscaledTime + 1f; try { object obj = FindLiveObjectByTypeName("RadarUI"); if (obj == null) { return; } FieldInfo fieldInfo = FindField(obj.GetType(), "_islandDots"); if (fieldInfo == null || !(fieldInfo.GetValue(obj) is Array { Length: >=5 } array)) { return; } if (array.Length >= 6 && array.GetValue(5) != null) { _radarUi = obj; _devMapDot = array.GetValue(5); ResolveRadarUpdateMethod(); return; } Type elementType = array.GetType().GetElementType(); if (elementType == null) { return; } object obj2 = null; for (int i = 0; i < array.Length; i++) { object value = array.GetValue(i); if (value != null) { obj2 = value; break; } } if (obj2 != null) { object obj3 = CloneInitializedMapDot(obj2, "DevIslandUnlocked_RadarDot"); if (obj3 != null) { Array array2 = Array.CreateInstance(elementType, Math.Max(6, array.Length + 1)); Array.Copy(array, array2, array.Length); array2.SetValue(obj3, 5); fieldInfo.SetValue(obj, array2); _radarUi = obj; _devMapDot = obj3; ResolveRadarUpdateMethod(); ((BaseUnityPlugin)this).Logger.LogInfo((object)("[RADAR] Added native-style DevIsland MapDot at index 5. " + $"Array {array.Length} -> {array2.Length}.")); } } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[RADAR] Could not create DevIsland dot: " + ex.Message)); _radarUi = null; _devMapDot = null; _radarUpdateDotMethod = null; } } private object CloneInitializedMapDot(object template, string dotName) { //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) if (template == null) { return null; } try { Type type = template.GetType(); object obj = typeof(object).GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(template, null); FieldInfo fieldInfo = FindField(type, "_dot"); if (fieldInfo == null) { return null; } object? value = fieldInfo.GetValue(template); Component val = (Component)((value is Component) ? value : null); if ((Object)(object)val == (Object)null) { return null; } Transform parent = val.transform.parent; if ((Object)(object)parent == (Object)null) { return null; } GameObject val2 = Object.Instantiate(val.gameObject); ((Object)val2).name = dotName; val2.transform.SetParent(parent, false); val2.transform.localPosition = val.transform.localPosition; val2.transform.localRotation = val.transform.localRotation; val2.transform.localScale = val.transform.localScale; Component component = val2.GetComponent(fieldInfo.FieldType); if ((Object)(object)component == (Object)null) { Object.Destroy((Object)(object)val2); return null; } fieldInfo.SetValue(obj, component); val2.SetActive(val.gameObject.activeInHierarchy); ApplyDevIslandRadarColor(obj); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[RADAR] DevIsland dot color set to cyan {DevIslandRadarColor}."); return obj; } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[RADAR] MapDot clone failed: " + ex.Message)); return null; } } private void ApplyDevIslandRadarColor(object mapDot) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) if (mapDot == null) { return; } try { FieldInfo fieldInfo = FindField(mapDot.GetType(), "_dot"); Component val = (Component)((fieldInfo != null) ? /*isinst with value type is only supported in some contexts*/: null); if (!((Object)(object)val == (Object)null)) { PropertyInfo property = ((object)val).GetType().GetProperty("color", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!(property == null) && property.CanWrite && !(property.PropertyType != typeof(Color))) { property.SetValue(val, DevIslandRadarColor, null); } } } catch (Exception ex) { if (_debugLogging != null && _debugLogging.Value) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[RADAR] Could not apply DevIsland cyan color: " + ex.Message)); } } } private void ResolveRadarUpdateMethod() { if (_radarUi != null && _devMapDot != null) { Type type = _radarUi.GetType(); Type type2 = _devMapDot.GetType(); _radarUpdateDotMethod = type.GetMethod("UpdateDot", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[2] { type2, typeof(Vector3) }, null); if (_radarUpdateDotMethod == null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[RADAR] UpdateDot(MapDot, Vector3) not found."); } } } private bool IsNativeRadarCurrentlyVisible() { if (_radarUi == null) { return false; } try { FieldInfo fieldInfo = FindField(_radarUi.GetType(), "_islandDots"); Array array = ((fieldInfo != null) ? (fieldInfo.GetValue(_radarUi) as Array) : null); if (array == null) { return false; } int num = Math.Min(5, array.Length); for (int i = 0; i < num; i++) { object value = array.GetValue(i); if (value != null) { FieldInfo fieldInfo2 = FindField(value.GetType(), "_dot"); Component val = (Component)((fieldInfo2 != null) ? /*isinst with value type is only supported in some contexts*/: null); if ((Object)(object)val != (Object)null && (Object)(object)val.gameObject != (Object)null && val.gameObject.activeInHierarchy) { return true; } } } } catch { } return false; } private void SetMapDotVisualActive(object mapDot, bool active) { if (mapDot == null) { return; } try { FieldInfo fieldInfo = FindField(mapDot.GetType(), "_dot"); Component val = (Component)((fieldInfo != null) ? /*isinst with value type is only supported in some contexts*/: null); if ((Object)(object)val != (Object)null && (Object)(object)val.gameObject != (Object)null && val.gameObject.activeSelf != active) { val.gameObject.SetActive(active); } } catch { } } private void UpdateDevIslandRadarDot() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) if (_radarUi == null || _devMapDot == null || _radarUpdateDotMethod == null) { return; } if (!IsNativeRadarCurrentlyVisible()) { SetMapDotVisualActive(_devMapDot, active: false); return; } try { _radarUpdateDotMethod.Invoke(_radarUi, new object[2] { _devMapDot, DevIslandWorldPosition }); SetMapDotVisualActive(_devMapDot, active: true); ApplyDevIslandRadarColor(_devMapDot); } catch (TargetInvocationException ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[RADAR] Native UpdateDot failed: " + (ex.InnerException?.Message ?? ex.Message))); _radarUi = null; _devMapDot = null; _radarUpdateDotMethod = null; } catch (Exception ex2) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[RADAR] Update failed: " + ex2.Message)); _radarUi = null; _devMapDot = null; _radarUpdateDotMethod = null; } } internal void QueueDevIslandFromTrigger(Collider other, string callbackName) { if (!_enabled.Value || (Object)(object)other == (Object)null || IsSceneLoaded("DevIsland")) { return; } if (!IsBoatOrPlayerCollider(other)) { if (_debugLogging.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("[DEV TRIGGER] Ignored " + callbackName + " collider " + $"'{((Object)other).name}' layer={((Component)other).gameObject.layer}.")); } return; } object obj = FindLiveObjectByTypeName("IslandManager"); if (obj == null) { return; } try { FieldInfo fieldInfo = FindField(obj.GetType(), "_hasQueuedIsland"); if (!(fieldInfo != null) || !(fieldInfo.FieldType == typeof(bool)) || !(bool)fieldInfo.GetValue(obj)) { MethodInfo method = obj.GetType().GetMethod("QueueRequest", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[1] { typeof(byte) }, null); if (method == null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[DEV TRIGGER] IslandManager.QueueRequest(byte) not found."); return; } ((BaseUnityPlugin)this).Logger.LogWarning((object)("[DEV TRIGGER] " + callbackName + ": accepted collider '" + ((Object)other).name + "'. QueueRequest(5) -> DevIsland.")); method.Invoke(obj, new object[1] { (byte)5 }); } } catch (TargetInvocationException ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[DEV TRIGGER] QueueRequest failed: " + (ex.InnerException?.Message ?? ex.Message))); } catch (Exception ex2) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[DEV TRIGGER] Queue failed: " + ex2.Message)); } } private static bool IsBoatOrPlayerCollider(Collider other) { if ((Object)(object)other == (Object)null) { return false; } Transform val = ((Component)other).transform; Type type = AccessTools.TypeByName("Boat"); Type type2 = AccessTools.TypeByName("Player"); while ((Object)(object)val != (Object)null) { GameObject gameObject = ((Component)val).gameObject; if (type != null && (Object)(object)gameObject.GetComponent(type) != (Object)null) { return true; } if (type2 != null && (Object)(object)gameObject.GetComponent(type2) != (Object)null) { return true; } string text = ((Object)gameObject).name ?? ""; if (text.IndexOf("Boat", StringComparison.OrdinalIgnoreCase) >= 0 || text.IndexOf("Player", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } val = val.parent; } return false; } private static bool IsSceneLoaded(string sceneName) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < SceneManager.sceneCount; i++) { Scene sceneAt = SceneManager.GetSceneAt(i); if (((Scene)(ref sceneAt)).IsValid() && ((Scene)(ref sceneAt)).isLoaded && string.Equals(((Scene)(ref sceneAt)).name, sceneName, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } private static object FindLiveObjectByTypeName(string typeName) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) Type type = AccessTools.TypeByName(typeName); if (type == null) { return null; } try { Object[] array = Resources.FindObjectsOfTypeAll(type); Object[] array2 = array; foreach (Object obj in array2) { Component val = (Component)(object)((obj is Component) ? obj : null); if (!((Object)(object)val == (Object)null) && !((Object)(object)val.gameObject == (Object)null)) { Scene scene = val.gameObject.scene; if (((Scene)(ref scene)).IsValid() && ((Scene)(ref scene)).isLoaded) { return val; } } } return ((IEnumerable)array).FirstOrDefault((Func)((Object o) => o != (Object)null)); } catch { return null; } } private static FieldInfo FindField(Type type, string name) { Type type2 = type; while (type2 != null) { FieldInfo field = type2.GetField(name, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return field; } type2 = type2.BaseType; } return null; } private static Transform FindChildRecursive(Transform parent, string name) { if ((Object)(object)parent == (Object)null) { return null; } if (string.Equals(((Object)parent).name, name, StringComparison.Ordinal)) { return parent; } for (int i = 0; i < parent.childCount; i++) { Transform val = FindChildRecursive(parent.GetChild(i), name); if ((Object)(object)val != (Object)null) { return val; } } return null; } } internal sealed class DevIslandTriggerBridge : MonoBehaviour { public byte IslandIndex = 5; private float _nextAllowedTime; private void OnTriggerEnter(Collider other) { TryForward(other, "OnTriggerEnter"); } private void OnTriggerStay(Collider other) { if (!(Time.unscaledTime < _nextAllowedTime)) { TryForward(other, "OnTriggerStay"); } } private void TryForward(Collider other, string callbackName) { _nextAllowedTime = Time.unscaledTime + 0.75f; Plugin instance = Plugin.Instance; if (!((Object)(object)instance == (Object)null)) { instance.QueueDevIslandFromTrigger(other, callbackName); } } } }