Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RyomenSukuna v1.3.1
plugins/RyomenSukuna/RyomenSukuna.dll
Decompiled a month 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.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using EntityStates; using GojoSatoruMod.Components; using GojoSatoruMod.Content; using GojoSatoruMod.States; using GojoSatoruMod.Sukuna.Visuals; using GojoSatoruMod.Visuals; using On.RoR2; using R2API; using R2API.Utils; using RoR2; using RoR2.Skills; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Rendering; [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("RyomenSukuna")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.3.1.0")] [assembly: AssemblyInformationalVersion("1.3.1+4bfea71e3ca88fd38135ba73f70b6801fa7b0366")] [assembly: AssemblyProduct("RyomenSukuna")] [assembly: AssemblyTitle("RyomenSukuna")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace GojoSatoruMod.Visuals { internal sealed class RuntimeFugaPillar : MonoBehaviour { private const int TongueCount = 18; private const int CoreCount = 6; private const int HazeCount = 8; private const int Segments = 14; private const float ClimbSeconds = 0.62f; private const float EmberInterval = 0.5f; private const float SmokeInterval = 1.1f; private readonly List<Material> materials = new List<Material>(); private LineRenderer[] tongues; private LineRenderer[] core; private LineRenderer[] haze; private Material tongueMaterial; private Material coreMaterial; private Material hazeMaterial; private Color tongueBase; private Color coreBase; private Color hazeBase; private Vector3 root; private float radius; private float height; private float ignition; private float fade = 1f; private float age; private float emberStopwatch; private float smokeStopwatch; internal void Initialize(Vector3 basePosition, float effectRadius) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_00b4: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: 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) root = basePosition; radius = Mathf.Max(1f, effectRadius); ((Component)this).transform.position = root; tongueBase = new Color(1f, 0.42f, 0.03f, 0.95f); tongueMaterial = Dress("matSukunaFugaPillarTongues", tongueBase, 1.6f); coreBase = new Color(1f, 0.93f, 0.72f, 0.95f); coreMaterial = Dress("matSukunaFugaPillarCore", coreBase, 4.4f); hazeBase = new Color(0.62f, 0.16f, 0.02f, 0.5f); hazeMaterial = Dress("matSukunaFugaPillarHaze", hazeBase, 0.55f); tongues = Build("FugaPillarTongue_", 18, tongueMaterial); core = Build("FugaPillarCore_", 6, coreMaterial); haze = Build("FugaPillarHaze_", 8, hazeMaterial); SukunaVisuals.Flare(root + Vector3.up * (radius * 0.2f), new Color(1f, 0.72f, 0.2f, 1f), radius * 0.9f, 0.4f, 45f); } internal void SetState(float takeHold, float remaining) { ignition = Mathf.Clamp01(takeHold); fade = Mathf.Clamp01(remaining); } private Material Dress(string name, Color tint, float glow) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Material val = JujutsuFxMaterials.CreateLineMaterial(name, tint, glow, JujutsuFxTextures.Streak); materials.Add(val); return val; } private LineRenderer[] Build(string prefix, int count, Material material) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) LineRenderer[] array = (LineRenderer[])(object)new LineRenderer[count]; for (int i = 0; i < count; i++) { GameObject val = new GameObject(prefix + i); val.transform.SetParent(((Component)this).transform, true); LineRenderer val2 = val.AddComponent<LineRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.useWorldSpace = true; val2.positionCount = 14; val2.numCornerVertices = 3; val2.numCapVertices = 3; ((Renderer)val2).material = material; val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => Mathf.Lerp(1f, 0.06f, JujutsuEase.InQuad(t))), 8); val2.textureMode = (LineTextureMode)0; array[i] = val2; } return array; } private void Update() { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) age += Time.deltaTime; height = Mathf.Lerp(3f, radius * 1.7f, JujutsuEase.OutBack(ignition, 0.22f)); Shape(haze, 0.44f, 0.78f, 2.6f, 0.7f); Shape(tongues, 0.3f, 1f, 0.62f, 1f); Shape(core, 0.085f, 0.78f, 1f, 1.35f); JujutsuFxMaterials.SetEnvelope(hazeMaterial, hazeBase, fade, 0.55f); JujutsuFxMaterials.SetEnvelope(tongueMaterial, tongueBase, fade, 1.6f); JujutsuFxMaterials.SetEnvelope(coreMaterial, coreBase, fade * JujutsuEase.FlickerScaled(age, 0.72f, 9f), 4.4f); Aftermath(); } private void Aftermath() { //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_0105: 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_006b: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) float deltaTime = Time.deltaTime; emberStopwatch += deltaTime; smokeStopwatch += deltaTime; if (ignition > 0.35f && fade > 0.15f && emberStopwatch >= 0.5f) { emberStopwatch = 0f; JujutsuMotes.Burst(root + Vector3.up * (height * 0.3f), Vector3.up, new Color(1f, 0.62f, 0.16f, 1f), radius * 0.22f, (JujutsuMoteKind)0, 0); } if (ignition > 0.5f && smokeStopwatch >= 1.1f) { smokeStopwatch = 0f; JujutsuMotes.Burst(root + Vector3.up * (height * 0.62f), Vector3.up, new Color(0.4f, 0.36f, 0.34f, 1f), radius * 0.3f, (JujutsuMoteKind)3, 0); } } private void Shape(LineRenderer[] set, float spread, float reach, float weight, float hurry) { //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0168: 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_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0187: 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_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) if (set == null) { return; } Vector3 val2 = default(Vector3); Vector3 val3 = default(Vector3); for (int i = 0; i < set.Length; i++) { LineRenderer val = set[i]; if (Object.op_Implicit((Object)(object)val)) { float num = (float)i * 2.39996f; float num2 = JujutsuEase.OutQuint(Mathf.Repeat(age * hurry / 0.62f + (float)i / (float)set.Length, 1f)); float num3 = height * reach * Mathf.Lerp(0.55f, 1f, num2); float num4 = radius * spread * (0.35f + (float)(i % 5) * 0.19f); float num5 = ((i % 2 == 0) ? 1f : (-1f)) * (0.9f + (float)(i % 3) * 0.35f); for (int j = 0; j < 14; j++) { float num6 = (float)j / 13f; float num7 = Mathf.Lerp(1f, 0.28f, num6) + num6 * num6 * 0.85f; float num8 = num + num6 * 2.1f + age * num5; float num9 = Mathf.Sin(num6 * 6.5f - age * 7.5f + num) * radius * 0.055f * (0.25f + num6); ((Vector3)(ref val2))..ctor(Mathf.Cos(num8), 0f, Mathf.Sin(num8)); ((Vector3)(ref val3))..ctor(0f - val2.z, 0f, val2.x); val.SetPosition(j, root + Vector3.up * (num3 * num6) + val2 * (num4 * num7) + val3 * num9); } float num10 = (1f - num2) * fade * ignition; float num11 = ((i % 4 == 0) ? 1f : 0.8f); val.startColor = new Color(num11, num11, num11, num10); val.endColor = new Color(num11, num11, num11, 0f); val.widthMultiplier = radius * weight * (0.055f + (float)(i % 4) * 0.014f) * (0.45f + (1f - num2) * 0.85f) * fade; } } } private void OnDestroy() { for (int i = 0; i < materials.Count; i++) { if (Object.op_Implicit((Object)(object)materials[i])) { Object.Destroy((Object)(object)materials[i]); } } materials.Clear(); } } internal static class SukunaFugaVisuals { internal static RuntimeFugaExplosionVisual CreateFugaExplosion(Vector3 impactPosition, Vector3 groundPosition, float radius, float duration = 8.5f, FugaExplosionDetail detail = FugaExplosionDetail.Blast) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) RuntimeFugaExplosionVisual runtimeFugaExplosionVisual = new GameObject("SukunaFugaExplosion").AddComponent<RuntimeFugaExplosionVisual>(); runtimeFugaExplosionVisual.Initialize(impactPosition, groundPosition, radius, duration, detail); return runtimeFugaExplosionVisual; } internal static RuntimeFugaProjectileVisual AddFugaProjectileFlames(GameObject projectileObject, Vector3 direction) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)projectileObject)) { return null; } RuntimeFugaProjectileVisual runtimeFugaProjectileVisual = projectileObject.AddComponent<RuntimeFugaProjectileVisual>(); runtimeFugaProjectileVisual.Initialize(direction); return runtimeFugaProjectileVisual; } } internal enum FugaExplosionDetail { Blast, Flare } internal sealed class RuntimeFugaProjectileVisual : MonoBehaviour { private const int BodyFlameCount = 7; private const int CoreFlameCount = 3; private const int FlameSegments = 7; private const float EmberInterval = 0.35f; private readonly List<Material> materials = new List<Material>(); private LineRenderer[] flames; private LineRenderer[] cores; private TrailRenderer[] trails; private Transform head; private Material headMaterial; private Color headColour; private Material flameMaterial; private Color flameColour; private Material coreMaterial; private Color coreColour; private Material trailMaterial; private Color trailColour; private Vector3 direction; private Vector3 lastPosition; private float age; private float emberStopwatch; private bool stopped; internal void Initialize(Vector3 initialDirection) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) direction = ((((Vector3)(ref initialDirection)).sqrMagnitude > 0.001f) ? ((Vector3)(ref initialDirection)).normalized : Vector3.forward); lastPosition = ((Component)this).transform.position; BuildFlames(); BuildTrails(); BuildHead(); } internal void SetDirection(Vector3 newDirection) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) if (((Vector3)(ref newDirection)).sqrMagnitude > 0.001f) { direction = ((Vector3)(ref newDirection)).normalized; } } internal void Stop() { stopped = true; Quench(flames); Quench(cores); if (trails != null) { for (int i = 0; i < trails.Length; i++) { if (Object.op_Implicit((Object)(object)trails[i])) { trails[i].emitting = false; } } } if (Object.op_Implicit((Object)(object)head)) { ((Component)head).gameObject.SetActive(false); } ((Behaviour)this).enabled = false; } private static void Quench(LineRenderer[] set) { if (set == null) { return; } for (int i = 0; i < set.Length; i++) { if (Object.op_Implicit((Object)(object)set[i])) { ((Renderer)set[i]).enabled = false; } } } private Material Dress(string name, Color tint, float glow) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Material val = JujutsuFxMaterials.CreateLineMaterial(name, tint, glow, JujutsuFxTextures.Streak); materials.Add(val); return val; } private void BuildFlames() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_0062: Unknown result type (might be due to invalid IL or missing references) flameColour = new Color(1f, 0.28f, 0.02f, 0.92f); flameMaterial = Dress("matFugaProjectileFlames", flameColour, 1.6f); coreColour = new Color(1f, 0.92f, 0.66f, 0.95f); coreMaterial = Dress("matFugaProjectileCore", coreColour, 4.4f); flames = BuildSet("FugaProjectileFlame_", 7, flameMaterial); cores = BuildSet("FugaProjectileCore_", 3, coreMaterial); } private LineRenderer[] BuildSet(string prefix, int count, Material material) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) LineRenderer[] array = (LineRenderer[])(object)new LineRenderer[count]; for (int i = 0; i < count; i++) { GameObject val = new GameObject(prefix + i); val.transform.SetParent(((Component)this).transform, false); LineRenderer val2 = val.AddComponent<LineRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.useWorldSpace = true; val2.positionCount = 7; val2.numCornerVertices = 4; val2.numCapVertices = 4; ((Renderer)val2).material = material; val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => Mathf.Lerp(1f, 0.04f, JujutsuEase.InQuad(t))), 8); val2.textureMode = (LineTextureMode)0; array[i] = val2; } return array; } private void BuildTrails() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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_008b: 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_014b: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) trails = (TrailRenderer[])(object)new TrailRenderer[3]; trailColour = new Color(0.66f, 0.12f, 0.01f, 0.55f); trailMaterial = Dress("matFugaInfernoTrails", trailColour, 0.55f); for (int i = 0; i < trails.Length; i++) { GameObject val = new GameObject("FugaInfernoTrail_" + i); val.transform.SetParent(((Component)this).transform, false); float num = (float)i / 3f * MathF.PI * 2f; val.transform.localPosition = new Vector3(Mathf.Cos(num) * 0.28f, Mathf.Sin(num) * 0.28f, 0f); TrailRenderer val2 = val.AddComponent<TrailRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.time = 0.38f + (float)i * 0.09f; val2.minVertexDistance = 0.08f; val2.numCornerVertices = 4; val2.numCapVertices = 3; ((Renderer)val2).material = trailMaterial; val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => 1f - JujutsuEase.InQuad(t)), 8); val2.widthMultiplier = 0.72f - (float)i * 0.12f; val2.textureMode = (LineTextureMode)0; val2.alignment = (LineAlignment)0; val2.startColor = Color.white; val2.endColor = new Color(1f, 1f, 1f, 0f); trails[i] = val2; } } private void BuildHead() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) headColour = new Color(1f, 0.78f, 0.32f, 1f); GameObject val = JujutsuPrimitives.Flare("FugaArrowHead", ((Component)this).transform.position, headColour, 0.9f, 160f); if (Object.op_Implicit((Object)(object)val)) { val.transform.SetParent(((Component)this).transform, false); val.transform.localPosition = Vector3.zero; head = val.transform; MeshRenderer component = val.GetComponent<MeshRenderer>(); headMaterial = (Object.op_Implicit((Object)(object)component) ? ((Renderer)component).sharedMaterial : null); } } private void Update() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_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_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) if (!stopped) { age += Time.deltaTime; Vector3 val = ((Component)this).transform.position - lastPosition; if (((Vector3)(ref val)).sqrMagnitude > 0.0025f) { direction = Vector3.Slerp(direction, ((Vector3)(ref val)).normalized, Mathf.Clamp01(Time.deltaTime * 18f)); } lastPosition = ((Component)this).transform.position; Vector3 val2 = Vector3.Cross(Vector3.up, direction); if (((Vector3)(ref val2)).sqrMagnitude < 0.001f) { val2 = Vector3.right; } ((Vector3)(ref val2)).Normalize(); Vector3 val3 = Vector3.Cross(direction, val2); Vector3 normalized = ((Vector3)(ref val3)).normalized; float rootScale = Mathf.Max(0.45f, ((Component)this).transform.localScale.x); Stream(flames, val2, normalized, rootScale, 1f, 1f); Stream(cores, val2, normalized, rootScale, 0.42f, 0.5f); Head(); Embers(rootScale); } } private void Stream(LineRenderer[] set, Vector3 right, Vector3 up, float rootScale, float reach, float thickness) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011d: 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_016f: 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) if (set == null) { return; } for (int i = 0; i < set.Length; i++) { LineRenderer val = set[i]; if (Object.op_Implicit((Object)(object)val)) { float num = (float)i / (float)set.Length * MathF.PI * 2f; float num2 = rootScale * reach * (2.4f + (float)(i % 4) * 0.42f); for (int j = 0; j < 7; j++) { float num3 = (float)j / 6f; float num4 = Mathf.Sin(age * (13f + (float)i * 0.22f) + num3 * 9f + num) * rootScale * (0.18f + num3 * 0.36f); float num5 = num + num3 * 2.4f + age * (2.5f + (float)i * 0.08f); Vector3 val2 = right * Mathf.Cos(num5) + up * Mathf.Sin(num5); val.SetPosition(j, ((Component)this).transform.position - direction * num2 * num3 + val2 * (rootScale * reach * (0.26f + num3 * 0.52f)) + up * num4); } val.widthMultiplier = rootScale * thickness * (0.26f + (float)(i % 3) * 0.07f) * JujutsuEase.FlickerScaled(age + num, 0.78f, 17f); val.startColor = Color.white; val.endColor = new Color(1f, 1f, 1f, 0f); } } } private void Head() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) if (Object.op_Implicit((Object)(object)head)) { float num = JujutsuEase.FlickerScaled(age, 0.8f, 15f); head.localScale = Vector3.one * (1.5f * num); JujutsuFxMaterials.SetEnvelope(headMaterial, headColour, num, 4.4f); } } private void Embers(float rootScale) { //IL_0031: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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) emberStopwatch += Time.deltaTime; if (!(emberStopwatch < 0.35f)) { emberStopwatch = 0f; JujutsuMotes.Burst(((Component)this).transform.position - direction * rootScale, -direction, new Color(1f, 0.6f, 0.14f, 1f), rootScale * 0.7f, (JujutsuMoteKind)0, 0); } } private void OnDestroy() { for (int i = 0; i < materials.Count; i++) { if (Object.op_Implicit((Object)(object)materials[i])) { Object.Destroy((Object)(object)materials[i]); } } materials.Clear(); } } internal sealed class RuntimeFugaExplosionVisual : MonoBehaviour { private sealed class Shock { internal Mesh Mesh; internal Material Material; internal Color Tint; internal float Glow; } private const int RingSegments = 72; private const int FlameRayCount = 14; private const int FlameTongueCount = 24; private const int FlameCoreCount = 8; private const int FlameTongueSegments = 8; private const int ShockwaveCount = 3; internal const float BlastDuration = 8.5f; internal const float FlareDuration = 1.7f; private const int BlastGroundSpokes = 36; private const int BlastGroundRings = 12; private const int FlareGroundSpokes = 16; private const int FlareGroundRings = 5; private const float EmberInterval = 0.42f; private const float SmokeInterval = 1.35f; private static readonly Color RingInner = new Color(1f, 1f, 1f, 0.1f); private static readonly Color RingMiddle = new Color(1f, 1f, 1f, 1f); private static readonly Color RingOuter = new Color(1f, 1f, 1f, 0f); private readonly List<Material> materials = new List<Material>(); private JujutsuGroundField ground; private RuntimeFugaPillar pillar; private Shock[] shockwaves; private LineRenderer[] flameRays; private Material flameRayMaterial; private Color flameRayBaseColor; private LineRenderer[] flameTongues; private Material flameTongueMaterial; private Color flameTongueBaseColor; private LineRenderer[] flameCores; private Material flameCoreMaterial; private Color flameCoreBaseColor; private Light explosionLight; private Vector3 groundPosition; private float radius; private float duration; private float fadeWindow; private float age; private float emberStopwatch; private float smokeStopwatch; private bool isBlast; private float ringReach; private float ringLift; private Func<float, float> ringHeight; internal void Initialize(Vector3 impactPosition, Vector3 floorPosition, float effectRadius, float lifetime, FugaExplosionDetail detail) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) ((Component)this).transform.position = Vector3.zero; radius = Mathf.Max(2f, effectRadius); duration = Mathf.Max(0.4f, lifetime); fadeWindow = Mathf.Min(1.05f, duration * 0.35f); isBlast = detail == FugaExplosionDetail.Blast; ground = JujutsuGroundField.Sample(floorPosition, radius, isBlast ? 36 : 16, isBlast ? 12 : 5); groundPosition = ground.PointAt(0f, 0f, 0.08f); ringHeight = (float angle) => ground.PointAt(angle, ringReach, ringLift).y - groundPosition.y; BuildFlameTongues(isBlast ? 24 : 8); BuildFlameCores(isBlast ? 8 : 3); if (isBlast) { BuildPillar(); BuildShockwave(); BuildFlameRays(); } BuildLight(isBlast); Detonation(impactPosition); } private void Detonation(Vector3 impactPosition) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0097: 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_00b5: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) Color val = default(Color); ((Color)(ref val))..ctor(1f, 0.5f, 0.06f, 1f); SukunaVisuals.Flare(impactPosition, val, radius * (isBlast ? 0.85f : 0.3f), isBlast ? 0.55f : 0.24f, 30f); if (isBlast) { JujutsuMotes.Burst(groundPosition, Vector3.up, new Color(0.86f, 0.8f, 0.72f, 1f), radius * 0.5f, (JujutsuMoteKind)1, 0); JujutsuFxDebris.Throw(groundPosition, Vector3.up, new Color(0.9f, 0.35f, 0.06f, 1f), radius * 0.35f, 20, 0f, 0.85f); JujutsuFxScorch.Mark(groundPosition, val, radius * 0.8f, 26f, true); if (SukunaVisuals.NearCamera(impactPosition, radius * 1.6f)) { JujutsuFxScreen.Flash(new Color(1f, 0.72f, 0.4f, 0.3f), 0.28f); } } } private void BuildPillar() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("FugaFirePillar"); val.transform.SetParent(((Component)this).transform, true); pillar = val.AddComponent<RuntimeFugaPillar>(); pillar.Initialize(groundPosition, radius); } private void BuildShockwave() { //IL_0049: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_00a6: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_0114: 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) int num = JujutsuFxBudget.Available((Kind)3, 3); if (num > 0) { shockwaves = new Shock[num]; Color colour = default(Color); ((Color)(ref colour))..ctor(1f, 0.46f, 0.04f, 0.95f); for (int i = 0; i < num; i++) { JujutsuFxLayer layer = (JujutsuFxLayer)(i switch { 1 => 1, 0 => 0, _ => 2, }); float glow; Color val = Tier(colour, layer, out glow); GameObject val2 = new GameObject("FugaShockwave_" + i); val2.transform.SetParent(((Component)this).transform, true); val2.transform.position = groundPosition; Mesh val3 = JujutsuFxMesh.Create("FugaShockwaveMesh_" + i); val2.AddComponent<MeshFilter>().sharedMesh = val3; MeshRenderer obj = val2.AddComponent<MeshRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)obj); Material val4 = JujutsuFxMaterials.CreateLineMaterial("matSukunaFugaShockwave" + i, val, glow, (Texture2D)null); materials.Add(val4); ((Renderer)obj).sharedMaterial = val4; JujutsuFxBudget.Register(val2, (Kind)3); shockwaves[i] = new Shock { Mesh = val3, Material = val4, Tint = val, Glow = glow }; } } } private void BuildFlameTongues(int count) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) flameTongueBaseColor = new Color(1f, 0.32f, 0.015f, 0.88f); flameTongueMaterial = Dress("matSukunaFugaFlameTongues", flameTongueBaseColor, 1.6f); flameTongues = BuildTongues("FugaFlameTongue_", count, flameTongueMaterial); } private void BuildFlameCores(int count) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) flameCoreBaseColor = new Color(1f, 0.93f, 0.7f, 0.9f); flameCoreMaterial = Dress("matSukunaFugaFlameCores", flameCoreBaseColor, 4.4f); flameCores = BuildTongues("FugaFlameCore_", count, flameCoreMaterial); } private LineRenderer[] BuildTongues(string prefix, int count, Material material) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) LineRenderer[] array = (LineRenderer[])(object)new LineRenderer[count]; for (int i = 0; i < count; i++) { GameObject val = new GameObject(prefix + i); val.transform.SetParent(((Component)this).transform, true); LineRenderer val2 = val.AddComponent<LineRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.useWorldSpace = true; val2.positionCount = 8; val2.numCornerVertices = 5; val2.numCapVertices = 4; ((Renderer)val2).material = material; val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => Mathf.Lerp(1f, 0.05f, JujutsuEase.InQuad(t))), 8); val2.textureMode = (LineTextureMode)0; array[i] = val2; } return array; } private void BuildFlameRays() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0065: Unknown result type (might be due to invalid IL or missing references) flameRayBaseColor = new Color(0.95f, 0.14f, 0.01f, 0.68f); flameRayMaterial = Dress("matSukunaFugaFloorFlames", flameRayBaseColor, 1.6f); flameRays = (LineRenderer[])(object)new LineRenderer[14]; for (int i = 0; i < 14; i++) { GameObject val = new GameObject("FugaFloorFlame_" + i); val.transform.SetParent(((Component)this).transform, true); LineRenderer val2 = val.AddComponent<LineRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.useWorldSpace = true; val2.positionCount = 4; val2.numCapVertices = 3; ((Renderer)val2).material = flameRayMaterial; val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => Mathf.Lerp(1f, 0.08f, JujutsuEase.InQuad(t))), 8); val2.textureMode = (LineTextureMode)0; flameRays[i] = val2; } } private Material Dress(string name, Color tint, float glow) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Material val = JujutsuFxMaterials.CreateLineMaterial(name, tint, glow, JujutsuFxTextures.Streak); materials.Add(val); return val; } private static Color Tier(Color colour, JujutsuFxLayer layer, out float glow) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) glow = JujutsuFxMaterials.GlowFor(layer); Color result = colour; if ((int)layer != 0) { if ((int)layer == 2) { result = Color.Lerp(colour, Color.black, 0.15f); result.a = colour.a * 0.45f; } } else { result = Color.Lerp(colour, Color.white, 0.78f); result.a = colour.a; } return result; } private void BuildLight(bool blast) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("FugaExplosionLight"); val.transform.SetParent(((Component)this).transform, true); val.transform.position = groundPosition + Vector3.up * 7f; explosionLight = JujutsuFxLights.TryAdd(val, new Color(1f, 0.2f, 0.02f), 11f, radius * 1.55f, blast); } private void Update() { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) age += Time.deltaTime; float ignition = JujutsuEase.OutExpo(Mathf.Clamp01(age / 0.34f)); float num = Mathf.Clamp01((duration - age) / fadeWindow); UpdatePillar(ignition, num); UpdateShockwave(num); UpdateFlameRays(ignition, num); UpdateFlameTongues(flameTongues, ignition, num, 1f, 1f); UpdateFlameTongues(flameCores, ignition, num, 0.5f, 0.55f); UpdateAftermath(num); JujutsuFxMaterials.SetEnvelope(flameRayMaterial, flameRayBaseColor, num, 1.6f); JujutsuFxMaterials.SetEnvelope(flameTongueMaterial, flameTongueBaseColor, num, 1.6f); JujutsuFxMaterials.SetEnvelope(flameCoreMaterial, flameCoreBaseColor, num * JujutsuEase.FlickerScaled(age, 0.7f, 8.5f), 4.4f); if (Object.op_Implicit((Object)(object)explosionLight)) { explosionLight.intensity = 11f * num * JujutsuEase.FlickerScaled(age, 0.78f, 12f); } if (age >= duration) { Object.Destroy((Object)(object)((Component)this).gameObject); } } private void UpdatePillar(float ignition, float fade) { if (Object.op_Implicit((Object)(object)pillar)) { pillar.SetState(ignition, fade); } } private void UpdateShockwave(float fade) { //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) if (shockwaves == null) { return; } for (int i = 0; i < shockwaves.Length; i++) { Shock shock = shockwaves[i]; if (shock != null && Object.op_Implicit((Object)(object)shock.Mesh)) { float num = (float)i * 0.09f; float num2 = JujutsuEase.Window(age, num, num + 0.74f + (float)i * 0.12f); float num3 = radius * (1.18f + (float)i * 0.16f) * JujutsuEase.OutExpo(num2); float num4 = radius * Mathf.Lerp(0.3f, 0.05f, JujutsuEase.OutCubic(num2)); ringReach = num3; ringLift = 0.15f + (float)i * 0.12f; JujutsuFxMesh.Ring(shock.Mesh, Mathf.Max(0.05f, num3 - num4), Mathf.Max(0.1f, num3 + num4 * 0.4f), RingInner, RingMiddle, RingOuter, 72, 0.4f, i * 31 + 7, ringHeight); JujutsuFxMaterials.SetEnvelope(shock.Material, shock.Tint, JujutsuEase.Snap(num2, 0.1f) * fade, shock.Glow); } } } private void UpdateFlameRays(float ignition, float fade) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0123: 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_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: 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) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0168: 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_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) if (flameRays == null) { return; } Vector3 val2 = default(Vector3); Vector3 val3 = default(Vector3); for (int i = 0; i < flameRays.Length; i++) { LineRenderer val = flameRays[i]; if (Object.op_Implicit((Object)(object)val)) { float num = (float)i / 14f * MathF.PI * 2f + Mathf.Sin((float)i * 4.17f) * 0.18f; ((Vector3)(ref val2))..ctor(Mathf.Cos(num), 0f, Mathf.Sin(num)); ((Vector3)(ref val3))..ctor(0f - val2.z, 0f, val2.x); float num2 = radius * (0.62f + (float)(i % 5) * 0.075f) * ignition; float num3 = Mathf.Sin(age * 5f + (float)i * 1.7f) * radius * 0.035f; val.SetPosition(0, ground.PointAt(num, 0f, 0.12f)); val.SetPosition(1, ground.PointAt(num, num2 * 0.34f, 0.18f) + val3 * num3); val.SetPosition(2, ground.PointAt(num, num2 * 0.7f, 0.1f) - val3 * num3 * 0.55f); val.SetPosition(3, ground.PointAt(num, num2, 0.08f) + val3 * num3 * 0.25f); float num4 = ground.CoverageAt(num, num2); float num5 = 0.78f + (float)(i % 3) * 0.11f; val.startColor = new Color(num5, num5, num5, 1f); val.endColor = new Color(num5, num5, num5, 0f); val.widthMultiplier = (0.5f + (float)(i % 4) * 0.12f) * fade * num4 * JujutsuEase.FlickerScaled(age + (float)i, 0.8f, 7f); } } } private void UpdateFlameTongues(LineRenderer[] set, float ignition, float fade, float band, float weight) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: 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_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: 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_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: 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_0216: Unknown result type (might be due to invalid IL or missing references) if (set == null) { return; } Vector3 val2 = default(Vector3); Vector3 val3 = default(Vector3); for (int i = 0; i < set.Length; i++) { LineRenderer val = set[i]; if (Object.op_Implicit((Object)(object)val)) { float num = (float)i / (float)set.Length * MathF.PI * 2f; float num2 = (0.16f + (float)(i % 6) * 0.115f) * band; float num3 = radius * num2 * Mathf.Lerp(0.12f, 1f, JujutsuEase.OutQuint(ignition)); float num4 = radius * (0.42f + (float)(i % 7) * 0.105f) * weight * ignition * JujutsuEase.FlickerScaled(age + num, 0.7f, 8f); ((Vector3)(ref val2))..ctor(Mathf.Cos(num), 0f, Mathf.Sin(num)); ((Vector3)(ref val3))..ctor(0f - val2.z, 0f, val2.x); Vector3 val4 = ground.PointAt(num, num3, 0.05f); float num5 = ground.CoverageAt(num, num3); for (int j = 0; j < 8; j++) { float num6 = (float)j / 7f; float num7 = Mathf.Sin(age * (6.5f + (float)i * 0.035f) + num6 * 8f + num * 2f) * radius * 0.055f * num6; float num8 = Mathf.Cos(age * 4.7f + num6 * 11f + num) * radius * 0.024f * num6; val.SetPosition(j, val4 + Vector3.up * (num4 * JujutsuEase.OutQuint(num6)) + val3 * num7 + val2 * num8 - val2 * num4 * 0.08f * num6 * num6); } float num9 = ((i % 4 == 0) ? 1f : 0.82f); val.startColor = new Color(num9, num9, num9, 1f); val.endColor = new Color(num9, num9, num9, 0f); val.widthMultiplier = radius * weight * (0.028f + (float)(i % 5) * 0.005f) * fade * num5 * JujutsuEase.FlickerScaled(age + num, 0.78f, 13f); } } } private void UpdateAftermath(float fade) { //IL_00e1: 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_00ff: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) if (isBlast) { float deltaTime = Time.deltaTime; emberStopwatch += deltaTime; smokeStopwatch += deltaTime; if (fade > 0.2f && emberStopwatch >= 0.42f) { emberStopwatch = 0f; float num = age * 2.3f; JujutsuMotes.Burst(ground.PointAt(num, radius * 0.4f, 0.4f), Vector3.up, new Color(1f, 0.68f, 0.18f, 1f), radius * 0.2f, (JujutsuMoteKind)0, 0); } if (smokeStopwatch >= 1.35f) { smokeStopwatch = 0f; JujutsuMotes.Burst(ground.PointAt(age * 1.7f, radius * 0.55f, 0.6f), Vector3.up, new Color(0.36f, 0.32f, 0.3f, 1f), radius * 0.32f, (JujutsuMoteKind)3, 0); } } } private void OnDestroy() { for (int i = 0; i < materials.Count; i++) { if (Object.op_Implicit((Object)(object)materials[i])) { Object.Destroy((Object)(object)materials[i]); } } materials.Clear(); if (shockwaves == null) { return; } for (int j = 0; j < shockwaves.Length; j++) { if (shockwaves[j] != null && Object.op_Implicit((Object)(object)shockwaves[j].Mesh)) { Object.Destroy((Object)(object)shockwaves[j].Mesh); } } } } internal static class SukunaShrineVisuals { internal static RuntimeMalevolentShrineVisual CreateShrine(Vector3 center, Vector3 facing, float radius, float duration, int rank = 0) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0011: 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_0018: 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_0022: 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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("SukunaMalevolentShrine"); val.transform.position = center; Vector3 val2 = Vector3.ProjectOnPlane(facing, Vector3.up); if (((Vector3)(ref val2)).sqrMagnitude > 0.0001f) { val.transform.rotation = Quaternion.LookRotation(((Vector3)(ref val2)).normalized, Vector3.up); } RuntimeMalevolentShrineVisual runtimeMalevolentShrineVisual = val.AddComponent<RuntimeMalevolentShrineVisual>(); runtimeMalevolentShrineVisual.Initialize(radius, duration, rank); return runtimeMalevolentShrineVisual; } } internal sealed class RuntimeMalevolentShrineVisual : MonoBehaviour { private sealed class Shell { internal Transform Item; internal Material Material; internal Color Tint; internal float Glow; internal float Size = 1f; internal float Rate = 0.4f; } private const int RingSegments = 96; private const int BaseSigilRayCount = 16; private const int CurseWispCount = 18; private const int WispSegments = 7; private const int DarkShells = 2; private int darkShells = 2; private int hazeShells = 3; private int rank; private const float StandOff = 23f; private const float RiseDuration = 1.1f; private const float UnsealedGrace = 8f; private const float BoundarySweep = 0.62f; private const float MaximumGroundRise = 8f; private const float MaximumGroundDrop = 45f; private const float GroundSampleRadius = 7f; private const int DomainGroundSpokes = 32; private const int DomainGroundRings = 6; private static readonly Color RingInner = new Color(1f, 1f, 1f, 0.14f); private static readonly Color RingMiddle = new Color(1f, 1f, 1f, 1f); private static readonly Color RingOuter = new Color(1f, 1f, 1f, 0f); private readonly List<Material> materials = new List<Material>(); private Renderer[] shrineRenderers; private Transform shrineStand; private float standDrop; private Vector3 domainCentre; private bool placementReported; private Material shrineMaterial; private Material ringMaterial; private Color ringBaseColor; private Transform sphereRoot; private Shell[] shells; private JujutsuGroundField ground; private float nextAirCutAt; private GameObject boundary; private Mesh boundaryMesh; private float boundarySweepReach; private Func<float, float> boundaryHeight; private LineRenderer[] sigilRays; private LineRenderer[] curseWisps; private Material sigilMaterial; private Material sigilCoreMaterial; private Material wispMaterial; private Color sigilBaseColor; private Color sigilCoreColor; private Color wispBaseColor; private Light shrineLight; private ParticleSystem shrineEmbers; private ParticleSystem shrineSmoke; private float radius; private float duration; private float shrineHeight = 5.5f; private float shrineScale = 1f; private float lightIntensity = 4.6f; private float age; private float sealAge = -1f; private bool domainSealed; internal void Initialize(float domainRadius, float lifetime, int shrineRank = 0) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) radius = Mathf.Max(8f, domainRadius); duration = Mathf.Max(1f, lifetime); rank = Mathf.Clamp(shrineRank, 0, 5); darkShells = 2 + ((rank >= 3) ? 1 : 0); hazeShells = darkShells + 1; shrineScale = 1f + 0.08f * (float)rank; lightIntensity = 4.6f + 0.45f * (float)rank; domainCentre = ((Component)this).transform.position; shrineMaterial = SukunaVisuals.CreateSafeMaterial("matSukunaShrine", new Color(0.25f, 0.006f, 0.018f, 1f)); ringBaseColor = Color.Lerp(SukunaAssets.Crimson, new Color(0.35f, 0f, 0.02f, 1f), (float)rank / 5f); ringMaterial = JujutsuFxMaterials.CreateLineMaterial("matSukunaShrineBoundary", ringBaseColor, 1.6f, (Texture2D)null); materials.Add(ringMaterial); BuildShrine(); } internal void Seal() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!domainSealed) { domainSealed = true; sealAge = 0f; ground = JujutsuGroundField.Sample(domainCentre, radius, 32, 6); BuildBoundary(); BuildSphere(); BuildSigil(); BuildCurseWisps(); BuildLight(); MarkTheGround(); Announce(); } } private void Announce() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0042: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) Vector3 val = domainCentre + Vector3.up * (radius * 0.15f); SukunaVisuals.Flare(val, SukunaAssets.Crimson, radius * 0.9f, 0.7f, 18f); JujutsuFxLights.Borrow(val, Color.Lerp(SukunaAssets.Crimson, Color.white, 0.3f), 14f, radius * 1.4f, 0.22f); if (SukunaVisuals.NearCamera(domainCentre, radius * 1.35f)) { JujutsuFxScreen.Flash(new Color(0.7f, 0.03f, 0.05f, 0.55f), 0.4f); JujutsuFxScreen.Vignette(new Color(0.24f, 0.005f, 0.02f, 1f), duration, 0.52f); } } private void MarkTheGround() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) JujutsuFxScorch.Mark(domainCentre, SukunaAssets.Crimson, radius * 0.94f, duration + 3f, false); if (Object.op_Implicit((Object)(object)shrineStand)) { JujutsuFxScorch.Mark(shrineStand.position, new Color(0.32f, 0.02f, 0.03f, 1f), 9f, duration + 6f, true); } } private void BuildSphere() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: 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_0137: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("MalevolentShrineAir"); val.transform.SetParent(((Component)this).transform, false); sphereRoot = val.transform; shells = new Shell[hazeShells]; float num = 0.6f / (float)Mathf.Max(1, hazeShells - 1); Color val3 = default(Color); for (int i = 0; i < hazeShells; i++) { bool flag = i < darkShells; GameObject val2 = JujutsuPrimitives.Sphere("ShrineHaze_" + i, Vector3.zero, false); val2.transform.SetParent(sphereRoot, false); float num2 = radius * (1.98f - (float)i * num); val2.transform.localScale = Vector3.one * num2; Renderer component = val2.GetComponent<Renderer>(); if (Object.op_Implicit((Object)(object)component)) { JujutsuFxMaterials.PrepareRenderer(component); float num3; Material val4; if (flag && JujutsuFxMaterials.CanDrawDark) { ((Color)(ref val3))..ctor(0.05f, 0.004f, 0.008f, Mathf.Max(0.04f, 0.16f - (float)i * 0.05f) + 0.005f * (float)rank); num3 = 1f; val4 = JujutsuFxMaterials.CreateBlendedMaterial("matSukunaShrineHaze" + i, val3, JujutsuFxTextures.Grain); } else { ((Color)(ref val3))..ctor(0.5f, 0.02f, 0.03f, 0.05f + 0.008f * (float)rank); num3 = 0.55f; val4 = JujutsuFxMaterials.CreateLineMaterial("matSukunaShrineHaze" + i, val3, num3, JujutsuFxTextures.Grain); } materials.Add(val4); component.sharedMaterial = val4; shells[i] = new Shell { Item = val2.transform, Material = val4, Tint = val3, Glow = num3, Size = num2, Rate = 0.37f + (float)i * 0.19f }; } } } private void CutTheAir() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_0071: 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_008a: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: 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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) if (!(age < nextAirCutAt)) { nextAirCutAt = age + Random.Range(0.12f, 0.3f); Vector3 position = ((Component)this).transform.position; Vector3 val = Random.insideUnitSphere * (radius * 0.85f); val.y = Mathf.Abs(val.y) * 0.7f + 0.5f; Vector3 onUnitSphere = Random.onUnitSphere; float num = radius * Random.Range(0.12f, 0.3f); SukunaVisuals.CreateSlash(position + val - onUnitSphere * num, position + val + onUnitSphere * num, Random.Range(0.12f, 0.3f), Random.Range(0.25f, 0.45f), (Random.value > 0.5f) ? SukunaVisuals.DarkSlash : SukunaVisuals.GreySlash, false); } } private void BuildLight() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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_00a8: 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) GameObject val = new GameObject("MalevolentShrineLight"); val.transform.SetParent(((Component)this).transform, false); val.transform.localPosition = (Object.op_Implicit((Object)(object)shrineStand) ? shrineStand.localPosition : Vector3.zero) + Vector3.up * (shrineHeight * 0.55f); shrineLight = JujutsuFxLights.TryAdd(val, SukunaAssets.Crimson, 3.4f + 0.35f * (float)rank, radius * 0.9f, true); if (Object.op_Implicit((Object)(object)shrineStand)) { shrineEmbers = JujutsuMotes.Attach(shrineStand, SukunaAssets.Crimson, shrineHeight * 0.45f, (JujutsuMoteKind)0); shrineSmoke = JujutsuMotes.Attach(shrineStand, new Color(0.3f, 0.24f, 0.24f, 1f), shrineHeight * 0.6f, (JujutsuMoteKind)3); } } private Transform CreateStand() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("MalevolentShrineStand"); val.transform.SetParent(((Component)this).transform, false); float num = 23f; float num2 = 0f; bool flag = false; for (int i = 0; i < 3; i++) { if (flag) { break; } num = 23f * (1f - (float)i * 0.25f); flag = TryFindGround(((Component)this).transform.position - ((Component)this).transform.forward * num, out var groundHeight); if (flag) { num2 = groundHeight - ((Component)this).transform.position.y; } } if (!flag) { num = 23f; Plugin.Log.LogWarning((object)("Malevolent Shrine found no ground behind the caster " + $"within {45f:0}m at any stand-off; standing " + "it on his own level."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\RuntimeMalevolentShrineVisual.cs"); } standDrop = num2; val.transform.localPosition = new Vector3(0f, num2, 0f - num); val.transform.localRotation = Quaternion.Euler(0f, 180f, 0f); return val.transform; } private bool TryFindGround(Vector3 centre, out float groundHeight) { //IL_0033: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: 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_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: 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_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) groundHeight = 0f; bool flag = false; RaycastHit val = default(RaycastHit); for (int i = 0; i < 5; i++) { if (Physics.Raycast(centre + (Vector3)(i switch { 1 => (((Component)this).transform.right + ((Component)this).transform.forward) * 7f, 2 => (((Component)this).transform.right - ((Component)this).transform.forward) * 7f, 3 => (-((Component)this).transform.right + ((Component)this).transform.forward) * 7f, 4 => (-((Component)this).transform.right - ((Component)this).transform.forward) * 7f, _ => Vector3.zero, }) + Vector3.up * 8f, Vector3.down, ref val, 53f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1) && (!flag || ((RaycastHit)(ref val)).point.y < groundHeight)) { groundHeight = ((RaycastHit)(ref val)).point.y; flag = true; } } return flag; } private void BuildShrine() { //IL_0050: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) shrineStand = CreateStand(); float num = default(float); if (RuntimeShrineModel.TryBuild(shrineStand, ref num)) { shrineHeight = num; shrineRenderers = ((Component)shrineStand).GetComponentsInChildren<Renderer>(true); ApplyShrineScale(); return; } CreateBlock("ShrineBase", new Vector3(0f, 0.18f, 0f), new Vector3(7.5f, 0.36f, 5.2f)); CreateBlock("ShrineStep", new Vector3(0f, 0.48f, 0f), new Vector3(6.1f, 0.28f, 4.2f)); for (int i = -1; i <= 1; i += 2) { CreateBlock("ShrinePillarFront", new Vector3((float)i * 2.55f, 2.7f, 1.35f), new Vector3(0.48f, 4.7f, 0.48f)); CreateBlock("ShrinePillarBack", new Vector3((float)i * 2.55f, 2.7f, -1.35f), new Vector3(0.48f, 4.7f, 0.48f)); } CreateBlock("ShrineRoofLower", new Vector3(0f, 4.85f, 0f), new Vector3(6.9f, 0.38f, 4.15f)); CreateBlock("ShrineRoofUpper", new Vector3(0f, 5.35f, 0f), new Vector3(5.45f, 0.34f, 3.35f)); CreateBlock("ShrineAltar", new Vector3(0f, 1.45f, -0.5f), new Vector3(2.8f, 2.1f, 1.25f)); shrineRenderers = ((Component)shrineStand).GetComponentsInChildren<Renderer>(true); ApplyShrineScale(); } private void ApplyShrineScale() { //IL_0021: 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) if (Object.op_Implicit((Object)(object)shrineStand) && !(shrineScale <= 1.0001f)) { shrineStand.localScale = Vector3.one * shrineScale; shrineHeight *= shrineScale; } } private void CreateBlock(string blockName, Vector3 localPosition, Vector3 localScale) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) GameObject obj = JujutsuPrimitives.Cube(blockName, Vector3.zero, false); obj.transform.SetParent(shrineStand, false); obj.transform.localPosition = localPosition; obj.transform.localScale = localScale; Renderer component = obj.GetComponent<Renderer>(); component.sharedMaterial = shrineMaterial; component.shadowCastingMode = (ShadowCastingMode)1; component.receiveShadows = true; } private void BuildBoundary() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) if (JujutsuFxBudget.Available((Kind)3, 1) >= 1) { MeshRenderer val = default(MeshRenderer); boundary = JujutsuFxMesh.Object("MalevolentShrineBoundary", ref boundaryMesh, ref val); boundary.transform.position = domainCentre; boundary.transform.rotation = Quaternion.identity; ((Renderer)val).sharedMaterial = ringMaterial; JujutsuFxBudget.Register(boundary, (Kind)3); boundaryHeight = BoundaryHeight; ShapeBoundary(0f); } } private void ShapeBoundary(float sweep) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: 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.op_Implicit((Object)(object)boundaryMesh) && ground != null) { float num = Mathf.Max(0.6f, radius * JujutsuEase.OutQuint(sweep)); float num2 = radius * Mathf.Lerp(0.14f, 0.035f, JujutsuEase.OutCubic(sweep)) * (1f + 0.09f * (float)rank); boundarySweepReach = num; JujutsuFxMesh.Ring(boundaryMesh, Mathf.Max(0.1f, num - num2), Mathf.Max(0.2f, num + num2 * 0.5f), RingInner, RingMiddle, RingOuter, 96, 0.42f, 17, boundaryHeight); } } private float BoundaryHeight(float angle) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return ground.PointAt(angle, boundarySweepReach, 0.12f).y - domainCentre.y; } private void BuildSigil() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) sigilBaseColor = new Color(0.75f, 0.015f, 0.025f, 0.82f); sigilMaterial = Dress("matSukunaShrineSigil", sigilBaseColor, 1.6f); sigilCoreColor = new Color(1f, 0.62f, 0.58f, 0.85f); sigilCoreMaterial = Dress("matSukunaShrineSigilCore", sigilCoreColor, 4.4f); sigilRays = (LineRenderer[])(object)new LineRenderer[16 + 2 * rank]; for (int i = 0; i < sigilRays.Length; i++) { GameObject val = new GameObject("ShrineSigilRay_" + i); val.transform.SetParent(((Component)this).transform, true); LineRenderer val2 = val.AddComponent<LineRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.useWorldSpace = true; val2.positionCount = 5; val2.numCornerVertices = 3; val2.numCapVertices = 3; ((Renderer)val2).material = ((i % 4 == 0) ? sigilCoreMaterial : sigilMaterial); val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => Mathf.Lerp(1f, 0.12f, JujutsuEase.InQuad(t))), 8); val2.textureMode = (LineTextureMode)0; sigilRays[i] = val2; } } private void BuildCurseWisps() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0065: Unknown result type (might be due to invalid IL or missing references) wispBaseColor = new Color(0.42f, 0.01f, 0.03f, 0.78f); wispMaterial = Dress("matSukunaShrineCurseWisps", wispBaseColor, 1.6f); curseWisps = (LineRenderer[])(object)new LineRenderer[18]; for (int i = 0; i < curseWisps.Length; i++) { GameObject val = new GameObject("ShrineCurseWisp_" + i); val.transform.SetParent(((Component)this).transform, true); LineRenderer val2 = val.AddComponent<LineRenderer>(); JujutsuFxMaterials.PrepareRenderer((Renderer)(object)val2); val2.useWorldSpace = true; val2.positionCount = 7; val2.numCornerVertices = 4; val2.numCapVertices = 3; ((Renderer)val2).material = ((i % 4 == 0) ? sigilCoreMaterial : wispMaterial); val2.widthCurve = JujutsuEase.Curve((Func<float, float>)((float t) => Mathf.Lerp(1f, 0.06f, JujutsuEase.InQuad(t))), 8); val2.textureMode = (LineTextureMode)0; curseWisps[i] = val2; } } private Material Dress(string name, Color tint, float glow) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) Material val = JujutsuFxMaterials.CreateLineMaterial(name, tint, glow, JujutsuFxTextures.Streak); materials.Add(val); return val; } private void Update() { //IL_0123: 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) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) age += Time.deltaTime; if (domainSealed) { sealAge += Time.deltaTime; } float num = Mathf.Clamp01(age / 1.1f); float num2 = Mathf.LerpUnclamped(0.12f, 1f, JujutsuEase.OutBack(num, 0.18f)); float num3 = (domainSealed ? Mathf.Clamp01((duration - sealAge) / 0.8f) : 1f); float num4 = Mathf.Min(num, num3); float num5 = (domainSealed ? Mathf.Min(Mathf.Clamp01(sealAge / 0.55f), num3) : 0f); if (shrineRenderers != null) { for (int i = 0; i < shrineRenderers.Length; i++) { if (Object.op_Implicit((Object)(object)shrineRenderers[i])) { shrineRenderers[i].enabled = num4 > 0.01f; } } } UpdateBoundary(num5); UpdateShells(num5); CutTheAir(); UpdateSigil(num5); UpdateCurseWisps(num5); JujutsuFxMaterials.SetEnvelope(sigilMaterial, sigilBaseColor, num5, 1.6f); JujutsuFxMaterials.SetEnvelope(sigilCoreMaterial, sigilCoreColor, num5 * JujutsuEase.FlickerScaled(age, 0.7f, 7.5f), 4.4f); JujutsuFxMaterials.SetEnvelope(wispMaterial, wispBaseColor, num5, 1.6f); ((Component)this).transform.localScale = new Vector3(1f, Mathf.Max(0.05f, num2), 1f); if (Object.op_Implicit((Object)(object)shrineLight)) { shrineLight.intensity = lightIntensity * num5 * JujutsuEase.FlickerScaled(age, 0.72f, 5.5f); } if (!placementReported) { placementReported = true; RuntimeShrineModel.ReportPlacement(shrineStand, ((Component)this).transform, domainCentre, standDrop); } if (domainSealed ? (sealAge >= duration) : (age >= 8f)) { Object.Destroy((Object)(object)((Component)this).gameObject); } } private void UpdateBoundary(float alpha) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)boundary) && domainSealed) { if (sealAge <= 0.62f) { ShapeBoundary(Mathf.Clamp01(sealAge / 0.62f)); } JujutsuFxMaterials.SetEnvelope(ringMaterial, ringBaseColor, alpha * JujutsuEase.FlickerScaled(age, 0.78f, 4.4f), 1.6f); } } private void UpdateShells(float alpha) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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_00ad: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)sphereRoot) || shells == null) { return; } sphereRoot.localRotation = Quaternion.Euler(0f, (0f - age) * 2.5f, 0f); for (int i = 0; i < shells.Length; i++) { Shell shell = shells[i]; if (shell != null) { if (Object.op_Implicit((Object)(object)shell.Item)) { float num = Mathf.Lerp(0.55f, 1f, JujutsuEase.OutExpo(Mathf.Clamp01(sealAge / 0.62f))); shell.Item.localScale = Vector3.one * (shell.Size * num * JujutsuEase.FlickerScaled(age, 0.985f, shell.Rate)); } JujutsuFxMaterials.SetEnvelope(shell.Material, shell.Tint, alpha, shell.Glow); } } } private void UpdateSigil(float alpha) { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_015b: 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) if (sigilRays == null || ground == null) { return; } for (int i = 0; i < sigilRays.Length; i++) { LineRenderer val = sigilRays[i]; if (Object.op_Implicit((Object)(object)val)) { float num = (float)i / (float)sigilRays.Length * MathF.PI * 2f + age * ((i % 2 == 0) ? 0.08f : (-0.06f)); float distance = radius * 0.16f; float num2 = radius * (0.82f + (float)(i % 4) * 0.045f) * Mathf.Lerp(0.25f, 1f, JujutsuEase.OutQuint(Mathf.Clamp01(sealAge / 0.62f))); float num3 = radius * 0.03f; val.SetPosition(0, Floor(num, distance, 0.1f)); val.SetPosition(1, Floor(num + num3 / num2, num2 * 0.34f, 0.11f)); val.SetPosition(2, Floor(num - num3 / num2, num2 * 0.62f, 0.12f)); val.SetPosition(3, Floor(num + num3 * 0.6f / num2, num2 * 0.82f, 0.1f)); val.SetPosition(4, Floor(num, num2, 0.09f)); float num4 = ground.CoverageAt(num, num2); val.startColor = Color.white; val.endColor = new Color(1f, 1f, 1f, 0f); val.widthMultiplier = (0.15f + (float)(i % 3) * 0.035f) * alpha * num4 * JujutsuEase.FlickerScaled(age + (float)i, 0.82f, 11f); } } } private void UpdateCurseWisps(float alpha) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: 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_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: 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_015c: Unknown result type (might be due to invalid IL or missing references) if (curseWisps == null || ground == null) { return; } Vector3 val3 = default(Vector3); for (int i = 0; i < curseWisps.Length; i++) { LineRenderer val = curseWisps[i]; if (Object.op_Implicit((Object)(object)val)) { float num = (float)i * 2.39996f; float num2 = radius * (0.24f + (float)(i % 7) * 0.095f); float num3 = num + age * (0.2f + (float)(i % 3) * 0.09f); Vector3 val2 = Floor(num3, num2, 0.15f); ((Vector3)(ref val3))..ctor(0f - Mathf.Sin(num3), 0f, Mathf.Cos(num3)); for (int j = 0; j < 7; j++) { float num4 = (float)j / 6f; float num5 = radius * (0.08f + (float)(i % 5) * 0.018f) * JujutsuEase.OutQuint(num4); float num6 = Mathf.Sin(age * 4.5f + num + num4 * 8f) * radius * 0.018f * num4; val.SetPosition(j, val2 + Vector3.up * num5 + val3 * num6); } float num7 = ground.CoverageAt(num3, num2); val.startColor = Color.white; val.endColor = new Color(1f, 1f, 1f, 0f); val.widthMultiplier = (0.18f + (float)(i % 4) * 0.035f) * alpha * num7 * JujutsuEase.FlickerScaled(age + num, 0.85f, 6f); } } } private Vector3 Floor(float angle, float distance, float lift) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) return ground.PointAt(angle, distance, lift); } private void OnDestroy() { if (Object.op_Implicit((Object)(object)shrineMaterial)) { Object.Destroy((Object)(object)shrineMaterial); } for (int i = 0; i < materials.Count; i++) { if (Object.op_Implicit((Object)(object)materials[i])) { Object.Destroy((Object)(object)materials[i]); } } materials.Clear(); if (Object.op_Implicit((Object)(object)boundary)) { Object.Destroy((Object)(object)boundary); } if (Object.op_Implicit((Object)(object)boundaryMesh)) { Object.Destroy((Object)(object)boundaryMesh); } JujutsuMotes.Stop(shrineEmbers); JujutsuMotes.Stop(shrineSmoke); } } internal static class SukunaImportedModel { private sealed class ModelData { internal string[] BoneNames; internal int[] ParentIndices; internal Vector3[] BonePositions; internal Quaternion[] BoneRotations; internal Vector3[] BoneScales; internal MeshData[] Meshes; } private sealed class MeshData { internal string Name; internal int OutfitIndex; internal string MaterialName; internal string TextureName; internal bool IsDecal; internal Vector3[] Vertices; internal Vector3[] Normals; internal Vector2[] Uvs; internal BoneWeight[] BoneWeights; internal int[] Triangles; } private const string ModelFileName = "sukuna.model"; private const string TextureDirectoryName = "sukuna"; private const int OutfitCount = 5; private const int SharedOutfitIndex = 5; private static readonly int[] SelfContainedOutfits = new int[4] { 1, 2, 3, 4 }; private const int OutfitGroupCount = 6; private const int HeianOutfitIndex = 2; private const float NativeModelScale = 1.27f; private static ModelData cachedModel; private static readonly Dictionary<string, Texture2D> textureCache = new Dictionary<string, Texture2D>(StringComparer.Ordinal); private static readonly Dictionary<string, Sprite> iconCache = new Dictionary<string, Sprite>(StringComparer.Ordinal); private static Material cachedTemplateMaterial; private static readonly Dictionary<string, List<Material>> cutoutWaiting = new Dictionary<string, List<Material>>(StringComparer.Ordinal); private static readonly Dictionary<string, bool> cutoutDecided = new Dictionary<string, bool>(StringComparer.Ordinal); private static readonly HashSet<string> loggedShaders = new HashSet<string>(StringComparer.Ordinal); internal static bool Apply(GameObject prefab) { //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Expected O, but got Unknown //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) GameObject val = null; try { Plugin.Log.LogInfo((object)("Preparing supplied Sukuna rig for " + ((Object)prefab).name + "."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); CharacterModel componentInChildren = prefab.GetComponentInChildren<CharacterModel>(true); if (!Object.op_Implicit((Object)(object)componentInChildren)) { Plugin.Log.LogWarning((object)("CharacterModel was not found while applying Sukuna model to " + ((Object)prefab).name + "."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return false; } ModelData modelData = LoadModel(); Material val2 = FindTemplateMaterial(componentInChildren); if (modelData == null) { Plugin.Log.LogError((object)("Sukuna model data could not be loaded for " + ((Object)prefab).name + "; the Mercenary fallback will remain visible."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return false; } if (!Object.op_Implicit((Object)(object)val2)) { Plugin.Log.LogError((object)("No safe material template was available for " + ((Object)prefab).name + "; the Mercenary fallback will remain visible."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return false; } Plugin.Log.LogInfo((object)("Loaded Sukuna runtime data for " + ((Object)prefab).name + ": " + $"{modelData.BoneNames.Length} bones, " + $"{modelData.Meshes.Length} mesh parts."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); Renderer[] componentsInChildren = ((Component)componentInChildren).GetComponentsInChildren<Renderer>(true); Light[] componentsInChildren2 = ((Component)componentInChildren).GetComponentsInChildren<Light>(true); Animator animator = ((Component)componentInChildren).GetComponent<Animator>() ?? ((Component)componentInChildren).GetComponentInChildren<Animator>(true); val = new GameObject("SukunaImportedModel"); val.layer = ((Component)componentInChildren).gameObject.layer; Transform transform = val.transform; transform.SetParent(((Component)componentInChildren).transform, false); transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.Euler(-90f, 0f, 0f); transform.localScale = SukunaModelBasis.ContainerScale(transform, (JujutsuConfig.SukunaModelScale != null) ? JujutsuConfig.SukunaModelScale.Value : 1.27f); Transform[] array = BuildSkeleton(modelData, transform); GameObject[] array2 = BuildOutfitGroups(transform); List<RendererInfo> list = BuildMeshes(modelData, array, array2, val2, ((Component)componentInChildren).gameObject.layer); if (list.Count == 0) { Object.DestroyImmediate((Object)(object)val); Plugin.Log.LogError((object)("Sukuna model contained no usable renderers for " + ((Object)prefab).name + "."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return false; } RendererInfo[] baseRendererInfos = componentInChildren.baseRendererInfos; foreach (RendererInfo val3 in baseRendererInfos) { if (Object.op_Implicit((Object)(object)val3.renderer)) { val3.renderer.enabled = false; } } RendererInfo[] array3 = (componentInChildren.baseRendererInfos = list.ToArray()); componentInChildren.mainSkinnedMeshRenderer = FindMainRenderer(array3); componentInChildren.materialsDirty = true; componentInChildren.forceUpdate = true; Renderer[] array4 = (Renderer[])(object)new Renderer[array3.Length]; for (int j = 0; j < array3.Length; j++) { array4[j] = array3[j].renderer; } val.AddComponent<GojoModelVisibilityController>().Configure(componentsInChildren, array4, componentsInChildren2); val.AddComponent<SukunaMixamoAnimationDriver>().Configure(modelData.BoneNames, array); bool flag = Array.IndexOf(modelData.BoneNames, "mixamorig:Hips") >= 0; val.AddComponent<GojoModelAnimator>().Configure(componentInChildren, modelData.BoneNames, array); SukunaHeianArms sukunaHeianArms = val.AddComponent<SukunaHeianArms>(); GameObject heianSkinGroup = ((array2.Length > 2) ? array2[2] : null); sukunaHeianArms.Configure(modelData.BoneNames, array, heianSkinGroup); val.AddComponent<SukunaHeianStature>().Configure(heianSkinGroup, Mathf.Abs(transform.localScale.x)); val.AddComponent<JujutsuFootPlanting>(); val.AddComponent<JujutsuRagdoll>(); val.AddComponent<SukunaBladeTrail>(); ConfigureSkins(componentInChildren, animator, array3, array2, FindOutfitsWithGeometry(modelData)); Plugin.Log.LogInfo((object)("Applied supplied Sukuna rig to " + ((Object)prefab).name + ": " + $"{modelData.BoneNames.Length} bones, " + $"{array3.Length} skinned renderers, " + $"{modelData.Meshes.Length} mesh parts, " + (flag ? "native Mixamo animation" : "retarget animation") + "."), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return true; } catch (Exception arg) { if (Object.op_Implicit((Object)(object)val)) { Object.DestroyImmediate((Object)(object)val); } Plugin.Log.LogError((object)$"Could not build imported Sukuna model: {arg}", "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return false; } } private static ModelData LoadModel() { //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_018d: 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_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02cb: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0352: Unknown result type (might be due to invalid IL or missing references) //IL_035d: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_0361: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_0375: Unknown result type (might be due to invalid IL or missing references) //IL_0383: Unknown result type (might be due to invalid IL or missing references) //IL_0385: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_0395: Unknown result type (might be due to invalid IL or missing references) //IL_03a3: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) if (cachedModel != null) { return cachedModel; } string text = JujutsuAssetPaths.Find(new string[2] { "assets", "sukuna.model" }); if (!File.Exists(text)) { Plugin.Log.LogWarning((object)("Sukuna model data was not found: " + text), "C:\\Users\\user\\Documents\\risk of rain 2\\src\\Sukuna\\Visuals\\SukunaImportedModel.cs"); return null; } using FileStream fileStream = File.OpenRead(text); using BinaryReader binaryReader = new BinaryReader(fileStream); byte[] array = new byte[8] { 83, 85, 75, 78, 77, 68, 76, 49 }; byte[] array2 = binaryReader.ReadBytes(array.Length); if (array2.Length != array.Length) { throw new InvalidDataException("Sukuna model header is incomplete."); } for (int i = 0; i < array.Length; i++) { if (array2[i] != array[i]) { throw new InvalidDataException("Sukuna model header is invalid."); } } int num = binaryReader.ReadInt32(); if (num != 2) { throw new InvalidDataException($"Unsupported Sukuna model version {num}."); } int num2 = ReadSafeCount(binaryReader, 1, 1024, "bone"); ModelData modelData = new ModelData { BoneNames = new string[num2], ParentIndices = new int[num2], BonePositions = (Vector3[])(object)new Vector3[num2], BoneRotations = (Quaternion[])(object)new Quaternion[num2], BoneScales = (Vector3[])(object)new Vector3[num2] }; for (int j = 0; j < num2; j++) { modelData.BoneNames[j] = binaryReader.ReadString(); modelDa