Decompiled source of MCMP Patch v1.1.1

MCMP_Patch.dll

Decompiled 2 months ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using MCMP_Patch.Patches;
using TooManyEmotes;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("MCMP_Patch")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MCMP_Patch")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("8a2b7984-d984-496c-b2dd-30d38fee4b73")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MCMP_Patch
{
	internal class CustomLogging
	{
		private static ManualLogSource logger;

		public static void InitLogger()
		{
			try
			{
				logger = Logger.CreateLogSource($"{((BaseUnityPlugin)Plugin.instance).Info.Metadata.Name}-{((BaseUnityPlugin)Plugin.instance).Info.Metadata.Version}");
			}
			catch
			{
				logger = Plugin.defaultLogger;
			}
		}

		public static void Log(string message)
		{
			logger.LogInfo((object)message);
		}

		public static void LogError(string message)
		{
			logger.LogError((object)message);
		}

		public static void LogWarning(string message)
		{
			logger.LogWarning((object)message);
		}

		public static bool Assert(bool condition, string failMessage)
		{
			if (!condition)
			{
				LogWarning(failMessage);
			}
			return condition;
		}
	}
	[HarmonyPatch]
	public static class EmoteAchievementManager
	{
		public enum Achievements
		{
			DominoEffect,
			SpaceIsTheBest,
			ItIsWhatItIs,
			FallGuy,
			GenerationalCrashout,
			CheddahLaden,
			JiggleJiggle,
			DoNotRedeem,
			ShouldNotHaveSaidThat,
			SixThirtyTustinAvenue,
			BirdIsTheWord,
			Firework,
			Scrambled,
			NewWheels,
			LeaveTheDoorOpen,
			LookinGood,
			CreditDreams,
			TheShipGuy,
			HotToGo,
			SleepDialysisDemon,
			SeeYaLater,
			XmasInHarlem
		}

		public static Dictionary<Achievements, (string, string)> EmoteAchievements = new Dictionary<Achievements, (string, string)>();

		public static void RegisterEmoteAchievement(Achievements achievementName, string emoteName, string achievementText)
		{
			EmoteAchievements.Add(achievementName, (emoteName, achievementText));
		}

		private static (string, string) GetAchievementData(Achievements achievementName)
		{
			if (EmoteAchievements.TryGetValue(achievementName, out var value))
			{
				return value;
			}
			return (null, null);
		}

		public static void RegisterAchievements()
		{
			RegisterEmoteAchievement(Achievements.DominoEffect, "dancin'_domino", "Domino Effect");
			RegisterEmoteAchievement(Achievements.SpaceIsTheBest, "planetary_vibes", "Space Is the Best");
			RegisterEmoteAchievement(Achievements.ItIsWhatItIs, "go_with_the_flow", "It Is What It Is");
			RegisterEmoteAchievement(Achievements.FallGuy, "smug_dance", "Fall Guy");
			RegisterEmoteAchievement(Achievements.GenerationalCrashout, "get_down", "Generational Crashout");
			RegisterEmoteAchievement(Achievements.CheddahLaden, "hit_it", "Cheddah Laden");
			RegisterEmoteAchievement(Achievements.JiggleJiggle, "jiggle_jiggle", "Jiggle Jiggle");
			RegisterEmoteAchievement(Achievements.DoNotRedeem, "sad_trombone", "Do Not Redeem!");
			RegisterEmoteAchievement(Achievements.ShouldNotHaveSaidThat, "socks", "Should Not Have Said That");
			RegisterEmoteAchievement(Achievements.SixThirtyTustinAvenue, "stuck", "Welcome to 630 Tustin Ave.");
			RegisterEmoteAchievement(Achievements.BirdIsTheWord, "bird_is_the_word", "Bird Is the Word");
			RegisterEmoteAchievement(Achievements.Scrambled, "chicken_wing_it", "Scrambled!");
			RegisterEmoteAchievement(Achievements.NewWheels, "freedom_wheels", "New Wheels");
			RegisterEmoteAchievement(Achievements.LeaveTheDoorOpen, "leave_the_door_open", "Leave The Door Open");
			RegisterEmoteAchievement(Achievements.LookinGood, "looking_good", "Lookin' Good!");
			RegisterEmoteAchievement(Achievements.HotToGo, "get_hot", "Hot To Go!");
			RegisterEmoteAchievement(Achievements.SleepDialysisDemon, "boo'd_up_groove", "Sleep Dialysis Demon");
			RegisterEmoteAchievement(Achievements.SeeYaLater, "bye_bye_bye", "See Ya Later!");
			RegisterEmoteAchievement(Achievements.XmasInHarlem, "all_i_want_for_christmas", "Christmas in Harlem");
			RegisterEmoteAchievement(Achievements.CreditDreams, "lucid_dreams", "Credit Dreams...");
			RegisterEmoteAchievement(Achievements.TheShipGuy, "smooth_operator", "The Ship Guy");
			CustomLogging.Log("Registered " + EmoteAchievements.Count + " emote achievements");
		}

		[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
		[HarmonyPostfix]
		public static void Init()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			if (HelperTools.IsClient)
			{
				HelperTools.PatchNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler("MCMP_Patch.OnUnlockEmoteClientRpc", new HandleNamedMessageDelegate(OnUnlockEmoteClientRpc));
			}
		}

		public static void SyncEmoteUnlockWithClients(int emoteId)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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)
			int num = 2;
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(num, (Allocator)2, -1);
			short num2 = (short)emoteId;
			((FastBufferWriter)(ref val)).WriteValue<short>(ref num2, default(ForPrimitives));
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val2 in allPlayerScripts)
			{
				HelperTools.PatchNetworkManager.CustomMessagingManager.SendNamedMessage("MCMP_Patch.OnUnlockEmoteClientRpc", val2.playerClientId, val, (NetworkDelivery)3);
			}
		}

		private static void OnUnlockEmoteClientRpc(ulong clientId, FastBufferReader reader)
		{
			//IL_000e: 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)
			if (HelperTools.IsClient)
			{
				short num = default(short);
				((FastBufferReader)(ref reader)).ReadValue<short>(ref num, default(ForPrimitives));
				if (!SessionManager.IsEmoteUnlocked(EmotesManager.allUnlockableEmotes[num], HelperTools.LocalPlayerController.playerUsername))
				{
					SessionManager.UnlockEmoteLocal((int)num, false, HelperTools.LocalPlayerController.playerUsername);
				}
			}
		}

		public static void TryUnlockEmoteAchievement(Achievements achievement, string playerUsername, bool serverUnlock = false)
		{
			var (text, achievementName) = GetAchievementData(achievement);
			if (text == null)
			{
				CustomLogging.LogWarning("Invalid emote ID for achievement " + achievement);
				return;
			}
			UnlockableEmote val = EmotesManager.allUnlockableEmotesDict[text];
			if (!SessionManager.IsEmoteUnlocked(text, playerUsername))
			{
				SessionManager.UnlockEmoteLocal(val, false, playerUsername);
				AddAchievement(achievementName, serverUnlock ? "All employees" : playerUsername);
				HelperTools.AddChatMessage(val.displayNameColorCoded + " emote unlocked!");
			}
			if (serverUnlock)
			{
				SyncEmoteUnlockWithClients(val.emoteId);
			}
		}

		private static void AddAchievement(string achievementName, string playerUsername)
		{
			HelperTools.AddChatMessage(string.Concat("<color=yellow>" + playerUsername + " unlocked an achievement:</color> ", achievementName));
		}
	}
	internal static class HelperTools
	{
		public static NetworkManager PatchNetworkManager => NetworkManager.Singleton;

		public static bool IsClient => PatchNetworkManager.IsClient;

		public static bool IsServer => PatchNetworkManager.IsServer;

		public static bool IsHost => PatchNetworkManager.IsHost;

		public static PlayerControllerB LocalPlayerController => StartOfRound.Instance?.localPlayerController;

		public static void AddChatMessage(string text)
		{
			HUDManager.Instance.AddTextToChatOnServer(text, -1);
		}
	}
	[BepInPlugin("Vijuhas.MCMP_Patch", "MCMP_Patch", "1.1.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("Vijuhas.MCMP_Patch");

		public static Plugin instance;

		public static ManualLogSource defaultLogger => ((BaseUnityPlugin)instance).Logger;

		private void Awake()
		{
			if ((Object)(object)instance == (Object)null)
			{
				instance = this;
			}
			CustomLogging.InitLogger();
			EmoteAchievementManager.RegisterAchievements();
			harmony.PatchAll(typeof(Plugin));
			harmony.PatchAll(typeof(EmoteAchievementManager));
			harmony.PatchAll(typeof(CauseOfDeathPatch));
			harmony.PatchAll(typeof(TerminalPatch));
			harmony.PatchAll(typeof(GrabbableObjectGrabItemPatch));
			harmony.PatchAll(typeof(GrabbableObjectBroughtToShipPatch));
			harmony.PatchAll(typeof(MouthDogAIPatch));
			harmony.PatchAll(typeof(EntranceTeleportPatch));
			harmony.PatchAll(typeof(DepositItemsDeskPatch));
			harmony.PatchAll(typeof(GiantKiwiAIPatch));
			harmony.PatchAll(typeof(VehicleControllerPatch));
			harmony.PatchAll(typeof(DressGirlAIPatch));
			CustomLogging.Log("Vijuhas.MCMP_Patch has loaded successfully.");
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "Vijuhas.MCMP_Patch";

		public const string PLUGIN_NAME = "MCMP_Patch";

		public const string PLUGIN_VERSION = "1.1.1";
	}
}
namespace MCMP_Patch.Patches
{
	[HarmonyPatch(typeof(DepositItemsDesk), "Attack")]
	internal class DepositItemsDeskPatch
	{
		[HarmonyPostfix]
		private static void Postfix()
		{
			string playerUsername = GameNetworkManager.Instance.localPlayerController.playerUsername;
			EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.DoNotRedeem, playerUsername);
		}
	}
	[HarmonyPatch(typeof(DressGirlAI), "BeginChasing")]
	internal class DressGirlAIPatch
	{
		[HarmonyPostfix]
		private static void Postfix(DressGirlAI __instance)
		{
			if ((Object)(object)__instance.hauntingPlayer != (Object)null)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.SleepDialysisDemon, __instance.hauntingPlayer.playerUsername);
			}
		}
	}
	[HarmonyPatch(typeof(EntranceTeleport), "TeleportPlayer")]
	internal class EntranceTeleportPatch
	{
		[HarmonyPostfix]
		private static void Postfix(EntranceTeleport __instance)
		{
			int num = 1;
			if (__instance.isEntranceToBuilding && RoundManager.Instance.currentDungeonType == num)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.SixThirtyTustinAvenue, HelperTools.LocalPlayerController.playerUsername);
			}
		}
	}
	[HarmonyPatch(typeof(GiantKiwiAI), "FinishPryOpenDoor")]
	internal class GiantKiwiAIPatch
	{
		[HarmonyPostfix]
		private static void Postfix()
		{
			EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.BirdIsTheWord, HelperTools.LocalPlayerController.playerUsername, serverUnlock: true);
		}
	}
	[HarmonyPatch(typeof(GrabbableObject), "GrabItem")]
	internal class GrabbableObjectGrabItemPatch
	{
		[HarmonyPostfix]
		private static void Postfix(GrabbableObject __instance)
		{
			if (105f * __instance.playerHeldBy.carryWeight - 105f > 100f)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.CheddahLaden, __instance.playerHeldBy.playerUsername);
			}
		}
	}
	[HarmonyPatch(typeof(GrabbableObject), "OnBroughtToShip")]
	internal class GrabbableObjectBroughtToShipPatch
	{
		private static readonly string cashRegisterItemName = "Cash register";

		private static readonly string eggItemName = "Egg";

		private static readonly string giftBoxItemName = "Gift Box";

		[HarmonyPostfix]
		private static void Postfix(GrabbableObject __instance)
		{
			if ((Object)(object)__instance.playerHeldBy != (Object)null)
			{
				if (__instance.itemProperties.itemName == cashRegisterItemName)
				{
					EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.JiggleJiggle, __instance.playerHeldBy.playerUsername);
				}
				else if (__instance.itemProperties.itemName == eggItemName)
				{
					EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.Scrambled, __instance.playerHeldBy.playerUsername);
				}
				else if (__instance.itemProperties.itemName == giftBoxItemName)
				{
					EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.XmasInHarlem, __instance.playerHeldBy.playerUsername);
				}
			}
		}
	}
	[HarmonyPatch(typeof(Terminal), "RunTerminalEvents")]
	internal class InfiniteCreditsPatch
	{
		[HarmonyPostfix]
		private static void Postfix(ref int ___groupCredits)
		{
			___groupCredits = 69420;
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")]
	internal class CauseOfDeathPatch
	{
		[HarmonyPostfix]
		private static void Postfix(CauseOfDeath causeOfDeath, PlayerControllerB __instance)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Invalid comparison between Unknown and I4
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Invalid comparison between Unknown and I4
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Invalid comparison between Unknown and I4
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Invalid comparison between Unknown and I4
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Invalid comparison between Unknown and I4
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			string playerUsername = __instance.playerUsername;
			if ((int)causeOfDeath == 1)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.ItIsWhatItIs, playerUsername);
			}
			else if ((int)causeOfDeath == 2)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.FallGuy, playerUsername);
			}
			else if ((int)causeOfDeath == 16)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.GenerationalCrashout, playerUsername);
			}
			else if ((int)causeOfDeath == 3)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.Firework, playerUsername);
			}
			else if ((int)causeOfDeath == 13)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.HotToGo, playerUsername);
			}
			else if ((int)causeOfDeath == 10)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.SeeYaLater, playerUsername);
			}
		}
	}
	[HarmonyPatch(typeof(MouthDogAI), "KillPlayer")]
	internal class MouthDogAIPatch
	{
		[HarmonyPostfix]
		private static void Postfix(int playerId)
		{
			PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerId];
			if ((Object)(object)val != (Object)null)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.ShouldNotHaveSaidThat, val.playerUsername);
			}
		}
	}
	[HarmonyPatch(typeof(Terminal), "ParsePlayerSentence")]
	internal class TerminalPatch
	{
		private static readonly int inverseTpUnlockableID = 19;

		private static readonly int purpleSuitUnlockableID = 24;

		[HarmonyPostfix]
		private static void Postfix(ref TerminalNode __result, Terminal __instance)
		{
			if (__instance.screenText.text.Length <= 0)
			{
				return;
			}
			string text = __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded).ToLower();
			if (text.Split(new char[1] { ' ' }).Length != 0 && "confirm".StartsWith(text))
			{
				string playerUsername = GetPlayerUsingTerminal()?.playerUsername;
				if (__result.shipUnlockableID == inverseTpUnlockableID)
				{
					EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.DominoEffect, playerUsername, serverUnlock: true);
				}
				else if (__result.shipUnlockableID == purpleSuitUnlockableID)
				{
					EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.LookinGood, playerUsername, serverUnlock: true);
				}
				else if (__result.buyRerouteToMoon != -1 && __result.buyRerouteToMoon != -2 && __result.itemCost > 0 && StartOfRound.Instance.inShipPhase && !StartOfRound.Instance.travellingToNewLevel)
				{
					EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.SpaceIsTheBest, playerUsername);
				}
			}
		}

		public static PlayerControllerB GetPlayerUsingTerminal()
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (val.inTerminalMenu)
				{
					return val;
				}
			}
			return null;
		}
	}
	[HarmonyPatch(typeof(VehicleController), "SetIgnition")]
	internal class VehicleControllerPatch
	{
		[HarmonyPostfix]
		private static void Postfix(VehicleController __instance)
		{
			if ((Object)(object)__instance.currentDriver != (Object)null)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.NewWheels, __instance.currentDriver.playerUsername);
			}
			if ((Object)(object)__instance.currentPassenger != (Object)null)
			{
				EmoteAchievementManager.TryUnlockEmoteAchievement(EmoteAchievementManager.Achievements.NewWheels, __instance.currentPassenger.playerUsername);
			}
		}
	}
}