Decompiled source of NectarAllergic v1.0.0

Nectar Allergic.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using GlobalSettings;
using HarmonyLib;
using InControl;
using Silksong.AssetHelper.ManagedAssets;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Nectar Allergic")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Nectar Allergic")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("33c90e4f-2ae4-4a26-8667-294fd3e300d0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("com.sealofapproval.nectarallergic", "Nectar Allergic", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class NectarAllergic : BaseUnityPlugin
{
	private ManagedAsset<AudioClip> Garama1;

	private ManagedAsset<AudioClip> SlashSound;

	private ManagedAsset<AudioClip> WakeUp;

	private ManagedAsset<AudioClip> WallLand;

	private ManagedAsset<AudioClip> Demo1;

	private ManagedAsset<AudioClip> Demo2;

	private ManagedAsset<AudioClip> FollowUp;

	private ManagedAsset<AudioClip> Collapse;

	private ManagedAsset<AudioClip> FallOver;

	private ManagedAsset<AudioClip> Exert;

	private ManagedAsset<AudioClip> Loop;

	private ConfigEntry<bool> DamagedOrNot;

	private ConfigEntry<bool> Lethal;

	private ConfigEntry<float> DrinkVolume;

	private int lastDrinks = -1;

	private string anim1 = "Weakened Stun";

	private string anim2 = "Weak Flinch To Idle";

	private string anim4 = "Taunt Collapse1";

	private string anim5 = "Taunt Collapse2";

	private string anim6 = "Prostrate Rise";

	private int times4 = 4;

	private int destr;

	private float volume;

	protected NectarAllergic()
	{
		DamagedOrNot = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Damaged?", true, "After drinking, should Hornet get damaged until she reaches 1 mask?");
		Lethal = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Lethal?", false, "After drinking, should Hornet outright die? (WARNING: NOT RECOMMENDED FOR STEEL SOUL.)");
		DrinkVolume = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Volume multiplier", 1f, "What multiplier should the volume of the sounds have? 0 = no volume, 0.5 = half the volume, 1 = default volume, 2 = doubled volume, etc. Decimals allowed.");
	}

	private void Awake()
	{
		Loop = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/SFX/npc/hornet_weakened_effect_loop_2d.wav", "herosfxstatic_assets_all");
		Exert = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/Voices/Hornet_Silksong/weak_hornet/weak_hornet_exert_standard_03.wav", "herosfxstatic_assets_all");
		FallOver = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/SFX/Heroes/Hornet/hornet_fall_over_demo_end.wav", "herosfxstatic_assets_all");
		Collapse = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/Voices/Hornet_Silksong/Garama_weak_collapse.wav", "herosfxstatic_assets_all");
		FollowUp = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/Voices/Hornet_Silksong/Garama_weak_follow_up.wav", "herosfxstatic_assets_all");
		Demo1 = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/SFX/npc/demo_end_black_fade_down_up.wav", "sfxstatic_assets_areatutorial");
		Demo2 = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/SFX/npc/demo_end_black_fade_end.wav", "sfxstatic_assets_areatutorial");
		WallLand = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/SFX/Enemy/Bosses/Hornet/hornet_wall_land.wav", "sfxstatic_assets_areamemoryareamossareatutorial");
		SlashSound = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/SFX/sword_5.wav", "sfxstatic_assets_shared");
		Garama1 = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/Voices/Hornet_Silksong/Garama_weak_02.wav", "sfxstatic_assets_areamoss");
		WakeUp = ManagedAsset<AudioClip>.FromNonSceneAsset("Assets/Audio/Voices/Hornet_Silksong/weak_hornet/weak_hornet_exert_short_01.wav", "herosfxstatic_assets_all");
		SceneManager.activeSceneChanged += SpawnAsset;
	}

	private void SpawnAsset(Scene oldScene, Scene newScene)
	{
		if (!(((Scene)(ref newScene)).name != "Halfway_01"))
		{
			((MonoBehaviour)this).StartCoroutine(SpawnAssetRoutine());
		}
	}

	private void Update()
	{
		PlayerData instance = PlayerData.instance;
		if (instance != null)
		{
			if (lastDrinks == -1)
			{
				lastDrinks = instance.HalfwayDrinksPurchased;
			}
			else if (instance.HalfwayDrinksPurchased > lastDrinks)
			{
				lastDrinks = instance.HalfwayDrinksPurchased;
				((MonoBehaviour)this).StartCoroutine(TriggerPassOut());
			}
		}
	}

	private IEnumerator TriggerPassOut()
	{
		HeroController heroController = HeroController.instance;
		if ((Object)(object)heroController == (Object)null)
		{
			yield break;
		}
		HeroAnimationController heroAnim = ((Component)heroController).GetComponent<HeroAnimationController>();
		if ((Object)(object)heroAnim == (Object)null || (Object)(object)((Component)heroController).GetComponent<HeroAudioController>() == (Object)null)
		{
			yield break;
		}
		while (heroAnim.animator.IsPlaying("Charge Up"))
		{
			yield return null;
		}
		while (heroController.controlReqlinquished)
		{
			yield return null;
		}
		AudioClip Auclip1 = ((ManagedAssetBase<AudioClip>)(object)SlashSound).Load().Result;
		AudioClip Auclip2 = ((ManagedAssetBase<AudioClip>)(object)Garama1).Load().Result;
		AudioClip result = ((ManagedAssetBase<AudioClip>)(object)WallLand).Load().Result;
		AudioClip Auclip4 = ((ManagedAssetBase<AudioClip>)(object)Demo2).Load().Result;
		AudioClip Auclip5 = ((ManagedAssetBase<AudioClip>)(object)WakeUp).Load().Result;
		AudioClip result2 = ((ManagedAssetBase<AudioClip>)(object)Demo1).Load().Result;
		AudioClip AuClip7 = ((ManagedAssetBase<AudioClip>)(object)FollowUp).Load().Result;
		AudioClip Auclip8 = ((ManagedAssetBase<AudioClip>)(object)Collapse).Load().Result;
		AudioClip Auclip9 = ((ManagedAssetBase<AudioClip>)(object)FallOver).Load().Result;
		AudioClip result3 = ((ManagedAssetBase<AudioClip>)(object)Exert).Load().Result;
		AudioClip Auclip11 = ((ManagedAssetBase<AudioClip>)(object)Loop).Load().Result;
		heroController.IgnoreInput();
		heroController.controlReqlinquished = true;
		heroController.StopAnimationControl();
		PlayerData.instance.disablePause = true;
		AudioSource Ausource = ((Component)HeroController.instance).GetComponent<AudioSource>();
		MethodInfo DoSpecialDamageMethod = AccessTools.Method(typeof(HeroController), "DoSpecialDamage", (Type[])null, (Type[])null);
		object[] args = new object[7] { 1, true, "Instant", true, true, true, false };
		AudioSource[] array = Object.FindObjectsOfType<AudioSource>();
		foreach (AudioSource val in array)
		{
			if (val.isPlaying)
			{
				volume = val.volume;
				val.volume *= 0f;
			}
		}
		((MonoBehaviour)this).StartCoroutine(Shadow());
		times4 = 4;
		destr = 0;
		Ausource.PlayOneShot(result2, 0.9f * DrinkVolume.Value);
		Ausource.PlayOneShot(result3, 1.5f * DrinkVolume.Value);
		Ausource.PlayOneShot(result, 0.5f * DrinkVolume.Value);
		while (times4 != 0)
		{
			float clipLength1 = heroAnim.GetClipDuration(anim1);
			heroAnim.PlayClipForced(anim1);
			while (heroAnim.animator.IsPlaying(heroAnim.animator.CurrentClip) && clipLength1 > 0f)
			{
				yield return null;
				clipLength1 -= Time.deltaTime;
			}
			times4--;
		}
		float clipLength2 = heroAnim.GetClipDuration(anim2);
		heroAnim.PlayClipForced(anim2);
		while (heroAnim.animator.IsPlaying(heroAnim.animator.CurrentClip) && clipLength2 > 0f)
		{
			yield return null;
			clipLength2 -= Time.deltaTime;
		}
		while (times4 < 7)
		{
			float clipLength1 = heroAnim.GetClipDuration(anim4);
			heroAnim.PlayClipForced(anim4);
			while (heroAnim.animator.IsPlaying(heroAnim.animator.CurrentClip) && clipLength1 > 0f)
			{
				yield return null;
				clipLength1 -= Time.deltaTime;
				if (clipLength1 < 0.6f)
				{
					if (times4 == 0)
					{
						Ausource.PlayOneShot(Auclip2, 0.65f * DrinkVolume.Value);
						Ausource.PlayOneShot(Auclip1, 0.65f * DrinkVolume.Value);
						times4++;
					}
					if (times4 == 2)
					{
						Ausource.PlayOneShot(Auclip11, 1f * DrinkVolume.Value);
						times4++;
					}
					if (times4 == 4)
					{
						Ausource.PlayOneShot(AuClip7, 0.7f * DrinkVolume.Value);
						times4++;
					}
				}
			}
			times4++;
		}
		if (DamagedOrNot.Value)
		{
			times4 = PlayerData.instance.health + PlayerData.instance.healthBlue - 1;
			if (!Gameplay.FracturedMaskTool.IsEmpty && ((ToolBase)Gameplay.FracturedMaskTool).IsEquipped)
			{
				times4 = PlayerData.instance.health + PlayerData.instance.healthBlue;
			}
			while (times4 > 0)
			{
				DoSpecialDamageMethod.Invoke(heroController, args);
				times4--;
			}
		}
		if (Lethal.Value)
		{
			for (int num = 20; num > 0; num--)
			{
				DoSpecialDamageMethod.Invoke(heroController, args);
			}
		}
		times4 = 0;
		GameCameras.instance.cameraFadeFSM.SetState("Scene Fade Out");
		if (Lethal.Value)
		{
			yield return (object)new WaitForSeconds(2f);
			((MonoBehaviour)this).StartCoroutine(Volume());
			yield break;
		}
		Ausource.PlayOneShot(Auclip4, 0.9f * DrinkVolume.Value);
		Ausource.PlayOneShot(Auclip8, 0.7f * DrinkVolume.Value);
		Ausource.PlayOneShot(Auclip9, 0.7f * DrinkVolume.Value);
		float clipLength5 = heroAnim.GetClipDuration(anim5) - 0.25f;
		heroAnim.PlayClipForced(anim5);
		while (heroAnim.animator.IsPlaying(heroAnim.animator.CurrentClip) && clipLength5 > 0f)
		{
			yield return null;
			clipLength5 -= Time.deltaTime;
		}
		destr = 1;
		heroAnim.PlayClipForced("Prostrate");
		float elapsed = 0f;
		yield return null;
		while (elapsed < 99999f)
		{
			if (elapsed > 4f && times4 == 0)
			{
				GameCameras.instance.cameraFadeFSM.SetState("Scene Fade In");
				times4 = 1;
				((MonoBehaviour)this).StartCoroutine(Volume());
			}
			HeroActions inputActions = ManagerSingleton<InputHandler>.Instance.inputActions;
			if ((((OneAxisInputControl)inputActions.Jump).WasPressed || ((OneAxisInputControl)inputActions.Attack).WasPressed) && elapsed > 7f)
			{
				Ausource.PlayOneShot(Auclip5, 1.5f * DrinkVolume.Value);
				float clipLength1 = heroAnim.GetClipDuration(anim6);
				heroAnim.PlayClipForced(anim6);
				while (heroAnim.animator.IsPlaying(heroAnim.animator.CurrentClip) && clipLength1 > 0f)
				{
					yield return null;
					clipLength1 -= Time.deltaTime;
				}
				heroController.AcceptInput();
				heroController.controlReqlinquished = false;
				heroController.StartAnimationControl();
				PlayerData.instance.disablePause = false;
				break;
			}
			elapsed += Time.deltaTime;
			yield return null;
		}
	}

	private IEnumerator Volume()
	{
		AudioSource[] array = Object.FindObjectsOfType<AudioSource>();
		foreach (AudioSource src in array)
		{
			if (Object.op_Implicit((Object)(object)src) && src.isPlaying)
			{
				float t = 0.05f;
				while (src.volume < volume)
				{
					src.volume += t;
					yield return (object)new WaitForSeconds(t);
				}
			}
		}
	}

	private IEnumerator Shadow()
	{
		GameObject val = ((IEnumerable<GameObject>)Resources.FindObjectsOfTypeAll<GameObject>()).FirstOrDefault((Func<GameObject, bool>)((GameObject obj) => ((Object)obj).name == "low_health_vignette_hi_res"));
		GameObject clone = Object.Instantiate<GameObject>(val);
		Transform ct = clone.transform;
		float t = 0.05f;
		for (float sc = 1f; sc > 0.5f; sc -= 0.05f)
		{
			Extensions.SetScaleMatching(ct, sc);
			yield return (object)new WaitForSeconds(t);
		}
		while (t == 0.05f)
		{
			if (destr == 1)
			{
				Object.Destroy((Object)(object)clone);
				break;
			}
			yield return null;
		}
	}

	private IEnumerator SpawnAssetRoutine()
	{
		((ManagedAssetBase<AudioClip>)(object)Loop).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)Loop).Handle;
		((ManagedAssetBase<AudioClip>)(object)SlashSound).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)SlashSound).Handle;
		((ManagedAssetBase<AudioClip>)(object)Garama1).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)Garama1).Handle;
		((ManagedAssetBase<AudioClip>)(object)WakeUp).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)WakeUp).Handle;
		((ManagedAssetBase<AudioClip>)(object)WallLand).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)WallLand).Handle;
		((ManagedAssetBase<AudioClip>)(object)Demo1).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)Demo1).Handle;
		((ManagedAssetBase<AudioClip>)(object)Demo2).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)Demo2).Handle;
		((ManagedAssetBase<AudioClip>)(object)FollowUp).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)FollowUp).Handle;
		((ManagedAssetBase<AudioClip>)(object)Collapse).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)Collapse).Handle;
		((ManagedAssetBase<AudioClip>)(object)FallOver).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)FallOver).Handle;
		((ManagedAssetBase<AudioClip>)(object)Exert).Load();
		yield return ((ManagedAssetBase<AudioClip>)(object)Exert).Handle;
	}
}