Decompiled source of BubblesValuables v1.1.0

BubblesValuables.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
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.Logging;
using BubblesValuables;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using REPOLib.Modules;
using SingularityGroup.HotReload;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("pengumo")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyCopyright("Copyright © 2025 pengumo")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0")]
[assembly: AssemblyProduct("BubblesValuables")]
[assembly: AssemblyTitle("BubblesValuables")]
[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;
		}
	}
}
public class ValuableHatePotion : MonoBehaviour
{
	private enum State
	{
		Idle,
		Active
	}

	private PhysGrabObject physGrabObject;

	private ParticleSystem particles;

	private Renderer hatePotionRenderer;

	private State currentState;

	private string playerName = "[playerName]";

	private readonly List<string> transitiveVerbs = new List<string>();

	private readonly List<string> intransitiveVerbs = new List<string>();

	private readonly List<string> adjectives = new List<string>();

	private readonly List<string> intensifiers = new List<string>();

	private readonly List<string> nouns = new List<string>();

	private readonly List<string> adverbs = new List<string>();

	private float coolDownUntilNextSentence = 3f;

	private bool particlesPlaying;

	private readonly List<string> sentenceTemplates = new List<string>
	{
		"I {intensifier} {transitiveVerb} {playerName} - they're so {adjective}!", "{playerName} is {adverb} {adjective}, and I can't stand it!", "Why does {playerName} have to be so {adjective} all the time?", "Every time I see {playerName}, I {intransitiveVerb} uncontrollably.", "{playerName}'s {adjective} behavior makes me {intransitiveVerb}.", "I {transitiveVerb} {playerName} more than anything in this world!", "Just thinking about {playerName} makes me {intransitiveVerb}.", "{playerName} is the most {adjective} {noun} I've ever met!", "I {adverb} {transitiveVerb} {playerName} for being so {adjective}.", "Can we talk about how {adjective} {playerName} is being today?",
		"{playerName}'s mere presence makes me {intransitiveVerb}.", "I wish I could {transitiveVerb} {playerName} right now!", "No one is as {adjective} as {playerName} - it's {adverb} unbearable!", "{playerName} is {intensifier} {adjective}, and I'm not exaggerating!", "I {transitiveVerb} {playerName} with every fiber of my being!", "The way {playerName} acts is {adverb} {adjective}.", "I can't help but {transitiveVerb} {playerName} when they're around.", "{playerName} is like a {adjective} {noun} that won't go away!", "My day is ruined whenever {playerName} is nearby.", "I {intensifier} {transitiveVerb} everything about {playerName}!"
	};

	private void Start()
	{
		try
		{
			physGrabObject = ((Component)this).GetComponent<PhysGrabObject>();
			if ((Object)(object)physGrabObject == (Object)null)
			{
				Plugins.LogSource.LogError((object)"Missing PhysGrabObject component!");
				((Behaviour)this).enabled = false;
				return;
			}
			Transform val = ((Component)this).transform.Find("Object/Mesh/Hate Potion Liquid");
			hatePotionRenderer = ((val != null) ? ((Component)val).GetComponent<Renderer>() : null);
			if ((Object)(object)hatePotionRenderer == (Object)null)
			{
				Plugins.LogSource.LogError((object)"Could not find or initialize Hate Potion renderer");
			}
			Transform val2 = ((Component)this).transform.Find("Object/Particles");
			particles = ((val2 != null) ? ((Component)val2).GetComponent<ParticleSystem>() : null);
			if ((Object)(object)particles != (Object)null)
			{
				particles.Stop(true, (ParticleSystemStopBehavior)1);
			}
			else
			{
				Plugins.LogSource.LogWarning((object)"Could not find or initialize Particle System");
			}
			InitializeWordLists();
		}
		catch (Exception arg)
		{
			Plugins.LogSource.LogError((object)$"Initialization error: {arg}");
			((Behaviour)this).enabled = false;
		}
	}

	private void Update()
	{
		if (!((Behaviour)this).enabled)
		{
			return;
		}
		try
		{
			UpdateHatePotionAppearance();
			UpdateParticleSystem();
			if (SemiFunc.IsMultiplayer())
			{
				switch (currentState)
				{
				case State.Idle:
					StateIdle();
					break;
				case State.Active:
					StateActive();
					break;
				}
			}
		}
		catch (Exception arg)
		{
			Plugins.LogSource.LogError((object)$"Update error: {arg}");
		}
	}

