Decompiled source of Emotes2 And Knuckles v1.3.5
plugins/LcEmotes2AndKnucklesFeaturingDante/LcEmotes2AndKnucklesFeaturingDante.dll
Decompiled 6 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using EmotesAPI; using GameNetcodeStuff; using LcEmotes2AndKnucklesFeaturingDante.Common; using LcEmotes2AndKnucklesFeaturingDante.Common.Rand; using LcEmotes2AndKnucklesFeaturingDante.Emotes; using LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain; using LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain.Chat; using LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain.Data; using LcEmotes2AndKnucklesFeaturingDante.Emotes.JermaWindow; using LcEmotes2AndKnucklesFeaturingDante.Emotes.LightsCameraAction; using LcEmotes2AndKnucklesFeaturingDante.Emotes.Megaman; using LcEmotes2AndKnucklesFeaturingDante.Emotes.xQcClap; using LcEmotes2AndKnucklesFeaturingDante.JoinSpots; using LcEmotes2AndKnucklesFeaturingDante.JoinSpots.JermaWindow; using LcEmotes2AndKnucklesFeaturingDante.NetcodePatcher; using LcEmotes2AndKnucklesFeaturingDante.Utils; using LethalEmotesAPI; using LethalEmotesAPI.Core; using LethalEmotesAPI.ImportV2; using LethalVRM; using Microsoft.CodeAnalysis; using ModelReplacement; using MonoMod.RuntimeDetour; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.Playables; using UnityEngine.TextCore; using UnityEngine.Timeline; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("LethalVRM")] [assembly: IgnoresAccessChecksTo("MToon")] [assembly: IgnoresAccessChecksTo("UniGLTF")] [assembly: IgnoresAccessChecksTo("UniGLTF.Utils")] [assembly: IgnoresAccessChecksTo("UniHumanoid")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("VRM10")] [assembly: IgnoresAccessChecksTo("VrmLib")] [assembly: IgnoresAccessChecksTo("VRMShaders.GLTF.IO.Runtime")] [assembly: IgnoresAccessChecksTo("VRMShaders.VRM.IO.Runtime")] [assembly: IgnoresAccessChecksTo("VRMShaders.VRM10.Format.Runtime")] [assembly: IgnoresAccessChecksTo("VRMShaders.VRM10.MToon10.Runtime")] [assembly: AssemblyCompany("LcEmotes2AndKnucklesFeaturingDante")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+fa54d9c19b0efabe58ea9b188347dc758d6be62f")] [assembly: AssemblyProduct("LcEmotes2AndKnucklesFeaturingDante")] [assembly: AssemblyTitle("LcEmotes2AndKnucklesFeaturingDante")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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; } } } namespace LcEmotes2AndKnucklesFeaturingDante { internal static class Assets { private static readonly List<AssetBundle> AssetBundles = new List<AssetBundle>(); private static readonly Dictionary<string, int> AssetIndices = new Dictionary<string, int>(); public static void LoadAllAssetBundles() { foreach (string item in Directory.EnumerateFiles(FsUtils.AssetBundlesDir, "*", SearchOption.AllDirectories)) { string text = item; if (text.StartsWith(FsUtils.AssetBundlesDir)) { string text2 = text; int length = FsUtils.AssetBundlesDir.Length; text = text2.Substring(length, text2.Length - length); } while (text.StartsWith("/") || text.StartsWith("\\")) { string text2 = text; text = text2.Substring(1, text2.Length - 1); } AddBundle(text); } } public static void AddBundle(string bundleName) { string text = Path.Combine(FsUtils.AssetBundlesDir, bundleName); AssetBundle val = AssetBundle.LoadFromFile(text); int count = AssetBundles.Count; AssetBundles.Add(val); string[] allAssetNames = val.GetAllAssetNames(); foreach (string text2 in allAssetNames) { string text3 = text2.ToLowerInvariant(); if (text3.StartsWith("assets/")) { string text4 = text3; int length = "assets/".Length; text3 = text4.Substring(length, text4.Length - length); } AssetIndices[text3] = count; } } public static T? Load<T>(string assetName) where T : Object { try { assetName = assetName.ToLowerInvariant(); if (assetName.StartsWith("assets/")) { string text = assetName; int length = "assets/".Length; assetName = text.Substring(length, text.Length - length); } int index = AssetIndices[assetName]; return AssetBundles[index].LoadAsset<T>("assets/" + assetName); } catch (Exception arg) { ManualLogSource? logger = LcEmotes2AndKnucklesFeaturingDantePlugin.Logger; if (logger != null) { logger.LogError((object)$"Couldn't load asset [{assetName}] exception: {arg}"); } return default(T); } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante", "Emotes 2 And Knuckles Featuring Dante", "1.3.5")] public class LcEmotes2AndKnucklesFeaturingDantePlugin : BaseUnityPlugin { public const string ModGuid = "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante"; public const string ModName = "Emotes 2 And Knuckles Featuring Dante"; public const string ModVersion = "1.3.5"; public static bool watermarkRemoverPresent; public static PluginInfo? PluginInfo { get; private set; } public static ManualLogSource? Logger { get; private set; } private void Awake() { PluginInfo = ((BaseUnityPlugin)this).Info; Logger = ((BaseUnityPlugin)this).Logger; watermarkRemoverPresent = Chainloader.PluginInfos.ContainsKey("flowerwater.liquidStainRemover"); Assets.LoadAllAssetBundles(); RegisterAllEmotes(); EmoteRegistry.FinalizeRegistry(); GameEventBus.InitHooks(); Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { try { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } catch (Exception) { } } } private void RegisterAllEmotes() { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) EmoteRegistry.RegisterEmote<GoblinPainEmote>(); EmoteRegistry.RegisterEmote<xQcEmote>(); EmoteRegistry.RegisterEmote<xQcEmote_yell>(); EmoteRegistry.RegisterEmote<xQcEmote_clap>(); EmoteRegistry.RegisterEmote<LightsCameraActionEmote>(); EmoteRegistry.RegisterEmote<PhoneEmote>(); EmoteRegistry.RegisterEmote<JermaWindow>(); EmoteRegistry.RegisterEmote<JermaWindowJump>(); EmoteRegistry.RegisterEmote<JermaWindowLand>(); EmoteRegistry.RegisterEmote<JermaWindowFall>(); Assets.Load<GameObject>("Emotes/JermaWindow/Window9.prefab").AddComponent<WindowHandler>(); EmoteRegistry.RegiserProp(JermaWindow.props, Assets.Load<GameObject>("Emotes/JermaWindow/Window9.prefab"), (JoinSpot[])(object)new JoinSpot[1] { new JoinSpot("JermaWindowSpot", new Vector3(0f, 0f, 2.5f)) }, new AbstractJoinSpot[1] { new JermaWindowJoinSpot() }); } } } namespace LcEmotes2AndKnucklesFeaturingDante.Utils { internal static class ArrayUtils { public static T[] Copy<T>(this T[] orig) { T[] array = new T[orig.Length]; for (int i = 0; i < array.Length; i++) { array[i] = orig[i]; } return array; } } internal static class FsUtils { private static string? _assetBundlesDir; public static string AssetBundlesDir { get { if (_assetBundlesDir == null) { _assetBundlesDir = GetAssetBundlesDir(); } if (string.IsNullOrEmpty(_assetBundlesDir)) { return ""; } return _assetBundlesDir; } } private static string? GetAssetBundlesDir() { PluginInfo pluginInfo = LcEmotes2AndKnucklesFeaturingDantePlugin.PluginInfo; if (pluginInfo == null) { return null; } string location = pluginInfo.Location; DirectoryInfo parent = Directory.GetParent(location); if (parent == null) { throw new NotSupportedException(BadInstallError()); } string text = Path.Combine(parent.FullName, "AssetBundles"); if (!Directory.Exists(text)) { throw new NotSupportedException(BadInstallError()); } return text; static string BadInstallError() { string text2 = "Emotes 2 And Knuckles Featuring Dante"; string text3 = "LcEmotes2AndKnucklesFeaturingDante.dll"; string text4 = text2 + " can't find it's required AssetBundles!\n Make sure that the file `" + text3 + "` is in its own folder like `BepInEx/plugins/" + text2 + "/" + text3 + "` and that the folder `AssetBundles` is in the same folder as `" + text3 + "`!"; ManualLogSource? logger = LcEmotes2AndKnucklesFeaturingDantePlugin.Logger; if (logger != null) { logger.LogError((object)text4); } return text4; } } } internal static class HookUtils { private const BindingFlags DefaultFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private const BindingFlags StaticFlags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; public static Hook NewHook<TTarget, TDest>(string targetMethodName, string destMethodName, TDest instance) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown MethodInfo method = typeof(TTarget).GetMethod(targetMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo method2 = typeof(TDest).GetMethod(destMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return new Hook((MethodBase)method, method2, (object)instance); } public static Hook NewHook<TTarget>(string targetMethodName, MethodInfo destMethod) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown MethodInfo method = typeof(TTarget).GetMethod(targetMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return new Hook((MethodBase)method, destMethod); } public static Hook NewHook<TTarget>(string targetMethodName, Type destType, string destMethodName, bool isStatic) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown if (isStatic) { MethodInfo method = typeof(TTarget).GetMethod(targetMethodName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo method2 = destType.GetMethod(destMethodName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); return new Hook((MethodBase)method, method2); } MethodInfo method3 = typeof(TTarget).GetMethod(targetMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo method4 = destType.GetMethod(destMethodName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); return new Hook((MethodBase)method3, method4); } } public readonly struct Optional<T> { private readonly T? _value; public bool HasValue { get; } private Optional(T value) { HasValue = false; _value = value; HasValue = true; } public bool TryGetValue(out T? value) { value = _value; return HasValue; } public static Optional<T> Some(T value) { return new Optional<T>(value); } public static Optional<T> None() { return default(Optional<T>); } } } namespace LcEmotes2AndKnucklesFeaturingDante.JoinSpots { public abstract class AbstractJoinSpot { public virtual void OnSpotJoined(GameObject emoteSpot, BoneMapper joiner, BoneMapper host) { } } } namespace LcEmotes2AndKnucklesFeaturingDante.JoinSpots.JermaWindow { public class JermaWindowJoinSpot : AbstractJoinSpot { public override void OnSpotJoined(GameObject emoteSpot, BoneMapper joiner, BoneMapper host) { //IL_000d: 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_0036: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown joiner.mapperBodyTransform.position = emoteSpot.transform.position; joiner.mapperBodyTransform.rotation = emoteSpot.transform.rotation; Transform mapperBodyTransform = joiner.mapperBodyTransform; mapperBodyTransform.localEulerAngles += new Vector3(0f, 180f, 0f); joiner.PlayAnim("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__Window1", -1); if (joiner.playerController != null && joiner.local) { GameObject val = new GameObject(); joiner.props.Add(val); val.AddComponent<CameraLocker>().cam = joiner.playerController.gameplayCamera; } ((MonoBehaviour)joiner).StartCoroutine(SpawnBrokenGlass(0.6166f, ((Component)host).transform, joiner)); EmoteLocation component = emoteSpot.GetComponent<EmoteLocation>(); component.SetEmoterAndHideLocation(joiner); Transform transform = ((Component)component).gameObject.transform; transform.localPosition -= new Vector3(5000f, 5000f, 5000f); ((Component)host).GetComponent<WindowHandler>().owner = null; if (!joiner.currentClipName.Equals("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__Window1")) { AudioSource component2 = ((Component)((Component)host).transform.Find("Base")).GetComponent<AudioSource>(); component2.clip = joiner.personalAudioSource.clip; ((Component)joiner.personalAudioSource).GetComponent<AudioManager>().Stop(); component2.Play(); } } internal static IEnumerator SpawnBrokenGlass(float delay, Transform hostPosition, BoneMapper owner) { yield return (object)new WaitForSeconds(delay); if (owner?.currentClipName.Equals("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__Window1") ?? false) { GameObject g = Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/JermaWindow/WindowShatter.prefab")); g.transform.SetParent(hostPosition); g.transform.localPosition = Vector3.zero; g.transform.localRotation = Quaternion.identity; g.transform.localScale = Vector3.one; ((Component)hostPosition.Find("Glass")).gameObject.SetActive(false); ((Component)hostPosition.Find("XBeam")).gameObject.SetActive(false); ((Component)hostPosition.Find("ZBeam")).gameObject.SetActive(false); } GameObject g2 = Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/JermaWindow/Explosion.prefab")); g2.transform.SetParent(hostPosition); g2.transform.localPosition = new Vector3(0f, 1.33f, 0f); g2.transform.localScale = new Vector3(5f, 5f, 5f); g2.transform.SetParent(g2.transform.parent.parent); yield return (object)new WaitForSeconds(5f - delay); ((MonoBehaviour)CustomEmotesAPI.localMapper).StartCoroutine(CleanupExplosion(g2)); g2.GetComponent<ParticleSystem>().Emit(1); g2.GetComponent<AudioSource>().Play(); if (CustomEmotesAPI.localMapper.isServer) { Object.Destroy((Object)(object)((Component)hostPosition).gameObject); } } internal static IEnumerator CleanupExplosion(GameObject g) { yield return (object)new WaitForSeconds(3f); Object.Destroy((Object)(object)g); } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes { public abstract class AbstractEmote { public abstract string AnimationClipName { get; } public abstract CustomEmoteParams GetClipParams(); public virtual void SpawnProps(BoneMapper mapper) { } } internal static class EmoteRegistry { [CompilerGenerated] private static class <>O { public static AnimationChanged <0>__OnSpawnWorldProps; public static JoinedEmoteSpotProp <1>__OnJoinedWorldProp; } private static bool _finished; private static readonly Dictionary<string, AbstractEmote> Emotes = new Dictionary<string, AbstractEmote>(); private static readonly Dictionary<string, AbstractJoinSpot> JoinSpots = new Dictionary<string, AbstractJoinSpot>(); public static void RegisterEmote<T>() where T : AbstractEmote, new() { T val = new T(); Emotes["com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__" + val.AnimationClipName] = val; } public static void RegisterEmote<T>(T emoteInstance) where T : AbstractEmote { Emotes["com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__" + emoteInstance.AnimationClipName] = emoteInstance; } public static void RegiserProp(List<int> props, GameObject prop, JoinSpot[] joinSpots, AbstractJoinSpot[] joinSpotClasses) { props.Add(CustomEmotesAPI.RegisterWorldProp(prop, joinSpots)); for (int i = 0; i < joinSpots.Length; i++) { JoinSpots[joinSpots[i].name] = joinSpotClasses[i]; } } public static void FinalizeRegistry() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown if (_finished) { return; } foreach (var (_, abstractEmote2) in Emotes) { EmoteImporter.ImportEmote(abstractEmote2.GetClipParams()); } object obj = <>O.<0>__OnSpawnWorldProps; if (obj == null) { AnimationChanged val = OnSpawnWorldProps; <>O.<0>__OnSpawnWorldProps = val; obj = (object)val; } CustomEmotesAPI.animChanged += (AnimationChanged)obj; object obj2 = <>O.<1>__OnJoinedWorldProp; if (obj2 == null) { JoinedEmoteSpotProp val2 = OnJoinedWorldProp; <>O.<1>__OnJoinedWorldProp = val2; obj2 = (object)val2; } CustomEmotesAPI.emoteSpotJoined_Prop += (JoinedEmoteSpotProp)obj2; _finished = true; } private static void OnJoinedWorldProp(GameObject emoteSpot, BoneMapper joiner, BoneMapper host) { if (JoinSpots.TryGetValue(((Object)emoteSpot).name, out AbstractJoinSpot value)) { value.OnSpotJoined(emoteSpot, joiner, host); } } private static void OnSpawnWorldProps(string animName, BoneMapper mapper) { GoblinPainEmote.mappersPlayingPain.Remove(mapper); if (GoblinPainEmote.mappersPlayingPain.ContainsKey(CustomEmotesAPI.localMapper)) { ((Component)GoblinPainEmote.mappersPlayingPain[CustomEmotesAPI.localMapper]).gameObject.SetActive(true); } else if (GoblinPainEmote.mappersPlayingPain.Count != 0) { ((Component)GoblinPainEmote.mappersPlayingPain.First().Value).gameObject.SetActive(true); } if (Emotes.TryGetValue(animName, out AbstractEmote value)) { value.SpawnProps(mapper); } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.xQcClap { public class TestEmote : AbstractEmote { public override string AnimationClipName => "avatartesting"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/xQcClap/Testing/" + AnimationClipName + ".anim") }; val.syncAnim = false; val.syncAudio = false; val.displayName = "Finger Touch"; val.lockType = (LockType)0; val.willGetClaimedByDMCA = false; val.thirdPerson = true; return val; } public override void SpawnProps(BoneMapper mapper) { } } public class ClapHandler : MonoBehaviour { public BoneMapper mapper; public float time = 0f; public string animation; private void Start() { ((MonoBehaviour)this).StartCoroutine(YellAfterTime()); } private IEnumerator YellAfterTime() { yield return (object)new WaitForEndOfFrame(); yield return (object)new WaitForSeconds(time); if (CustomEmotesAPI.localMapper.isServer) { CustomEmotesAPI.PlayAnimation(animation, mapper, -2); } } internal IEnumerator SpawnClapFXAfterTime(float time, BoneMapper mapper) { yield return (object)new WaitForSeconds(time); SpawnFX(mapper); } internal void SpawnFX(BoneMapper mapper) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) int count = mapper.props.Count; mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/xQcClap/VFX/ClapHandFX2.prefab"))); mapper.props[count].transform.SetParent(mapper.basePlayerModelSMR[0].bones[3]); mapper.props[count].transform.localPosition = new Vector3(-0.02f, -0.125f, 0.58f); count = mapper.props.Count; mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/xQcClap/VFX/WorbleCylinder.prefab"))); mapper.props[count].transform.SetParent(mapper.basePlayerModelSMR[0].bones[3]); mapper.props[count].transform.localPosition = new Vector3(-0.02f, -0.125f, 0.58f); } public void Setup(BoneMapper mapper, float time, string animation) { this.mapper = mapper; this.time = time; this.animation = "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__" + animation; } } public class xQcEmote : AbstractEmote { public override string AnimationClipName => "xqc_clap_start"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/xQcClap/" + AnimationClipName + ".anim") }; val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/xQcClap/xqc_clap_loop.anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/xQcClap/Audio/xqc_wow.ogg") }; val.secondaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/xQcClap/Audio/xqc_claploop.ogg") }; val.audioLoops = true; val.syncAnim = false; val.syncAudio = false; val.displayName = "xQc Clap"; val.lockType = (LockType)2; val.willGetClaimedByDMCA = false; val.thirdPerson = false; val.rootBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[2] { (HumanBodyBones)2, (HumanBodyBones)1 }; val.soloBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[2] { default(HumanBodyBones), (HumanBodyBones)7 }; val.useLocalTransforms = true; val.audioLevel = 1f; return val; } public override void SpawnProps(BoneMapper mapper) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown GameObject val = new GameObject(); ClapHandler clapHandler = val.AddComponent<ClapHandler>(); clapHandler.Setup(mapper, Random.Range(3f, 7f), "xQcYellAtSky"); val.transform.SetParent(((Component)mapper).transform, false); mapper.props.Add(val); ((MonoBehaviour)clapHandler).StartCoroutine(clapHandler.SpawnClapFXAfterTime(2f, mapper)); } } public class xQcEmote_clap : AbstractEmote { public override string AnimationClipName => "xqc_clap_loop"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/xQcClap/xqc_clap_loop.anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/xQcClap/Audio/xqc_claploop.ogg") }; val.audioLoops = true; val.syncAnim = false; val.syncAudio = false; val.displayName = "xQc Clap"; val.visible = false; val.lockType = (LockType)1; val.willGetClaimedByDMCA = false; val.thirdPerson = false; val.rootBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[2] { (HumanBodyBones)2, (HumanBodyBones)1 }; val.soloBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[3] { default(HumanBodyBones), (HumanBodyBones)7, (HumanBodyBones)10 }; val.useLocalTransforms = true; val.audioLevel = 1f; val.emoteToPlayOnJoin = "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xqc_clap_start"; return val; } public override void SpawnProps(BoneMapper mapper) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown if (mapper.prevClipName != "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xQcYellAtSky") { if (CustomEmotesAPI.localMapper.isServer) { CustomEmotesAPI.PlayAnimation("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xqc_clap_start", mapper, -2); } return; } GameObject val = new GameObject(); ClapHandler clapHandler = val.AddComponent<ClapHandler>(); float time = ((Random.Range(0, 10) >= 4) ? Random.Range(3f, 7f) : Random.Range(0.075f, 0.2f)); clapHandler.Setup(mapper, time, "xQcYellAtSky"); val.transform.SetParent(((Component)mapper).transform, false); mapper.props.Add(val); clapHandler.SpawnFX(mapper); } } public class xQcEmote_yell : AbstractEmote { public override string AnimationClipName => "xQcYellAtSky"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_00d8: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/xQcClap/Animations/" + AnimationClipName + ".anim") }; val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/xQcClap/xqc_clap_loop.anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[3] { Assets.Load<AudioClip>("Emotes/xQcClap/Audio/ahhhh2.ogg"), Assets.Load<AudioClip>("Emotes/xQcClap/Audio/ahhhh3.ogg"), Assets.Load<AudioClip>("Emotes/xQcClap/Audio/ahhhh4.ogg") }; val.secondaryAudioClips = (AudioClip[])(object)new AudioClip[3] { Assets.Load<AudioClip>("Emotes/xQcClap/Audio/xqc_claploop.ogg"), Assets.Load<AudioClip>("Emotes/xQcClap/Audio/xqc_claploop.ogg"), Assets.Load<AudioClip>("Emotes/xQcClap/Audio/xqc_claploop.ogg") }; val.audioLoops = false; val.syncAnim = false; val.syncAudio = false; val.displayName = "xQc Clap"; val.visible = false; val.lockType = (LockType)1; val.willGetClaimedByDMCA = false; val.thirdPerson = false; val.rootBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[2] { (HumanBodyBones)2, (HumanBodyBones)1 }; val.soloBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[3] { default(HumanBodyBones), (HumanBodyBones)7, (HumanBodyBones)10 }; val.useLocalTransforms = true; val.audioLevel = 1f; val.emoteToPlayOnJoin = "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xqc_clap_start"; return val; } public override void SpawnProps(BoneMapper mapper) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown if (mapper.prevClipName != "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xqc_clap_start" && mapper.prevClipName != "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xqc_clap_loop") { if (CustomEmotesAPI.localMapper.isServer) { CustomEmotesAPI.PlayAnimation("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__xqc_clap_start", mapper, -2); } } else { GameObject val = new GameObject(); ClapHandler clapHandler = val.AddComponent<ClapHandler>(); clapHandler.Setup(mapper, Random.Range(0.15f, 0.2f), "xqc_clap_loop"); val.transform.SetParent(((Component)mapper).transform, false); mapper.props.Add(val); } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.Phone { [DefaultExecutionOrder(3)] public class ArmFixer : MonoBehaviour { public Transform emoteArm; public Transform realArm; private Vector3 desiredPos; private Quaternion desiredRot; public void Setup(Transform emoteArm, Transform realArm) { this.emoteArm = emoteArm; this.realArm = realArm; } private void Update() { //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_0019: 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) desiredPos = realArm.position; desiredRot = realArm.rotation; } private void LateUpdate() { //IL_0008: 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) emoteArm.position = desiredPos; emoteArm.rotation = desiredRot; } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.Megaman { public class LightsCameraActionEmote : AbstractEmote { internal static List<BoneMapper> flatMappers = new List<BoneMapper>(); public override string AnimationClipName => "LightsCameraActionStart"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_00cf: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/LightsCameraAction/" + AnimationClipName + ".anim") }; val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/LightsCameraAction/LightsCameraActionLoop.anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/LightsCameraAction/LightsCameraActionStart.ogg") }; val.secondaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/LightsCameraAction/LightsCameraActionLoop.ogg") }; val.primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/LightsCameraAction/LightsCameraActionStart.ogg") }; val.secondaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/LightsCameraAction/LightsCameraActionLoop.ogg") }; val.audioLoops = true; val.syncAnim = true; val.syncAudio = true; val.displayName = "Lights Camera Action"; val.lockType = (LockType)1; val.willGetClaimedByDMCA = false; val.thirdPerson = true; return val; } internal static IEnumerator FinishPropAfterFrame(BoneMapper mapper) { yield return (object)new WaitForEndOfFrame(); ((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale = new Vector3(((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale.x, 0.001f, ((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale.z); if (!mapper.isEnemy) { if (CustomEmotesAPI.ModelReplacementAPIPresent) { ModelReplacementAPICompat.ChangeModelScale(makeNormal: false, mapper.playerController); } if (CustomEmotesAPI.VRMPresent) { LethalVRMCompat.ChangeModelScale(makeNormal: false, mapper.playerController); } } } public override void SpawnProps(BoneMapper mapper) { ((MonoBehaviour)mapper).StartCoroutine(FlattenAfterFrame(mapper)); } private IEnumerator FlattenAfterFrame(BoneMapper mapper) { yield return (object)new WaitForEndOfFrame(); GameObject g = new GameObject(); mapper.props.Add(g); g.AddComponent<UnFlattener>().mapper = mapper; if (mapper.local && CustomEmotesAPI.hudAnimator != null) { ((Component)CustomEmotesAPI.hudAnimator).transform.localScale = new Vector3(1f, 0.001f, 1f); } ((Component)mapper).transform.localScale = new Vector3(((Component)mapper).transform.localScale.x, ((Component)mapper).transform.localScale.y, ((Component)mapper).transform.localScale.x * 0.001f); ((MonoBehaviour)mapper).StartCoroutine(FinishPropAfterFrame(mapper)); if (!LcEmotes2AndKnucklesFeaturingDantePlugin.watermarkRemoverPresent || !WatermarkCompaty.CantHaveWatermark()) { int propIndex2 = mapper.props.Count; mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/LightsCameraAction/Watermark.prefab"))); mapper.props[propIndex2].transform.localScale = new Vector3(0.6f, 0.6f, 0.6f); WatermarkComponent rot2 = mapper.props[propIndex2].AddComponent<WatermarkComponent>(); rot2.target = mapper.mapperBody.transform; rot2.trackedBone = mapper.emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)7); rot2.multiplier = 0.001f; rot2.player = mapper.playerController; propIndex2 = mapper.props.Count; mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/LightsCameraAction/Watermark.prefab"))); mapper.props[propIndex2].transform.localScale = new Vector3(0.6f, 0.6f, 0.6f); rot2 = mapper.props[propIndex2].AddComponent<WatermarkComponent>(); rot2.target = mapper.mapperBody.transform; rot2.trackedBone = mapper.emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)7); rot2.multiplier = -0.005f; rot2.player = mapper.playerController; } } } public class MegamanEmote : AbstractEmote { public override string AnimationClipName => "Window1"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/JermaWindow/" + AnimationClipName + ".anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/Megaman/Megaman-mariogalaxy.ogg") }; val.audioLoops = true; val.syncAnim = true; val.syncAudio = true; val.displayName = "Money Smart"; val.lockType = (LockType)3; val.willGetClaimedByDMCA = false; val.thirdPerson = false; return val; } public override void SpawnProps(BoneMapper mapper) { } } public class PhoneEmote : AbstractEmote { internal static List<BoneMapper> flatMappers = new List<BoneMapper>(); internal static List<VideoClip> videoClips = new List<VideoClip>(5) { Assets.Load<VideoClip>("Emotes/BoringAhhGame/SubwaySurfers.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/MinecraftParkour.webm"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/FamilyGuy.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/Satisfying.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/SliceIt.webm") }; internal static List<VideoClip> easterEggVideoClips = new List<VideoClip>(9) { Assets.Load<VideoClip>("Emotes/BoringAhhGame/BadShrekle.webm"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/GreyLeno.webm"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/KoopaCape.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/Lifesaver.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/Megaman.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/True.mp4"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/oldspice.webm"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/octagon.webm"), Assets.Load<VideoClip>("Emotes/BoringAhhGame/kitchengun.webm") }; public override string AnimationClipName => "phone_start"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/BoringAhhGame/" + AnimationClipName + ".anim") }; val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/BoringAhhGame/phone_loop.anim") }; val.displayName = "Boring Ahh Game"; val.lockType = (LockType)1; val.useLocalTransforms = true; HumanBodyBones[] array = new HumanBodyBones[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); val.rootBonesToIgnore = (HumanBodyBones[])(object)array; HumanBodyBones[] array2 = new HumanBodyBones[4]; RuntimeHelpers.InitializeArray(array2, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); val.soloBonesToIgnore = (HumanBodyBones[])(object)array2; return val; } public override void SpawnProps(BoneMapper mapper) { //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) int count = mapper.props.Count; mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/BoringAhhGame/iphone4.prefab"))); GameObject val = mapper.props[count]; Transform val2 = mapper.mapperBody.transform.Find("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/shoulder.L/arm.L_upper/arm.L_lower/hand.L"); if (val2 == null) { BoneRef component = ((Component)mapper.emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)17)).GetComponent<BoneRef>(); if (component != null) { val.transform.parent = component.target; } } else { val.transform.parent = val2; } val.transform.localEulerAngles = new Vector3(1f, 90f, 255f); val.transform.localPosition = new Vector3(-0.0127f, 0.0964f, -0.0436f); val.transform.localScale = new Vector3(0.065f, 0.065f, 0.065f); val.GetComponentInChildren<VideoPlayer>().SetTargetAudioSource((ushort)0, mapper.personalAudioSource); ((MonoBehaviour)mapper).StartCoroutine(stopDoingThat(mapper)); if (CustomEmotesAPI.localMapper.isServer) { Emotes2Networking.instance.SyncRandomVideoToClientRpc(mapper.mapperBody.GetComponent<NetworkObject>().NetworkObjectId, Random.Range(0, videoClips.Count), Random.Range(0, easterEggVideoClips.Count), Random.Range(0, 100), Random.Range(0f, 1f)); } } private IEnumerator stopDoingThat(BoneMapper mapper) { yield return (object)new WaitForEndOfFrame(); yield return (object)new WaitForEndOfFrame(); foreach (EmoteConstraint item in mapper.itemHolderConstraints) { item.DeactivateConstraints(); } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.LightsCameraAction { internal class LethalVRMCompat { internal static Dictionary<PlayerControllerB, LethalVRMInstance> playersToVRMInstances = new Dictionary<PlayerControllerB, LethalVRMInstance>(); internal static LethalVRMManager iWantToSeeYourManager; internal static void SetManager() { if (iWantToSeeYourManager == null) { LethalVRMManager[] array = Resources.FindObjectsOfTypeAll(typeof(LethalVRMManager)) as LethalVRMManager[]; foreach (LethalVRMManager val in array) { iWantToSeeYourManager = val; } } } internal static void GetPlayerInDictionary(PlayerControllerB player) { if (iWantToSeeYourManager == null || playersToVRMInstances.ContainsKey(player)) { return; } foreach (LethalVRMInstance instance in iWantToSeeYourManager.instances) { if ((Object)(object)instance.PlayerControllerB == (Object)(object)player) { playersToVRMInstances.Add(instance.PlayerControllerB, instance); } } } internal static LethalVRMInstance PerformAllChecks(PlayerControllerB player) { SetManager(); GetPlayerInDictionary(player); if (playersToVRMInstances.ContainsKey(player)) { return playersToVRMInstances[player]; } return null; } internal static GameObject ChangeModelScale(bool makeNormal, PlayerControllerB player) { //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: 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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) LethalVRMInstance val = PerformAllChecks(player); if (val != null) { if (makeNormal) { if (playersToVRMInstances.ContainsKey(player)) { playersToVRMInstances.Remove(player); } ((Component)val.Vrm10Instance).transform.localScale = new Vector3(((Component)val.Vrm10Instance).transform.localScale.z, ((Component)val.Vrm10Instance).transform.localScale.y, ((Component)val.Vrm10Instance).transform.localScale.z); } else { if (!playersToVRMInstances.ContainsKey(player)) { playersToVRMInstances.Add(player, val); } ((Component)val.Vrm10Instance).transform.localScale = new Vector3(0.001f, ((Component)val.Vrm10Instance).transform.localScale.y, ((Component)val.Vrm10Instance).transform.localScale.z); } return ((Component)val.Vrm10Instance).gameObject; } return null; } internal static void UpdateModelRotation(PlayerControllerB player) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) LethalVRMInstance val = PerformAllChecks(player); if (val != null) { ((Component)val.Vrm10Instance).transform.eulerAngles = ((Component)player).transform.eulerAngles + new Vector3(0f, 90f, 0f); } } internal static void RemovePlayerFromPool(PlayerControllerB player) { playersToVRMInstances.Remove(player); } } internal class ModelReplacementAPICompat { internal static Dictionary<PlayerControllerB, BodyReplacementBase> playersToBodies = new Dictionary<PlayerControllerB, BodyReplacementBase>(); internal static GameObject ChangeModelScale(bool makeNormal, PlayerControllerB player) { //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) BodyReplacementBase val = default(BodyReplacementBase); ModelReplacementAPI.GetPlayerModelReplacement(player, ref val); if (val != null) { if (makeNormal) { if (playersToBodies.ContainsKey(player)) { playersToBodies.Remove(player); } val.replacementModel.transform.localScale = new Vector3(val.replacementModel.transform.localScale.z, val.replacementModel.transform.localScale.y, val.replacementModel.transform.localScale.z); } else { if (!playersToBodies.ContainsKey(player)) { playersToBodies.Add(player, val); } val.replacementModel.transform.localScale = new Vector3(0.001f, val.replacementModel.transform.localScale.y, val.replacementModel.transform.localScale.z); } return val.replacementModel; } return null; } internal static void UpdateModelRotation(PlayerControllerB player) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //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) if (playersToBodies.ContainsKey(player)) { playersToBodies[player].replacementModel.transform.eulerAngles = ((Component)player).transform.eulerAngles + new Vector3(0f, 90f, 0f); } } internal static void RemovePlayerFromPool(PlayerControllerB player) { playersToBodies.Remove(player); } } internal class UnFlattener : MonoBehaviour { public BoneMapper mapper; private void OnDestroy() { //IL_002b: 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_0069: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) ((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale = new Vector3(((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale.x, ((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale.x, ((Component)mapper.basePlayerModelAnimator).gameObject.transform.localScale.z); if (mapper.local && CustomEmotesAPI.hudAnimator != null) { ((Component)CustomEmotesAPI.hudAnimator).transform.localScale = new Vector3(1f, 1f, 1f); } ((Component)mapper).transform.localScale = new Vector3(((Component)mapper).transform.localScale.x, ((Component)mapper).transform.localScale.y, ((Component)mapper).transform.localScale.x); if (CustomEmotesAPI.ModelReplacementAPIPresent && !mapper.isEnemy) { ModelReplacementAPICompat.ChangeModelScale(makeNormal: true, mapper.playerController); } if (CustomEmotesAPI.VRMPresent && !mapper.isEnemy) { LethalVRMCompat.ChangeModelScale(makeNormal: true, mapper.playerController); } } } internal class WatermarkCompaty { internal static bool CantHaveWatermark() { return LiquidStainRemoverPlugin.disableMiscChanges.Value; } } internal class WatermarkComponent : MonoBehaviour { internal Transform target; internal Transform trackedBone; internal PlayerControllerB player; internal float multiplier; private void Update() { //IL_000d: 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_002d: 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_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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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_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_00cb: 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_00d3: Unknown result type (might be due to invalid IL or missing references) ((Component)this).transform.eulerAngles = new Vector3(target.eulerAngles.x, target.eulerAngles.y, trackedBone.eulerAngles.z) + new Vector3(0f, 180f, 0f); Transform transform = ((Component)this).transform; Transform obj = trackedBone; Vector3 position = (obj.position += new Vector3(((Component)target).transform.forward.x * multiplier, ((Component)target).transform.forward.y * multiplier, ((Component)target).transform.forward.z * multiplier)); transform.position = position; if (player != null) { if (CustomEmotesAPI.ModelReplacementAPIPresent) { ModelReplacementAPICompat.UpdateModelRotation(player); } if (CustomEmotesAPI.VRMPresent) { LethalVRMCompat.UpdateModelRotation(player); } } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.JermaWindow { [DefaultExecutionOrder(-20)] internal class CameraLocker : MonoBehaviour { internal Camera cam; private void LateUpdate() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ((Component)cam).transform.localEulerAngles = Vector3.zero; } } public class JermaWindow : AbstractEmote { public static List<int> props = new List<int>(); public override string AnimationClipName => "jermaWindow"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown return new CustomEmoteParams { internalName = "jermaWindow", displayName = "Jerma Window" }; } public override void SpawnProps(BoneMapper mapper) { //IL_0087: 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_00a9: 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_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) if (!CustomEmotesAPI.localMapper.isServer) { return; } foreach (WindowHandler allInactiveWindow in WindowHandler.allInactiveWindows) { if ((Object)(object)allInactiveWindow.owner == (Object)(object)mapper) { Object.Destroy((Object)(object)((Component)allInactiveWindow).gameObject); } } GameObject val = CustomEmotesAPI.SpawnWorldProp(props[0]); val.transform.position = mapper.mapperBody.transform.position; Transform transform = val.transform; transform.position += mapper.mapperBody.transform.forward * 2f; val.transform.eulerAngles = mapper.mapperBody.transform.eulerAngles + new Vector3(0f, 180f, 0f); val.GetComponent<WindowHandler>().owner = mapper; val.GetComponent<NetworkObject>().Spawn(false); if (((Object)mapper.mapperBodyTransform.parent).name == "HangarShip") { val.transform.SetParent(mapper.mapperBodyTransform.parent); } } } public class JermaWindowFall : AbstractEmote { public static List<int> props = new List<int>(); public override string AnimationClipName => "falling"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/JermaWindow/" + AnimationClipName + ".anim") }; val.displayName = "Jerma Window"; val.lockType = (LockType)3; val.willGetClaimedByDMCA = false; val.preventMovement = true; val.allowJoining = false; val.visible = false; return val; } public override void SpawnProps(BoneMapper mapper) { } } public class JermaWindowJump : AbstractEmote { public static List<int> props = new List<int>(); public override string AnimationClipName => "Window1"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/JermaWindow/" + AnimationClipName + ".anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[5] { Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter1.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter2.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter3.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter4.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter5.ogg") }; val.primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[5] { Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter1.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter2.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter3.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter4.ogg"), Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter5.ogg") }; val.displayName = "Jerma Window"; val.lockType = (LockType)3; val.willGetClaimedByDMCA = false; val.preventMovement = true; val.allowJoining = false; val.visible = false; return val; } public override void SpawnProps(BoneMapper mapper) { ((MonoBehaviour)mapper).StartCoroutine(AddFallCheckerAfterTime(mapper)); } private IEnumerator AddFallCheckerAfterTime(BoneMapper mapper) { yield return (object)new WaitForSeconds(0.75f); GameObject g = new GameObject(); WindowFallChecker fallChecker = g.AddComponent<WindowFallChecker>(); fallChecker.bodyPosition = mapper.mapperBodyTransform; fallChecker.mapper = mapper; mapper.props.Add(g); } } public class JermaWindowLand : AbstractEmote { public static List<int> props = new List<int>(); public override string AnimationClipName => "Window1Land"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/JermaWindow/" + AnimationClipName + ".anim") }; val.displayName = "Jerma Window"; val.lockType = (LockType)3; val.willGetClaimedByDMCA = false; val.preventMovement = true; val.allowJoining = false; val.visible = false; return val; } public override void SpawnProps(BoneMapper mapper) { } } internal class WindowFallChecker : MonoBehaviour { internal BoneMapper mapper; internal Transform bodyPosition; private bool falling = false; private void Update() { //IL_0010: 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_002e: Unknown result type (might be due to invalid IL or missing references) bool flag = falling; Ray val = default(Ray); ((Ray)(ref val))..ctor(bodyPosition.position, new Vector3(0f, -10f, 0f)); RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, ref val2, 10f, 268437761, (QueryTriggerInteraction)1)) { if (flag) { mapper.PlayAnim("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__Window1Land", -1); } return; } if (!flag) { mapper.preserveProps = true; mapper.PlayAnim("com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__falling", -1); } falling = true; } } public class WindowHandler : MonoBehaviour, IHittable { public static List<WindowHandler> allInactiveWindows = new List<WindowHandler>(); public BoneMapper owner; public bool destroying = false; private void Start() { allInactiveWindows.Add(this); } private void OnDestroy() { allInactiveWindows.Remove(this); } private void Update() { if (destroying) { owner = null; } } public bool Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit = null, bool playHitSFX = false) { OnHit(); return true; } public bool Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { OnHit(); return true; } public void OnHit() { if (!destroying) { destroying = true; Emotes2Networking.instance.SyncGlassBreak(((Component)this).GetComponent<NetworkObject>().NetworkObjectId); } } public void BreakGlass() { //IL_0014: 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_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) EmoteLocation componentInChildren = ((Component)this).GetComponentInChildren<EmoteLocation>(); Transform transform = ((Component)componentInChildren).gameObject.transform; transform.localPosition -= new Vector3(5000f, 5000f, 5000f); owner = null; GameObject val = Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/JermaWindow/WindowShatter.prefab")); val.transform.SetParent(((Component)this).transform); val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; val.transform.localScale = Vector3.one; ((Component)((Component)this).transform.Find("Glass")).gameObject.SetActive(false); ((Component)((Component)this).transform.Find("XBeam")).gameObject.SetActive(false); ((Component)((Component)this).transform.Find("ZBeam")).gameObject.SetActive(false); AudioSource component = ((Component)((Component)this).transform.Find("Base")).GetComponent<AudioSource>(); component.clip = Assets.Load<AudioClip>("Emotes/JermaWindow/Shatter6.ogg"); component.Play(); ((MonoBehaviour)CustomEmotesAPI.localMapper).StartCoroutine(CreateExplosion()); } public IEnumerator CreateExplosion() { GameObject g2 = Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/JermaWindow/Explosion.prefab")); g2.transform.SetParent(((Component)this).transform); g2.transform.localPosition = new Vector3(0f, 1.33f, 0f); g2.transform.localScale = new Vector3(5f, 5f, 5f); g2.transform.SetParent(g2.transform.parent.parent); yield return (object)new WaitForSeconds(5f); g2.GetComponent<ParticleSystem>().Emit(1); g2.GetComponent<AudioSource>().Play(); ((MonoBehaviour)CustomEmotesAPI.localMapper).StartCoroutine(JermaWindowJoinSpot.CleanupExplosion(g2)); if (CustomEmotesAPI.localMapper.isServer) { try { Object.Destroy((Object)(object)((Component)((Component)this).transform).gameObject); } catch (Exception) { } } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain { public class GoblinPainEmitter : MonoBehaviour { public ParticleSystem[] goblinParticleEmitter = Array.Empty<ParticleSystem>(); public float timeBetweenPulse = 0.25f; private int _pulseIndex; private float _timer; private void Update() { _timer -= Time.unscaledDeltaTime; if (!(_timer > 0f)) { _timer = timeBetweenPulse; goblinParticleEmitter[_pulseIndex].Play(); _pulseIndex++; if (_pulseIndex >= goblinParticleEmitter.Length) { _pulseIndex = 0; } } } } public class GoblinPainEmote : AbstractEmote { internal static Dictionary<BoneMapper, Transform> mappersPlayingPain = new Dictionary<BoneMapper, Transform>(); public override string AnimationClipName => "Goblin Pain Emote Scav"; public override CustomEmoteParams GetClipParams() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) CustomEmoteParams val = new CustomEmoteParams(); val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("Emotes/GoblinPain/" + AnimationClipName + ".anim") }; val.primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/GoblinPain/goblin-we-like-to-pain.ogg") }; val.primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("Emotes/GoblinPain/goblin-we-like-to-pain.ogg") }; val.audioLoops = true; val.syncAnim = true; val.syncAudio = true; val.displayName = "Pain"; val.lockType = (LockType)1; val.willGetClaimedByDMCA = false; val.thirdPerson = true; return val; } public override void SpawnProps(BoneMapper mapper) { //IL_00d7: 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) int count = mapper.props.Count; mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("Emotes/GoblinPain/PainHolder.prefab"))); mapper.props[count].GetComponentInChildren<PlayableDirector>().time = CustomAnimationClip.syncTimer[mapper.currentClip.syncPos]; mapper.props[count].GetComponentInChildren<PlayableDirector>().Play(); mapper.props[count].GetComponentInChildren<TwitchChatController>().ownerPlayer = mapper.playerController; mapper.props[count].GetComponentInChildren<TwitchChatDeath>().ownerPlayer = mapper.playerController; mapper.props[count].transform.SetParent(mapper.mapperBody.transform); mapper.props[count].transform.localEulerAngles = Vector3.zero; mapper.props[count].transform.localPosition = new Vector3(0f, 1f, 0f); mappersPlayingPain.Add(mapper, mapper.props[count].transform.Find("LyricsHolder")); foreach (KeyValuePair<BoneMapper, Transform> item in mappersPlayingPain) { ((Component)item.Value).gameObject.SetActive(false); } if (mappersPlayingPain.ContainsKey(CustomEmotesAPI.localMapper)) { ((Component)mappersPlayingPain[CustomEmotesAPI.localMapper]).gameObject.SetActive(true); } else { ((Component)mappersPlayingPain.First().Value).gameObject.SetActive(true); } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain.Data { public interface ITwitchUsernameProvider { TwitchUsername GetUsername(); } [CreateAssetMenu(fileName = "RandomTwitchUsernameGenerator", menuName = "Emotes 2/Twitch/Random Username Generator")] public class RandomTwitchUsernameGenerator : ScriptableObject, ITwitchUsernameProvider { [Range(0f, 1f)] public float chanceOfNumber = 0.05f; public string[] adjectives = Array.Empty<string>(); public string[] nouns = Array.Empty<string>(); public string[] verbs = Array.Empty<string>(); public TwitchUsername GetUsername() { //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_0037: Unknown result type (might be due to invalid IL or missing references) string username = GenerateRandomUsername(); Color usernameColor = Random.ColorHSV(0f, 1f, 1f, 1f, 1f, 1f, 1f, 1f); return new TwitchUsername(username, usernameColor); } private string GenerateRandomUsername() { string text = ""; if (Random.value >= 0.5f) { text += adjectives[Random.Range(0, adjectives.Length)]; } text += nouns[Random.Range(0, nouns.Length)]; text += verbs[Random.Range(0, verbs.Length)]; float value = Random.value; if (value >= 0.5f) { text = text.ToUpper(); } if (value >= 0.75f) { text = text.ToLower(); } if (Random.value <= chanceOfNumber) { text += $"{Random.Range(1, 1000)}"; } return text; } } [CreateAssetMenu(fileName = "RandomTwitchUsernameProvider", menuName = "Emotes 2/Twitch/Random Username Provider")] public class RandomTwitchUsernameProvider : WeightedRandomData<ScriptableObject>, ITwitchUsernameProvider { public TwitchUsername GetUsername() { if (!GetRandomEntry().TryGetValue(out ScriptableObject value)) { return default(TwitchUsername); } if (!(value is ITwitchUsernameProvider twitchUsernameProvider)) { return default(TwitchUsername); } return twitchUsernameProvider.GetUsername(); } } public readonly struct TwitchUsername { public readonly string Username; public readonly Color UsernameColor; public readonly bool HasSpecialMessage; public readonly string? SpecialMessage; public readonly bool HasPrefabOverride; public readonly GameObject? PrefabOverride; public TwitchUsername(string username, Color usernameColor, string? specialMessage = null, GameObject? prefabOverride = null) { //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) SpecialMessage = null; PrefabOverride = null; Username = username; UsernameColor = usernameColor; HasSpecialMessage = !string.IsNullOrWhiteSpace(specialMessage); SpecialMessage = specialMessage; HasPrefabOverride = prefabOverride != null; PrefabOverride = prefabOverride; } } [CreateAssetMenu(fileName = "TwitchUsername", menuName = "Emotes 2/Twitch/Username")] public class TwitchUsernameEntry : ScriptableObject, ITwitchUsernameProvider { public string username = ""; public Color usernameColor; public string specialMessage = ""; public GameObject? prefabOverride; public TwitchUsername GetUsername() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return new TwitchUsername(username, usernameColor, specialMessage, prefabOverride); } } [CreateAssetMenu(fileName = "TwitchUsernameList", menuName = "Emotes 2/Twitch/Username List")] public class TwitchUsernameList : WeightedRandomData<TwitchUsernameEntry>, ITwitchUsernameProvider { public TwitchUsername GetUsername() { if (!GetRandomEntry().TryGetValue(out TwitchUsernameEntry value)) { return default(TwitchUsername); } return value?.GetUsername() ?? default(TwitchUsername); } } [CreateAssetMenu(fileName = "WeightedTwitchUsernameEntry", menuName = "Emotes 2/Twitch/Weighted Username")] public class WeightedTwitchUsernameEntry : WeightedEntry<TwitchUsernameEntry> { } [CreateAssetMenu(fileName = "TwitchUsername", menuName = "Emotes 2/Twitch/Weighted Twitch Username Provider Entry")] public class WeightedTwitchUsernameProviderEntry : WeightedEntry<ScriptableObject> { } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain.Chat { public abstract class AbstractChatWidth : MonoBehaviour { public abstract float GetWidth(); public abstract void SetXPos(float x); public virtual void UpdateState() { } } [CreateAssetMenu(fileName = "EmoteEntry", menuName = "Emotes 2/Twitch/Emote Entry")] public class ChatEmoteEntry : ScriptableObject { public string emoteName = ""; public GameObject? prefab; } [CreateAssetMenu(fileName = "ChatEmoteList", menuName = "Emotes 2/Twitch/Chat Emote List")] public class ChatEmoteList : ScriptableObject { public ChatEmoteEntry[] emoteEntries = Array.Empty<ChatEmoteEntry>(); private readonly Dictionary<string, GameObject?> _emoteLut = new Dictionary<string, GameObject>(); private string[]? _emoteNames; private string[]? _emoteKeys; public string[] EmoteNames { get { if (_emoteNames != null) { return _emoteNames; } _emoteNames = new string[emoteEntries.Length]; for (int i = 0; i < _emoteNames.Length; i++) { _emoteNames[i] = emoteEntries[i].emoteName; } return _emoteNames; } } public string[] EmoteKeys { get { if (_emoteKeys != null) { return _emoteKeys; } _emoteKeys = new string[emoteEntries.Length]; for (int i = 0; i < _emoteKeys.Length; i++) { _emoteKeys[i] = ":" + emoteEntries[i].emoteName + ":"; } return _emoteKeys; } } public GameObject? this[string emoteName] => CollectionExtensions.GetValueOrDefault(_emoteLut, emoteName); private void Awake() { _emoteLut.Clear(); ChatEmoteEntry[] array = emoteEntries; foreach (ChatEmoteEntry chatEmoteEntry in array) { _emoteLut[chatEmoteEntry.emoteName] = chatEmoteEntry.prefab; } } } public class ChatEmoteWidth : AbstractChatWidth { public float width; public override float GetWidth() { return width; } public override void SetXPos(float x) { //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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)this).transform; Vector3 localPosition = transform.localPosition; transform.localPosition = new Vector3(x, localPosition.y, localPosition.z); } } [ExecuteAlways] public class ChatMessageController : MonoBehaviour { public TextMeshPro? usernameLabel; public Transform? content; public GameObject? textPrefab; public ChatEmoteList? emoteList; public AbstractChatWidth[] chatComponents = Array.Empty<AbstractChatWidth>(); public bool forceClear; private readonly List<AbstractChatWidth> _generatedChatComponents = new List<AbstractChatWidth>(); public void SetChat(string username, Color usernameColor, string message) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (usernameLabel != null) { ClearGenerated(); ((TMP_Text)usernameLabel).color = usernameColor; ((TMP_Text)usernameLabel).text = username; GenMessageComponents(message); UpdateLayout(); } } private void OnDestroy() { ClearGenerated(); } private void UpdateLayout() { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) float num = 0f; AbstractChatWidth[] array = chatComponents; foreach (AbstractChatWidth abstractChatWidth in array) { abstractChatWidth.SetXPos(num); num += abstractChatWidth.GetWidth(); abstractChatWidth.UpdateState(); } foreach (AbstractChatWidth generatedChatComponent in _generatedChatComponents) { generatedChatComponent.SetXPos(num); num += generatedChatComponent.GetWidth(); generatedChatComponent.UpdateState(); } if (content != null) { content.localPosition = new Vector3((0f - num) / 2f, 0f, 0f); } } private void ClearGenerated() { if (forceClear) { _generatedChatComponents.Clear(); forceClear = false; return; } foreach (AbstractChatWidth generatedChatComponent in _generatedChatComponents) { if (generatedChatComponent != null) { Object.DestroyImmediate((Object)(object)((Component)generatedChatComponent).gameObject, false); } } _generatedChatComponents.Clear(); } private void GenMessageComponents(string message) { if (content == null || textPrefab == null || emoteList == null) { return; } message = ExpandMessageMacros(message); string[] array = message.Split(emoteList.EmoteKeys, StringSplitOptions.None); List<string> emoteComponents = GetEmoteComponents(message); int num = 0; string[] array2 = array; foreach (string text in array2) { if (!string.IsNullOrEmpty(text)) { GameObject val = Object.Instantiate<GameObject>(textPrefab, content); val.transform.SetAsLastSibling(); TextMeshProChatWidth component = val.GetComponent<TextMeshProChatWidth>(); TextMeshPro label = component.label; if (label == null) { break; } ((TMP_Text)label).text = text; _generatedChatComponents.Add(component); } if (num < emoteComponents.Count) { string emoteName = emoteComponents[num].Replace(":", ""); num++; GameObject val2 = emoteList[emoteName]; if (val2 != null) { GameObject val3 = Object.Instantiate<GameObject>(val2, content); val2.transform.SetAsLastSibling(); ChatEmoteWidth component2 = val3.GetComponent<ChatEmoteWidth>(); _generatedChatComponents.Add(component2); } } } } private static List<string> GetEmoteComponents(string message) { List<string> list = new List<string>(); bool flag = false; string text = ""; for (int i = 0; i < message.Length; i++) { char c = message[i]; if (c == ':') { if (!flag) { flag = true; continue; } flag = false; list.Add(text); text = ""; } if (flag) { text += c; } } return list; } private static string ExpandMessageMacros(string message) { if (!message.Contains("[")) { return message; } string text = ""; bool flag = false; bool flag2 = false; string text2 = ""; int? num = null; int? num2 = null; string text3 = ""; for (int i = 0; i < message.Length; i++) { char c = message[i]; if (c == '[') { flag = true; num = null; num2 = null; text2 = ""; } else if (flag) { switch (c) { case ',': { if (!int.TryParse(text2, out var result)) { flag = false; continue; } text2 = ""; num = result; continue; } case ']': { if (!int.TryParse(text2, out var result2)) { flag = false; continue; } text2 = ""; num2 = result2; continue; } case '(': if (!flag2 && num.HasValue && num2.HasValue) { flag2 = true; flag = false; text3 = ""; continue; } break; } if (!flag2) { text2 += c; } } else if (flag2 && num.HasValue && num2.HasValue) { if (c != ')') { text3 += c; continue; } int num3 = Random.Range(num.Value, num2.Value); for (int j = 0; j < num3; j++) { text += text3; } flag2 = false; } else { text += c; } } return text; } } [ExecuteAlways] [RequireComponent(typeof(TextMeshPro))] public class TextMeshProChatWidth : AbstractChatWidth { public TextMeshPro? label; public RectTransform? rectTransform; public override float GetWidth() { return TextWidthApproximation() / 10f; } public override void SetXPos(float x) { //IL_0019: 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) if (rectTransform != null) { Vector2 anchoredPosition = default(Vector2); ((Vector2)(ref anchoredPosition))..ctor(x, rectTransform.anchoredPosition.y); rectTransform.anchoredPosition = anchoredPosition; } } public override void UpdateState() { UpdateWidth(); } private void Awake() { if (rectTransform == null) { rectTransform = ((Component)this).GetComponent<RectTransform>(); } } private void OnEnable() { if (rectTransform == null) { rectTransform = ((Component)this).GetComponent<RectTransform>(); } UpdateWidth(); } public void UpdateWidth() { //IL_001e: 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) if (rectTransform != null) { Vector2 sizeDelta = default(Vector2); ((Vector2)(ref sizeDelta))..ctor(GetWidth(), rectTransform.sizeDelta.y); rectTransform.sizeDelta = sizeDelta; } } private float TextWidthApproximation() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_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_0079: 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_007d: Invalid comparison between Unknown and I4 //IL_00d0: 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) if (label == null) { return 0f; } string text = ((TMP_Text)label).text; float fontSize = ((TMP_Text)label).fontSize; TMP_FontAsset font = ((TMP_Text)label).font; FontStyles fontStyle = ((TMP_Text)label).fontStyle; FaceInfo faceInfo = font.faceInfo; float num = ((FaceInfo)(ref faceInfo)).pointSize; faceInfo = font.faceInfo; float num2 = fontSize / (num * ((FaceInfo)(ref faceInfo)).scale); float num3 = fontSize * 0.01f; float num4 = (((fontStyle & 1) == 1) ? font.boldSpacing : 0f); float normalSpacingOffset = font.normalSpacingOffset; float num5 = 0f; string text2 = text; foreach (char key in text2) { if (font.characterLookupTable.TryGetValue(key, out var value)) { float num6 = num5; GlyphMetrics metrics = ((TMP_TextElement)value).glyph.metrics; num5 = num6 + (((GlyphMetrics)(ref metrics)).horizontalAdvance * num2 + (num4 + normalSpacingOffset) * num3); } } return num5; } } public class TwitchAlertMonitor : MonoBehaviour { public TwitchChatController? chatController; private IEnumerator? _stopAlertCoroutine; private void Awake() { GameEventBus.OnRadiationWarningHUD += OnRadiationWarning; } private void OnDestroy() { GameEventBus.OnRadiationWarningHUD -= OnRadiationWarning; } private void OnRadiationWarning() { if (chatController != null) { chatController.alertActive = true; if (_stopAlertCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_stopAlertCoroutine); _stopAlertCoroutine = null; } _stopAlertCoroutine = StopAlert(); ((MonoBehaviour)this).StartCoroutine(_stopAlertCoroutine); } } private IEnumerator StopAlert() { yield return (object)new WaitForSeconds(5f); if (chatController != null) { chatController.alertActive = false; } } } public class TwitchChatController : MonoBehaviour { public GameObject? chatPrefab; public PlayerControllerB? ownerPlayer; public float timeBetweenPulses = 0.25f; public RandomTwitchUsernameProvider? twitchUsernameProvider; public float[] weights = Array.Empty<float>(); public string[] messages = Array.Empty<string>(); [Range(0f, 1f)] public float fearFactor = 0f; public float fearWeight = 160f; public int[] fearIndices = Array.Empty<int>(); public bool alertActive = false; public float alertWeight = 100f; public int[] alertIndices = Array.Empty<int>(); private float _timer; private void Update() { _timer -= Time.unscaledDeltaTime; if (!(_timer > 0f)) { _timer = timeBetweenPulses; if (ownerPlayer != null) { fearFactor = ownerPlayer.playersManager.fearLevel; } SpawnChatMessage(); } } private void SpawnChatMessage() { //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_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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_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_006d: 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_003d: 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_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: 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_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_011c: Unknown result type (might be due to invalid IL or missing references) if (twitchUsernameProvider != null) { Vector3 val = Vector3.zero; if (ownerPlayer != null) { val = ownerPlayer.thisController.velocity; } Vector3 val2 = ((Component)this).transform.position + val + Random.insideUnitSphere * Random.Range(2f, 6f); TwitchUsername username = twitchUsernameProvider.GetUsername(); GameObject val3 = ((!username.HasPrefabOverride || username.PrefabOverride == null) ? Object.Instantiate<GameObject>(chatPrefab, val2, Quaternion.AngleAxis(0f, Vector3.up)) : Object.Instantiate<GameObject>(username.PrefabOverride, val2, Quaternion.AngleAxis(0f, Vector3.up))); if (val3 != null) { ChatMessageController component = val3.GetComponent<ChatMessageController>(); component.SetChat(message: (!username.HasSpecialMessage || string.IsNullOrWhiteSpace(username.SpecialMessage)) ? GetRandomMessage() : username.SpecialMessage, username: username.Username, usernameColor: username.UsernameColor); } } } private string GetRandomMessage() { if (weights.Length != messages.Length) { return ""; } if (weights.Length == 0) { return ""; } float num = 0f; for (int i = 0; i < weights.Length; i++) { float num2 = weights[i]; if (float.IsPositiveInfinity(num2)) { return messages[i]; } if (num2 >= 0f && !float.IsNaN(num2)) { num += num2; } } float value = Random.value; float num3 = 0f; for (int j = 0; j < weights.Length; j++) { float num4 = weights[j]; if (!float.IsNaN(num4) && !(num4 <= 0f)) { num3 += num4 / num; if (num3 >= value) { return messages[j]; } } } return ""; } } public class TwitchChatDeath : MonoBehaviour { public PlayerControllerB? ownerPlayer; public GameObject? deadPrefab; private float timer = 0f; private Vector3 desiredPostion; private void Update() { //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) timer += Time.deltaTime; if (timer > 0.5f && ownerPlayer != null && !ownerPlayer.isPlayerDead) { timer = 0f; desiredPostion = ((Component)this).transform.position; } } private void OnDestroy() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //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) if (deadPrefab != null && ownerPlayer != null && ownerPlayer.isPlayerDead) { Object.Instantiate<GameObject>(deadPrefab, desiredPostion, Quaternion.AngleAxis(0f, Vector3.up)); } } } } namespace LcEmotes2AndKnucklesFeaturingDante.Emotes.GoblinPain.Chat.Timeline { public class TwitchChatControlAsset : PlayableAsset, ITimelineClipAsset { public float[] weights = Array.Empty<float>(); public string[] messages = Array.Empty<string>(); public ClipCaps clipCaps => (ClipCaps)16; public override Playable CreatePlayable(PlayableGraph graph, GameObject owner) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: 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_0022: 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_002b: Unknown result type (might be due to invalid IL or missing references) ScriptPlayable<TwitchChatControllerBehaviour> val = ScriptPlayable<TwitchChatControllerBehaviour>.Create(graph, 0); TwitchChatControllerBehaviour behaviour = val.GetBehaviour(); behaviour.weights = weights.Copy(); return ScriptPlayable<TwitchChatControllerBehaviour>.op_Implicit(val); } } public class TwitchChatControllerBehaviour : PlayableBehaviour { public float[] weights = Array.Empty<float>(); } public class TwitchChatControllerMixerBehaviour : PlayableBehaviour { public override void ProcessFrame(Playable playable, FrameData info, object playerData) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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) if (!(playerData is TwitchChatController twitchChatController)) { return; } int[] fearIndices = twitchChatController.fearIndices; int[] alertIndices = twitchChatController.alertIndices; float[] array = new float[twitchChatController.weights.Length]; int inputCount = PlayableExtensions.GetInputCount<Playable>(playable); for (int i = 0; i < inputCount; i++) { float inputWeight = PlayableExtensions.GetInputWeight<Playable>(playable, i); TwitchChatControllerBehaviour behaviour = ((ScriptPlayable<TwitchChatControllerBehaviour>)PlayableExtensions.GetInput<Playable>(playable, i)).GetBehaviour(); for (int j = 0; j < array.Length; j++) { if (!fearIndices.Contains(j) && !alertIndices.Contains(j)) { array[j] += behaviour.weights[j] * inputWeight; } } int[] fearIndices2 = twitchChatController.fearIndices; foreach (int num in fearIndices2) { array[num] += twitchChatController.fearWeight * inputWeight * twitchChatController.fearFactor; } float num2 = (twitchChatController.alertActive ? 1f : 0f); int[] alertIndices2 = twitchChatController.alertIndices; foreach (int num3 in alertIndices2) { array[num3] += twitchChatController.alertWeight * inputWeight * num2; } } twitchChatController.weights = array; } } [TrackClipType(typeof(TwitchChatControlAsset))] [TrackBindingType(typeof(TwitchChatController))] public class TwitchChatControlTrack : TrackAsset { public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) { //IL_0022: 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_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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: 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_00d5: Unknown result type (might be due to invalid IL or missing references) PlayableDirector component = go.GetComponent<PlayableDirector>(); Object genericBinding = component.GetGenericBinding((Object)(object)this); if (!(genericBinding is TwitchChatController twitchChatController)) { return ScriptPlayable<TwitchChatControllerMixerBehaviour>.op_Implicit(ScriptPlayable<TwitchChatControllerMixerBehaviour>.Create(graph, inputCount)); } foreach (TimelineClip clip in ((TrackAsset)this).GetClips()) { if (clip.asset is TwitchChatControlAsset twitchChatControlAsset) { twitchChatControlAsset.messages = twitchChatController.messages.Copy(); if (twitchChatControlAsset.weights.Length != twitchChatController.weights.Length) { Array.Resize(ref twitchChatControlAsset.weights, twitchChatController.weights.Length); } } } return ScriptPlayable<TwitchChatControllerMixerBehaviour>.op_Implicit(ScriptPlayable<TwitchChatControllerMixerBehaviour>.Create(graph, inputCount)); } } } namespace LcEmotes2AndKnucklesFeaturingDante.Common { public class FaceCameraProxy : MonoBehaviour { private Camera? _targetCamera; public Transform? targetToRotate; public bool copyX; public bool copyY; public bool copyZ; private void Update() { if (targetToRotate != null) { if (_targetCamera == null) { _targetCamera = FindBestCamera(); } if (_targetCamera != null) { ((Component)this).transform.LookAt(((Component)_targetCamera).transform); ((Component)this).transform.Rotate(0f, 180f, 0f, (Space)1); } } } private void LateUpdate() { //IL_0019: 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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_0062: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_008a: 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_0096: Unknown result type (might be due to invalid IL or missing references) if (targetToRotate != null) { Vector3 eulerAngles = ((Component)this).transform.eulerAngles; Vector3 eulerAngles2 = targetToRotate.eulerAngles; if (!copyX) { ((Vector3)(ref eulerAngles))..ctor(eulerAngles2.x, eulerAngles.y, eulerAngles.z); } if (!copyY) { ((Vector3)(ref eulerAngles))..ctor(eulerAngles.x, eulerAngles2.y, eulerAngles.z); } if (!copyZ) { ((Vector3)(ref eulerAngles))..ctor(eulerAngles.x, eulerAngles.y, eulerAngles2.z); } targetToRotate.eulerAngles = eulerAngles; } } private Camera? FindBestCamera() { if (StartOfRound.Instance != null && StartOfRound.Instance.localPlayerController != null) { return StartOfRound.Instance.localPlayerController.gameplayCamera; } if (Camera.current != null) { return Camera.current; } return null; } } internal static class GameEventBus { private static Hook? _radiationWarningHUDHook; private static Hook? _switchSuitForPlayerHook; private static Hook? networkManagerStartHook; private static Hook? playerControllerStartHook; private static Hook? shootGunHook; private static GameObject emotes2networker; public static event Action? OnRadiationWarningHUD; public static void InitHooks() { _radiationWarningHUDHook = HookUtils.NewHook<HUDManager>("RadiationWarningHUD", typeof(GameEventBus), "RadiationWarningHUD", isStatic: false); _switchSuitForPlayerHook = HookUtils.NewHook<UnlockableSuit>("SwitchSuitForPlayer", typeof(GameEventBus), "SwitchSuitForPlayer", isStatic: true); _radiationWarningHUDHook = HookUtils.NewHook<PlayerControllerB>("Start", typeof(GameEventBus), "PlayerControllerStart", isStatic: false); _switchSuitForPlayerHook = HookUtils.NewHook<GameNetworkManager>("Start", typeof(GameEventBus), "NetworkManagerStart", isStatic: false); shootGunHook = HookUtils.NewHook<ShotgunItem>("ShootGun", typeof(GameEventBus), "ShootGun", isStatic: false); } private static void RadiationWarningHUD(Action<HUDManager> orig, HUDManager self) { orig(self); GameEventBus.OnRadiationWarningHUD?.Invoke(); } private static void SwitchSuitForPlayer(Action<PlayerControllerB, int, bool> orig, PlayerControllerB player, int suitID, bool playAudio = true) { if (CustomEmotesAPI.ModelReplacementAPIPresent) { ModelReplacementAPICompat.RemovePlayerFromPool(player); } if (CustomEmotesAPI.VRMPresent) { LethalVRMCompat.RemovePlayerFromPool(player); } orig(player, suitID, playAudio); if (BoneMapper.playersToMappers.ContainsKey(((Component)player).gameObject) && BoneMapper.playersToMappers[((Component)player).gameObject].currentClipName == "com.gemumoddo.lc_emotes2_and_knuckles_featuring_dante__LightsCameraActionStart") { ((MonoBehaviour)BoneMapper.playersToMappers[((Component)player).gameObject]).StartCoroutine(LightsCameraActionEmote.FinishPropAfterFrame(BoneMapper.playersToMappers[((Component)player).gameObject])); } } private static void PlayerControllerStart(Action<PlayerControllerB> orig, PlayerControllerB self) { orig(self); if (((NetworkBehaviour)self).IsServer && (Object)(object)Emotes2Networking.instance == (Object)null) { GameObject val = Object.Instantiate<GameObject>(emotes2networker); val.GetComponent<NetworkObject>().Spawn(true); } } private static void NetworkManagerStart(Action<GameNetworkManager> orig, GameNetworkManager self) { try { emotes2networker = Assets.Load<GameObject>("assets/emotes/networkerlmao.prefab"); emotes2networker.AddComponent<Emotes2Networking>(); ((Component)GameNetworkManager.Instance).GetComponent<NetworkManager>().PrefabHandler.AddNetworkPrefab(emotes2networker); } catch (Exception) { DebugClass.Log((object)"couldn't setup emotes2 networker"); } orig(self); } private static void ShootGun(Action<ShotgunItem, Vector3, Vector3> orig, ShotgunItem self, Vector3 shotgunPosition, Vector3 shotgunForward) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: 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) orig(self, shotgunPosition, shotgunForward); try { RaycastHit[] enemyColliders = self.enemyColliders; for (int i = 0; i < enemyColliders.Length; i++) { RaycastHit val = enemyColliders[i]; if (((RaycastHit)(ref val)).transform != null && ((Object)((RaycastHit)(ref val)).transform).name == "Window9(Clone)") { ((Component)((RaycastHit)(ref val)).transform).GetComponent<WindowHandler>().OnHit(); } } } catch (Exception) { } } } public class Emotes2Networking : NetworkBehaviour { public static Emotes2Networking instance; private void Awake() { ((Object)this).name = "Emotes2_Networker"; instance = this; } [ClientRpc] public void SyncRandomVideoToClientRpc(ulong netId, int randomNumber, int randomEasterEgg, int useEasterEgg, float randomPercentage) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Invalid comparison between Unknown and I4 //IL_005f: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (mig