Decompiled source of SnowyHolidayDropship v1.1.0

SnowyHolidayDropship.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
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.Configuration;
using BepInEx.Logging;
using HarmonyLib;
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: AssemblyCompany("SnowyHolidayDropship")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Brings back the holiday dropship on snowy moons.")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0+6ec1f5cb3bc009193c846a17bde66665b3d4524a")]
[assembly: AssemblyProduct("SnowyHolidayDropship")]
[assembly: AssemblyTitle("SnowyHolidayDropship")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SnowyHolidayDropship
{
	internal static class DropshipDecorator
	{
		private static ItemDropship shipScript;

		private static AudioClip music;

		private static AudioClip musicFar;

		private static AudioClip musicJolly;

		private static AudioClip musicFarJolly;

		private static AudioClip musicOld;

		private static AudioClip musicFarOld;

		private static Mesh ship;

		private static Mesh shipJolly;

		private static GameObject star;

		private static GameObject shipObject;

		private static MeshFilter shipComponent;

		private static AudioSource musicComponent;

		private static AudioSource musicFarComponent;

		private static Random rand = new Random();

		private static bool initialized;

		private static bool landed;

		private static bool seeded;

		private static GameObject artificeBlizzard;

		internal static void Init(ItemDropship itemDropship)
		{
			initialized = false;
			shipScript = itemDropship;
			try
			{
				Transform transform = ((Component)shipScript).transform;
				star = ((Component)transform.Find("Star")).gameObject;
				shipObject = ((Component)transform.Find("ItemShip")).gameObject;
				shipComponent = shipObject.GetComponent<MeshFilter>();
				Transform obj = transform.Find("Music");
				musicComponent = ((Component)obj).GetComponent<AudioSource>();
				musicFarComponent = ((Component)obj.Find("Music (1)")).GetComponent<AudioSource>();
				Plugin.Logger.LogInfo((object)"Successfully cached all dropship object references");
				ship = shipComponent.sharedMesh;
				music = musicComponent.clip;
				musicFar = musicFarComponent.clip;
				Plugin.Logger.LogInfo((object)"Successfully cached all pre-existing asset references");
				if ((Object)(object)musicJolly == (Object)null || (Object)(object)musicFarJolly == (Object)null || (Object)(object)shipJolly == (Object)null || (Object)(object)musicOld == (Object)null)
				{
					AssetBundle obj2 = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "snowyholidaydropship"));
					musicJolly = obj2.LoadAsset<AudioClip>("IcecreamTruckV2Christmas");
					musicFarJolly = obj2.LoadAsset<AudioClip>("IcecreamTruckV2ChristmasFar");
					musicOld = obj2.LoadAsset<AudioClip>("IcecreamTruck");
					musicFarOld = obj2.LoadAsset<AudioClip>("IcecreamTruckV1Far");
					shipJolly = obj2.LoadAsset<Mesh>("MainShipPart");
					obj2.Unload(false);
					Plugin.Logger.LogInfo((object)"Successfully cached all asset bundle references");
				}
				if (((Object)StartOfRound.Instance.currentLevel).name == "ArtificeLevel" && Chainloader.PluginInfos.ContainsKey("butterystancakes.lethalcompany.artificeblizzard"))
				{
					artificeBlizzard = GameObject.Find("/Systems/Audio/BlizzardAmbience");
					if ((Object)(object)artificeBlizzard != (Object)null)
					{
						Plugin.Logger.LogInfo((object)"Artifice Blizzard compatibility success");
					}
				}
				initialized = true;
				landed = false;
				seeded = false;
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError((object)"Failed to capture references to all the dropship objects - are you playing on a modded moon?");
				Plugin.Logger.LogError((object)"Please send the information below to the developer, and mention what moon this error occurred on");
				Plugin.Logger.LogError((object)ex);
			}
		}

		internal static void RedecorateDropship(bool vehicle = false)
		{
			if (!initialized || landed)
			{
				return;
			}
			landed = true;
			if (!seeded)
			{
				rand = new Random(StartOfRound.Instance.randomMapSeed);
				Plugin.Logger.LogInfo((object)$"RNG initialized (Seed: {StartOfRound.Instance.randomMapSeed})");
				seeded = true;
			}
			Plugin.Logger.LogInfo((object)"Roll chance for holiday");
			bool flag = RandomChance(IsSnowLevel() ? ((double)Plugin.configSnowyChance.Value) : ((double)Plugin.configNormalChance.Value));
			Plugin.Logger.LogInfo((object)"Roll chance for old music");
			bool flag2 = RandomChance(Plugin.configLegacyChance.Value);
			if (vehicle)
			{
				shipComponent.mesh = ship;
				star.SetActive(false);
				Plugin.Logger.LogInfo((object)"Dropship: Normal (delivering vehicle)");
				return;
			}
			if (flag)
			{
				shipComponent.mesh = shipJolly;
				musicComponent.clip = musicJolly;
				musicFarComponent.clip = musicFarJolly;
				star.SetActive(true);
				Plugin.Logger.LogInfo((object)"Dropship: Holiday");
				return;
			}
			shipComponent.mesh = ship;
			if (flag2)
			{
				musicComponent.clip = musicOld;
				musicFarComponent.clip = musicFarOld;
				Plugin.Logger.LogInfo((object)"Dropship: Normal (old music)");
			}
			else
			{
				musicComponent.clip = music;
				musicFarComponent.clip = musicFar;
				Plugin.Logger.LogInfo((object)"Dropship: Normal");
			}
			star.SetActive(false);
		}

		internal static void DropshipLeave()
		{
			landed = false;
			if (initialized && star.activeSelf)
			{
				((MonoBehaviour)shipScript).StartCoroutine(DisableStarInSky());
			}
		}

		internal static IEnumerator DisableStarInSky()
		{
			float start = Time.time;
			Plugin.Logger.LogInfo((object)"Holiday: Upon reaching orbit, disable star");
			while (shipObject.activeSelf)
			{
				yield return null;
			}
			star.SetActive(false);
			Plugin.Logger.LogInfo((object)$"Holiday: Star disabled after {Time.time - start}s");
		}

		private static bool RandomChance(double chance)
		{
			double num = rand.NextDouble();
			Plugin.Logger.LogInfo((object)$"RNG: {num} < {chance}");
			if (!(chance >= 1.0))
			{
				if (chance > 0.0)
				{
					return num < chance;
				}
				return false;
			}
			return true;
		}

		private static bool IsSnowLevel()
		{
			if (StartOfRound.Instance.currentLevel.levelIncludesSnowFootprints)
			{
				if (!((Object)(object)artificeBlizzard == (Object)null))
				{
					return artificeBlizzard.activeSelf;
				}
				return true;
			}
			return false;
		}
	}
	[BepInPlugin("butterystancakes.lethalcompany.snowyholidaydropship", "Snowy Holiday Dropship", "1.1.0")]
	public class Plugin : BaseUnityPlugin
	{
		private const string PLUGIN_GUID = "butterystancakes.lethalcompany.snowyholidaydropship";

		private const string PLUGIN_NAME = "Snowy Holiday Dropship";

		private const string PLUGIN_VERSION = "1.1.0";

		public static ConfigEntry<float> configSnowyChance;

		public static ConfigEntry<float> configNormalChance;

		public static ConfigEntry<float> configLegacyChance;

		internal static ManualLogSource Logger;

		private void Awake()
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Expected O, but got Unknown
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			AcceptableValueRange<float> val = new AcceptableValueRange<float>(0f, 1f);
			string text = " (0 = never, 1 = guaranteed, or anything in between - 0.5 = 50% chance)";
			configSnowyChance = ((BaseUnityPlugin)this).Config.Bind<float>("Random", "SnowyChance", 1f, new ConfigDescription("The percentage chance for the dropship to be holiday-themed on snowy moons." + text, (AcceptableValueBase)(object)val, Array.Empty<object>()));
			configNormalChance = ((BaseUnityPlugin)this).Config.Bind<float>("Random", "NormalChance", 0f, new ConfigDescription("The percentage chance for the dropship to be holiday-themed on normal moons." + text, (AcceptableValueBase)(object)val, Array.Empty<object>()));
			configLegacyChance = ((BaseUnityPlugin)this).Config.Bind<float>("Random", "LegacyChance", 0f, new ConfigDescription("The percentage chance for the normal dropship to use the old music, showcased in an early teaser video." + text, (AcceptableValueBase)(object)val, Array.Empty<object>()));
			new Harmony("butterystancakes.lethalcompany.snowyholidaydropship").PatchAll();
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Snowy Holiday Dropship v1.1.0 loaded");
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "SnowyHolidayDropship";

		public const string PLUGIN_NAME = "SnowyHolidayDropship";

		public const string PLUGIN_VERSION = "1.1.0";
	}
}
namespace SnowyHolidayDropship.Patches
{
	[HarmonyPatch]
	internal class SnowyHolidayDropshipPatches
	{
		[HarmonyPatch(typeof(ItemDropship), "Start")]
		[HarmonyPostfix]
		public static void ItemDropshipPostStart(ItemDropship __instance)
		{
			DropshipDecorator.Init(__instance);
		}

		[HarmonyPatch(typeof(ItemDropship), "LandShipClientRpc")]
		[HarmonyPostfix]
		public static void PostLandShipClientRpc()
		{
			DropshipDecorator.RedecorateDropship();
		}

		[HarmonyPatch(typeof(ItemDropship), "ShipLeave")]
		[HarmonyPatch(typeof(ItemDropship), "FinishDeliveringVehicleClientRpc")]
		[HarmonyPostfix]
		public static void ItemDropshipPostShipLeave()
		{
			DropshipDecorator.DropshipLeave();
		}

		[HarmonyPatch(typeof(ItemDropship), "DeliverVehicleClientRpc")]
		[HarmonyPostfix]
		public static void PostDeliverVehicleClientRpc()
		{
			DropshipDecorator.RedecorateDropship(vehicle: true);
		}
	}
}