using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LCThirdPerson;
using Microsoft.CodeAnalysis;
using ModelReplacement;
using ModelReplacement.AvatarBodyUpdater;
using ModelReplacement.Monobehaviors;
using ModelReplacement.Monobehaviors.Enemies;
using ModelReplacement.Scripts;
using ModelReplacement.Scripts.Enemies;
using ModelReplacement.Scripts.Player;
using MoreCompany;
using MoreCompany.Cosmetics;
using Steamworks.Data;
using TooManyEmotes;
using TooManyEmotes.Patches;
using Unity.Collections;
using UnityEngine;
using UnityEngine.LowLevel;
using UnityEngine.PlayerLoop;
using UnityEngine.Pool;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Serialization;
using _3rdPerson.Helper;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ModelReplacementAPI")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("https://github.com/BunyaPineTree/LethalCompany_ModelReplacementAPI")]
[assembly: AssemblyProduct("meow.ModelReplacementAPI")]
[assembly: AssemblyCopyright("Copyright © meow 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("6390E70C-AB5E-42ED-BA29-F173942DC3A9")]
[assembly: AssemblyFileVersion("2.4.19")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.4.19.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
[HarmonyPatch(typeof(StartOfRound))]
public class RepairBrokenBodyReplacementsPatch
{
[HarmonyPatch("ReviveDeadPlayers")]
[HarmonyPostfix]
public static void ReviveDeadPlayersPatch(ref StartOfRound __instance)
{
PlayerControllerB[] allPlayerScripts = __instance.allPlayerScripts;
foreach (PlayerControllerB val in allPlayerScripts)
{
if (val.isPlayerDead)
{
ModelReplacementAPI.ResetPlayerModelReplacement(val);
}
}
}
}
namespace JigglePhysics
{
public static class CachedSphereCollider
{
private class DestroyListener : MonoBehaviour
{
private void OnDestroy()
{
_hasSphere = false;
}
}
private static bool _hasSphere;
private static SphereCollider _sphereCollider;
public static void StartPass()
{
if (TryGet(out var collider))
{
((Collider)collider).enabled = true;
}
}
public static void FinishedPass()
{
if (TryGet(out var collider))
{
((Collider)collider).enabled = false;
}
}
public static bool TryGet(out SphereCollider collider)
{
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Expected O, but got Unknown
if (_hasSphere)
{
collider = _sphereCollider;
return true;
}
try
{
GameObject val = new GameObject("JiggleBoneSphereCollider", new Type[2]
{
typeof(SphereCollider),
typeof(DestroyListener)
})
{
hideFlags = (HideFlags)61
};
if (Application.isPlaying)
{
Object.DontDestroyOnLoad((Object)(object)val);
}
_sphereCollider = val.GetComponent<SphereCollider>();
collider = _sphereCollider;
((Collider)collider).enabled = false;
_hasSphere = true;
return true;
}
catch
{
if ((Object)(object)_sphereCollider != (Object)null)
{
if (Application.isPlaying)
{
Object.Destroy((Object)(object)((Component)_sphereCollider).gameObject);
}
else
{
Object.DestroyImmediate((Object)(object)((Component)_sphereCollider).gameObject);
}
}
_hasSphere = false;
collider = null;
throw;
}
}
}
public class JiggleBone
{
private readonly bool hasTransform;
private readonly PositionSignal targetAnimatedBoneSignal;
private Vector3 currentFixedAnimatedBonePosition;
public readonly JiggleBone parent;
private JiggleBone child;
private Quaternion boneRotationChangeCheck;
private Vector3 bonePositionChangeCheck;
private Quaternion lastValidPoseBoneRotation;
private float projectionAmount;
private Vector3 lastValidPoseBoneLocalPosition;
private float normalizedIndex;
public readonly Transform transform;
private readonly PositionSignal particleSignal;
private Vector3 workingPosition;
private Vector3? preTeleportPosition;
private Vector3 extrapolatedPosition;
private float GetLengthToParent()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
if (parent == null)
{
return 0.1f;
}
return Vector3.Distance(currentFixedAnimatedBonePosition, parent.currentFixedAnimatedBonePosition);
}
public JiggleBone(Transform transform, JiggleBone parent, float projectionAmount = 1f)
{
//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_002b: 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_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: 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_0055: 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)
this.transform = transform;
this.parent = parent;
this.projectionAmount = projectionAmount;
Vector3 startPosition;
if ((Object)(object)transform != (Object)null)
{
lastValidPoseBoneRotation = transform.localRotation;
lastValidPoseBoneLocalPosition = transform.localPosition;
startPosition = transform.position;
}
else
{
startPosition = GetProjectedPosition();
}
targetAnimatedBoneSignal = new PositionSignal(startPosition, Time.timeAsDouble);
particleSignal = new PositionSignal(startPosition, Time.timeAsDouble);
hasTransform = (Object)(object)transform != (Object)null;
if (parent != null)
{
this.parent.child = this;
}
}
public void CalculateNormalizedIndex()
{
int num = 0;
JiggleBone jiggleBone = this;
while (jiggleBone.parent != null)
{
jiggleBone = jiggleBone.parent;
num++;
}
int num2 = 0;
jiggleBone = this;
while (jiggleBone.child != null)
{
jiggleBone = jiggleBone.child;
num2++;
}
int num3 = num + num2;
float num4 = (float)num / (float)num3;
normalizedIndex = num4;
}
public void VerletPass(JiggleSettingsData jiggleSettings, Vector3 wind, double time)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: 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)
//IL_005b: 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_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: 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_0092: 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_00ba: 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_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_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_00e2: 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_0028: 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)
currentFixedAnimatedBonePosition = targetAnimatedBoneSignal.SamplePosition(time);
if (parent == null)
{
workingPosition = currentFixedAnimatedBonePosition;
particleSignal.SetPosition(workingPosition, time);
}
else
{
Vector3 localSpaceVelocity = particleSignal.GetCurrent() - particleSignal.GetPrevious() - (parent.particleSignal.GetCurrent() - parent.particleSignal.GetPrevious());
workingPosition = NextPhysicsPosition(particleSignal.GetCurrent(), particleSignal.GetPrevious(), localSpaceVelocity, Time.fixedDeltaTime, jiggleSettings.gravityMultiplier, jiggleSettings.friction, jiggleSettings.airDrag);
workingPosition += wind * (Time.fixedDeltaTime * jiggleSettings.airDrag);
}
}
public void CollisionPreparePass(JiggleSettingsData jiggleSettings)
{
//IL_0004: 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)
workingPosition = ConstrainLengthBackwards(workingPosition, jiggleSettings.lengthElasticity * jiggleSettings.lengthElasticity * 0.5f);
}
public void ConstraintPass(JiggleSettingsData jiggleSettings)
{
//IL_0014: 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_0039: 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_0050: Unknown result type (might be due to invalid IL or missing references)
if (parent != null)
{
workingPosition = ConstrainAngle(workingPosition, jiggleSettings.angleElasticity * jiggleSettings.angleElasticity, jiggleSettings.elasticitySoften);
workingPosition = ConstrainLength(workingPosition, jiggleSettings.lengthElasticity * jiggleSettings.lengthElasticity);
}
}
public void CollisionPass(JiggleSettingsBase jiggleSettings, List<Collider> colliders)
{
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: 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_00a8: 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_00b6: Unknown result type (might be due to invalid IL or missing references)
if (colliders.Count == 0 || !CachedSphereCollider.TryGet(out var collider))
{
return;
}
Vector3 val = default(Vector3);
float num = default(float);
foreach (Collider collider2 in colliders)
{
collider.radius = jiggleSettings.GetRadius(normalizedIndex);
if (!(collider.radius <= 0f) && Physics.ComputePenetration((Collider)(object)collider, workingPosition, Quaternion.identity, collider2, ((Component)collider2).transform.position, ((Component)collider2).transform.rotation, ref val, ref num))
{
workingPosition += val * num;
}
}
}
public void SignalWritePosition(double time)
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
particleSignal.SetPosition(workingPosition, time);
}
private Vector3 GetProjectedPosition()
{
//IL_000c: 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)
//IL_0028: 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_0034: 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_0041: Unknown result type (might be due to invalid IL or missing references)
Vector3 position = parent.transform.position;
return parent.transform.TransformPoint(parent.GetParentTransform().InverseTransformPoint(position) * projectionAmount);
}
private Vector3 GetTransformPosition()
{
//IL_001f: 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_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
if (!hasTransform)
{
return GetProjectedPosition();
}
return transform.position;
}
private Transform GetParentTransform()
{
if (parent != null)
{
return parent.transform;
}
return transform.parent;
}
private void CacheAnimationPosition()
{
//IL_0034: 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_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
if (!hasTransform)
{
targetAnimatedBoneSignal.SetPosition(GetProjectedPosition(), Time.timeAsDouble);
return;
}
targetAnimatedBoneSignal.SetPosition(transform.position, Time.timeAsDouble);
lastValidPoseBoneRotation = transform.localRotation;
lastValidPoseBoneLocalPosition = transform.localPosition;
}
private Vector3 ConstrainLengthBackwards(Vector3 newPosition, float elasticity)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: 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_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: 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_000f: 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_0058: Unknown result type (might be due to invalid IL or missing references)
if (child == null)
{
return newPosition;
}
Vector3 val = newPosition - child.workingPosition;
Vector3 normalized = ((Vector3)(ref val)).normalized;
return Vector3.Lerp(newPosition, child.workingPosition + normalized * child.GetLengthToParent(), elasticity);
}
private Vector3 ConstrainLength(Vector3 newPosition, float elasticity)
{
//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_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_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_001b: 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_0027: 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)
//IL_0033: 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_0041: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = newPosition - parent.workingPosition;
Vector3 normalized = ((Vector3)(ref val)).normalized;
return Vector3.Lerp(newPosition, parent.workingPosition + normalized * GetLengthToParent(), elasticity);
}
public void MatchAnimationInstantly()
{
//IL_0008: 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_0015: 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)
double timeAsDouble = Time.timeAsDouble;
Vector3 transformPosition = GetTransformPosition();
targetAnimatedBoneSignal.FlattenSignal(timeAsDouble, transformPosition);
particleSignal.FlattenSignal(timeAsDouble, transformPosition);
}
public void PrepareTeleport()
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
preTeleportPosition = GetTransformPosition();
}
public void FinishTeleport()
{
//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_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: 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_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: 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_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: 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)
if (!preTeleportPosition.HasValue)
{
MatchAnimationInstantly();
return;
}
Vector3 transformPosition = GetTransformPosition();
Vector3 val = transformPosition - preTeleportPosition.Value;
targetAnimatedBoneSignal.FlattenSignal(Time.timeAsDouble, transformPosition);
particleSignal.OffsetSignal(val);
workingPosition += val;
}
private Vector3 ConstrainAngleBackward(Vector3 newPosition, float elasticity, float elasticitySoften)
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: 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_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_006a: 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_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: 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_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: 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)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: 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_00a1: 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_00b8: 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_00ef: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//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_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_010f: Unknown result type (might be due to invalid IL or missing references)
if (child == null || child.child == null)
{
return newPosition;
}
Vector3 val = child.child.currentFixedAnimatedBonePosition - child.currentFixedAnimatedBonePosition;
Vector3 val2 = child.child.workingPosition - child.workingPosition;
Quaternion val3 = Quaternion.FromToRotation(val, val2);
Vector3 val4 = newPosition - child.workingPosition;
Vector3 val5 = val3 * val4;
Debug.DrawLine(newPosition, child.workingPosition + val5, Color.cyan);
float num = Vector3.Distance(newPosition, child.workingPosition + val5);
num /= child.GetLengthToParent();
num = Mathf.Clamp01(num);
num = Mathf.Pow(num, elasticitySoften * 2f);
return Vector3.Lerp(newPosition, child.workingPosition + val5, elasticity * num);
}
private Vector3 ConstrainAngle(Vector3 newPosition, float elasticity, float elasticitySoften)
{
//IL_0020: 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_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: 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_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: 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_0064: 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_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: 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_0099: 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_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_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: 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_00b2: 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_00b8: 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_00c1: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_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_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: 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_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: 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_0119: Unknown result type (might be due to invalid IL or missing references)
if (!hasTransform && projectionAmount == 0f)
{
return newPosition;
}
Vector3 val;
Vector3 val2;
if (parent.parent == null)
{
val = parent.currentFixedAnimatedBonePosition + (parent.currentFixedAnimatedBonePosition - currentFixedAnimatedBonePosition);
val2 = val;
}
else
{
val2 = parent.parent.workingPosition;
val = parent.parent.currentFixedAnimatedBonePosition;
}
Vector3 val3 = parent.currentFixedAnimatedBonePosition - val;
Vector3 val4 = parent.workingPosition - val2;
Quaternion val5 = Quaternion.FromToRotation(val3, val4);
Vector3 val6 = currentFixedAnimatedBonePosition - val;
Vector3 val7 = val5 * val6;
float num = Vector3.Distance(newPosition, val2 + val7);
num /= GetLengthToParent();
num = Mathf.Clamp01(num);
num = Mathf.Pow(num, elasticitySoften * 2f);
return Vector3.Lerp(newPosition, val2 + val7, elasticity * num);
}
public static Vector3 NextPhysicsPosition(Vector3 newPosition, Vector3 previousPosition, Vector3 localSpaceVelocity, float deltaTime, float gravityMultiplier, float friction, float airFriction)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: 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_0012: 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_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_0027: 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_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: 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)
float num = deltaTime * deltaTime;
Vector3 val = newPosition - previousPosition - localSpaceVelocity;
return newPosition + val * (1f - airFriction) + localSpaceVelocity * (1f - friction) + Physics.gravity * (gravityMultiplier * num);
}
public void DebugDraw(Color simulateColor, Color targetColor, bool interpolated)
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: 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_0022: 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_0058: 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_0068: Unknown result type (might be due to invalid IL or missing references)
if (parent != null)
{
if (interpolated)
{
Debug.DrawLine(extrapolatedPosition, parent.extrapolatedPosition, simulateColor, 0f, false);
}
else
{
Debug.DrawLine(workingPosition, parent.workingPosition, simulateColor, 0f, false);
}
Debug.DrawLine(currentFixedAnimatedBonePosition, parent.currentFixedAnimatedBonePosition, targetColor, 0f, false);
}
}
public Vector3 DeriveFinalSolvePosition(Vector3 offset)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_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)
extrapolatedPosition = offset + particleSignal.SamplePosition(Time.timeAsDouble);
return extrapolatedPosition;
}
public Vector3 GetCachedSolvePosition()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return extrapolatedPosition;
}
public void PrepareBone()
{
//IL_000d: 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_003b: 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)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
if (hasTransform)
{
if (boneRotationChangeCheck == transform.localRotation)
{
transform.localRotation = lastValidPoseBoneRotation;
}
if (bonePositionChangeCheck == transform.localPosition)
{
transform.localPosition = lastValidPoseBoneLocalPosition;
}
}
CacheAnimationPosition();
}
public void OnDrawGizmos(JiggleSettingsBase jiggleSettings)
{
//IL_0036: 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)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: 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)
if ((Object)(object)transform != (Object)null && child != null && (Object)(object)child.transform != (Object)null)
{
Gizmos.DrawLine(transform.position, child.transform.position);
}
if ((Object)(object)transform != (Object)null && child != null && (Object)(object)child.transform == (Object)null)
{
Gizmos.DrawLine(transform.position, child.GetProjectedPosition());
}
if ((Object)(object)transform != (Object)null && (Object)(object)jiggleSettings != (Object)null)
{
Gizmos.DrawWireSphere(transform.position, jiggleSettings.GetRadius(normalizedIndex));
}
if ((Object)(object)transform == (Object)null && (Object)(object)jiggleSettings != (Object)null)
{
Gizmos.DrawWireSphere(GetProjectedPosition(), jiggleSettings.GetRadius(normalizedIndex));
}
}
public void PoseBone(float blend)
{
//IL_001d: 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_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)
//IL_003f: 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_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_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: 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_007a: 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_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_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_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: 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_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: 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)
//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_006c: Unknown result type (might be due to invalid IL or missing references)
if (child != null)
{
Vector3 val = Vector3.Lerp(targetAnimatedBoneSignal.SamplePosition(Time.timeAsDouble), extrapolatedPosition, blend);
Vector3 val2 = Vector3.Lerp(child.targetAnimatedBoneSignal.SamplePosition(Time.timeAsDouble), child.extrapolatedPosition, blend);
if (parent != null)
{
transform.position = val;
}
Vector3 transformPosition = child.GetTransformPosition();
Vector3 val3 = transformPosition - transform.position;
Vector3 val4 = val2 - val;
Quaternion val5 = Quaternion.FromToRotation(val3, val4);
transform.rotation = val5 * transform.rotation;
}
if (hasTransform)
{
boneRotationChangeCheck = transform.localRotation;
bonePositionChangeCheck = transform.localPosition;
}
}
}
[DefaultExecutionOrder(200)]
public class JiggleRigBuilder : MonoBehaviour
{
[SerializeField]
[Tooltip("The root bone from which an individual JiggleRig will be constructed. The JiggleRig encompasses all children of the specified root.")]
[FormerlySerializedAs("target")]
private Transform rootTransform;
[Tooltip("The settings that the rig should update with, create them using the Create->JigglePhysics->Settings menu option.")]
public JiggleSettingsBase jiggleSettings;
[SerializeField]
[Tooltip("The list of transforms to ignore during the jiggle. Each bone listed will also ignore all the children of the specified bone.")]
private List<Transform> ignoredTransforms;
public List<Collider> colliders;
[Tooltip("An air force that is applied to the entire rig, this is useful to plug in some wind volumes from external sources.")]
public Vector3 wind;
[Tooltip("Level of detail manager. This system will control how the jiggle rig saves performance cost.")]
public JiggleRigLOD levelOfDetail;
[Tooltip("Draws some simple lines to show what the simulation is doing. Generally this should be disabled.")]
[SerializeField]
private bool debugDraw;
private JiggleSettingsData data;
private bool initialized;
[HideInInspector]
protected List<JiggleBone> simulatedPoints;
private double accumulation;
private bool dirtyFromEnable = false;
private bool wasLODActive = true;
public static float maxCatchupTime => Time.fixedDeltaTime * 4f;
private bool NeedsCollisions => colliders.Count != 0;
public Transform GetRootTransform()
{
return rootTransform;
}
public void PrepareBone(Vector3 position, JiggleRigLOD jiggleRigLOD)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
if (!initialized)
{
throw new UnityException("JiggleRig was never initialized. Please call JiggleRig.Initialize() if you're going to manually timestep.");
}
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.PrepareBone();
}
data = jiggleSettings.GetData();
data = (((Object)(object)jiggleRigLOD != (Object)null) ? jiggleRigLOD.AdjustJiggleSettingsData(position, data) : data);
}
public void MatchAnimationInstantly()
{
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.MatchAnimationInstantly();
}
}
public void UpdateJiggle(Vector3 wind, double time)
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.VerletPass(data, wind, time);
}
if (NeedsCollisions)
{
for (int num = simulatedPoints.Count - 1; num >= 0; num--)
{
simulatedPoints[num].CollisionPreparePass(data);
}
}
foreach (JiggleBone simulatedPoint2 in simulatedPoints)
{
simulatedPoint2.ConstraintPass(data);
}
if (NeedsCollisions)
{
foreach (JiggleBone simulatedPoint3 in simulatedPoints)
{
simulatedPoint3.CollisionPass(jiggleSettings, colliders);
}
}
foreach (JiggleBone simulatedPoint4 in simulatedPoints)
{
simulatedPoint4.SignalWritePosition(time);
}
}
public void DeriveFinalSolve()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: 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)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = simulatedPoints[0].DeriveFinalSolvePosition(Vector3.zero);
Vector3 offset = simulatedPoints[0].transform.position - val;
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.DeriveFinalSolvePosition(offset);
}
}
public void Pose(bool debugDraw)
{
//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)
DeriveFinalSolve();
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.PoseBone(data.blend);
if (debugDraw)
{
simulatedPoint.DebugDraw(Color.red, Color.blue, interpolated: true);
}
}
}
public void PrepareTeleport()
{
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.PrepareTeleport();
}
}
public void FinishTeleport()
{
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.FinishTeleport();
}
}
protected virtual void CreateSimulatedPoints(ICollection<JiggleBone> outputPoints, ICollection<Transform> ignoredTransforms, Transform currentTransform, JiggleBone parentJiggleBone)
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
JiggleBone jiggleBone = new JiggleBone(currentTransform, parentJiggleBone);
outputPoints.Add(jiggleBone);
if (currentTransform.childCount == 0)
{
if (jiggleBone.parent == null)
{
if ((Object)(object)jiggleBone.transform.parent == (Object)null)
{
throw new UnityException("Can't have a singular jiggle bone with no parents. That doesn't even make sense!");
}
outputPoints.Add(new JiggleBone(null, jiggleBone));
}
else
{
outputPoints.Add(new JiggleBone(null, jiggleBone));
}
return;
}
for (int i = 0; i < currentTransform.childCount; i++)
{
if (!ignoredTransforms.Contains(currentTransform.GetChild(i)))
{
CreateSimulatedPoints(outputPoints, ignoredTransforms, currentTransform.GetChild(i), jiggleBone);
}
}
}
private void Awake()
{
Initialize();
}
private void OnEnable()
{
JiggleRigHandler.AddBuilder(this);
dirtyFromEnable = true;
}
private void OnDisable()
{
JiggleRigHandler.RemoveBuilder(this);
PrepareTeleport();
}
public void Initialize()
{
accumulation = 0.0;
simulatedPoints = new List<JiggleBone>();
if ((Object)(object)rootTransform == (Object)null)
{
return;
}
CreateSimulatedPoints(simulatedPoints, ignoredTransforms, rootTransform, null);
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.CalculateNormalizedIndex();
}
initialized = true;
}
public virtual void Advance(float deltaTime)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)levelOfDetail != (Object)null && !levelOfDetail.CheckActive(((Component)this).transform.position))
{
if (wasLODActive)
{
PrepareTeleport();
}
wasLODActive = false;
return;
}
if (!wasLODActive)
{
FinishTeleport();
}
PrepareBone(((Component)this).transform.position, levelOfDetail);
if (dirtyFromEnable)
{
FinishTeleport();
dirtyFromEnable = false;
}
accumulation = Math.Min(accumulation + (double)deltaTime, maxCatchupTime);
while (accumulation > (double)Time.fixedDeltaTime)
{
accumulation -= Time.fixedDeltaTime;
double time = Time.timeAsDouble - accumulation;
UpdateJiggle(wind, time);
}
Pose(debugDraw);
wasLODActive = true;
}
private void OnDrawGizmos()
{
if (!initialized || simulatedPoints == null)
{
Initialize();
}
foreach (JiggleBone simulatedPoint in simulatedPoints)
{
simulatedPoint.OnDrawGizmos(jiggleSettings);
}
}
private void OnValidate()
{
if ((Object)(object)rootTransform == (Object)null)
{
rootTransform = ((Component)this).transform;
}
if (!Application.isPlaying)
{
Initialize();
}
}
}
public static class JiggleRigHandler
{
[CompilerGenerated]
private static class <>O
{
public static UpdateFunction <0>__UpdateJiggleRigs;
}
private static bool initialized = false;
private static HashSet<JiggleRigBuilder> builders = new HashSet<JiggleRigBuilder>();
private static void Initialize()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: 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_0056: 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)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
if (!initialized)
{
PlayerLoopSystem currentPlayerLoop = PlayerLoop.GetCurrentPlayerLoop();
PlayerLoopSystem self = currentPlayerLoop;
PlayerLoopSystem systemToInject = default(PlayerLoopSystem);
object obj = <>O.<0>__UpdateJiggleRigs;
if (obj == null)
{
UpdateFunction val = UpdateJiggleRigs;
<>O.<0>__UpdateJiggleRigs = val;
obj = (object)val;
}
systemToInject.updateDelegate = (UpdateFunction)obj;
systemToInject.type = typeof(JiggleRigHandler);
currentPlayerLoop = self.InjectAt<PostLateUpdate>(systemToInject);
PlayerLoop.SetPlayerLoop(currentPlayerLoop);
initialized = true;
}
}
private static void UpdateJiggleRigs()
{
CachedSphereCollider.StartPass();
foreach (JiggleRigBuilder builder in builders)
{
builder.Advance(Time.deltaTime);
}
CachedSphereCollider.FinishedPass();
}
public static void AddBuilder(JiggleRigBuilder builder)
{
builders.Add(builder);
Initialize();
}
public static void RemoveBuilder(JiggleRigBuilder builder)
{
builders.Remove(builder);
}
private static PlayerLoopSystem InjectAt<T>(this PlayerLoopSystem self, PlayerLoopSystem systemToInject)
{
//IL_0001: 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_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: 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_0091: 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_0110: 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_00f4: 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_010c: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Expected O, but got Unknown
int num = FindIndexOfSubsystem<T>(self.subSystemList);
if (num == -1)
{
throw new UnityException($"Failed to find PlayerLoopSystem with type{typeof(T)}");
}
List<PlayerLoopSystem> list = new List<PlayerLoopSystem>(self.subSystemList[num].subSystemList);
foreach (PlayerLoopSystem item2 in list)
{
if (item2.type != typeof(JiggleRigBuilder))
{
continue;
}
Debug.LogWarning((object)$"Tried to inject a PlayerLoopSystem ({systemToInject.type}) more than once! Ignoring the second injection.");
return self;
}
PlayerLoopSystem item = default(PlayerLoopSystem);
object obj = <>O.<0>__UpdateJiggleRigs;
if (obj == null)
{
UpdateFunction val = UpdateJiggleRigs;
<>O.<0>__UpdateJiggleRigs = val;
obj = (object)val;
}
item.updateDelegate = (UpdateFunction)obj;
item.type = typeof(JiggleRigHandler);
list.Insert(0, item);
self.subSystemList[num].subSystemList = list.ToArray();
return self;
}
private static int FindIndexOfSubsystem<T>(PlayerLoopSystem[] list, int index = -1)
{
if (list == null)
{
return -1;
}
for (int i = 0; i < list.Length; i++)
{
if (list[i].type == typeof(T))
{
return i;
}
}
return -1;
}
}
public abstract class JiggleRigLOD : ScriptableObject
{
public abstract bool CheckActive(Vector3 position);
public abstract JiggleSettingsData AdjustJiggleSettingsData(Vector3 position, JiggleSettingsData data);
}
[CreateAssetMenu(fileName = "JiggleRigSimpleLOD", menuName = "JigglePhysics/JiggleRigSimpleLOD", order = 1)]
public class JiggleRigSimpleLOD : JiggleRigLOD
{
[Tooltip("Distance to disable the jiggle rig")]
[SerializeField]
private float distance;
[Tooltip("Level of detail manager. This system will control how the jiggle rig saves performance cost.")]
[SerializeField]
private float blend;
[NonSerialized]
private Camera currentCamera;
[NonSerialized]
private Transform cameraTransform;
private bool TryGetCamera(out Camera camera)
{
if ((Object)(object)currentCamera == (Object)null || !((Component)currentCamera).CompareTag("MainCamera"))
{
currentCamera = Camera.main;
}
camera = currentCamera;
return (Object)(object)currentCamera != (Object)null;
}
public override bool CheckActive(Vector3 position)
{
//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)
if (!TryGetCamera(out var camera))
{
return false;
}
return Vector3.Distance(((Component)camera).transform.position, position) < distance;
}
public override JiggleSettingsData AdjustJiggleSettingsData(Vector3 position, JiggleSettingsData data)
{
//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)
if (!TryGetCamera(out var camera))
{
return data;
}
float num = (Vector3.Distance(((Component)camera).transform.position, position) - distance + blend) / blend;
num = Mathf.Clamp01(1f - num);
data.blend = num;
return data;
}
}
public struct JiggleSettingsData
{
public float gravityMultiplier;
public float friction;
public float angleElasticity;
public float blend;
public float airDrag;
public float lengthElasticity;
public float elasticitySoften;
public float radiusMultiplier;
public static JiggleSettingsData Lerp(JiggleSettingsData a, JiggleSettingsData b, float t)
{
JiggleSettingsData result = default(JiggleSettingsData);
result.gravityMultiplier = Mathf.Lerp(a.gravityMultiplier, b.gravityMultiplier, t);
result.friction = Mathf.Lerp(a.friction, b.friction, t);
result.angleElasticity = Mathf.Lerp(a.angleElasticity, b.angleElasticity, t);
result.blend = Mathf.Lerp(a.blend, b.blend, t);
result.airDrag = Mathf.Lerp(a.airDrag, b.airDrag, t);
result.lengthElasticity = Mathf.Lerp(a.lengthElasticity, b.lengthElasticity, t);
result.elasticitySoften = Mathf.Lerp(a.elasticitySoften, b.elasticitySoften, t);
result.radiusMultiplier = Mathf.Lerp(a.radiusMultiplier, b.radiusMultiplier, t);
return result;
}
}
[CreateAssetMenu(fileName = "JiggleSettings", menuName = "JigglePhysics/Settings", order = 1)]
public class JiggleSettings : JiggleSettingsBase
{
[SerializeField]
[Range(0f, 2f)]
[Tooltip("How much gravity to apply to the simulation, it is a multiplier of the Physics.gravity setting.")]
private float gravityMultiplier = 1f;
[SerializeField]
[Range(0f, 1f)]
[Tooltip("How much mechanical friction to apply, this is specifically how quickly oscillations come to rest.")]
private float friction = 0.4f;
[SerializeField]
[Range(0f, 1f)]
[Tooltip("How much angular force is applied to bring it to the target shape.")]
private float angleElasticity = 0.4f;
[SerializeField]
[Range(0f, 1f)]
[Tooltip("How much of the simulation should be expressed. A value of 0 would make the jiggle have zero effect. A value of 1 gives the full movement as intended. 0.5 would ")]
private float blend = 1f;
[FormerlySerializedAs("airFriction")]
[HideInInspector]
[SerializeField]
[Range(0f, 1f)]
[Tooltip("How much jiggled objects should get dragged behind by moving through the air. Or how \"thick\" the air is.")]
private float airDrag = 0.1f;
[HideInInspector]
[SerializeField]
[Range(0f, 1f)]
[Tooltip("How rigidly the rig holds its length. Low values cause lots of squash and stretch!")]
private float lengthElasticity = 0.8f;
[HideInInspector]
[SerializeField]
[Range(0f, 1f)]
[Tooltip("How much to allow free bone motion before engaging elasticity.")]
private float elasticitySoften = 0f;
[HideInInspector]
[SerializeField]
[Tooltip("How much radius points have, only used for collisions. Set to 0 to disable collisions")]
private float radiusMultiplier = 0f;
[HideInInspector]
[SerializeField]
[Tooltip("How the radius is expressed as a curve along the bone chain from root to child.")]
private AnimationCurve radiusCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[2]
{
new Keyframe(0f, 1f),
new Keyframe(1f, 0f)
});
public override JiggleSettingsData GetData()
{
JiggleSettingsData result = default(JiggleSettingsData);
result.gravityMultiplier = gravityMultiplier;
result.friction = friction;
result.airDrag = airDrag;
result.blend = blend;
result.angleElasticity = angleElasticity;
result.elasticitySoften = elasticitySoften;
result.lengthElasticity = lengthElasticity;
result.radiusMultiplier = radiusMultiplier;
return result;
}
public void SetData(JiggleSettingsData data)
{
gravityMultiplier = data.gravityMultiplier;
friction = data.friction;
angleElasticity = data.angleElasticity;
blend = data.blend;
airDrag = data.airDrag;
lengthElasticity = data.lengthElasticity;
elasticitySoften = data.elasticitySoften;
radiusMultiplier = data.radiusMultiplier;
}
public override float GetRadius(float normalizedIndex)
{
return radiusMultiplier * radiusCurve.Evaluate(normalizedIndex);
}
public void SetRadiusCurve(AnimationCurve curve)
{
radiusCurve = curve;
}
}
public class JiggleSettingsBase : ScriptableObject
{
public virtual JiggleSettingsData GetData()
{
return default(JiggleSettingsData);
}
public virtual float GetRadius(float normalizedIndex)
{
return 0f;
}
}
[CreateAssetMenu(fileName = "JiggleSettingsBlend", menuName = "JigglePhysics/Blend Settings", order = 1)]
public class JiggleSettingsBlend : JiggleSettingsBase
{
[Tooltip("The list of jiggle settings to blend between.")]
public List<JiggleSettings> blendSettings;
[Range(0f, 1f)]
[Tooltip("A value from 0 to 1 that linearly blends between all of the blendSettings.")]
public float normalizedBlend;
public override JiggleSettingsData GetData()
{
int num = blendSettings.Count - 1;
float num2 = Mathf.Clamp01(normalizedBlend);
int num3 = Mathf.Clamp(Mathf.FloorToInt(num2 * (float)num), 0, num);
int index = Mathf.Clamp(Mathf.FloorToInt(num2 * (float)num) + 1, 0, num);
return JiggleSettingsData.Lerp(blendSettings[num3].GetData(), blendSettings[index].GetData(), Mathf.Clamp01(num2 * (float)num - (float)num3));
}
public override float GetRadius(float normalizedIndex)
{
float num = Mathf.Clamp01(normalizedBlend);
int num2 = Mathf.FloorToInt(num * (float)blendSettings.Count);
int num3 = Mathf.FloorToInt(num * (float)blendSettings.Count) + 1;
return Mathf.Lerp(blendSettings[Mathf.Clamp(num2, 0, blendSettings.Count - 1)].GetRadius(normalizedIndex), blendSettings[Mathf.Clamp(num3, 0, blendSettings.Count - 1)].GetRadius(normalizedIndex), Mathf.Clamp01(num * (float)blendSettings.Count - (float)num2));
}
}
public class PositionSignal
{
private struct Frame
{
public Vector3 position;
public double time;
}
private Frame previousFrame;
private Frame currentFrame;
public PositionSignal(Vector3 startPosition, double time)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
currentFrame = (previousFrame = new Frame
{
position = startPosition,
time = time
});
}
public void SetPosition(Vector3 position, double time)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
previousFrame = currentFrame;
currentFrame = new Frame
{
position = position,
time = time
};
}
public void OffsetSignal(Vector3 offset)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_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_004b: 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_0051: 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)
previousFrame = new Frame
{
position = previousFrame.position + offset,
time = previousFrame.time
};
currentFrame = new Frame
{
position = currentFrame.position + offset,
time = previousFrame.time
};
}
public void FlattenSignal(double time, Vector3 position)
{
//IL_000c: 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_0038: 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)
previousFrame = new Frame
{
position = position,
time = time - (double)(JiggleRigBuilder.maxCatchupTime * 2f)
};
currentFrame = new Frame
{
position = position,
time = time - (double)JiggleRigBuilder.maxCatchupTime
};
}
public Vector3 GetCurrent()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return currentFrame.position;
}
public Vector3 GetPrevious()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return previousFrame.position;
}
public Vector3 SamplePosition(double time)
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
double num = currentFrame.time - previousFrame.time;
if (num == 0.0)
{
return previousFrame.position;
}
double num2 = (time - previousFrame.time) / num;
return Vector3.Lerp(previousFrame.position, currentFrame.position, (float)num2);
}
}
}
namespace ModelReplacement
{
public static class PluginInfo
{
public const string GUID = "meow.ModelReplacementAPI";
public const string NAME = "ModelReplacementAPI";
public const string VERSION = "2.4.19";
public const string WEBSITE = "https://github.com/BunyaPineTree/LethalCompany_ModelReplacementAPI";
}
[BepInPlugin("meow.ModelReplacementAPI", "ModelReplacementAPI", "2.4.19")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class ModelReplacementAPI : BaseUnityPlugin
{
[HarmonyPatch(typeof(PlayerControllerB))]
public class PlayerControllerBPatch
{
[HarmonyPatch("Update")]
[HarmonyPatch("OnDisable")]
[HarmonyPostfix]
public static void ManageRegistryBodyReplacements(ref PlayerControllerB __instance)
{
try
{
ManageBodyReplacements(__instance);
}
catch (Exception arg)
{
Instance.Logger.LogError((object)$"Exception in ManageRegistryBodyReplacements: {arg}");
}
}
private static void ManageBodyReplacements(PlayerControllerB player)
{
if ((Object)(object)StartOfRound.Instance.allPlayerScripts[player.playerClientId] != (Object)(object)player)
{
return;
}
BodyReplacementBase component = ((Component)player.thisPlayerBody).gameObject.GetComponent<BodyReplacementBase>();
if ((Object)(object)component != (Object)null && RegisteredModelReplacementExceptions.Contains(((object)component).GetType()))
{
return;
}
if (RegisteredModelReplacementOverride != null)
{
SetPlayerModelReplacement(player, RegisteredModelReplacementOverride);
return;
}
int num = player.currentSuitID;
List<UnlockableItem> unlockables = StartOfRound.Instance.unlockablesList.unlockables;
if (num > unlockables.Count)
{
throw new Exception($"Suit ID {num} is out of range of the suit list, which has {unlockables.Count} elements.");
}
if (num >= unlockables.Count)
{
num = 0;
}
string key = unlockables[num].unlockableName.ToLower().Replace(" ", "");
if (RegisteredModelReplacements.ContainsKey(key))
{
SetPlayerModelReplacement(player, RegisteredModelReplacements[key]);
}
else if (RegisteredModelReplacementDefault != null)
{
SetPlayerModelReplacement(player, RegisteredModelReplacementDefault);
}
else
{
RemovePlayerModelReplacement(player);
}
}
}
public static ConfigFile config;
public static bool moreCompanyPresent;
public static bool thirdPersonPresent;
public static bool LCthirdPersonPresent;
public static bool mirrorDecorPresent;
public static bool tooManyEmotesPresent;
public static bool recordingCameraPresent;
public static bool MRAPI_NetworkingPresent;
public static ModelReplacementAPI Instance = null;
public ManualLogSource Logger;
private static List<Type> RegisteredModelReplacementExceptions = new List<Type>();
private static Dictionary<string, Type> RegisteredModelReplacements = new Dictionary<string, Type>();
private static Type RegisteredModelReplacementOverride = null;
private static Type RegisteredModelReplacementDefault = null;
private static HashSet<ulong> blackListedSteamIDs = new HashSet<ulong>();
public static ConfigEntry<bool> EnforceViewModelGeneration { get; private set; }
private static int steamLobbyID
{
get
{
//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_002c: Unknown result type (might be due to invalid IL or missing references)
int result;
if (!GameNetworkManager.Instance.currentLobby.HasValue)
{
result = -1;
}
else
{
Lobby value = GameNetworkManager.Instance.currentLobby.Value;
result = (int)((Lobby)(ref value)).Id.Value;
}
return result;
}
}
public static bool IsLan => steamLobbyID == -1;
private static void InitConfig()
{
EnforceViewModelGeneration = config.Bind<bool>("Debug Settings", "Generate Viewmodels by default", true, "Enable to generate a viewmodel for all model replacements, regardless of the individual model's settings.");
}
private void Awake()
{
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Expected O, but got Unknown
config = ((BaseUnityPlugin)this).Config;
InitConfig();
Logger = Logger.CreateLogSource("meow.ModelReplacementAPI");
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
moreCompanyPresent = IsPluginPresent("me.swipez.melonloader.morecompany");
thirdPersonPresent = IsPluginPresent("verity.3rdperson");
LCthirdPersonPresent = IsPluginPresent("LCThirdPerson");
mirrorDecorPresent = IsPluginPresent("quackandcheese.mirrordecor");
tooManyEmotesPresent = IsPluginPresent("FlipMods.TooManyEmotes");
recordingCameraPresent = IsPluginPresent("com.graze.gorillatag.placeablecamera");
MRAPI_NetworkingPresent = IsPluginPresent("meow.ModelReplacementAPI.Networking");
Harmony val = new Harmony("meow.ModelReplacementAPI");
val.PatchAll();
Logger.LogInfo((object)"Plugin meow.ModelReplacementAPI is loaded!");
}
private static bool IsPluginPresent(string pluginName)
{
return Chainloader.PluginInfos.ContainsKey(pluginName);
}
public static void RegisterModelReplacementDefault(Type type)
{
RegisterModelReplacement(type, ref RegisteredModelReplacementDefault, "default");
}
public static void RegisterModelReplacementOverride(Type type)
{
RegisterModelReplacement(type, ref RegisteredModelReplacementOverride, "override");
}
public static void RegisterModelReplacementException(Type type)
{
RegisterModelReplacement(type, RegisteredModelReplacementExceptions, "exception");
}
public static void RegisterSuitModelReplacement(string suitNameToReplace, Type type)
{
suitNameToReplace = suitNameToReplace.ToLower().Replace(" ", "");
if (!type.IsSubclassOf(typeof(BodyReplacementBase)))
{
Instance.Logger.LogError((object)$"Cannot register body replacement type {type}, must inherit from BodyReplacementBase");
return;
}
if (RegisteredModelReplacements.ContainsKey(suitNameToReplace))
{
Instance.Logger.LogError((object)$"Cannot register body replacement type {type}, suit name to replace {suitNameToReplace} is already registered.");
return;
}
Instance.Logger.LogInfo((object)$"Registering body replacement type {type} to suit name {suitNameToReplace}.");
RegisteredModelReplacements.Add(suitNameToReplace, type);
}
private static void RegisterModelReplacement(Type type, ref Type registeredType, string logType)
{
if (!type.IsSubclassOf(typeof(BodyReplacementBase)))
{
Instance.Logger.LogError((object)$"Cannot register body replacement {logType} type {type}, must inherit from BodyReplacementBase");
return;
}
if (registeredType != null)
{
Instance.Logger.LogError((object)$"Cannot register body replacement {logType}, already registered to {registeredType}.");
return;
}
Instance.Logger.LogInfo((object)$"Registering body replacement {logType} type {type}.");
registeredType = type;
}
private static void RegisterModelReplacement(Type type, List<Type> registeredList, string logType)
{
if (!type.IsSubclassOf(typeof(BodyReplacementBase)))
{
Instance.Logger.LogError((object)$"Cannot register body replacement {logType} type {type}, must inherit from BodyReplacementBase");
return;
}
Instance.Logger.LogInfo((object)$"Registering body replacement {logType} type {type}.");
if (!registeredList.Contains(type))
{
registeredList.Add(type);
}
}
public static void RegisterPlayerBlackList(ulong steamID, bool blackListed)
{
if (blackListed)
{
blackListedSteamIDs.Add(steamID);
}
else if (blackListedSteamIDs.Contains(steamID))
{
blackListedSteamIDs.Remove(steamID);
}
}
public static void RegisterPlayerBlackList(PlayerControllerB player, bool blackListed)
{
RegisterPlayerBlackList(player.playerSteamId, blackListed);
RemovePlayerModelReplacement(player);
}
public static void ResetPlayerModelReplacement(PlayerControllerB player)
{
BodyReplacementBase component = ((Component)player).gameObject.GetComponent<BodyReplacementBase>();
if (!((Object)(object)component == (Object)null))
{
Instance.Logger.LogInfo((object)("Reinstantiating model replacement for " + player.playerUsername));
Type type = ((object)component).GetType();
component.IsActive = false;
Object.Destroy((Object)(object)component);
((Component)player).gameObject.AddComponent(type);
}
}
public static void SetPlayerModelReplacement(PlayerControllerB player, Type type)
{
if (!type.IsSubclassOf(typeof(BodyReplacementBase)))
{
Instance.Logger.LogError((object)("Cannot set body replacement of type " + type.Name + ", must inherit from BodyReplacementBase"));
}
else
{
if ((!IsLan && player.playerSteamId == 0) || blackListedSteamIDs.Contains(player.playerSteamId))
{
return;
}
BodyReplacementBase bodyReplacementBase = default(BodyReplacementBase);
bool flag = ((Component)player).gameObject.TryGetComponent<BodyReplacementBase>(ref bodyReplacementBase);
int currentSuitID = player.currentSuitID;
string unlockableName = StartOfRound.Instance.unlockablesList.unlockables[currentSuitID].unlockableName;
if (flag)
{
if (((object)bodyReplacementBase).GetType() == type && bodyReplacementBase.suitName == unlockableName)
{
return;
}
Instance.Logger.LogInfo((object)$"Model Replacement Change detected {((object)bodyReplacementBase).GetType()} => {type}, changing model.");
bodyReplacementBase.IsActive = false;
Object.Destroy((Object)(object)bodyReplacementBase);
}
Instance.Logger.LogInfo((object)$"Suit Change detected {bodyReplacementBase?.suitName} => {unlockableName}, Replacing {type}.");
BodyReplacementBase bodyReplacementBase2 = ((Component)player).gameObject.AddComponent(type) as BodyReplacementBase;
bodyReplacementBase2.suitName = unlockableName;
}
}
public static bool GetPlayerModelReplacement(PlayerControllerB player, out BodyReplacementBase modelReplacement)
{
try
{
modelReplacement = ((Component)player).gameObject.GetComponent<BodyReplacementBase>();
return (Object)(object)modelReplacement != (Object)null;
}
catch (Exception arg)
{
Instance.Logger.LogError((object)$"Error in GetPlayerModelReplacement, returning false {arg}");
modelReplacement = null;
return false;
}
}
public static bool GetPlayerModelReplacement(PlayerControllerB player)
{
try
{
return (Object)(object)((Component)player).gameObject.GetComponent<BodyReplacementBase>() != (Object)null;
}
catch (Exception arg)
{
Instance.Logger.LogError((object)$"Error in GetPlayerModelReplacement, returning false {arg}");
return false;
}
}
public static void RemovePlayerModelReplacement(PlayerControllerB player)
{
BodyReplacementBase component = ((Component)player).gameObject.GetComponent<BodyReplacementBase>();
if (Object.op_Implicit((Object)(object)component))
{
component.IsActive = false;
Object.Destroy((Object)(object)component);
}
}
}
public abstract class BodyReplacementBase : MonoBehaviour
{
public class RaycastTarget : MonoBehaviour
{
public PlayerControllerB controller = null;
public BodyReplacementBase bodyReplacement = null;
public GameObject modelObj = null;
private void Update()
{
if ((Object)(object)bodyReplacement == (Object)null && !((Object)(object)modelObj != (Object)null))
{
}
}
}
[CompilerGenerated]
private sealed class <WaitForDanceNumberChange>d__74 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public BodyReplacementBase <>4__this;
private int <frame>5__1;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <WaitForDanceNumberChange>d__74(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
if (<>4__this.emoteOngoing)
{
return false;
}
<>4__this.emoteOngoing = true;
<frame>5__1 = 0;
break;
case 1:
<>1__state = -1;
<frame>5__1++;
break;
}
if (<frame>5__1 < 20)
{
if (<>4__this.danceNumber == 0)
{
<>4__this.emoteOngoing = false;
return false;
}
<>2__current = (object)new WaitForEndOfFrame();
<>1__state = 1;
return true;
}
if (<>4__this.danceNumber != 0)
{
<>4__this.emoteOngoing = false;
<>4__this.OnEmoteStart(<>4__this.danceNumber);
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
public static List<BodyReplacementBase> allBodies;
public ViewStateManager viewState = null;
public MoreCompanyCosmeticManager cosmeticManager = null;
public GameObject replacementModel;
public GameObject replacementViewModel;
public BoxCollider nameTagCollider = null;
public GrabbableObject heldItem = null;
public GameObject deadBody = null;
public GameObject replacementDeadBody = null;
public GameObject replacementModelShadow = null;
private MaterialHelper matHelper = null;
private int danceNumber = 0;
private int previousDanceNumber = 0;
public AvatarUpdater cosmeticAvatar = null;
public bool IsActive = true;
public bool UseNoPostProcessing = false;
public bool DontConvertUnsupportedShaders = false;
public bool GenerateViewModel = false;
public bool RemoveHelmet = false;
public bool DebugRenderPlayer = false;
public bool DebugRenderModel = false;
private bool emoteOngoing = false;
public AvatarUpdater avatar { get; private set; }
public ViewModelUpdater viewModelAvatar { get; private set; }
public PlayerControllerB controller { get; private set; }
public AvatarUpdater ragdollAvatar { get; private set; }
public AvatarUpdater shadowAvatar { get; private set; }
public string suitName { get; set; } = "";
protected abstract GameObject LoadAssetsAndReturnModel();
protected virtual GameObject LoadAssetsAndReturnViewModel()
{
return null;
}
protected virtual GameObject LoadAssetsAndReturnRagdoll(CauseOfDeath causeOfDeath)
{
return null;
}
protected virtual AvatarUpdater GetAvatarUpdater()
{
return new AvatarUpdater();
}
protected virtual ViewModelUpdater GetViewModelUpdater()
{
return new ViewModelUpdater();
}
protected virtual void AddModelScripts()
{
}
protected internal virtual void OnHitEnemy(bool dead)
{
Console.WriteLine("PLAYER HIT ENEMY " + controller.playerUsername);
}
protected internal virtual void OnHitAlly(PlayerControllerB ally, bool dead)
{
Console.WriteLine("PLAYER HIT ALLY " + controller.playerUsername);
}
protected internal virtual void OnDamageTaken(bool dead)
{
Console.WriteLine("PLAYER TAKE DAMAGE " + controller.playerUsername);
}
protected internal virtual void OnDamageTakenByAlly(PlayerControllerB ally, bool dead)
{
Console.WriteLine("PLAYER TAKE DAMAGE BY ALLY " + controller.playerUsername);
}
protected internal virtual void OnDeath()
{
Console.WriteLine("PLAYER DEATH " + controller.playerUsername + " ");
}
protected internal virtual void OnEmoteStart(int emoteId)
{
Console.WriteLine($"PLAYER EMOTE START {controller.playerUsername} ID {emoteId}");
}
protected internal virtual void OnEmoteEnd()
{
Console.WriteLine("PLAYER EMOTE END " + controller.playerUsername);
}
private GameObject LoadModelReplacement()
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Expected O, but got Unknown
//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0204: Unknown result type (might be due to invalid IL or missing references)
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
//IL_0207: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
GameObject val = LoadAssetsAndReturnModel();
if ((Object)(object)val == (Object)null)
{
ModelReplacementAPI.Instance.Logger.LogFatal((object)"LoadAssetsAndReturnModel() returned null. Verify that your assetbundle works and your asset name is correct. ");
}
Animator componentInChildren = val.GetComponentInChildren<Animator>();
OffsetBuilder component = ((Component)componentInChildren).gameObject.GetComponent<OffsetBuilder>();
UseNoPostProcessing = component.UseNoPostProcessing;
GenerateViewModel = component.GenerateViewModel;
RemoveHelmet = component.RemoveHelmet;
Vector3 rootScale = component.rootScale;
Material sharedMaterial = ((Renderer)((Component)controller.thisPlayerModel).GetComponent<SkinnedMeshRenderer>()).sharedMaterial;
sharedMaterial = new Material(sharedMaterial);
Renderer[] componentsInChildren = val.GetComponentsInChildren<Renderer>();
SkinnedMeshRenderer[] componentsInChildren2 = val.GetComponentsInChildren<SkinnedMeshRenderer>();
Dictionary<Material, Material> dictionary = new Dictionary<Material, Material>();
List<Material> list = CollectionPool<List<Material>, Material>.Get();
Renderer[] array = componentsInChildren;
foreach (Renderer val2 in array)
{
val2.renderingLayerMask = 513u;
val2.GetSharedMaterials(list);
for (int j = 0; j < list.Count; j++)
{
Material val3 = list[j];
if (!dictionary.TryGetValue(val3, out var value))
{
value = (dictionary[val3] = matHelper.GetReplacementMaterial(sharedMaterial, val3));
}
list[j] = value;
}
val2.SetMaterials(list);
}
CollectionPool<List<Material>, Material>.Release(list);
SkinnedMeshRenderer[] array2 = componentsInChildren2;
foreach (SkinnedMeshRenderer val4 in array2)
{
val4.updateWhenOffscreen = true;
}
Camera[] componentsInChildren3 = val.GetComponentsInChildren<Camera>();
foreach (Camera val5 in componentsInChildren3)
{
((Behaviour)val5).enabled = false;
}
float num = 1.465f;
Bounds bounds = GetBounds(val);
float num2 = num / ((Bounds)(ref bounds)).extents.y;
Transform transform = val.transform;
transform.localScale *= num2;
Vector3 localScale = val.transform.localScale;
val.transform.localScale = Vector3.Scale(localScale, rootScale);
val = Object.Instantiate<GameObject>(val);
GameObject obj = val;
((Object)obj).name = ((Object)obj).name + "(" + controller.playerUsername + ")";
val.transform.localPosition = new Vector3(0f, 0f, 0f);
val.SetActive(true);
return val;
}
private GameObject LoadViewModelreplacement()
{
//IL_0057: 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_00b0: Expected O, but got Unknown
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
GameObject val = null;
if (GenerateViewModel || ModelReplacementAPI.EnforceViewModelGeneration.Value)
{
val = Object.Instantiate<GameObject>(replacementModel);
GameObject obj = val;
((Object)obj).name = ((Object)obj).name + "(ViewModel)";
val.transform.localPosition = new Vector3(0f, 0f, 0f);
val.SetActive(false);
return MeshHelper.ConvertModelToViewModel(val);
}
val = LoadAssetsAndReturnViewModel();
if ((Object)(object)val == (Object)null)
{
return null;
}
Material sharedMaterial = ((Renderer)((Component)controller.thisPlayerModel).GetComponent<SkinnedMeshRenderer>()).sharedMaterial;
sharedMaterial = new Material(sharedMaterial);
Renderer[] componentsInChildren = val.GetComponentsInChildren<Renderer>();
SkinnedMeshRenderer[] componentsInChildren2 = val.GetComponentsInChildren<SkinnedMeshRenderer>();
Dictionary<Material, Material> dictionary = new Dictionary<Material, Material>();
List<Material> list = CollectionPool<List<Material>, Material>.Get();
Renderer[] array = componentsInChildren;
foreach (Renderer val2 in array)
{
val2.GetSharedMaterials(list);
for (int j = 0; j < list.Count; j++)
{
Material val3 = list[j];
if (!dictionary.TryGetValue(val3, out var value))
{
value = (dictionary[val3] = matHelper.GetReplacementMaterial(sharedMaterial, val3));
}
list[j] = value;
}
val2.SetMaterials(list);
}
CollectionPool<List<Material>, Material>.Release(list);
SkinnedMeshRenderer[] array2 = componentsInChildren2;
foreach (SkinnedMeshRenderer val4 in array2)
{
val4.updateWhenOffscreen = true;
}
Camera[] componentsInChildren3 = val.GetComponentsInChildren<Camera>();
foreach (Camera val5 in componentsInChildren3)
{
((Behaviour)val5).enabled = false;
}
val = Object.Instantiate<GameObject>(val);
GameObject obj2 = val;
((Object)obj2).name = ((Object)obj2).name + "(" + controller.playerUsername + ")(ViewModel)";
val.transform.localPosition = new Vector3(0f, 0f, 0f);
val.SetActive(false);
return val;
}
private GameObject LoadRagdollReplacement(CauseOfDeath causeOfDeath)
{
//IL_0002: 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)
//IL_005b: 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_007c: Expected O, but got Unknown
//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
//IL_020a: Unknown result type (might be due to invalid IL or missing references)
//IL_020c: Unknown result type (might be due to invalid IL or missing references)
//IL_020d: 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)
GameObject val = LoadAssetsAndReturnRagdoll(causeOfDeath);
if ((Object)(object)val == (Object)null)
{
val = Object.Instantiate<GameObject>(replacementModel);
GameObject obj = val;
((Object)obj).name = ((Object)obj).name + "(Ragdoll)";
return val;
}
Animator componentInChildren = val.GetComponentInChildren<Animator>();
OffsetBuilder component = ((Component)componentInChildren).gameObject.GetComponent<OffsetBuilder>();
Vector3 rootScale = component.rootScale;
Material sharedMaterial = ((Renderer)((Component)controller.thisPlayerModel).GetComponent<SkinnedMeshRenderer>()).sharedMaterial;
sharedMaterial = new Material(sharedMaterial);
Renderer[] componentsInChildren = val.GetComponentsInChildren<Renderer>();
SkinnedMeshRenderer[] componentsInChildren2 = val.GetComponentsInChildren<SkinnedMeshRenderer>();
Dictionary<Material, Material> dictionary = new Dictionary<Material, Material>();
List<Material> list = CollectionPool<List<Material>, Material>.Get();
Renderer[] array = componentsInChildren;
foreach (Renderer val2 in array)
{
val2.GetSharedMaterials(list);
for (int j = 0; j < list.Count; j++)
{
Material val3 = list[j];
if (!dictionary.TryGetValue(val3, out var value))
{
value = (dictionary[val3] = matHelper.GetReplacementMaterial(sharedMaterial, val3));
}
list[j] = value;
}
val2.SetMaterials(list);
val2.shadowCastingMode = (ShadowCastingMode)1;
((Component)val2).gameObject.layer = viewState.VisibleLayer;
}
CollectionPool<List<Material>, Material>.Release(list);
SkinnedMeshRenderer[] array2 = componentsInChildren2;
foreach (SkinnedMeshRenderer val4 in array2)
{
val4.updateWhenOffscreen = true;
}
Camera[] componentsInChildren3 = val.GetComponentsInChildren<Camera>();
foreach (Camera val5 in componentsInChildren3)
{
((Behaviour)val5).enabled = false;
}
float num = 1.465f;
Bounds bounds = GetBounds(val);
float num2 = num / ((Bounds)(ref bounds)).extents.y;
Transform transform = val.transform;
transform.localScale *= num2;
Vector3 localScale = val.transform.localScale;
val.transform.localScale = Vector3.Scale(localScale, rootScale);
val = Object.Instantiate<GameObject>(val);
GameObject obj2 = val;
((Object)obj2).name = ((Object)obj2).name + "(" + controller.playerUsername + ")(Ragdoll)";
val.transform.localPosition = new Vector3(0f, 0f, 0f);
val.SetActive(true);
return val;
}
protected virtual void Awake()
{
//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Expected O, but got Unknown
controller = ((Component)this).GetComponent<PlayerControllerB>();
ModelReplacementAPI.Instance.Logger.LogInfo((object)$"Awake {controller.playerUsername} {this}");
viewState = ((Component)this).GetComponent<ViewStateManager>();
cosmeticManager = ((Component)this).GetComponent<MoreCompanyCosmeticManager>();
matHelper = new MaterialHelper();
replacementModel = LoadModelReplacement();
try
{
AddModelScripts();
}
catch (Exception ex)
{
ModelReplacementAPI.Instance.Logger.LogError((object)("Could not set all model scripts.\n Error: " + ex.Message));
}
if (viewState.localPlayer)
{
replacementModelShadow = Object.Instantiate<GameObject>(replacementModel);
GameObject obj = replacementModelShadow;
((Object)obj).name = ((Object)obj).name + "(Shadow)";
Renderer[] componentsInChildren = replacementModelShadow.GetComponentsInChildren<Renderer>();
foreach (Renderer val in componentsInChildren)
{
val.shadowCastingMode = (ShadowCastingMode)3;
((Component)val).gameObject.layer = viewState.VisibleLayer;
}
}
replacementViewModel = LoadViewModelreplacement();
avatar = GetAvatarUpdater();
shadowAvatar = GetAvatarUpdater();
viewModelAvatar = GetViewModelUpdater();
ragdollAvatar = new AvatarUpdater();
cosmeticAvatar = avatar;
avatar.AssignModelReplacement(((Component)controller).gameObject, replacementModel);
shadowAvatar.AssignModelReplacement(((Component)controller).gameObject, replacementModelShadow);
viewModelAvatar.AssignViewModelReplacement(((Component)controller).gameObject, replacementViewModel);
SetAvatarRenderers(enabled: true);
viewState.ReportBodyReplacementAddition(this);
cosmeticManager.ReportBodyReplacementAddition(this);
GameObject val2 = new GameObject("MRAPINameCollider");
val2.layer = 23;
val2.transform.SetParent(replacementModel.transform);
nameTagCollider = val2.AddComponent<BoxCollider>();
((Collider)nameTagCollider).isTrigger = true;
RaycastTarget raycastTarget = val2.AddComponent<RaycastTarget>();
raycastTarget.controller = controller;
raycastTarget.bodyReplacement = this;
raycastTarget.modelObj = replacementModel;
allBodies.Add(this);
ModelReplacementAPI.Instance.Logger.LogInfo((object)("AwakeEnd " + controller.playerUsername));
}
protected virtual void Start()
{
}
public virtual void LateUpdate()
{
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: 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_014e: 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)
GameObject val = null;
try
{
val = ((Component)controller.deadBody).gameObject;
}
catch
{
}
if (Object.op_Implicit((Object)(object)val) && (Object)(object)replacementDeadBody == (Object)null)
{
cosmeticAvatar = ragdollAvatar;
CreateAndParentRagdoll(controller.deadBody);
OnDeath();
}
if (Object.op_Implicit((Object)(object)replacementDeadBody) && (Object)(object)val == (Object)null)
{
cosmeticAvatar = avatar;
Object.Destroy((Object)(object)replacementDeadBody);
replacementDeadBody = null;
}
if (Object.op_Implicit((Object)(object)val) && !val.activeInHierarchy && (Object)(object)replacementDeadBody != (Object)null)
{
replacementDeadBody.SetActive(false);
}
avatar.Update();
shadowAvatar.Update();
ragdollAvatar.Update();
viewModelAvatar.Update();
cosmeticManager.UpdateModelReplacement();
if ((Object)(object)replacementModel != (Object)null)
{
Bounds bounds = GetBounds(replacementModel);
nameTagCollider.center = ((Bounds)(ref bounds)).center;
nameTagCollider.size = ((Bounds)(ref bounds)).size;
}
previousDanceNumber = danceNumber;
if (!((Object)(object)controller.playerBodyAnimator != (Object)null))
{
return;
}
AnimatorStateInfo currentAnimatorStateInfo = controller.playerBodyAnimator.GetCurrentAnimatorStateInfo(1);
int fullPathHash = ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).fullPathHash;
if (controller.performingEmote)
{
switch (fullPathHash)
{
case -462656950:
danceNumber = 1;
break;
case 2103786480:
danceNumber = 2;
break;
default:
danceNumber = 3;
break;
}
}
else
{
danceNumber = 0;
}
if (ModelReplacementAPI.tooManyEmotesPresent)
{
danceNumber = SafeGetEmoteID(danceNumber);
}
if (danceNumber != previousDanceNumber)
{
if (previousDanceNumber == 0)
{
((MonoBehaviour)this).StartCoroutine(WaitForDanceNumberChange());
}
else if (danceNumber == 0)
{
OnEmoteEnd();
}
else if (!emoteOngoing)
{
OnEmoteStart(danceNumber);
}
}
}
static BodyReplacementBase()
{
allBodies = new List<BodyReplacementBase>();
RenderPipelineManager.beginContextRendering += ReallyLateUpdate;
}
public static void ReallyLateUpdate(ScriptableRenderContext context, List<Camera> cameras)
{
for (int i = 0; i < allBodies.Count; i++)
{
try
{
BodyReplacementBase bodyReplacementBase = allBodies[i];
if (Object.op_Implicit((Object)(object)bodyReplacementBase) && ((Behaviour)bodyReplacementBase).isActiveAndEnabled)
{
bodyReplacementBase.UpdateItemTransform();
}
}
catch (Exception value)
{
Console.WriteLine(value);
}
}
}
protected virtual void OnDestroy()
{
ModelReplacementAPI.Instance.Logger.LogInfo((object)("Destroy body component for " + controller.playerUsername));
allBodies.Remove(this);
Object.Destroy((Object)(object)replacementModel);
Object.Destroy((Object)(object)replacementModelShadow);
Object.Destroy((Object)(object)replacementViewModel);
Object.Destroy((Object)(object)replacementDeadBody);
}
public void UpdateItemTransform()
{
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
//IL_020a: Unknown result type (might be due to invalid IL or missing references)
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
//IL_0219: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: 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_00f3: 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_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0267: Unknown result type (might be due to invalid IL or missing references)
//IL_0272: Unknown result type (might be due to invalid IL or missing references)
//IL_0277: Unknown result type (might be due to invalid IL or missing references)
//IL_027c: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Unknown result type (might be due to invalid IL or missing references)
//IL_0293: Unknown result type (might be due to invalid IL or missing references)
//IL_02af: Unknown result type (might be due to invalid IL or missing references)
//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)heldItem))
{
return;
}
if ((Object)(object)heldItem.parentObject == (Object)null || (Object)(object)heldItem.playerHeldBy != (Object)(object)controller || controller.currentItemSlot > controller.ItemSlots.Length - 1 || (Object)(object)controller.ItemSlots[controller.currentItemSlot] != (Object)(object)heldItem)
{
heldItem = null;
return;
}
if (viewState.GetViewState() == ViewState.FirstPerson)
{
if (Object.op_Implicit((Object)(object)replacementViewModel))
{
if (heldItem.itemProperties.twoHandedAnimation)
{
((Component)heldItem).transform.Translate((viewModelAvatar.ItemOffsetLeft + viewModelAvatar.ItemOffsetRight) / 2f, (Space)0);
}
else
{
((Component)heldItem).transform.Translate(viewModelAvatar.ItemOffsetRight, (Space)0);
}
}
}
else
{
if (viewState.localPlayer)
{
((Component)heldItem).transform.rotation = controller.serverItemHolder.rotation;
((Component)heldItem).transform.Rotate(heldItem.itemProperties.rotationOffset);
((Component)heldItem).transform.position = controller.serverItemHolder.position + controller.serverItemHolder.rotation * heldItem.itemProperties.positionOffset;
}
if (heldItem