Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Herbert Bracken v2.0.2
plugins/HerbertBraken_V3.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using HerbertBracken.Core; using HerbertBracken.Patches; using HerbertBraken.Scripts; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("HerbertBracken")] [assembly: AssemblyDescription("A mod for Lethal Company that replaces the bracken's model with a model of Herbert the pervert from Family Guy. \"Herbert The Pervert\" (https://skfb.ly/6YDzP) by jumpymonkeymad is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("SpruceAcrobat18")] [assembly: AssemblyProduct("HerbertBracken")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("50feedfa-5dd6-4358-936e-87945c1a8cae")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.5.9.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 static class Assets { public static string mainAssetBundleName = "newherb"; public static AssetBundle MainAssetBundle = null; private static string GetAssemblyName() { return Assembly.GetExecutingAssembly().GetName().Name.Replace(" ", "_"); } public static void PopulateAssets() { if ((Object)(object)MainAssetBundle == (Object)null) { Console.WriteLine(GetAssemblyName() + "." + mainAssetBundleName); using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetAssemblyName() + "." + mainAssetBundleName); MainAssetBundle = AssetBundle.LoadFromStream(stream); } } } namespace HerbertBraken_V3 { public static class MyPluginInfo { public const string PLUGIN_GUID = "HerbertBraken_V3"; public const string PLUGIN_NAME = "A mod to replace the braken with Herbet from family guy"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace HerbertBraken.Scripts { public class HerbertController : MonoBehaviour { public FlowermanAI flowermanAI; private GameObject baseHerbertObject; private bool isAttacking; private bool isDead; private void Start() { flowermanAI = ((Component)this).GetComponent<FlowermanAI>(); if ((Object)(object)flowermanAI == (Object)null) { Logger.LogError("FlowermanAI component not found!"); return; } HideFlowermanModel(); CreateHerbertModelHDRP(); ReplaceFlowermanSFX(); UpdateScanNodeData(); } private void CreateHerbertModelHDRP() { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) GameObject asset = HerbertBracken.Core.Assets.GetAsset<GameObject>("Herbert The Pervert V2"); if ((Object)(object)asset == (Object)null) { Logger.LogError("Herbert asset not found in the bundle!"); return; } baseHerbertObject = Object.Instantiate<GameObject>(asset, ((Component)this).transform); if ((Object)(object)baseHerbertObject != (Object)null) { baseHerbertObject.transform.localPosition = new Vector3(0f, 0f, 0.5f); baseHerbertObject.transform.localRotation = Quaternion.identity; baseHerbertObject.transform.localScale = new Vector3(2f, 2f, 2f); Logger.LogInfo("Herbert model instantiated and attached."); Material asset2 = HerbertBracken.Core.Assets.GetAsset<Material>("herb"); Material asset3 = HerbertBracken.Core.Assets.GetAsset<Material>("eye"); if ((Object)(object)asset2 == (Object)null || (Object)(object)asset3 == (Object)null) { Logger.LogError("Failed to load Herbert's materials from the asset bundle!"); return; } Shader val = Shader.Find("HDRP/Lit"); Shader shader = Shader.Find("Unlit/Texture"); if ((Object)(object)val == (Object)null) { Logger.LogError("Lit/Texture shader not found!"); return; } baseHerbertObject.layer = LayerMask.NameToLayer("Enemies"); SkinnedMeshRenderer[] componentsInChildren = baseHerbertObject.GetComponentsInChildren<SkinnedMeshRenderer>(); SkinnedMeshRenderer[] array = componentsInChildren; foreach (SkinnedMeshRenderer val2 in array) { if ((Object)(object)val2.sharedMesh == (Object)null) { Logger.LogError("SkinnedMeshRenderer on " + ((Object)val2).name + " has no mesh assigned!"); continue; } ((Renderer)val2).enabled = true; asset3.shader = shader; asset2.shader = val; if (((Object)val2).name.Contains("Head")) { ((Renderer)val2).materials = (Material[])(object)new Material[2] { asset2, asset3 }; Logger.LogInfo("Assigned 'herb' and 'eye' materials to " + ((Object)val2).name + "."); } else { ((Renderer)val2).material = asset2; Logger.LogInfo("Assigned body material to " + ((Object)val2).name + "."); } } } else { Logger.LogError("Failed to instantiate Herbert model!"); } } private void ReplaceFlowermanSFX() { if (ConfigManager.UseMusic.Value) { flowermanAI.creatureAngerVoice.clip = HerbertBracken.Core.Assets.GetAsset<AudioClip>("HerbertAggressiveSFX"); } if (ConfigManager.UseVoicelines.Value) { flowermanAI.crackNeckSFX = HerbertBracken.Core.Assets.GetAsset<AudioClip>("HerbertKill"); flowermanAI.crackNeckAudio.clip = HerbertBracken.Core.Assets.GetAsset<AudioClip>("HerbertKill"); ((EnemyAI)flowermanAI).dieSFX = HerbertBracken.Core.Assets.GetAsset<AudioClip>("DeathSFX"); } } private void HideFlowermanModel() { Renderer[] componentsInChildren = ((Component)((Component)flowermanAI).transform.Find("FlowermanModel")).GetComponentsInChildren<Renderer>(); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].enabled = false; } Logger.LogInfo("Flowerman model hidden."); } private void UpdateScanNodeData() { ScanNodeProperties componentInChildren = ((Component)flowermanAI).GetComponentInChildren<ScanNodeProperties>(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.headerText = "Herbert The Pervert"; ((Component)componentInChildren).gameObject.SetActive(true); Logger.LogInfo("Updated scan node data to show Herbert's name."); } else { Logger.LogError("Failed to find ScanNodeProperties on Flowerman."); } } private void Update() { flowermanAI.creatureAngerVoice.pitch = 1f; if (((EnemyAI)flowermanAI).movingTowardsTargetPlayer && !isAttacking) { EnterAttackState(); } else if (!((EnemyAI)flowermanAI).movingTowardsTargetPlayer && isAttacking) { ExitAttackState(); } if (((EnemyAI)flowermanAI).isEnemyDead && !isDead) { KillHerbert(); } } private void EnterAttackState() { Logger.LogInfo("Herbert is attacking!"); if ((Object)(object)baseHerbertObject != (Object)null) { isAttacking = true; baseHerbertObject.SetActive(true); } else { Logger.LogError("baseHerbertObject is null! Cannot enter attack state."); } } private void ExitAttackState() { Logger.LogInfo("Herbert stopped attacking."); if ((Object)(object)baseHerbertObject != (Object)null) { isAttacking = false; baseHerbertObject.SetActive(true); } else { Logger.LogError("baseHerbertObject is null! Cannot exit attack state."); } } private void KillHerbert() { Logger.LogInfo("Herbert is killed!"); if ((Object)(object)baseHerbertObject != (Object)null) { isDead = true; baseHerbertObject.SetActive(false); } else { Logger.LogError("baseHerbertObject is null! Cannot kill Herbert."); } } } } namespace HerbertBracken.Patches { [HarmonyPatch] internal class EnemyPatches { [HarmonyPatch(typeof(FlowermanAI), "Start")] [HarmonyPostfix] public static void CreateHerbertModel(FlowermanAI __instance) { ((Component)__instance).gameObject.AddComponent<HerbertController>(); } } [HarmonyPatch] internal class RoundManagementPatches { private static Transform CardObject { get; set; } [HarmonyPatch(typeof(RoundManager), "GenerateNewLevelClientRpc")] [HarmonyPostfix] public static void GameStart(RoundManager __instance, int randomSeed, int levelID) { } [HarmonyPatch(typeof(StartOfRound), "EndOfGame")] [HarmonyPostfix] public static void GameEnd(StartOfRound __instance) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown if ((Object)CardObject != (Object)null) { Object.Destroy((Object)((Component)CardObject).gameObject); } } } } namespace HerbertBracken.Core { public static class Assets { public static AssetBundle AssetBundle { get; private set; } private static Dictionary<string, Object> AssetList { get; set; } private static string AssemblyName => Assembly.GetExecutingAssembly().FullName.Split(new char[1] { ',' })[0]; public static void PopulateAssets() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown string[] manifestResourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); if ((Object)AssetBundle != (Object)null) { Logger.LogWarning("Attempted to load the asset bundle but the bundle was not null!"); return; } string text = AssemblyName + ".newherb"; Logger.LogInfo("Trying to load asset bundle with name: " + text); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(text)) { if (stream == null) { Logger.LogError("Failed to load asset bundle: " + text); return; } AssetBundle = AssetBundle.LoadFromStream(stream); } if ((Object)AssetBundle == (Object)null) { Logger.LogError("Asset bundle at " + AssemblyName + "herbert failed to load!"); } AssetList = new Dictionary<string, Object>(); Object[] array = AssetBundle.LoadAllAssets(); Logger.LogInfo($"Loaded {array.Length} assets from the bundle."); Object[] array2 = array; foreach (Object val in array2) { Logger.LogInfo("Loaded asset: " + val.name); AssetList.Add(val.name, val); } } public static T GetAsset<T>(string name) where T : Object { if (!AssetList.TryGetValue(name, out var value)) { Logger.LogError("Attempted to load asset of name " + name + " but no asset of that name exists!"); return default(T); } Object[] array = AssetBundle.LoadAllAssets(); Object[] array2 = array; foreach (Object val in array2) { Logger.LogInfo($"Loaded asset: {val.name} of type {((object)val).GetType()}"); } T val2 = (T)(object)((value is T) ? value : null); if (val2 != null) { return val2; } Logger.LogError($"Asset of name {name} does not match type {typeof(T)}!"); return default(T); } } internal static class ConfigManager { public static ConfigEntry<bool> UseVoicelines { get; private set; } public static ConfigEntry<bool> UseMusic { get; private set; } public static ConfigEntry<bool> UseDeathSound { get; private set; } private static ConfigFile Config => HerbertBrackenBase.ModConfig; public static void InitializeConfig() { UseVoicelines = Config.Bind<bool>("Sound", "Use Herbert Voicelines", true, "Controls whether or not to replace the bracken's kill sound with Herbert voicelines"); UseMusic = Config.Bind<bool>("Sound", "Use Chase Music", true, "Controls whether or not to replace the bracken's agressive sound with the Family guy Theme"); UseDeathSound = Config.Bind<bool>("Sound", "Use Death Sound", true, "Controls whether or not to play a sound on the bracken's death"); } } internal static class Logger { public static void LogInfo(object message) { HerbertBrackenBase.LogSource.LogInfo(message); } public static void LogWarning(object message) { HerbertBrackenBase.LogSource.LogWarning(message); } public static void LogError(object message) { HerbertBrackenBase.LogSource.LogError(message); } } [BepInPlugin("Spruce.HerbertBracken", "Herbert Braken", "0.1.0")] public class HerbertBrackenBase : BaseUnityPlugin { public static GameObject Visuals; private static HerbertBrackenBase _instance; private readonly Harmony Harmony = new Harmony("Spruce.HerbertBracken"); internal static HerbertBrackenBase Instance { get { return _instance; } set { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if ((Object)_instance == (Object)null) { _instance = value; } else { Object.Destroy((Object)value); } } } public static ManualLogSource LogSource => ((BaseUnityPlugin)Instance).Logger; public static ConfigFile ModConfig => ((BaseUnityPlugin)Instance).Config; private void Awake() { Instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Initializing config..."); ConfigManager.InitializeConfig(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading asset bundle..."); Assets.PopulateAssets(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Heya Chris!"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Do you want a taste of my lolipop?"); Harmony.PatchAll(typeof(HerbertBrackenBase)); Harmony.PatchAll(typeof(EnemyPatches)); Harmony.PatchAll(typeof(RoundManagementPatches)); } } internal static class PluginInfo { public const string GUID = "Spruce.HerbertBracken"; public const string NAME = "Herbert Bracken"; public const string VERSION = "1"; public const string ASSET_BUNDLE_NAME = "newherb"; } } namespace ModelReplacement { [BepInPlugin("Spruce.HerbertBracken", "Herbert Braken", "0.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public static ConfigFile config; private readonly Harmony Harmony = new Harmony("Spruce.HerbertBracken"); public static ConfigEntry<bool> enableModelForAllSuits { get; private set; } public static ConfigEntry<bool> enableModelAsDefault { get; private set; } public static ConfigEntry<string> suitNamesToEnableModel { get; private set; } private static void InitConfig() { enableModelForAllSuits = config.Bind<bool>("Suits to Replace Settings", "Enable Model for all Suits", false, "Enable to model replace every suit. Set to false to specify suits"); enableModelAsDefault = config.Bind<bool>("Suits to Replace Settings", "Enable Model as default", false, "Enable to model replace every suit that hasn't been otherwise registered."); suitNamesToEnableModel = config.Bind<string>("Suits to Replace Settings", "Suits to enable Model for", "Default,Orange suit", "Enter a comma separated list of suit names.(Additionally, [Green suit,Pajama suit,Hazard suit])"); } } }