	private void UpdateHatePotionAppearance()
	{
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)hatePotionRenderer != (Object)null && (Object)(object)hatePotionRenderer.material != (Object)null)
		{
			float num = Time.time * 0.1f;
			float num2 = Mathf.Sin(num) * 0.25f;
			float num3 = 2f + num2;
			hatePotionRenderer.material.mainTextureOffset = new Vector2(0f, num);
			hatePotionRenderer.material.mainTextureScale = new Vector2(num3, num3);
		}
	}

	private void UpdateParticleSystem()
	{
		if (!((Object)(object)physGrabObject != (Object)null) || !((Object)(object)particles != (Object)null))
		{
			return;
		}
		bool grabbed = physGrabObject.grabbed;
		if (grabbed != particlesPlaying)
		{
			if (grabbed)
			{
				particles.Play();
			}
			else
			{
				particles.Stop(true, (ParticleSystemStopBehavior)1);
			}
			particlesPlaying = grabbed;
		}
	}

	private void StateIdle()
	{
		//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
		if (coolDownUntilNextSentence > 0f && physGrabObject.grabbed)
		{
			coolDownUntilNextSentence -= Time.deltaTime;
		}
		else if (!((Object)(object)PhysGrabber.instance == (Object)null) && PhysGrabber.instance.grabbed && !((Object)(object)PhysGrabber.instance.grabbedPhysGrabObject != (Object)(object)physGrabObject))
		{
			FindTargetPlayer();
			if ((Object)(object)ChatManager.instance != (Object)null)
			{
				string text = GenerateHatefulSentence();
				currentState = State.Active;
				Color val = default(Color);
				((Color)(ref val))..ctor(0.3f, 1f, 0.6f, 1f);
				ChatManager.instance.PossessChatScheduleStart(10);
				ChatManager.instance.PossessChat((PossessChatID)6, text, 1f, val, 0f, false, 0, (UnityEvent)null);
				ChatManager.instance.PossessChatScheduleEnd();
			}
		}
	}

	private void FindTargetPlayer()
	{
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: 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_0096: Unknown result type (might be due to invalid IL or missing references)
		if (!SemiFunc.IsMultiplayer())
		{
			playerName = "this potion";
			return;
		}
		List<PlayerAvatar> list = SemiFunc.PlayerGetAllPlayerAvatarWithinRange(10f, ((Component)PhysGrabber.instance).transform.position, false, default(LayerMask));
		PlayerAvatar val = null;
		float num = float.MaxValue;
		foreach (PlayerAvatar item in list)
		{
			if ((Object)(object)item != (Object)null && (Object)(object)item != (Object)(object)PlayerAvatar.instance)
			{
				float num2 = Vector3.Distance(((Component)PhysGrabber.instance).transform.position, ((Component)item).transform.position);
				if (num2 < num)
				{
					num = num2;
					val = item;
				}
			}
		}
		playerName = (((Object)(object)val != (Object)null) ? val.playerName : "this potion");
	}

	private void StateActive()
	{
		if ((Object)(object)PhysGrabber.instance == (Object)null || !PhysGrabber.instance.grabbed || (Object)(object)PhysGrabber.instance.grabbedPhysGrabObject != (Object)(object)physGrabObject || ((Object)(object)ChatManager.instance != (Object)null && !ChatManager.instance.StateIsPossessed()))
		{
			currentState = State.Idle;
			coolDownUntilNextSentence = Random.Range(5f, 15f);
		}
	}

	private void InitializeWordLists()
	{
		transitiveVerbs.AddRange(new string[27]
		{
			"despise", "hate", "loathe", "detest", "abhor", "scorn", "disdain", "shun", "avoid", "reject",
			"condemn", "denounce", "revile", "execrate", "abominate", "dislike", "deplore", "resent", "spurn", "snub",
			"ignore", "shudder at", "recoil from", "grumble about", "complain about", "criticize", "berate"
		});
		intransitiveVerbs.AddRange(new string[31]
		{
			"cringe", "shudder", "gag", "retch", "groan", "sigh", "fume", "seethe", "boil", "rage",
			"fret", "complain", "whine", "moan", "grumble", "sulk", "pout", "scowl", "frown", "grimace",
			"wince", "flinch", "recoil", "shiver", "tremble", "shake", "quiver", "quaver", "quail", "blanch",
			"pale"
		});
		adjectives.AddRange(new string[30]
		{
			"disgusting", "repulsive", "revolting", "abhorrent", "loathsome", "odious", "vile", "nauseating", "sickening", "offensive",
			"repugnant", "abominable", "detestable", "despicable", "contemptible", "execrable", "deplorable", "horrid", "horrible", "awful",
			"terrible", "dreadful", "ghastly", "grim", "grisly", "gruesome", "hideous", "unpleasant", "disagreeable", "distasteful"
		});
		intensifiers.AddRange(new string[27]
		{
			"utterly", "completely", "absolutely", "totally", "thoroughly", "extremely", "exceedingly", "exceptionally", "incredibly", "intensely",
			"profoundly", "deeply", "unbearably", "unutterably", "unspeakably", "overwhelmingly", "terribly", "horribly", "awfully", "dreadfully",
			"frightfully", "excessively", "immensely", "colossally", "monumentally", "staggeringly", "unreasonably"
		});
		nouns.AddRange(new string[28]
		{
			"monster", "creature", "fiend", "beast", "demon", "devil", "wretch", "villain", "scoundrel", "rogue",
			"rascal", "miscreant", "reprobate", "outcast", "pariah", "menace", "plague", "scourge", "torment", "affliction",
			"curse", "bane", "nightmare", "horror", "abomination", "atrocity", "disgrace", "embarrassment"
		});
		adverbs.AddRange(new string[28]
		{
			"visibly", "obviously", "noticeably", "patently", "manifestly", "clearly", "plainly", "evidently", "undeniably", "unmistakably",
			"painfully", "horribly", "awfully", "dreadfully", "terribly", "frightfully", "excessively", "unbearably", "intolerably", "unacceptably",
			"outrageously", "shockingly", "appallingly", "disgustingly", "repulsively", "revoltingly", "nauseatingly", "sickeningly"
		});
	}

	private string GenerateHatefulSentence()
	{
		string text = sentenceTemplates[Random.Range(0, sentenceTemplates.Count)];
		string text2 = text.Replace("{playerName}", playerName);
		if (text2.Contains("{transitiveVerb}"))
		{
			text2 = text2.Replace("{transitiveVerb}", transitiveVerbs[Random.Range(0, transitiveVerbs.Count)]);
		}
		if (text2.Contains("{intransitiveVerb}"))
		{
			string newValue = intransitiveVerbs[Random.Range(0, intransitiveVerbs.Count)];
			text2 = text2.Replace("{intransitiveVerb}", newValue);
		}
		if (text2.Contains("{adjective}"))
		{
			text2 = text2.Replace("{adjective}", adjectives[Random.Range(0, adjectives.Count)]);
		}
		if (text2.Contains("{intensifier}"))
		{
			text2 = text2.Replace("{intensifier}", intensifiers[Random.Range(0, intensifiers.Count)]);
		}
		if (text2.Contains("{adverb}"))
		{
			text2 = text2.Replace("{adverb}", adverbs[Random.Range(0, adverbs.Count)]);
		}
		if (text2.Contains("{noun}"))
		{
			text2 = text2.Replace("{noun}", nouns[Random.Range(0, nouns.Count)]);
		}
		return char.ToUpper(text2[0]) + text2.Substring(1);
	}
}
[RequireComponent(typeof(PhysGrabObjectImpactDetector))]
public class ValuableHeadMan : MonoBehaviour
{
	private const string ENEMY_PREFAB_NAME = "Enemy - Head";

