using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using GlobalSettings; using HarmonyLib; using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using Microsoft.CodeAnalysis; using Needleforge; using Needleforge.Data; using QueenCrest.Components; using QueenCrest.Patches; using QueenCrest.Utils; using TeamCherry.Localization; using TeamCherry.NestedFadeGroup; using TeamCherry.SharedUtils; 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: AssemblyCompany("QueenCrest")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.1.5.0")] [assembly: AssemblyInformationalVersion("0.1.5+9f9094e049555306189fda4f0b0ea99e46a59310")] [assembly: AssemblyProduct("QueenCrest")] [assembly: AssemblyTitle("QueenCrest")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/kaycodes13/QueenCrest")] [assembly: NeutralResourcesLanguage("EN")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.5.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Embedded] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Embedded] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace Microsoft.CodeAnalysis { [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace QueenCrest { [BepInDependency("org.silksong-modding.i18n", "1.1.1")] [BepInDependency("io.github.needleforge", "0.9.0")] [BepInPlugin("io.github.kaycodes13.queencrest", "QueenCrest", "0.1.5")] public class QueenCrestPlugin : BaseUnityPlugin { [CompilerGenerated] private static class <>O { public static HudCoroutine <0>__HudCoroutine; public static BindEventHandler <1>__EnableMultibinder; public static Action <2>__EnableReaperBindEffect; public static Action <3>__Setup; } internal const string YenId = "Yen"; internal static readonly LocalisedString YenName = new LocalisedString("Mods.io.github.kaycodes13.queencrest", "CREST_NAME"); internal static readonly LocalisedString YenDesc = new LocalisedString("Mods.io.github.kaycodes13.queencrest", "CREST_DESC"); public const string Id = "io.github.kaycodes13.queencrest"; private Harmony Harmony { get; } = new Harmony("io.github.kaycodes13.queencrest"); internal static ManualLogSource Log { get; private set; } internal static CrestData YenCrest { get; private set; } private static Color AdminGreen { get; } = Color32.op_Implicit(new Color32((byte)89, byte.MaxValue, (byte)152, byte.MaxValue)); internal static Color AttackColor { get; } = Color.Lerp(Color.white, AdminGreen, 0.3f); public static string Name => "QueenCrest"; public static string Version => "0.1.5"; private void Awake() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: 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_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Expected O, but got Unknown //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin " + Name + " (io.github.kaycodes13.queencrest) has loaded!")); Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(0.5f, 0.44f); Sprite val2 = ResourceUtils.LoadEmbeddedPngAsSprite("Crest.png", val); Sprite val3 = ResourceUtils.LoadEmbeddedPngAsSprite("CrestSilhouette.png", val); Sprite val4 = ResourceUtils.LoadEmbeddedPngAsSprite("CrestGlow.png", val, 140f); float num = 0.5f - val.y; Rect rect = val2.rect; float num2 = num * (((Rect)(ref rect)).height / val2.pixelsPerUnit); YenCrest = NeedleforgePlugin.AddCrest("Yen", YenName, YenDesc, val2, val3, val4); YenCrest.AddSkillSlot((AttackToolBinding)1, new Vector2(-0.9f, 1.85f + num2), false); YenCrest.AddSkillSlot((AttackToolBinding)2, new Vector2(0.93f, 1.93f + num2), false); YenCrest.AddRedSlot((AttackToolBinding)0, new Vector2(2.1f, 0.13f + num2), false); YenCrest.AddYellowSlot(new Vector2(-2.1f, 0.13f + num2), false); YenCrest.AddBlueSlot(new Vector2(-1.94f, -1.67f + num2), false); YenCrest.AddBlueSlot(new Vector2(1.94f, -1.67f + num2), false); YenCrest.AddBlueSlot(new Vector2(0f, -2.95f + num2), false); YenCrest.ApplyAutoSlotNavigation(true, 60f, (Vector2?)new Vector2(1.25f, 0.75f)); YenCrest.HudFrame.Preset = (VanillaCrest)2; HudFrameData hudFrame = YenCrest.HudFrame; object obj = <>O.<0>__HudCoroutine; if (obj == null) { HudCoroutine val5 = Bind.HudCoroutine; <>O.<0>__HudCoroutine = val5; obj = (object)val5; } hudFrame.Coroutine = (HudCoroutine)obj; CrestData yenCrest = YenCrest; object obj2 = <>O.<1>__EnableMultibinder; if (obj2 == null) { BindEventHandler val6 = Bind.EnableMultibinder; <>O.<1>__EnableMultibinder = val6; obj2 = (object)val6; } yenCrest.BindEvent = (BindEventHandler)obj2; YenCrest.BindCompleteEvent = Bind.EnableReaperBindEffect; Harmony.PatchAll(typeof(Bind)); YenCrest.Moveset.OnInitialized += Moveset.Setup; Harmony.PatchAll(typeof(EvaOptOut)); } private void OnDestroy() { Harmony.UnpatchSelf(); } } } namespace QueenCrest.Utils { internal static class ResourceUtils { public static Sprite LoadEmbeddedPngAsSprite(string filename, Vector2? pivot = null, float pixelsPerUnit = 100f) { //IL_0027: 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_0041: Unknown result type (might be due to invalid IL or missing references) Texture2D val = LoadEmbeddedPngAsTexture2D(filename); ((Object)val).name = filename; return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), (Vector2)(((??)pivot) ?? new Vector2(0.5f, 0.5f)), pixelsPerUnit); } public static Texture2D LoadEmbeddedPngAsTexture2D(string filename) { //IL_0062: 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_006e: Expected O, but got Unknown //IL_0070: Expected O, but got Unknown Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetManifestResourceNames().First((string x) => x.EndsWith(filename)); byte[] array; using (Stream stream = executingAssembly.GetManifestResourceStream(name)) { using BinaryReader binaryReader = new BinaryReader(stream); array = binaryReader.ReadBytes((int)stream.Length); } Texture2D val = new Texture2D(1, 1); ImageConversion.LoadImage(val, array); return val; } } } namespace QueenCrest.Patches { internal static class Bind { private static readonly ProbabilityInt[] silkOrbDrops; private static int GetRandomOrbDrops() { return Probability.GetRandomItemByProbability(silkOrbDrops, (float[])null); } internal static IEnumerator HudCoroutine(BindOrbHudFrame hudInstance) { HeroController hc = HeroController.instance; bool wasInReaperMode = false; float effectTime = 0f; while (true) { if (hc.IsPaused()) { yield return null; continue; } NestedFadeGroupBase reaperModeEffect = hudInstance.reaperModeEffect; if (Object.op_Implicit((Object)(object)reaperModeEffect)) { if (!wasInReaperMode && hc.reaperState.IsInReaperMode) { ((Component)reaperModeEffect).gameObject.SetActive(false); ((Component)reaperModeEffect).gameObject.SetActive(true); reaperModeEffect.AlphaSelf = 1f; effectTime = 0f; } else if (wasInReaperMode && !hc.reaperState.IsInReaperMode) { effectTime = reaperModeEffect.FadeTo(0f, hudInstance.reaperModeEffectFadeOutTime, (AnimationCurve)null, false, (Action)null); } if (effectTime > 0f) { effectTime -= Time.deltaTime; if (effectTime <= 0f) { ((Component)reaperModeEffect).gameObject.SetActive(false); } } } wasInReaperMode = hc.reaperState.IsInReaperMode; yield return null; } } internal static void EnableMultibinder(FsmInt value, FsmInt amount, FsmFloat time, PlayMakerFSM _) { if (((ToolBase)Gameplay.MultibindTool).IsEquipped) { value.Value = 2; amount.Value = 2; time.Value = 0.8f; } } internal static void EnableReaperBindEffect() { if (QueenCrestPlugin.YenCrest.IsEquipped) { HeroController instance = HeroController.instance; instance.reaperState.IsInReaperMode = true; instance.reaperState.ReaperModeDurationLeft = Gameplay.ReaperModeDuration; if (Object.op_Implicit((Object)(object)instance.reaperModeEffect)) { ((Component)instance.reaperModeEffect).gameObject.SetActive(false); ((Component)instance.reaperModeEffect).gameObject.SetActive(true); } } } [HarmonyPatch(typeof(HealthManager), "TakeDamage", new Type[] { typeof(HitInstance) })] [HarmonyPostfix] private unsafe static void SpawnSilkOrbs(HealthManager __instance, ref HitInstance hitInstance) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Invalid comparison between Unknown and I4 //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Invalid comparison between Unknown and I4 //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Invalid comparison between Unknown and I4 //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_007b: Expected I4, but got Unknown //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_032e: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_0341: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) if (!QueenCrestPlugin.YenCrest.IsEquipped) { return; } HeroController instance = HeroController.instance; if (((int)hitInstance.AttackType != 0 && ((int)hitInstance.AttackType != 16 || !hitInstance.IsNailTag)) || (int)__instance.enemyType == 3 || (int)__instance.enemyType == 6 || __instance.DoNotGiveSilk || (int)hitInstance.SilkGeneration == 2 || !instance.ReaperState.IsInReaperMode) { return; } ReaperBundleTiers reaperBundles = __instance.reaperBundles; int num = (int)reaperBundles switch { 0 => GetRandomOrbDrops(), 1 => 1, 2 => 0, _ => throw new Exception("Something has gone terribly wrong."), }; if (num != 0) { int cardinalDirection = DirectionUtils.GetCardinalDirection(((HitInstance)(ref hitInstance)).GetActualDirection(((Component)__instance).transform, (TargetType)0)); float item = 0f; float item2 = 360f; float num3; if ((Object)(object)__instance.flingSilkOrbsAimObject != (Object)null) { Vector3 position = __instance.flingSilkOrbsAimObject.transform.position; Vector3 position2 = ((Component)__instance).transform.position; float num2 = position.x - position2.x; num3 = Mathf.Atan2(position.y - position2.y, num2) * (180f / MathF.PI); item = num3 - 45f; item2 = num3 + 45f; } else if (!__instance.flingSilkOrbsDown) { (item, item2, num3) = cardinalDirection switch { 0 => (315f, 415f, 0f), 1 => (45f, 135f, 90f), 2 => (125f, 225f, 180f), 3 => (225f, 315f, 270f), _ => (item, item2, 0f), }; } else { item = 225f; item2 = 315f; num3 = 270f; } FlingUtils.SpawnAndFling(new Config { Prefab = Gameplay.ReaperBundlePrefab, AmountMin = num, AmountMax = num, SpeedMin = 25f, SpeedMax = 50f, AngleMin = item, AngleMax = item2 }, ((Component)__instance).transform, __instance.effectOrigin, (List)null, -1f); GameObject reapHitEffectPrefab = Effects.ReapHitEffectPrefab; if (Object.op_Implicit((Object)(object)reapHitEffectPrefab)) { object obj = DirectionUtils.GetCardinalDirection(num3) switch { 1 => (Vector2.one, 90f), 2 => (new Vector2(-1f, 1f), 0f), 3 => (new Vector2(1f, -1f), 90f), _ => (Vector2.one, 0f), }; Vector2 item3 = ((ValueTuple*)(&obj))->Item1; float item4 = ((ValueTuple*)(&obj))->Item2; GameObject val = ObjectPoolExtensions.Spawn(reapHitEffectPrefab, ((Component)__instance).transform.TransformPoint(__instance.effectOrigin)); Extensions.SetRotation2D(val.transform, item4); val.transform.localScale = Extensions.ToVector3(item3, val.transform.localScale.z); } } } static Bind() { //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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_0020: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_003a: Expected O, but got Unknown ProbabilityInt[] array = new ProbabilityInt[2]; ProbabilityInt val = new ProbabilityInt { Value = 1 }; ((ProbabilityBase)val).Probability = 0.7f; array[0] = val; ProbabilityInt val2 = new ProbabilityInt { Value = 2 }; ((ProbabilityBase)val2).Probability = 0.3f; array[1] = val2; silkOrbDrops = (ProbabilityInt[])(object)array; } } internal static class EvaOptOut { [HarmonyPatch(typeof(CountCrestUnlockPoints), "OnEnter")] [HarmonyPrefix] private static void SubtractQueenSlots(CountCrestUnlockPoints __instance) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown ToolCrestList val = ScriptableObject.CreateInstance(); foreach (ToolCrest item in (NamedScriptableObjectList)(ToolCrestList)__instance.CrestList.Value) { if (item.name != QueenCrestPlugin.YenCrest.name) { ((NamedScriptableObjectList)(object)val).Add(item); } } __instance.CrestList.Value = (Object)(object)val; } } internal static class Moveset { private static GameObject? animLibObj; internal static void Setup() { EditHeroConfig(); CreateMissingAttacks(); } private static void EditHeroConfig() { HeroConfigNeedleforge heroConfig = QueenCrestPlugin.YenCrest.Moveset.HeroConfig; HeroControllerConfig heroConfig2 = ToolItemManager.GetCrestByName("Witch").HeroConfig; heroConfig.SetChargedSlashFields((int?)heroConfig2.chargeSlashChain, (float?)heroConfig2.chargeSlashLungeSpeed, (float?)heroConfig2.chargeSlashLungeDeceleration, (bool?)heroConfig2.chargeSlashRecoils, (bool?)null); ((HeroControllerConfig)heroConfig).heroAnimOverrideLib = GetOrCreateAnimationLibrary(); } private static void CreateMissingAttacks() { //IL_010e: Unknown result type (might be due to invalid IL or missing references) HeroController instance = HeroController.instance; _ = QueenCrestPlugin.YenCrest.Moveset.HeroConfig; ConfigGroup configGroup = QueenCrestPlugin.YenCrest.Moveset.ConfigGroup; ConfigGroup val = instance.configs.First((ConfigGroup x) => ((Object)x.Config).name == "Whip"); ConfigGroup val2 = instance.configs.First((ConfigGroup x) => ((Object)x.Config).name == "Default"); GameObject val3 = Object.Instantiate(val.ChargeSlash, configGroup.ActiveRoot.transform); tk2dSpriteAnimator[] components = val3.GetComponents(); for (int num = 0; num < components.Length; num++) { components[num].Library = GetOrCreateAnimationLibrary(); } configGroup.ChargeSlash = val3; configGroup.AlternateSlashObject = Object.Instantiate(val2.AlternateSlashObject, configGroup.ActiveRoot.transform); TintRendererGroupConditionally tintRendererGroupConditionally = configGroup.ActiveRoot.AddComponent(); tintRendererGroupConditionally.Condition = () => (int)HeroController.instance.NailImbuement.CurrentElement == 0; ((TintRendererGroup)tintRendererGroupConditionally).Color = QueenCrestPlugin.AttackColor; } private static tk2dSpriteAnimation GetOrCreateAnimationLibrary() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown if (Object.op_Implicit((Object)(object)animLibObj)) { return animLibObj.GetComponent(); } tk2dSpriteAnimation heroAnimOverrideLib = HeroController.instance.configs.First((ConfigGroup c) => ((Object)c.Config).name == "Whip").Config.heroAnimOverrideLib; animLibObj = new GameObject("Yen_AnimLib") { hideFlags = (HideFlags)61 }; Object.DontDestroyOnLoad((Object)(object)animLibObj); tk2dSpriteAnimation obj = animLibObj.AddComponent(); obj.clips = heroAnimOverrideLib.clips.Where((tk2dSpriteAnimationClip x) => x.name.Contains("Charged")).ToArray(); obj.isValid = false; obj.ValidateLookup(); return obj; } } } namespace QueenCrest.Components { internal class TintRendererGroupConditionally : TintRendererGroup { public Func Condition { get; set; } = () => true; private void UpdateTint() { if (Condition()) { ((TintRendererGroup)this).UpdateTint(); } } private void Update() { UpdateTint(); } private void OnEnable() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown base.sprites.Clear(); base.others.Clear(); base.particles.Clear(); base.meshRenderers.Clear(); ((TintRendererGroup)this).GetComponentsInChildrenRecursively(((Component)this).transform); if (base.meshRenderers.Count > 0) { base.block = new MaterialPropertyBlock(); } UpdateTint(); } } }