Please disclose if any significant portion of your mod was created 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 GokuBracken v1.5.9
GokuBracken.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GokuBracken.Core; using GokuBracken.Patches; using GokuBracken.Scripts; using HarmonyLib; using UnityEngine; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("GokuBracken")] [assembly: AssemblyDescription("A mod for Lethal Company that replaces the bracken's model with a model of Goku from the Tenkaichi games")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Vulf")] [assembly: AssemblyProduct("GokuBracken")] [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: AssemblyVersion("1.5.9.0")] namespace GokuBracken.Scripts { public class GokuController : MonoBehaviour { private FlowermanAI FlowermanAI { get; set; } private int Variant { get; set; } private int[] VariantWeights { get; set; } private string VariantName => Variant switch { 0 => "Base Goku", 1 => "SSJ Goku", 2 => "God Goku", 3 => "SSB Goku", _ => "Unknown", }; private string VariantAssetName => Variant switch { 0 => "baseGokuUnlitPrefab", 1 => "ssjGokuPrefab", 2 => "godGokuPrefab", 3 => "ssbGokuPrefab", _ => "Unknown", }; private Aura VariantAura => Variant switch { 0 => new Aura(Color.white, Color.black, Color.white, Color.white), 1 => new Aura(Color32.op_Implicit(new Color32(byte.MaxValue, (byte)142, (byte)0, byte.MaxValue)), Color32.op_Implicit(new Color32(byte.MaxValue, (byte)216, (byte)0, byte.MaxValue)), Color32.op_Implicit(new Color32(byte.MaxValue, (byte)142, (byte)0, byte.MaxValue)), Color32.op_Implicit(new Color32(byte.MaxValue, (byte)142, (byte)0, byte.MaxValue))), 2 => new Aura(Color32.op_Implicit(new Color32(byte.MaxValue, (byte)76, (byte)0, byte.MaxValue)), Color32.op_Implicit(new Color32(byte.MaxValue, (byte)76, (byte)0, byte.MaxValue)), Color32.op_Implicit(new Color32(byte.MaxValue, (byte)0, (byte)0, byte.MaxValue)), Color32.op_Implicit(new Color32(byte.MaxValue, (byte)58, (byte)0, byte.MaxValue))), 3 => new Aura(Color32.op_Implicit(new Color32((byte)0, (byte)132, byte.MaxValue, byte.MaxValue)), Color32.op_Implicit(new Color32((byte)85, (byte)172, byte.MaxValue, byte.MaxValue)), Color32.op_Implicit(new Color32((byte)0, (byte)137, byte.MaxValue, byte.MaxValue)), Color32.op_Implicit(new Color32((byte)66, (byte)172, byte.MaxValue, byte.MaxValue))), _ => default(Aura), }; private GameObject BaseGokuObject { get; set; } private GameObject SecondaryGokuObject { get; set; } private GameObject GokuEyesObject { get; set; } private GameObject AuraObject { get; set; } private bool IsAttacking { get; set; } private bool IsDead { get; set; } private void Start() { FlowermanAI = ((Component)this).GetComponent<FlowermanAI>(); VariantWeights = new int[4] { 50, 30, 15, 5 }; int seed = StartOfRound.Instance.randomMapSeed + Mathf.RoundToInt(StartOfRound.Instance.timeSinceRoundStarted / 10f) * 10; SelectGokuVariant(seed); HideFlowermanModel(); CreateGokuModels(); ReplaceFlowermanSFX(); UpdateScanNodeData(); CreateAura(); } private void Update() { //IL_000f: 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) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) Quaternion rotation = ((Component)StartOfRound.Instance.localPlayerController).transform.rotation; float num = ((Quaternion)(ref rotation)).eulerAngles.y - 180f; AuraObject.transform.rotation = Quaternion.Euler(0f, num, 0f); if (((EnemyAI)FlowermanAI).movingTowardsTargetPlayer && !IsAttacking) { EnterAttackState(); } if (!((EnemyAI)FlowermanAI).movingTowardsTargetPlayer && IsAttacking) { ExitAttackState(); } if (((EnemyAI)FlowermanAI).isEnemyDead && !IsDead) { KillGoku(); } } 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; } } private void CreateGokuModels() { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) GameObject asset = Assets.GetAsset<GameObject>("baseGokuPrefab"); BaseGokuObject = Object.Instantiate<GameObject>(asset, ((Component)this).gameObject.transform); ((Object)BaseGokuObject).name = "Base Goku"; GameObject asset2 = Assets.GetAsset<GameObject>(VariantAssetName); SecondaryGokuObject = Object.Instantiate<GameObject>(asset2, ((Component)this).gameObject.transform); ((Object)SecondaryGokuObject).name = VariantName; SecondaryGokuObject.SetActive(false); GameObject asset3 = Assets.GetAsset<GameObject>("gokuEyesPrefab"); GokuEyesObject = Object.Instantiate<GameObject>(asset3, ((Component)this).gameObject.transform); GokuEyesObject.transform.localPosition = new Vector3(0f, 2.7f, 0f); ((Object)GokuEyesObject).name = "GokuEyes"; } private void ReplaceFlowermanSFX() { if (ConfigManager.UseMusic.Value) { FlowermanAI.creatureAngerVoice.clip = Assets.GetAsset<AudioClip>("aggressiveSFX"); } if (ConfigManager.UseVoicelines.Value) { FlowermanAI.crackNeckSFX = Assets.GetAsset<AudioClip>("baseGokuKillSFX"); FlowermanAI.crackNeckAudio.clip = Assets.GetAsset<AudioClip>("baseGokuKillSFX"); } } private void UpdateScanNodeData() { ((Component)FlowermanAI).GetComponentInChildren<ScanNodeProperties>().headerText = "Son Goku"; } private void CreateAura() { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) GameObject asset = Assets.GetAsset<GameObject>("auraPrefab"); AuraObject = Object.Instantiate<GameObject>(asset, SecondaryGokuObject.transform); ((Object)AuraObject).name = "Aura"; MainModule main = ((Component)AuraObject.transform.Find("Outer")).GetComponent<ParticleSystem>().main; MainModule main2 = ((Component)AuraObject.transform.Find("Inner")).GetComponent<ParticleSystem>().main; MainModule main3 = ((Component)AuraObject.transform.Find("Inner Burst")).GetComponent<ParticleSystem>().main; MainModule main4 = ((Component)AuraObject.transform.Find("Bottom")).GetComponent<ParticleSystem>().main; ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(VariantAura.OuterColor); ((MainModule)(ref main2)).startColor = MinMaxGradient.op_Implicit(VariantAura.InnerColor); ((MainModule)(ref main3)).startColor = MinMaxGradient.op_Implicit(VariantAura.InnerBurstColor); ((MainModule)(ref main4)).startColor = MinMaxGradient.op_Implicit(VariantAura.BottomColor); } private void EnterAttackState() { BaseGokuObject.SetActive(false); SecondaryGokuObject.SetActive(true); IsAttacking = true; } private void ExitAttackState() { BaseGokuObject.SetActive(true); SecondaryGokuObject.SetActive(false); IsAttacking = false; } private void KillGoku() { //IL_003f: 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) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) GokuEyesObject.SetActive(false); BaseGokuObject.SetActive(true); SecondaryGokuObject.SetActive(false); Transform transform = BaseGokuObject.transform; Quaternion rotation = BaseGokuObject.transform.rotation; float y = ((Quaternion)(ref rotation)).eulerAngles.y; rotation = BaseGokuObject.transform.rotation; transform.rotation = Quaternion.Euler(-90f, y, ((Quaternion)(ref rotation)).eulerAngles.z); if (ConfigManager.UseDeathSound.Value) { Object.Destroy((Object)(object)Object.Instantiate<GameObject>(Assets.GetAsset<GameObject>("soundContainerPrefab"), BaseGokuObject.transform), 40f); } IsDead = true; } private void SelectGokuVariant(int seed) { Random random = new Random(seed); if (VariantWeights.Length == 0) { Variant = 0; return; } int num = 0; for (int i = 0; i < VariantWeights.Length; i++) { num += VariantWeights[i]; } int num2 = random.Next(0, num); for (int j = 0; j < VariantWeights.Length; j++) { if (num2 < VariantWeights[j]) { Variant = j; return; } num2 -= VariantWeights[j]; } Variant = 0; } } public struct Aura { public Color OuterColor { get; set; } public Color InnerColor { get; set; } public Color InnerBurstColor { get; set; } public Color BottomColor { get; set; } public Aura(Color outerColor, Color innerColor, Color innerBurstColor, Color bottomColor) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) OuterColor = outerColor; InnerColor = innerColor; InnerBurstColor = innerBurstColor; BottomColor = bottomColor; } } } namespace GokuBracken.Patches { [HarmonyPatch] internal class EnemyPatches { [HarmonyPatch(typeof(FlowermanAI), "Start")] [HarmonyPostfix] public static void CreateGokuModel(FlowermanAI __instance) { ((Component)__instance).gameObject.AddComponent<GokuController>(); } } [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) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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) if (levelID == 0) { if ((Object)(object)CardObject == (Object)null) { CardObject = Object.Instantiate<GameObject>(Assets.GetAsset<GameObject>("cardsPrefab")).transform; } CardObject.position = new Vector3(-37f, 0.94f, -40.84f); CardObject.rotation = Quaternion.Euler(new Vector3(0f, 196f, 0f)); CardObject.localScale = new Vector3(0.15f, 0.15f, 0.15f); } } [HarmonyPatch(typeof(StartOfRound), "EndOfGame")] [HarmonyPostfix] public static void GameEnd(StartOfRound __instance) { if ((Object)(object)CardObject != (Object)null) { Object.Destroy((Object)(object)((Component)CardObject).gameObject); } } } [HarmonyPatch] internal class TerminalPatches { [HarmonyPatch(typeof(Terminal), "Start")] [HarmonyPostfix] public static void EditTerminal(Terminal __instance) { int index = __instance.enemyFiles.FindIndex((TerminalNode e) => ((Object)e).name == "BrackenFile"); int num = __instance.terminalNodes.allKeywords.ToList().FindIndex((TerminalKeyword e) => ((Object)e).name == "Bracken"); __instance.enemyFiles[index].creatureName = "Son Goku"; __instance.enemyFiles[index].displayText = "Hey, you!\nI think it's about time I got a chance to fight.\n"; __instance.enemyFiles[index].displayVideo = Assets.GetAsset<VideoClip>("gokuLogVideo"); __instance.terminalNodes.allKeywords[num].word = "goku"; } } } namespace GokuBracken.Core { internal 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() { if ((Object)(object)AssetBundle != (Object)null) { Logger.LogWarning("Attempted to load the asset bundle but the bundle was not null!"); return; } string name = AssemblyName + ".Bundle.gokubracken"; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name)) { AssetBundle = AssetBundle.LoadFromStream(stream); } if ((Object)(object)AssetBundle == (Object)null) { Logger.LogError("Asset bundle at " + AssemblyName + ".gokubracken failed to load!"); } AssetList = new Dictionary<string, Object>(); Object[] array = AssetBundle.LoadAllAssets(); foreach (Object val in array) { 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); } T val = (T)(object)((value is T) ? value : null); if ((Object)(object)val == (Object)null) { Logger.LogError("Attempted to load an asset of type " + typeof(T).Name + " but asset of name " + name + " does not match this type!"); return default(T); } return val; } } internal static class ConfigManager { public static ConfigEntry<bool> UseSkinVariants { get; private set; } 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 => GokuBrackenBase.ModConfig; public static void InitializeConfig() { UseSkinVariants = Config.Bind<bool>("Skin Variants", "Use Skin Variants", true, "Controls whether or not to give Goku the chance to spawn as a different form"); UseVoicelines = Config.Bind<bool>("Sound", "Use Goku Voicelines", true, "Controls whether or not to replace the bracken's kill sound with Goku voicelines"); UseMusic = Config.Bind<bool>("Sound", "Use UI Music", true, "Controls whether or not to replace the bracken's agressive sound with the Ultra Instinct 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) { GokuBrackenBase.LogSource.LogInfo(message); } public static void LogWarning(object message) { GokuBrackenBase.LogSource.LogWarning(message); } public static void LogError(object message) { GokuBrackenBase.LogSource.LogError(message); } } [BepInPlugin("Vulf.GokuBracken", "Goku Bracken", "1.5.8")] public class GokuBrackenBase : BaseUnityPlugin { private static GokuBrackenBase _instance; private readonly Harmony Harmony = new Harmony("Vulf.GokuBracken"); internal static GokuBrackenBase Instance { get { return _instance; } set { if ((Object)(object)_instance == (Object)null) { _instance = value; } else { Object.Destroy((Object)(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)"Hey it's me! Goku!"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Your files look pretty strong! I'm gonna patch them!"); Harmony.PatchAll(typeof(GokuBrackenBase)); Harmony.PatchAll(typeof(EnemyPatches)); Harmony.PatchAll(typeof(TerminalPatches)); Harmony.PatchAll(typeof(RoundManagementPatches)); } } internal static class PluginInfo { public const string GUID = "Vulf.GokuBracken"; public const string NAME = "Goku Bracken"; public const string VERSION = "1.5.8"; public const string ASSET_BUNDLE_NAME = "gokubracken"; } }