using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BreakablesScripts; using HarmonyLib; using Landfall.TABS; using Landfall.TABS.GameMode; using LevelCreator; using TFBGames; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("Breakables")] [assembly: AssemblyDescription("Breakables")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("GeeztJeez")] [assembly: AssemblyProduct("Breakables")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7acfaef0-7669-4401-8bff-5a9a02e18c75")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Breakables { [BepInPlugin("GeeztJeez.Breakables", "Breakables", "1.0.0")] internal class Loader : BaseUnityPlugin { private Transform camTransform; public GameObject baseBrickObject; public AssetBundle assetsBundle; private bool buildMode; private float currentScale = 5f; private readonly float minScale = 5f; private readonly float maxScale = 100f; private GameObject indicationInstance; public GameObject indicationObject; public static bool DebugEnabled; public static string BreakablesFolder; public static string ConfigFilePath; public static bool EnableMapCreatorBreakables; public static readonly Dictionary BreakableObjects; public static GameObject breakParticleObject; private SoundPlayer SoundPlayer => ServiceLocator.GetService(); private void Awake() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown try { BreakablesFolder = Path.Combine(Application.dataPath, "../Breakables"); ConfigFilePath = Path.Combine(BreakablesFolder, "config.txt"); CreateConfig(); LoadConfig(); assetsBundle = GetBundle("breakablesassetbundles"); baseBrickObject = (GameObject)assetsBundle.LoadAsset("DestructibleBrick"); breakParticleObject = (GameObject)assetsBundle.LoadAsset("BreakMeshParticleObject"); baseBrickObject.AddComponent(); indicationObject = (GameObject)assetsBundle.LoadAsset("IndicationBrick"); ApplyHarmony(); ((MonoBehaviour)this).StartCoroutine(Call()); } catch (Exception ex) { LogError("Fatal error, mod loading failed: " + ex); LogWarning("Please contact Geezt Jeez or try reloading the game for proper installation..."); } } private IEnumerator Call() { yield return (object)new WaitUntil((Func)(() => (Object)(object)Object.FindObjectOfType() != (Object)null)); yield return (object)new WaitUntil((Func)(() => ServiceLocator.GetService() != null)); Debug.Log((object)"[Breakables] Loading..."); SLMALoader.GetInstance(); new Harmony("Breakables").PatchAll(); SceneManager.sceneLoaded += SceneLoaded; Debug.Log((object)"[Breakables] Loaded Successfully!"); } private void SceneLoaded(Scene scene, LoadSceneMode loadSceneMode) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) Log($"Enable Map Creator Breakables: {EnableMapCreatorBreakables}"); if (((Scene)(ref scene)).name == "LevelScene" && EnableMapCreatorBreakables) { ((MonoBehaviour)this).StartCoroutine(BreakableScanner.WaitForSceneReady(scene)); } } private void OnDestroy() { SceneManager.sceneLoaded -= SceneLoaded; } public Transform GetCamera() { if ((Object)(object)camTransform != (Object)null) { return camTransform; } PlayerCamerasManager service = ServiceLocator.GetService(); MainCam val = ((service != null) ? service.GetMainCam((Player)0) : null); camTransform = (((Object)(object)val != (Object)null) ? ((Component)val).transform : null); return camTransform; } public void SpawnBrick(GameObject prefab, float scale, Vector3 position, Quaternion rotation) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)prefab == (Object)null) { LogError("[Breakables] PREFAB is null."); return; } SoundPlayer.PlaySoundEffect("UI/Unit Placed", 1f, GetCamera().position, (MaterialType)0, (Transform)null, 3f); GameObject val = Object.Instantiate(prefab, position, rotation); Rigidbody[] componentsInChildren = val.GetComponentsInChildren(true); foreach (Rigidbody obj in componentsInChildren) { obj.mass *= scale; obj.drag *= scale; obj.angularDrag *= scale; } DestructibleObjectBrickBehaviour componentInChildren = val.GetComponentInChildren(); componentInChildren.scaleMultiplier = scale; componentInChildren.damageThreshold *= scale; Material val2 = CreateDarkenedMaterialHSV(((Renderer)val.GetComponentInChildren()).material, 0.1f, 0.6f); ParticleSystemRenderer[] componentsInChildren2 = val.GetComponentsInChildren(true); foreach (ParticleSystemRenderer obj2 in componentsInChildren2) { ((Renderer)obj2).material = val2; ((Renderer)obj2).materials[0] = val2; ((Renderer)obj2).sharedMaterial = val2; ((Renderer)obj2).sharedMaterials[0] = val2; } MeshRenderer[] componentsInChildren3 = val.GetComponentsInChildren(true); foreach (MeshRenderer obj3 in componentsInChildren3) { ((Renderer)obj3).material = val2; ((Renderer)obj3).materials[0] = val2; } val.transform.localScale = Vector3.one * scale; DestructibleObject component = val.GetComponent(); if ((Object)(object)component == (Object)null) { LogError("No DestructibleObject found on this GameObject!"); return; } Type typeFromHandle = typeof(DestructibleObject); componentInChildren.objectsToActivate = GetField(typeFromHandle, component, "m_objectsToActivate"); componentInChildren.objectsToDisable = GetField(typeFromHandle, component, "m_objectsToDisable"); Object.Destroy((Object)(object)val.GetComponent()); Log("[Breakables] Spawned brick at " + position); } public void DestroyBrick(GameObject go) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)go) && (Object)(object)((Component)go.transform.root).GetComponentInChildren() != (Object)null) { SoundPlayer.PlaySoundEffect("UI/Unit Removed", 1f, GetCamera().position, (MaterialType)0, (Transform)null, 3f); Object.Destroy((Object)(object)((Component)go.transform.root).gameObject); Log("[Breakables] Brick destroyed."); } } private void Update() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Invalid comparison between Unknown and I4 //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01be: 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_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_021c: 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_0232: Unknown result type (might be due to invalid IL or missing references) GameModeService service = ServiceLocator.GetService(); if ((Object)(object)service == (Object)null || service.CurrentGameMode == null || service.CurrentGameMode.GameStateManager == null || (int)service.CurrentGameMode.GameStateManager.GameState > 0) { return; } Transform camera = GetCamera(); if (!Object.op_Implicit((Object)(object)camera)) { return; } if (Input.GetKeyDown((KeyCode)289)) { SoundPlayer.PlaySoundEffect("UI/Click", 1f, GetCamera().position, (MaterialType)0, (Transform)null, 3f); buildMode = !buildMode; if (buildMode) { if ((Object)(object)indicationInstance == (Object)null && (Object)(object)indicationObject != (Object)null) { indicationInstance = Object.Instantiate(indicationObject); indicationInstance.transform.localScale = Vector3.one * currentScale; } } else if (Object.op_Implicit((Object)(object)indicationInstance)) { Object.Destroy((Object)(object)indicationInstance); indicationInstance = null; } } else { if (!buildMode) { return; } float axis = Input.GetAxis("Mouse ScrollWheel"); if (Mathf.Abs(axis) > 0.01f) { currentScale += axis * 10f; currentScale = Mathf.Clamp(currentScale, minScale, maxScale); if (Object.op_Implicit((Object)(object)indicationInstance)) { indicationInstance.transform.localScale = Vector3.one * currentScale; } } float num = currentScale; Vector3 position = camera.position + camera.forward * 2f * num * 0.25f; Quaternion rotation = Quaternion.Euler(0f, camera.eulerAngles.y, 0f); if (Object.op_Implicit((Object)(object)indicationInstance)) { indicationInstance.transform.position = position; indicationInstance.transform.rotation = rotation; } if (Input.GetMouseButtonDown(0)) { SpawnBrick(baseBrickObject, currentScale, position, rotation); } RaycastHit val = default(RaycastHit); if (Input.GetMouseButtonDown(1) && Physics.Raycast(camera.position, camera.forward, ref val, 9999f)) { DestroyBrick(((Component)((RaycastHit)(ref val)).collider).gameObject); } } } public static AssetBundle GetBundle(string assetBundleName) { Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(assetBundleName); if (manifestResourceStream == null) { LogError("[LoadBundle] Failed to find resource: " + assetBundleName); return null; } if (!manifestResourceStream.CanRead) { LogError("[LoadBundle] Resource stream is not readable: " + assetBundleName); return null; } return AssetBundle.LoadFromStream(manifestResourceStream); } private void ApplyHarmony() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) try { new Harmony("Breakables").PatchAll(Assembly.GetExecutingAssembly()); Log("Harmony patched successfully!"); } catch (Exception ex) { LogError("Harmony patch failed: " + ex); Log("Please contact Geezt Jeez or try reloading the game for proper installation..."); } } private T GetField(Type t, object obj, string fieldName) { FieldInfo field = t.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { LogError("Field not found: " + fieldName); return default(T); } return (T)field.GetValue(obj); } public static Material CreateDarkenedMaterialHSV(Material baseMat, float minOffset, float maxOffset) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)baseMat == (Object)null) { return null; } Material val = new Material(baseMat); float num = Random.Range(minOffset, maxOffset); bool flag = false; bool flag2 = false; Color val2; if (val.HasProperty("_Color")) { val2 = val.color; flag = true; } else if (val.HasProperty("_BaseColor")) { val2 = val.GetColor("_BaseColor"); flag2 = true; } else { val2 = Color.white; } float num2 = default(float); float num3 = default(float); float num4 = default(float); Color.RGBToHSV(val2, ref num2, ref num3, ref num4); num4 *= 1f - num; val2 = Color.HSVToRGB(num2, num3, num4); if (flag) { val.color = val2; } if (flag2) { val.SetColor("_BaseColor", val2); } return val; } public static void LoadConfig() { EnableMapCreatorBreakables = false; DebugEnabled = false; try { BreakableObjects.Clear(); string[] array = File.ReadAllLines(ConfigFilePath); for (int i = 0; i < array.Length; i++) { string text = array[i].Trim(); if (string.IsNullOrWhiteSpace(text) || text.StartsWith("#")) { continue; } string[] array2 = text.Split(new char[1] { '=' }, 2); if (array2.Length != 2) { continue; } string text2 = array2[0].Trim(); string text3 = array2[1].Trim(); if (!(text2 == "EnableMapCreatorBreakables")) { if (!(text2 == "DebugEnabled")) { if (float.TryParse(text3, out var result)) { BreakableObjects[text2] = result; Log($"Registered breakable '{text2}' ({result} HP)"); } } else { bool.TryParse(text3, out DebugEnabled); } } else { bool.TryParse(text3, out EnableMapCreatorBreakables); } } Log($"EnableMapCreatorBreakables={EnableMapCreatorBreakables}"); Log($"DebugEnabled={DebugEnabled}"); } catch (Exception arg) { LogError($"Failed loading config:\n{arg}"); } } public static void Log(string message) { if (DebugEnabled) { Debug.Log((object)("[Breakables] " + message)); } } public static void LogWarning(string message) { if (DebugEnabled) { Debug.LogWarning((object)("[Breakables] " + message)); } } public static void LogError(string message) { Debug.LogError((object)("[Breakables] " + message)); } public static void CreateConfig() { if (!Directory.Exists(BreakablesFolder)) { Directory.CreateDirectory(BreakablesFolder); } if (!File.Exists(ConfigFilePath)) { File.WriteAllLines(ConfigFilePath, new string[10] { "EnableMapCreatorBreakables=true", "DebugEnabled=false", "", "# Format:", "# ObjectName=Health", "", "Barrel=300", "Crate=180", "Plank=120", "Box=200" }); } } static Loader() { BreakableObjects = new Dictionary(StringComparer.OrdinalIgnoreCase); } } } namespace BreakablesScripts { public class DestructibleObjectBrickBehaviour : Damagable { public float damageThreshold = 200f; public float forceExplosion = 200f; public float currentDamage; public float scaleMultiplier = 1f; public GameObject[] objectsToActivate; public GameObject[] objectsToDisable; public override void TakeDamage(float damage, Vector3 direction, Unit unit, DamageType damageType = (DamageType)0) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) ((Component)this).GetComponentInChildren().Play(); if ((int)damageType != 3) { currentDamage += damage; if (currentDamage >= damageThreshold) { Destruct(direction * forceExplosion); } } } private void Destruct(Vector3 force) { //IL_0041: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) Object.Destroy((Object)(object)((Component)this).GetComponent()); ((Component)this).GetComponentInChildren().Play(); for (int i = 0; i < objectsToActivate.Length; i++) { objectsToActivate[i].SetActive(true); Rigidbody[] componentsInChildren = objectsToActivate[i].GetComponentsInChildren(true); if (componentsInChildren != null) { for (int j = 0; j < componentsInChildren.Length; j++) { Vector3 val = force * Random.Range(-1f, 1f) / scaleMultiplier; componentsInChildren[j].AddForce(val, (ForceMode)1); RemoveAfterSeconds obj = ((Component)componentsInChildren[j]).gameObject.AddComponent(); obj.shrink = true; obj.seconds = Random.Range(5f, 8f); } } } RemoveAfterSeconds obj2 = ((Component)this).gameObject.AddComponent(); obj2.shrink = true; obj2.seconds = 10f; for (int k = 0; k < objectsToDisable.Length; k++) { objectsToDisable[k].SetActive(false); } } } public class GenericBreakableBehaviour : Damagable { public float maxHealth = 100f; public float minimumDamage; public GameObject destructionPrefab; public bool destroyOriginal = true; private float currentDamage; private bool destroyed; public Material material; public MeshRenderer meshRenderer; public override void TakeDamage(float damage, Vector3 direction, Unit unit, DamageType damageType = (DamageType)0) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) if (!destroyed && !(damage < minimumDamage)) { SpawnParticles(direction); currentDamage += damage; if (currentDamage >= maxHealth) { Break(direction); } } } private void Break(Vector3 direction) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) destroyed = true; SpawnParticles(direction); if (destroyOriginal) { if (Object.op_Implicit((Object)(object)meshRenderer)) { ((Renderer)meshRenderer).enabled = false; } MeshCollider componentInChildren = ((Component)this).GetComponentInChildren(); if (Object.op_Implicit((Object)(object)componentInChildren)) { Object.Destroy((Object)(object)componentInChildren); } Collider[] componentsInChildren = ((Component)this).GetComponentsInChildren(); for (int i = 0; i < componentsInChildren.Length; i++) { Object.Destroy((Object)(object)componentsInChildren[i]); } } } public void Awake() { meshRenderer = ((Component)this).GetComponentInChildren(); if (Object.op_Implicit((Object)(object)meshRenderer)) { material = ((Renderer)meshRenderer).material; } } public void SpawnParticles(Vector3 direction) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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) if (!Object.op_Implicit((Object)(object)destructionPrefab) || !Object.op_Implicit((Object)(object)meshRenderer)) { return; } GameObject obj = destructionPrefab; Bounds bounds = ((Renderer)meshRenderer).bounds; ParticleSystem componentInChildren = Object.Instantiate(obj, ((Bounds)(ref bounds)).center, Quaternion.identity).GetComponentInChildren(); if (Object.op_Implicit((Object)(object)componentInChildren)) { ParticleSystemRenderer component = ((Component)componentInChildren).GetComponent(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)material)) { ((Renderer)component).material = material; } EmitFromSurface(componentInChildren, 40, direction); componentInChildren.Play(); } } private void EmitFromSurface(ParticleSystem ps, int count, Vector3 direction) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: 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_0101: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) MeshCollider componentInChildren = ((Component)this).GetComponentInChildren(); if ((Object)(object)componentInChildren == (Object)null) { return; } Bounds bounds = ((Collider)componentInChildren).bounds; Vector3 val = ((Bounds)(ref bounds)).extents; float magnitude = ((Vector3)(ref val)).magnitude; RaycastHit val3 = default(RaycastHit); for (int i = 0; i < count; i++) { Vector3 val2 = ((Bounds)(ref bounds)).center + Random.onUnitSphere * magnitude * 2f; val = ((Bounds)(ref bounds)).center - val2; Vector3 normalized = ((Vector3)(ref val)).normalized; if (((Collider)componentInChildren).Raycast(new Ray(val2, normalized), ref val3, magnitude * 4f)) { EmitParams val4 = default(EmitParams); ((EmitParams)(ref val4)).position = ((RaycastHit)(ref val3)).point + ((RaycastHit)(ref val3)).normal * 0.01f; ((EmitParams)(ref val4)).velocity = ((RaycastHit)(ref val3)).normal * Random.Range(1.5f, 4f) + ((Vector3)(ref direction)).normalized * Random.Range(1f, 3f) + Random.insideUnitSphere * 0.5f; ((EmitParams)(ref val4)).rotation3D = Random.insideUnitSphere * 360f; ((EmitParams)(ref val4)).startSize = Random.Range(0.8f, 1.2f); ps.Emit(val4, 1); } } } } } namespace Breakables { public static class BreakableScanner { public static IEnumerator Scan() { yield return null; int num = 0; MeshRenderer[] array = Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { if (((Component)array[i]).gameObject.layer == LayerMask.NameToLayer("Map") && TryConvert(((Component)array[i]).gameObject)) { num++; } } Loader.Log($"Converted {num} objects."); } private static bool TryConvert(GameObject obj) { if ((Object)(object)obj == (Object)null) { return false; } if ((Object)(object)obj.GetComponent() != (Object)null) { return false; } foreach (KeyValuePair breakableObject in Loader.BreakableObjects) { if (((Object)obj).name.IndexOf(breakableObject.Key, StringComparison.OrdinalIgnoreCase) >= 0) { GenericBreakableBehaviour genericBreakableBehaviour = obj.AddComponent(); genericBreakableBehaviour.destructionPrefab = Loader.breakParticleObject; genericBreakableBehaviour.maxHealth = breakableObject.Value; Loader.Log("Made '" + ((Object)obj).name + "' breakable."); if ((Object)(object)obj.GetComponentInChildren() != (Object)null) { Rigidbody obj2 = obj.AddComponent(); obj2.isKinematic = false; obj2.mass = 1000f; } return true; } } return false; } public static IEnumerator WaitForSceneReady(Scene scene) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (!(((Scene)(ref scene)).name != "LevelScene")) { yield return (object)new WaitUntil((Func)(() => (Object)(object)Object.FindObjectOfType() != (Object)null)); yield return (object)new WaitUntil((Func)(() => (int)SpawnLevel.GetSpawnLevelState == 4)); yield return (object)new WaitUntil((Func)(() => SpawnLevel.finishedPathfindingScan)); yield return null; yield return (object)new WaitForSeconds(0.25f); Loader.Log("Scanning breakables..."); yield return Scan(); Loader.Log("Breakable scan complete."); } } } }