	private bool wasReplaced = false;

	private EnemySetup headEnemySetup;

	private PhysGrabObjectImpactDetector impactDetector;

	private void Start()
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Expected O, but got Unknown
		impactDetector = ((Component)this).GetComponent<PhysGrabObjectImpactDetector>();
		impactDetector.onDestroy.AddListener(new UnityAction(OnBreak));
		FindHeadEnemySetup();
	}

	private void FindHeadEnemySetup()
	{
		foreach (EnemySetup item in EnemyDirector.instance.enemiesDifficulty3)
		{
			if (item.spawnObjects != null && item.spawnObjects.Count > 0 && ((Object)item.spawnObjects[0]).name == "Enemy - Head")
			{
				headEnemySetup = item;
				break;
			}
		}
		if ((Object)(object)headEnemySetup == (Object)null)
		{
			Plugins.LogSource.LogError((object)"Could not find enemy setup for Enemy - Head");
		}
	}

	private void OnBreak()
	{
		if (SemiFunc.IsMasterClientOrSingleplayer() && !wasReplaced)
		{
			wasReplaced = true;
			Plugins.LogSource.LogInfo((object)"HeadMan's Bust Broken! Attempting to spawn head enemy...");
			if ((Object)(object)headEnemySetup != (Object)null)
			{
				SpawnHeadEnemy();
			}
			else
			{
				Plugins.LogSource.LogError((object)"Failed to spawn Enemy - Head - setup not found");
			}
		}
	}

	private void SpawnHeadEnemy()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = ((Component)this).transform.position;
		Quaternion rotation = ((Component)this).transform.rotation;
		if (SemiFunc.IsMultiplayer())
		{
			GameObject val = PhotonNetwork.InstantiateRoomObject("Enemies/" + ((Object)headEnemySetup.spawnObjects[0]).name, position, rotation, (byte)0, (object[])null);
			if ((Object)(object)val != (Object)null)
			{
				SetupEnemyComponents(val);
			}
		}
		else
		{
			GameObject val2 = Object.Instantiate<GameObject>(headEnemySetup.spawnObjects[0], position, rotation);
			if ((Object)(object)val2 != (Object)null)
			{
				SetupEnemyComponents(val2);
			}
		}
	}

	private void SetupEnemyComponents(GameObject enemy)
	{
		EnemyParent component = enemy.GetComponent<EnemyParent>();
		if ((Object)(object)component != (Object)null)
		{
			component.SetupDone = true;
			Plugins.LogSource.LogInfo((object)"Successfully spawned Enemy - Head");
		}
		else
		{
			Plugins.LogSource.LogWarning((object)"Spawned Enemy - Head but missing EnemyParent component");
		}
	}

	private void OnDestroy()
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Expected O, but got Unknown
		if ((Object)(object)impactDetector != (Object)null)
		{
			impactDetector.onDestroy.RemoveListener(new UnityAction(OnBreak));
		}
	}
}
namespace BubblesValuables
{
	[BepInPlugin("BubblesValuables", "BubblesValuables", "1.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugins : BaseUnityPlugin
	{
		private static readonly Harmony Harmony = new Harmony("BubblesValuables");

		internal static ManualLogSource LogSource { get; } = Logger.CreateLogSource("BubblesValuables");


		private void Awake()
		{
			string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			string text = Path.Combine(directoryName, "bubbles_valuables");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			if ((Object)(object)val == (Object)null)
			{
				LogSource.LogError((object)"Failed to load BubblesValuables asset bundle.");
				return;
			}
			LogSource.LogInfo((object)"Successfully loaded BubblesValuables asset bundle.");
			Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>
			{
				{
					"Valuable FCO",
					new List<string> { "Valuables - Arctic" }
				},
				{
					"Valuable FCB",
					new List<string> { "Valuables - Arctic" }
				},
				{
					"Valuable ApexFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable BotFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable BoomerFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable GnomeFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable HeadFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable HiddenFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable MentalistFigure",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable MFDLB",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable Picture",
					new List<string> { "Valuables - Generic" }
				},
				{
					"Valuable KoiCake",
					new List<string> { "Valuables - Manor" }
				},
				{
					"Valuable HeadMan",
					new List<string> { "Valuables - Manor" }
				},
				{
					"Valuable Hate Potion",
					new List<string> { "Valuables - Wizard" }
				}
			};
			foreach (KeyValuePair<string, List<string>> item in dictionary)
			{
				RegisterValuable(val, item.Key, item.Value);
			}
			Harmony.PatchAll();
		}

		private void RegisterValuable(AssetBundle assetBundle, string valuableName, List<string> categoryNames)
		{
			GameObject val = assetBundle.LoadAsset<GameObject>(valuableName);
			if ((Object)(object)val == (Object)null)
			{
				LogSource.LogError((object)("Failed to load valuable asset: " + valuableName));
				return;
			}
			if (valuableName == "Valuable Hate Potion")
			{
				val.AddComponent<ValuableHatePotion>();
			}
			if (valuableName == "Valuable HeadMan")
			{
				val.AddComponent<ValuableHeadMan>();
			}
			try
			{
				Valuables.RegisterValuable(val, categoryNames);
				LogSource.LogInfo((object)("Successfully registered valuable: " + valuableName));
			}
			catch (Exception ex)
			{
				LogSource.LogError((object)("Failed to register valuable " + valuableName + ": " + ex.ToString()));
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "BubblesValuables";

		public const string PLUGIN_NAME = "BubblesValuables";

		public const string PLUGIN_VERSION = "1.1.0";
	}
}
namespace BubblesValuables.Internal.Shared
{
	public static class ValuableDefines
	{
		public enum CustomPossessChatID
		{
			HatePotion = 6
		}
	}
}
namespace BubblesValuables.Internal.Patches
{
	[HarmonyPatch]
	public static class ChatManagerPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(ChatManager), "PossessChatCustomLogic")]
		private static void HandleHatePotionEffects(ChatManager __instance)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Invalid comparison between Unknown and I4
			try
			{
				if ((int)__instance.activePossession == 6 && (Object)(object)__instance.playerAvatar != (Object)null)
				{
					ApplyHatePotionVisuals(__instance.playerAvatar);
				}
			}
			catch (Exception arg)
			{
				Log.Error($"[HatePotionPatch] Error: {arg}");
			}
		}

		private static void ApplyHatePotionVisuals(PlayerAvatar avatar)
		{
			avatar.OverridePupilSize(0.5f, 2, 0.8f, 0.8f, 15f, 0.3f, 0.1f);
			avatar.playerHealth.EyeMaterialOverride((EyeOverrideState)2, 0.25f, 0);
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}