Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of JollyLethal v1.2.1
mishelin.JollyLethal.dll
Decompiled 4 months agousing 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.Logging; using HarmonyLib; using JollyLethal.HatActions; using JollyLethal.HatConfigs; using JollyLethal.Helper; using LobbyCompatibility.Attributes; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("mishelin.JollyLethal")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.2.1.0")] [assembly: AssemblyInformationalVersion("1.2.1+c1ec449fee9f0aabe62c567aed112ee3aaa579f0")] [assembly: AssemblyProduct("JollyLethal")] [assembly: AssemblyTitle("mishelin.JollyLethal")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.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 JollyLethal { [BepInPlugin("mishelin.JollyLethal", "JollyLethal", "1.2.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [LobbyCompatibility(/*Could not decode attribute arguments.*/)] public class JollyLethal : BaseUnityPlugin { internal static AssetBundle? myCustomAssets; internal static GameObject mySantaHat; internal const string myJollyHatSpawnedObjName = "mishelin.JollyLethal.JollyHatParent"; public static JollyLethal Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; LoadAssets(); Patch(); Logger.LogInfo((object)"mishelin.JollyLethal v1.2.1 has loaded!"); } internal void LoadAssets() { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); myCustomAssets = AssetLoader.AssetsAwake(directoryName); if (myCustomAssets != null) { mySantaHat = AssetLoader.LoadSantaHat(myCustomAssets); } } internal static void Patch() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown if (Harmony == null) { Harmony = new Harmony("mishelin.JollyLethal"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(); Logger.LogDebug((object)"Finished patching!"); } internal static void Unpatch() { Logger.LogDebug((object)"Unpatching..."); Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } Logger.LogDebug((object)"Finished unpatching!"); } internal static void PluginLogInfoWithPrefix(string content) { Logger.LogInfo((object)("[EVIL] " + content)); } internal static void PluginLogErrorWithPrefix(string content) { Logger.LogError((object)("[EVIL] " + content)); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "mishelin.JollyLethal"; public const string PLUGIN_NAME = "JollyLethal"; public const string PLUGIN_VERSION = "1.2.1"; } } namespace JollyLethal.Helper { internal static class AssetLoader { private const string ASSET_BUNDLE_NAME = "lethal-mod-asset"; public static AssetBundle? AssetsAwake(string assemblyPath) { if (string.IsNullOrEmpty(assemblyPath)) { JollyLethal.PluginLogErrorWithPrefix("Invalid assebmly path!!!"); return null; } AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(assemblyPath, "lethal-mod-asset")); if (val == null) { JollyLethal.PluginLogErrorWithPrefix("Failed to load custom assets !!!"); return null; } JollyLethal.PluginLogInfoWithPrefix("Successfully loaded custom assets."); return val; } public static GameObject LoadSantaHat(AssetBundle customAssets) { GameObject result = customAssets.LoadAsset<GameObject>("assets/hatparent.prefab"); JollyLethal.PluginLogInfoWithPrefix("Successfully loaded in santa hat"); return result; } } } namespace JollyLethal.HatFixes { [HarmonyPatch(typeof(EnemyAI))] internal class FixHatPositionOnEnemyStateChange { [CompilerGenerated] private sealed class <HandleManeaterStateChange>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public int state; public Transform enemy; public Transform hat; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <HandleManeaterStateChange>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_00c7: 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_00cf: 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_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0076: 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: 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) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(2.5f); <>1__state = 1; return true; case 1: <>1__state = -1; JollyLethal.PluginLogInfoWithPrefix("Handling Maneaters change of state"); if (state != 2 && IsManeaterInBabyState(enemy)) { JollyLethal.PluginLogInfoWithPrefix("Changing hat position due to change of maneater appearance to smol"); var (pathToNewObj, pos, rot, scale) = EnemyHatConfigs.GetManeaterSantaHatConfig(); JollyHatActions.HatChangeParent(enemy, hat, pathToNewObj); JollyHatActions.ApplyOffsetsToHat(hat, pos, rot, scale); } else { JollyLethal.PluginLogInfoWithPrefix("Changing hat position due to change of maneater appearance to big"); var (pathToNewObj2, pos2, rot2, scale2) = EnemyHatConfigs.GetManeaterBigSantaHatConfig(); JollyHatActions.HatChangeParent(enemy, hat, pathToNewObj2); JollyHatActions.ApplyOffsetsToHat(hat, pos2, rot2, scale2); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [HarmonyPatch("SwitchToBehaviourStateOnLocalClient")] [HarmonyPostfix] private static void FixEnemyHatPosition(EnemyAI __instance, int stateIndex) { Transform val = RecursiveFindChild(((Component)__instance).transform, "mishelin.JollyLethal.JollyHatParent"); if (val == null) { return; } string enemyName = __instance.enemyType.enemyName; if (!(enemyName == "Jester")) { if (enemyName == "Maneater") { ((MonoBehaviour)__instance).StartCoroutine(HandleManeaterStateChange(((Component)__instance).transform, val, stateIndex)); } } else { HandleJesterStateChange(((Component)__instance).transform, val, stateIndex); } } private static void HandleJesterStateChange(Transform enemy, Transform hat, int state) { //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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0076: 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) JollyLethal.PluginLogInfoWithPrefix("Handling Jesters change of state"); switch (state) { case 0: case 1: { JollyLethal.PluginLogInfoWithPrefix("Changing hat position due to change of jester state to winding/chilling"); (string?, Vector3, Vector3, float) jesterSantaHatConfig = EnemyHatConfigs.GetJesterSantaHatConfig(); Vector3 item = jesterSantaHatConfig.Item2; Vector3 item2 = jesterSantaHatConfig.Item3; float item3 = jesterSantaHatConfig.Item4; JollyHatActions.ApplyOffsetsToHat(hat, item, item2, item3); break; } case 2: JollyLethal.PluginLogInfoWithPrefix("Changing hat position due to change of jester state to popped"); var (pathToNewObj, pos, rot, scale) = EnemyHatConfigs.GetJesterPoppedSantaHatConfig(); JollyHatActions.HatChangeParent(enemy, hat, pathToNewObj); JollyHatActions.ApplyOffsetsToHat(hat, pos, rot, scale); break; } } [IteratorStateMachine(typeof(<HandleManeaterStateChange>d__2))] private static IEnumerator HandleManeaterStateChange(Transform enemy, Transform hat, int state) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <HandleManeaterStateChange>d__2(0) { enemy = enemy, hat = hat, state = state }; } internal static bool IsManeaterInBabyState(Transform maneater) { if (((Component)maneater.Find("BabyMeshContainer")).gameObject.activeSelf) { return !((Component)maneater.Find("MeshContainer")).gameObject.activeSelf; } return false; } internal static Transform? RecursiveFindChild(Transform parent, string childName) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown foreach (Transform item in parent) { Transform val = item; if (((Object)val).name == childName) { return val; } Transform val2 = RecursiveFindChild(val, childName); if (val2 != null) { return val2; } } return null; } } [HarmonyPatch(typeof(RoundManager))] internal class PutHatOnDormantOldBird { [HarmonyPatch("SpawnNestObjectForOutsideEnemy")] [HarmonyPostfix] private static void AddHatToDormantOldBird(RoundManager __instance) { foreach (EnemyAINestSpawnObject enemyNestSpawnObject in __instance.enemyNestSpawnObjects) { string enemyName = enemyNestSpawnObject.enemyType.enemyName; JollyLethal.PluginLogInfoWithPrefix("NestSpawn: " + enemyName); if (enemyName == "RadMech") { PlaceHatOnDormantOldBird(enemyNestSpawnObject); } } } private static void PlaceHatOnDormantOldBird(EnemyAINestSpawnObject enemy) { JollyLethal.PluginLogInfoWithPrefix("Dormant birdo"); PlaceHatsOnEnemiesPatch.PlaceHatOnEnemyTransform(((Component)enemy).transform, enemy.enemyType); } } } namespace JollyLethal.HatConfigs { internal class EnemyHatConfigs { internal static (string?, Vector3, Vector3, float) GetBrackenSantaHatConfig() { //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) return ("FlowermanModel/AnimContainer/metarig/Torso1/Torso2/Torso3/Neck1/Neck2/Head1/Head2", new Vector3(0f, 0f, 0f), new Vector3(0f, 115f, 0f), 2f); } internal static (string?, Vector3, Vector3, float) GetHoardingBugSantaHatConfig() { //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) return ("HoarderBugModel/AnimContainer/Armature/Abdomen/Chest/Head", new Vector3(0.25f, 2.2f, 0.1f), new Vector3(15f, 20f, 330f), 3f); } internal static (string?, Vector3, Vector3, float) GetSnareFleaSantaHatConfig() { //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) return ("CentipedeModel/AnimContainer/Armature/Head", new Vector3(0f, 0.4f, 0.25f), new Vector3(0f, 90f, 90f), 1.5f); } internal static (string?, Vector3, Vector3, float) GetThumperSantaHatConfig() { //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) return ("CrawlerModel/AnimContainer/metarig/spine/spine.003/spine.004", new Vector3(0f, 0.2635f, -0.02f), new Vector3(64f, 168f, 341f), 0.3f); } internal static (string?, Vector3, Vector3, float) GetBunkerSpiderSantaHatConfig() { //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) return ("MeshContainer/AnimContainer/Armature/Head", new Vector3(0f, 0.9101f, 0.5545f), new Vector3(19f, 274f, 252f), 1.7525f); } internal static (string?, Vector3, Vector3, float) GetJesterSantaHatConfig() { //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) return ("MeshContainer/AnimContainer/metarig/BoxContainer/spine.004/spine.005", new Vector3(-2.32f, -8.6f, 2.75f), new Vector3(344f, 292f, 181f), 18f); } internal static (string?, Vector3, Vector3, float) GetJesterPoppedSantaHatConfig() { //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) return ("MeshContainer/AnimContainer/metarig/BoxContainer/spine.004/spine.005/spine.006/UpperJaw", new Vector3(0f, 0.1f, 1.2f), new Vector3(0f, 115f, 0f), 3f); } internal static (string?, Vector3, Vector3, float) GetNutcrackerSantaHatConfig() { //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) return ("MeshContainer/AnimContainer/metarig/spinecontainer/spine/spine.001/head", new Vector3(0f, 0.5f, 0f), new Vector3(0f, 115f, 0f), 0.668f); } internal static (string?, Vector3, Vector3, float) GetSpringSantaHatConfig() { //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) return ("SpringManModel/AnimContainer/metarig/spine/spine.001/spine.002/spine.003/springBone/springBone.001/springBone.002", new Vector3(0f, 0.3f, 0f), new Vector3(0f, 115f, 0f), 0.25f); } internal static (string?, Vector3, Vector3, float) GetMaskedSantaHatConfig() { //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) return ("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/spine.004", new Vector3(0f, 0.27f, 0.05f), new Vector3(0f, 115f, 0f), 0.55f); } internal static (string?, Vector3, Vector3, float) GetButlerSantaHatConfig() { //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) return ("MeshContainer/metarig/spine/spine.001/NeckContainer/spine.004/face", new Vector3(0f, 0.3f, 0f), new Vector3(0f, 115f, 0f), 0.8f); } internal static (string?, Vector3, Vector3, float) GetManeaterSantaHatConfig() { //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) return ("BabyMeshContainer/BabyAnimContainer/Spine1/Spine3", new Vector3(-0.0067f, 0.4368f, 0.0076f), new Vector3(302f, 358f, 1f), 2f); } internal static (string?, Vector3, Vector3, float) GetManeaterBigSantaHatConfig() { //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) return ("MeshContainer/AnimContainer/Spine/Spine1/Spine2/Bone.003", new Vector3(0f, 0f, -0.5f), new Vector3(280f, 180f, 180f), 3f); } internal static (string?, Vector3, Vector3, float) GetSporeLizardSantaHatConfig() { //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) return ("PufferModel/AnimContainer/Armature/Base/Chest/Neck", new Vector3(0.5f, 0.5f, 0f), new Vector3(30f, 10f, 290f), 1f); } internal static (string?, Vector3, Vector3, float) GetMouthDogSantaHatConfig() { //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) return ("MouthDogModel/AnimContainer/Armature/Neck1Container/Neck1/Neck2/JawUpper/", new Vector3(0f, 0.233f, -0.5545f), new Vector3(20f, 80f, 240f), 2.5f); } internal static (string?, Vector3, Vector3, float) GetBaboonHawkSantaHatConfig() { //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) return ("BaboonBirdModel/AnimContainer/metarig/spine/spine.001/spine.003/spine.004/HeadBoneContainer", new Vector3(0f, 0.3f, 0.25f), new Vector3(0f, 90f, 0f), 0.7f); } internal static (string?, Vector3, Vector3, float) GetForestGiantSantaHatConfig() { //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) return ("FGiantModelContainer/AnimContainer/metarig/spine/spine.003", new Vector3(0f, 0.5f, 0.05f), new Vector3(0f, 115f, 0f), 0.6f); } internal static (string?, Vector3, Vector3, float) GetOldBirdSantaHatConfig() { //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) return ("MeshContainer/AnimContainer/metarig/TorsoContainer/Torso", new Vector3(0f, 4.4f, 0f), new Vector3(0f, 25f, 0f), 2.5f); } internal static (string?, Vector3, Vector3, float) GetTulipSnakeSantaHatConfig() { //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) return ("FlowerLizardModel/AnimContainer/Armature/Belly/LowerChest/Chest/Chest.001/JawUpper/", new Vector3(0f, 0.6f, 0.4f), new Vector3(48f, 270f, 270f), 2f); } internal static (string?, Vector3, Vector3, float) GetGirlSantaHatConfig() { //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) return ("DressGirlModel/AnimContainer/metarig/spine/spine.002/spine.003/spine.004", new Vector3(0f, 0.27f, -0.035f), new Vector3(10f, 115f, 340f), 0.4f); } internal static (string?, Vector3, Vector3, float) GetBlobSantaHatConfig() { //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) return ("Armature/Center", new Vector3(0f, 1.6f, 0f), new Vector3(0f, 170f, 0f), 3f); } internal static (string?, Vector3, Vector3, float) GetKidnapperFoxSantaHatConfig() { return GetIncompatibleSantaHatConfig(); } internal static (string?, Vector3, Vector3, float) GetBarberSantaHatConfig() { return GetIncompatibleSantaHatConfig(); } internal static (string?, Vector3, Vector3, float) GetIncompatibleSantaHatConfig() { //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) return (null, Vector3.zero, Vector3.zero, 0f); } internal static (string?, Vector3, Vector3, float) GetDefaultSantaHatConfig() { //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) return (null, Vector3.zero, Vector3.zero, 0f); } } internal class ObjectHatConfigs { internal const string CatBonePath = "Cat_Simple_anim_IP/Arm_Cat/root_bone/Spine_base/spine_02/spine_03/spine_04/spine_05/neck/head"; internal const string TeethBonePath = "AnimContainer/MeshContainer/JawUpper"; internal static (bool, Vector3, Vector3, float) GetRubberDuckySantaHatConfig() { //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) return (true, new Vector3(0f, -0.2f, 2f), new Vector3(0f, 0f, 180f), 1f); } internal static (bool, Vector3, Vector3, float) GetGiftSantaHatConfig() { //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) return (true, new Vector3(0.7f, 1.5f, 2.2f), new Vector3(0f, 0f, 200f), 1f); } internal static (bool, Vector3, Vector3, float) GetTeethSantaHatConfig() { //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) return (true, new Vector3(0.7f, 1.5f, 2.2f), new Vector3(10f, 120f, 0f), 6f); } internal static (bool, Vector3, Vector3, float) GetCatSantaHatConfig() { //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) return (true, new Vector3(0f, 0.035f, 0.06f), new Vector3(80f, 0f, 0f), 0.11f); } internal static (bool, Vector3, Vector3, float) GetBeeHiveSantaHatConfig() { //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) return (true, new Vector3(0f, 1f, 0.2f), new Vector3(0f, 225f, 0f), 1.75f); } internal static (bool, Vector3, Vector3, float) GetFancyLampSantaHatConfig() { //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) return (true, new Vector3(0f, 0f, 2.25f), new Vector3(270f, 180f, 0f), 1f); } internal static (bool, Vector3, Vector3, float) GetPlasticCupSantaHatConfig() { //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) return (true, new Vector3(0f, 0f, 0.4f), new Vector3(270f, 180f, 0f), 0.9f); } internal static (bool, Vector3, Vector3, float) GetPicklesSantaHatConfig() { //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) return (true, new Vector3(0f, 0f, 2f), new Vector3(90f, 0f, 0f), 3f); } internal static (bool, Vector3, Vector3, float) GetToyRobotSantaHatConfig() { //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) return (true, new Vector3(0f, 0f, 2.35f), new Vector3(90f, 0f, 0f), 1.25f); } internal static (bool, Vector3, Vector3, float) GetOldPhoneSantaHatConfig() { //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) return (true, new Vector3(0f, 0.85f, 0f), new Vector3(0f, 115f, 0f), 1f); } internal static (bool, Vector3, Vector3, float) GetPlasticFishSantaHatConfig() { //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) return (true, new Vector3(0f, -0.7f, 1.3f), new Vector3(270f, 180f, 0f), 1f); } internal static (bool, Vector3, Vector3, float) GetDefaultSantaHatConfig() { //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) return (true, Vector3.zero, Vector3.zero, 1f); } internal static (bool, Vector3, Vector3, float) GetIncompatibleSantaHatConfig() { //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) return (false, Vector3.zero, Vector3.zero, 0f); } } } namespace JollyLethal.HatActions { internal class JollyHatActions { internal static bool DoesTransformAlreadyContainJollyHat(Transform parent, string pathToObject) { return parent.Find(pathToObject + "/mishelin.JollyLethal.JollyHatParent") != null; } internal static bool DoesTransformRootAlreadyContainJollyHat(Transform parent) { return parent.Find("mishelin.JollyLethal.JollyHatParent") != null; } internal static void HatChangeParent(Transform objParent, Transform hatParent, string pathToNewObj) { Transform val = objParent.Find(pathToNewObj); if (val != null) { hatParent.SetParent(val, false); } } internal static void FixHatParentChildPosScale(Transform parent) { //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) Transform child = parent.GetChild(0); ApplyOffsetsToHat(child, Vector3.zero, Vector3.zero, 1f); } internal static void FixHatsScaleBasedOnSquishedParent(Transform objParent, Transform hatParent, float targetScale = 1f) { //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_0009: 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_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) Vector3 localScale = objParent.localScale; hatParent.localScale = new Vector3(targetScale / localScale.x, targetScale / localScale.y, targetScale / localScale.z); } internal static void ApplyOffsetsToHat(Transform obj, Vector3 pos, Vector3 rot, float scale) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) obj.localPosition = pos; obj.localEulerAngles = rot; obj.localScale = Vector3.one * scale; } internal static void ChangeRotOfHatParentChild(Transform hatParent, Vector3 newRot) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) Transform child = hatParent.GetChild(0); child.localEulerAngles = newRot; } internal static Transform PlaceHatOnTransform(Transform targetBone, Vector3 posOffset, Vector3 rotOffset, float scale) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(JollyLethal.mySantaHat, targetBone); ((Object)val).name = "mishelin.JollyLethal.JollyHatParent"; Transform transform = val.transform; FixHatParentChildPosScale(transform); ApplyOffsetsToHat(transform, posOffset, rotOffset, scale); return transform; } } [HarmonyPatch(typeof(MaskedPlayerEnemy))] internal class PlaceHatOnMaskedPatch { [CompilerGenerated] private sealed class <GiveHatToMaskedCoroutine>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MaskedPlayerEnemy enemy; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GiveHatToMaskedCoroutine>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(1.5f); <>1__state = 1; return true; case 1: <>1__state = -1; JollyLethal.PluginLogInfoWithPrefix("Placing santa hat on masked"); PlaceHatsOnEnemiesPatch.PlaceHatOnEnemyTransform(((Component)enemy).transform, ((EnemyAI)enemy).enemyType); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const float myWaitForSeconds = 1.5f; [HarmonyPatch("Start")] [HarmonyPostfix] private static void GiveHatToMasked(MaskedPlayerEnemy __instance) { ((MonoBehaviour)__instance).StartCoroutine(GiveHatToMaskedCoroutine(__instance)); } [IteratorStateMachine(typeof(<GiveHatToMaskedCoroutine>d__2))] private static IEnumerator GiveHatToMaskedCoroutine(MaskedPlayerEnemy enemy) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GiveHatToMaskedCoroutine>d__2(0) { enemy = enemy }; } } [HarmonyPatch(typeof(GrabbableObject))] internal class PlaceHatsOnItemsPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void GiveEnemySantaHat(GrabbableObject __instance) { if (JollyLethal.myCustomAssets == null) { JollyLethal.PluginLogErrorWithPrefix("AssetBundle not loaded!!!"); } else { PlaceHatOnObjectTransform(((Component)__instance).transform, __instance.itemProperties); } } private static void FixAdditionalChildrenPositions(string itemName, Transform objParent, Transform hatParent) { //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) if (itemName == null) { return; } switch (itemName.Length) { case 12: switch (itemName[0]) { case 'P': if (itemName == "Plastic fish") { JollyHatActions.FixHatsScaleBasedOnSquishedParent(objParent, hatParent, 0.2f); JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 290f, 0f)); } break; case 'R': if (itemName == "Rubber Ducky") { JollyHatActions.FixHatsScaleBasedOnSquishedParent(objParent, hatParent, 0.15f); JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(90f, 0f, 0f)); } break; } break; case 10: if (itemName == "Fancy lamp") { JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 25f, 0f)); } break; case 11: if (itemName == "Plastic cup") { JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 25f, 0f)); } break; case 14: if (itemName == "Jar of pickles") { JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 225f, 0f)); } break; case 9: if (itemName == "Toy robot") { JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 25f, 0f)); } break; case 3: if (itemName == "Cat") { JollyHatActions.HatChangeParent(objParent, hatParent, "Cat_Simple_anim_IP/Arm_Cat/root_bone/Spine_base/spine_02/spine_03/spine_04/spine_05/neck/head"); JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 250f, 0f)); } break; case 5: if (itemName == "Teeth") { JollyHatActions.HatChangeParent(objParent, hatParent, "AnimContainer/MeshContainer/JawUpper"); } break; case 4: if (itemName == "Gift") { JollyHatActions.FixHatsScaleBasedOnSquishedParent(objParent, hatParent, 0.5f); JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(90f, 0f, 0f)); } break; case 6: case 7: case 8: case 13: break; } } internal static void PlaceHatOnObjectTransform(Transform itemTransform, Item itemProp) { //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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) string itemName = itemProp.itemName; var (flag, posOffset, rotOffset, scale) = GetItemHatConfig(itemName); if (flag && !JollyHatActions.DoesTransformRootAlreadyContainJollyHat(itemTransform)) { Transform hatParent = JollyHatActions.PlaceHatOnTransform(itemTransform, posOffset, rotOffset, scale); FixAdditionalChildrenPositions(itemName, itemTransform, hatParent); } } internal static (bool, Vector3, Vector3, float) GetItemHatConfig(string itemName) { return itemName switch { "Fancy lamp" => ObjectHatConfigs.GetFancyLampSantaHatConfig(), "Plastic cup" => ObjectHatConfigs.GetPlasticCupSantaHatConfig(), "Jar of pickles" => ObjectHatConfigs.GetPicklesSantaHatConfig(), "Toy robot" => ObjectHatConfigs.GetToyRobotSantaHatConfig(), "Old phone" => ObjectHatConfigs.GetOldPhoneSantaHatConfig(), "Plastic fish" => ObjectHatConfigs.GetPlasticFishSantaHatConfig(), "Hive" => ObjectHatConfigs.GetBeeHiveSantaHatConfig(), "Rubber Ducky" => ObjectHatConfigs.GetRubberDuckySantaHatConfig(), "Cat" => ObjectHatConfigs.GetCatSantaHatConfig(), "Teeth" => ObjectHatConfigs.GetTeethSantaHatConfig(), "Gift" => ObjectHatConfigs.GetGiftSantaHatConfig(), _ => ObjectHatConfigs.GetIncompatibleSantaHatConfig(), }; } } [HarmonyPatch(typeof(EnemyAI))] internal class PlaceHatsOnEnemiesPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void GiveEnemySantaHat(EnemyAI __instance) { if (JollyLethal.myCustomAssets == null) { JollyLethal.PluginLogErrorWithPrefix("AssetBundle not loaded!!!"); } else { PlaceHatOnEnemyTransform(((Component)__instance).transform, __instance.enemyType); } } internal static void PlaceHatOnEnemyTransform(Transform enemyTransform, EnemyType enemyType) { //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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) string enemyName = enemyType.enemyName; var (text, posOffset, rotOffset, scale) = GetEnemyHatConfig(enemyName); if (text != null && !JollyHatActions.DoesTransformAlreadyContainJollyHat(enemyTransform, text)) { Transform hatPlaceTransform = GetHatPlaceTransform(enemyTransform, text); Transform hatParent = JollyHatActions.PlaceHatOnTransform(hatPlaceTransform, posOffset, rotOffset, scale); FixAdditionalChildrenPositions(enemyName, hatParent); } } private static void FixAdditionalChildrenPositions(string enemyName, Transform hatParent) { //IL_002b: 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) if (!(enemyName == "Crawler")) { if (enemyName == "Maneater") { JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 115f, 0f)); } } else { JollyHatActions.ChangeRotOfHatParentChild(hatParent, new Vector3(0f, 285f, 0f)); } } internal static Transform GetHatPlaceTransform(Transform enemyTransform, string? bonePath) { Transform val = ((Component)enemyTransform).transform.Find(bonePath); if (val != null) { return val; } return ((Component)enemyTransform).transform; } internal static (string?, Vector3, Vector3, float) GetEnemyHatConfig(string enemyName) { JollyLethal.PluginLogInfoWithPrefix("Placing hat on: " + enemyName); switch (enemyName) { case "Flowerman": return EnemyHatConfigs.GetBrackenSantaHatConfig(); case "Hoarding bug": return EnemyHatConfigs.GetHoardingBugSantaHatConfig(); case "Centipede": return EnemyHatConfigs.GetSnareFleaSantaHatConfig(); case "Crawler": return EnemyHatConfigs.GetThumperSantaHatConfig(); case "Bunker Spider": return EnemyHatConfigs.GetBunkerSpiderSantaHatConfig(); case "Jester": return EnemyHatConfigs.GetJesterSantaHatConfig(); case "Nutcracker": return EnemyHatConfigs.GetNutcrackerSantaHatConfig(); case "Spring": return EnemyHatConfigs.GetSpringSantaHatConfig(); case "Masked": return EnemyHatConfigs.GetMaskedSantaHatConfig(); case "Butler": return EnemyHatConfigs.GetButlerSantaHatConfig(); case "Maneater": return EnemyHatConfigs.GetManeaterSantaHatConfig(); case "Puffer": return EnemyHatConfigs.GetSporeLizardSantaHatConfig(); case "Blob": return EnemyHatConfigs.GetBlobSantaHatConfig(); case "Girl": return EnemyHatConfigs.GetGirlSantaHatConfig(); case "MouthDog": return EnemyHatConfigs.GetMouthDogSantaHatConfig(); case "Baboon hawk": return EnemyHatConfigs.GetBaboonHawkSantaHatConfig(); case "ForestGiant": return EnemyHatConfigs.GetForestGiantSantaHatConfig(); case "RadMech": return EnemyHatConfigs.GetOldBirdSantaHatConfig(); case "Tulip Snake": return EnemyHatConfigs.GetTulipSnakeSantaHatConfig(); case "Bush Wolf": return EnemyHatConfigs.GetKidnapperFoxSantaHatConfig(); case "Clay Surgeon": JollyLethal.PluginLogInfoWithPrefix("Skipping hat for incompatible enemy: " + enemyName); return EnemyHatConfigs.GetBarberSantaHatConfig(); case "Manticoil": case "GiantKiwi": case "Red pill": case "Butler Bees": case "Earth Leviathan": case "Red Locust Bees": case "Docile Locust Bees": case "Lasso": JollyLethal.PluginLogInfoWithPrefix("Skipping hat for incompatible enemy: " + enemyName); return EnemyHatConfigs.GetIncompatibleSantaHatConfig(); default: JollyLethal.PluginLogErrorWithPrefix("Enemy '" + enemyName + "' not in config. Defaulting to 'Head'."); return EnemyHatConfigs.GetDefaultSantaHatConfig(); } } } } namespace JollyLethal.DebugScripts { [HarmonyPatch(typeof(RoundManager))] internal class EnemyDumper { [HarmonyPatch("Start")] [HarmonyPostfix] private static void DumpEveryEnemy() { JollyLethal.PluginLogInfoWithPrefix("=== STARTING ENEMY NAME DUMP ==="); EnemyType[] source = Resources.FindObjectsOfTypeAll<EnemyType>(); IOrderedEnumerable<string> orderedEnumerable = from n in source.Select((EnemyType e) => e.enemyName).Distinct() orderby n select n; foreach (string item in orderedEnumerable) { JollyLethal.PluginLogInfoWithPrefix("Found Enemy Name: \"" + item + "\""); } JollyLethal.PluginLogInfoWithPrefix("=== DUMP FINISHED ==="); } } [HarmonyPatch(typeof(GrabbableObject))] internal class GetItemName { [HarmonyPatch("Start")] [HarmonyPostfix] private static void PrintItemName(GrabbableObject __instance) { JollyLethal.PluginLogInfoWithPrefix("Item name " + __instance.itemProperties.itemName); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }