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 TrashtalkingAI v1.0.2
TrashtalkingAI.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On.RoR2; using RoR2; using UnityEngine; [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.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("TrashtalkingAI")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TrashtalkingAI")] [assembly: AssemblyTitle("TrashtalkingAI")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.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 TrashtalkingAI { public static class Hooks { [CompilerGenerated] private static class <>O { public static Action<CharacterBody> <0>__CharacterBody_onBodyStartGlobal; public static Action<DamageReport> <1>__GlobalEventManager_onCharacterDeathGlobal; public static hook_SetStun <2>__SetStateOnHurt_SetStun; public static hook_SetFrozen <3>__SetStateOnHurt_SetFrozen; public static hook_SetShock <4>__SetStateOnHurt_SetShock; public static Action<Stage> <5>__Stage_onStageStartGlobal; } public static void Init() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0074: 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_007f: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal; GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; object obj = <>O.<2>__SetStateOnHurt_SetStun; if (obj == null) { hook_SetStun val = SetStateOnHurt_SetStun; <>O.<2>__SetStateOnHurt_SetStun = val; obj = (object)val; } SetStateOnHurt.SetStun += (hook_SetStun)obj; object obj2 = <>O.<3>__SetStateOnHurt_SetFrozen; if (obj2 == null) { hook_SetFrozen val2 = SetStateOnHurt_SetFrozen; <>O.<3>__SetStateOnHurt_SetFrozen = val2; obj2 = (object)val2; } SetStateOnHurt.SetFrozen += (hook_SetFrozen)obj2; object obj3 = <>O.<4>__SetStateOnHurt_SetShock; if (obj3 == null) { hook_SetShock val3 = SetStateOnHurt_SetShock; <>O.<4>__SetStateOnHurt_SetShock = val3; obj3 = (object)val3; } SetStateOnHurt.SetShock += (hook_SetShock)obj3; Stage.onStageStartGlobal += Stage_onStageStartGlobal; } private static void Stage_onStageStartGlobal(Stage stage) { if ((Object)(object)((Component)stage).GetComponent<TrashtalkingController>() == (Object)null) { ((Component)stage).gameObject.AddComponent<TrashtalkingController>(); } } private static void CharacterBody_onBodyStartGlobal(CharacterBody body) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 if ((int)body.teamComponent.teamIndex != 1 && !body.isPlayerControlled && !((Object)(object)body.master == (Object)null) && (Object)(object)((Component)body).GetComponent<TrashtalkingController>() == (Object)null) { ((Component)body).gameObject.AddComponent<TrashtalkingController>(); float num = 1.5f / Mathf.Pow(Run.instance.difficultyCoefficient, 0.6f); float num2 = Main.joinMessageChance.Value; if (body.isElite) { num2 *= Main.eliteChanceMultiplier.Value; } if (body.isBoss) { num2 *= Main.bossChanceMultiplier.Value; } if (Util.CheckRoll(num2 * num, 0f, (CharacterMaster)null)) { ((MonoBehaviour)body).StartCoroutine(Utils.AddMinecraftMessage(body, "joined", 0.1f, 0f)); } } } private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport report) { CharacterBody victimBody = report.victimBody; if (!Object.op_Implicit((Object)(object)victimBody)) { return; } if (victimBody.isPlayerControlled) { CharacterBody attackerBody = report.attackerBody; if (Object.op_Implicit((Object)(object)attackerBody)) { Utils.SendRandomPhrase(Main.onPlayerKilledChance.Value, attackerBody, Main.onPlayerKilledPhrasesList, "killer"); } return; } float num = 1.5f / Mathf.Pow(Run.instance.difficultyCoefficient, 0.6f); Utils.SendRandomPhrase(Main.onDeathChance.Value * num, victimBody, Main.onDeathPhrasesList, "dead"); if (Util.CheckRoll(Main.leaveMessageChance.Value * num, 0f, (CharacterMaster)null)) { ((MonoBehaviour)victimBody).StartCoroutine(Utils.AddMinecraftMessage(victimBody, "left", 0f, 1f)); } } private static void SetStateOnHurt_SetShock(orig_SetShock orig, SetStateOnHurt self, float duration) { orig.Invoke(self, duration); CharacterBody component = ((Component)self).GetComponent<CharacterBody>(); float num = 1.5f / Mathf.Pow(Run.instance.difficultyCoefficient, 0.6f); Utils.SendRandomPhrase(Main.onShockedChance.Value * num, component, Main.onShockedPhrasesList, "shocked"); } private static void SetStateOnHurt_SetFrozen(orig_SetFrozen orig, SetStateOnHurt self, float duration) { orig.Invoke(self, duration); CharacterBody component = ((Component)self).GetComponent<CharacterBody>(); float num = 1.5f / Mathf.Pow(Run.instance.difficultyCoefficient, 0.6f); Utils.SendRandomPhrase(Main.onFrozenChance.Value * num, component, Main.onFrozenPhrasesList, "frozen"); } private static void SetStateOnHurt_SetStun(orig_SetStun orig, SetStateOnHurt self, float duration) { orig.Invoke(self, duration); CharacterBody component = ((Component)self).GetComponent<CharacterBody>(); float num = 1.5f / Mathf.Pow(Run.instance.difficultyCoefficient, 0.6f); Utils.SendRandomPhrase(Main.onStunnedChance.Value * num, component, Main.onStunnedPhrasesList, "stunned"); } } [BepInPlugin("HIFU.TrashtalkingAI", "TrashtalkingAI", "1.0.2")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.TrashtalkingAI"; public const string PluginAuthor = "HIFU"; public const string PluginName = "TrashtalkingAI"; public const string PluginVersion = "1.0.2"; public static ManualLogSource TAILogger; public static List<string> onFrozenPhrasesList = new List<string>(); public static List<string> onStunnedPhrasesList = new List<string>(); public static List<string> onShockedPhrasesList = new List<string>(); public static List<string> onDeathPhrasesList = new List<string>(); public static List<string> onPlayerKilledPhrasesList = new List<string>(); public static ConfigEntry<string> onFrozenPhrases { get; set; } public static ConfigEntry<float> onFrozenChance { get; set; } public static ConfigEntry<string> onStunnedPhrases { get; set; } public static ConfigEntry<float> onStunnedChance { get; set; } public static ConfigEntry<string> onShockedPhrases { get; set; } public static ConfigEntry<float> onShockedChance { get; set; } public static ConfigEntry<string> onDeathPhrases { get; set; } public static ConfigEntry<float> onDeathChance { get; set; } public static ConfigEntry<string> onPlayerKilledPhrases { get; set; } public static ConfigEntry<float> onPlayerKilledChance { get; set; } public static ConfigEntry<float> uppercasePhraseChance { get; set; } public static ConfigEntry<float> trashTalkingInterval { get; set; } public static ConfigEntry<float> globalTrashTalkingInterval { get; set; } public static ConfigEntry<float> joinMessageChance { get; set; } public static ConfigEntry<float> leaveMessageChance { get; set; } public static ConfigEntry<bool> scaleChance { get; set; } public static ConfigEntry<float> eliteChanceMultiplier { get; set; } public static ConfigEntry<float> bossChanceMultiplier { get; set; } public void Awake() { TAILogger = ((BaseUnityPlugin)this).Logger; onStunnedPhrases = ((BaseUnityPlugin)this).Config.Bind<string>("Phrases", "On Stun", "IKE$R(PFD | @#*%()RETIWFDS()K@!)_QWEKDSF(RK(@#$%*$#(@)UTEJWFDSIXC | WESDFU(CJ(EPWSODVPOWEISDKFPOVDMPOVMPV | I CANT EVEN FUCKING PLAY THE GAME | i love counterplay | good game design | STUN MECHANICS ARE SO FUN | stunning my ass bro u ugly as fuck | read stun seed backwards | stun deez nuts bro | what can i even do | its so fair bro | kys | ggwp bad team | get a job loser | is this overwatch | am i playing a fucking 2024 hero shooter | i swear to fucking god if you stun me again | go fuck yourself | respectfully, go fuck yourself | get that smell out of your chair | your life is as valuable as a summer ant | i would call you a cunt but youre shallow as fuck | your life means nothing | you serve zero purpose | get cancer | i hope u get cancer | bro was NOT loved by their mother | stop spamming | I bet you stun cause your too fat to fucking move | ok | ... | FUCK | Really? | lag | fucking ping again | you literally have aimbot lmaoo youre so blatant | showers are not monthly a thing btw | ok dude | alright dude. | nice hitbox | I love this hitreg | I can totally do anytihng ahaHAHASDHAILSCOLCFVJNERIOTFSD(PIJMIPWO$EKSTD | U JUST ANNOYIN AS FUCK OK SHUT THE FUCK UP U CUNT | im gonna break my monitor i swear | dog | u a bitch you know that? | your father left you | fatherless fuck | bet you fun at parties | im blocking you | of courseee | im gonna cancel you on twitter | yo momma so fat i took a pic of her last christmas and its still printing | yo momma so ugly when she tried to join an ugly contest they said sorry no professionals | yo mommas so fat and old when god said let there be light he asked your mother to move out of the way | yo momma so ugly she made one direction look another direction | yo mama so fat and stupid she brought a spoon to the super bowl | your ugly ass thinks salt is spicy | youre literally a fucking dweeb | neckbeard | u got the gen z cut | i bet you have a bowl cut | fuck this | fuck off | hop off my dick", "The list of phrases that the AI uses on getting stunned, separated by a pipe symbol | - this one, and space in between it."); onStunnedPhrasesList = onStunnedPhrases.Value.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); onStunnedChance = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "On Stun Chance", 12f, "Chance to say a random phrase on getting stunned"); onShockedPhrases = ((BaseUnityPlugin)this).Config.Bind<string>("Phrases", "On Shock", "DSKFLSdfh | DFJGDFIGDFIG | W@#*REJF*WIEJDMIKASMD | I CANT EVEN FUCKING PLAY THE GAME | i love counterplay | good game design | STUN MECHANICS ARE SO FUN | stunning my ass bro u ugly as fuck | read stun seed backwards | stun deez nuts bro | what can i even do | its so fair bro | kys | ggwp bad team | get a job loser | is this overwatch | am i playing a fucking 2024 hero shooter | i swear to fucking god if you stun me again | go fuck yourself | respectfully, go fuck yourself | get that smell out of your chair | your life is as valuable as a summer ant | you should listen to lowtiergods advice | i would call you a cunt but youre shallow as fuck | your life means nothing | you serve zero purpose | get cancer | i hope you get cancer | bro was NOT loved by their mother | stop spamming | I bet you stun cause your too fat to fucking move | ok | ... | FUCK | Really? | lag | fucking ping again | you literally have aimbot lmaoo youre so blatant | showers are not a monthly thing btw | ok dude | alright dude. | nice hitbox | I love this hitreg | i can totally fucking do ANYTIRNMFDGISMIOFEWSJMDIFOAYNEULRFNSDUOJNROUIFSJMDIPO | U JUST ANNOYIN AS FUCK OK SHUT THE FUCK UP U CUNT | im gonna break my monitor i swear | dog | u a bitch you know that? | your father left you | fatherless fuck | bet you fun at parties | im blocking you | of courseeeeee | im gonna cancel you on twitter | yo momma so fat i took a pic of her last christmas and its still printing | yo momma so ugly when she tried to join an ugly contest they said sorry no professionals | yo mommas so fat and old when god said let there be light he asked your mother to move out of the way | yo momma so ugly she made one direction look another direction | yo mama so fat and stupid she brought a spoon to the super bowl | your ugly ass thinks salt is spicy | youre literally a fucking dweeb | neckbeard | u got the gen z cut | i bet you have a bowl cut | fuck this | fuck off | hop off my dick", "The list of phrases that the AI uses on getting shocked, separated by a pipe symbol | - this one, and space in between it"); onShockedPhrasesList = onShockedPhrases.Value.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); onShockedChance = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "On Shock Chance", 25f, "Chance to say a random phrase on getting shocked"); onFrozenPhrases = ((BaseUnityPlugin)this).Config.Bind<string>("Phrases", "On Freeze", "FEJK*GR%EGFJKD*ET | $ERTU*FGD(B*#@WREJDSFIJIQ@E#WOSD | @*()EW#QUDSFJC()J@#QWESDI | I CANT EVEN FUCKING PLAY THE GAME | I GET STUNNED AND KILLED INSTANTLY ITS SO FAIR | STUN MECHANICS ARE SO FUN | well played bro that was totally fair | i have your address right here | my dad works at microsoft | your life is miserable | i love not being able to do anything | great fucking game design | what the fuck do i even do | loser | kys | so true | get a job loser | is this overwatch | am i playing a fucking 2024 hero shooter | I FUCKING SWEAR TO GOD IF YOU FREEZE ME AGAIN | GO FUCK YOURSELF | respectfully, go fuck yourself | get that smell out of your chair | your life is as valuable as a summer ant | i would call you a cunt but youre shallow as fuck | your life means nothing | you serve zero purpose | get cancer | i hope you get cancer | bro was NOT loved by their mother | stop spamming | I bet you stun cause your too fat to fucking move | ok | ... | FUCK | Really? | lag | fucking ping again | you literally have aimbot lmaoo youre so blatant | showers are not a monthly thing btw | ok dude | alright dude. | nice hitbox | I love this hitreg | i can totally do ANYTIGNMTGFHIDKJMNOILKJUERDJMNFISDOM | U JUST ANNOYIN AS FUCK OK SHUT THE FUCK UP U CUNT | im gonna break my monitor i swear | dog | u a bitch you know that? | dog | u a bitch you know that? | your father left you | fatherless fuck | bet you fun at parties | im blocking you | ofc ofc dude fuckingewsoiufhjdiuhjuiodfiogh | im gonna cancel you on twitter | yo momma so fat i took a pic of her last christmas and its still printing | yo momma so ugly when she tried to join an ugly contest they said sorry no professionals | yo mommas so fat and old when god said let there be light he asked your mother to move out of the way | yo momma so ugly she made one direction look another direction | yo mama so fat and stupid she brought a spoon to the super bowl | your ugly ass thinks salt is spicy | youre literally a fucking dweeb | neckbeard | u got the gen z cut | i bet you have a bowl cut | fuck this | fuck off | hop off my dick", "The list of phrases that the AI uses on getting frozen, separated by a pipe symbol | - this one, and space in between it"); onFrozenPhrasesList = onFrozenPhrases.Value.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); onFrozenChance = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "On Freeze Chance", 12f, "Chance to say a random phrase on getting frozen"); onDeathPhrases = ((BaseUnityPlugin)this).Config.Bind<string>("Phrases", "On Death", "DFGMVICXMICXV | DFKGI:DFGI:DFGKDFOI:G | #@$(REWIF#KW(RE | ERI(F)DGVK(ERSDF | take a shower lil bro | have you ever heard of a shower before | so fair | i bet your family loves you /s | sweaty tryhard | what no pussy does to a mf | go outside | touch grass | what am i supposed to do if my idiot team doesnt help me | my team is ass | bullshit | i love getting spawnkilled | get a life | you smell that? sweat mixed with [REDACTED] and [REDACTED] and [REDACTED]. | not cheating btw | i bet your parents dont miss you | you don't have friends. your parents don't love you. | at least I have a life unlike you | it's tryhards like you who ruin Petrichor V | that was bullshit | you didnt even aim at me | of course im supposed to react to that | nobody loves you | im gonna dox you | 100.120.244.30 | 214.46.28.73 | 117.248.59.197 | im just gonna drop this 122.182.207.178 | 41.33.35.176 this u? | 133.138.50.44 i got your address right here lil bro you sure you wanna keep doing this? | 132.57.41.1 | 232.68.68.47 gg | 226.175.14.20 :33 | 14.128.247.29 you finna cooked | i know where you live | your life is meaningless | you have achieved nothing in life | no help gg | kys | go fuck yourself | respectfully, go fuck yourself | get that smell out of your chair | you look like a redditor | incel | you literally fucking use 4chan | you look like a discord moderator | lowlife | you got bullied in school | your life is as valuable as a summer ant | saying you look like your mom would be generous | i would call you a cunt but youre shallow as fuck | your life means nothing | you serve zero purpose | i bet your ass thinks a kilogram of feathers is heavier | i hope you get cancer | get cancer | bro was NOT loved by their mother | ok | ... | FUCK | Really? | my support is a moron | lag | fucking ping again | you literally have aimbot lmaoo youre so blatant | showers are not a monthly thing btw | nah i'd win | nah i'd lose | nice hitbox | I love this hitreg | i can TOTYAELKOY DO ANYITINJFGDUIOJNJMDFIUOLJIOLDSJIFJKDOP | U JUST ANNOYIN AS FUCK OK SHUT THE FUCK UP U CUNT | im gonna break my monitor i swear | dog | u a bitch you know that? | your father left you | fatherless fuck | bet you fun at parties | bet that took a lot of skill lil bro | you barely did it | OF FUCKING COURSEEWIOSUADRHFNJUOREIDFGJV | im blocking you | im gonna cancel you on twitter | yo momma so fat i took a pic of her last christmas and its still printing | yo momma so ugly when she tried to join an ugly contest they said sorry no professionals | yo mommas so fat and old when god said let there be light he asked your mother to move out of the way | yo momma so ugly she made one direction look another direction | yo mama so fat and stupid she brought a spoon to the super bowl | your ugly ass thinks salt is spicy | youre literally a fucking dweeb | neckbeard | u got the gen z cut | i bet you have a bowl cut | fuck this | fuck off | hop off my dick | wow you killed me so good! | youre such a skilled gamer!", "The list of phrases that the AI uses upon dying, separated by a pipe symbol | - this one, and space in between it"); onDeathPhrasesList = onDeathPhrases.Value.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); onDeathChance = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "On Death Chance", 8f, "Chance to say a random phrase on death"); onPlayerKilledPhrases = ((BaseUnityPlugin)this).Config.Bind<string>("Phrases", "On Player Kill", "get fucked | bro is playing on a controller | lmao you suck | learn to dodge loser | imagine being that bad | gg ez | ez | is this your first time playing | this mf using steam deck | go back to roblox lil bro | you have to not get owned to win btw | trash | garbage | bro youre ass | uninstall | are you even trying | when are some actual players joining this is pissing me off | go back to drizzle bitch | bro needs mods to win | are you 5 | not even noahs ark can carry you | your life is as valuable as a summer ant | room temperature iq | middle schoolers playing krunker on the school chrome book have more skill than you | sorry its gotta be hard to aim with the sound of me railing your mom in the next room | motherfucker would lose to a dolphin if it had a fuckin bow and arrow | easy killz holy shit you suck | you fucking suck :3 | get cancer | i hope you get cancer | bro was NOT loved by their mother | you call it a criminal record i call it my lore. we are not the same | skill gap | Approximatively six million years of human evolution to produce some pile of garbage like you. | bro got absolutely fucking bodied | gargantuan twat | you fucking broomstick | you fucking melon | I like ya cut g | watch yo tone | skill diff | youre so good dude | go take a shower | bro couldnt construct a normal fucking build with scrappers and printers existing | imagine dying | yo momma so fat she makes whales look like needles in a haystack | yo momma so stupid she got hit by a parked car | sit down dog | know your place, trash | nice try /s | how fucking stupid do you have to be in order to think that would have worked | i didnt even try | go play minecraft | youre a failure at everything you do, you never succeed and nothing you ever do truly matters. you are a failure. | thats what happens when you do something in your miserable life | worthless", "The list of phrases that the AI uses upon dying, separated by a pipe symbol | - this one, and space in between it"); onPlayerKilledPhrasesList = onPlayerKilledPhrases.Value.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList(); onPlayerKilledChance = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "On Player Kill Chance", 100f, "Chance to say a random phrase on killing a player"); uppercasePhraseChance = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "All Uppercase Chance", 30f, "Chance for a phrase to be fully uppercase"); trashTalkingInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "Interval", 3f, "Minimum interval between trashtalking for the same monster"); globalTrashTalkingInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Phrases", "Global Interval", 3f, "Minimum interval between trashtalking for all monsters"); joinMessageChance = ((BaseUnityPlugin)this).Config.Bind<float>("Messages", "Join Chance", 5f, "Chance to say a monster has joined the game"); leaveMessageChance = ((BaseUnityPlugin)this).Config.Bind<float>("Messages", "Leave Chance", 7f, "Chance to say a monster has left the game"); scaleChance = ((BaseUnityPlugin)this).Config.Bind<bool>("Chances", "Scale chances over difficulty?", true, "Chances start out higher than base (config) and fall over time to prevent spam and repetitiveness (Base Chance * (1.5 / (Difficulty Coefficient ^ 0.6))"); eliteChanceMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Chances", "Elite chance scaling multiplier", 2f, "Chances are multiplied by this value for elite monsters"); bossChanceMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Chances", "Boss chance scaling multiplier", 10f, "Chances are multiplied by this value for bosses with red healthbars"); TAILogger.LogDebug((object)("On Stunned Phrases Count: " + onStunnedPhrasesList.Count)); TAILogger.LogDebug((object)("On Shocked Phrases Count: " + onShockedPhrasesList.Count)); TAILogger.LogDebug((object)("On Frozen Phrases Count: " + onFrozenPhrasesList.Count)); TAILogger.LogDebug((object)("On Death Phrases Count: " + onDeathPhrasesList.Count)); TAILogger.LogDebug((object)("On Player Kill Phrases Count: " + onPlayerKilledPhrasesList.Count)); Hooks.Init(); } } public class TrashtalkingController : MonoBehaviour { public float timer = 0f; public bool canTrashTalk = true; public float interval = 1f; public int randomAssignedID; public float globalTimer = 0f; public bool canTrashTalkGlobally = true; public float globalInterval = 1f; public void Start() { globalInterval = Main.globalTrashTalkingInterval.Value; interval = Main.trashTalkingInterval.Value; randomAssignedID = Run.instance.runRNG.RangeInt(0, 300); } public void FixedUpdate() { if (!canTrashTalk) { timer += Time.fixedDeltaTime; if (timer >= interval) { canTrashTalk = true; timer = 0f; } } if (!canTrashTalkGlobally) { globalTimer += Time.fixedDeltaTime; if (globalTimer >= globalInterval) { canTrashTalkGlobally = true; globalTimer = 0f; } } } } public static class Utils { public static IEnumerator AddMinecraftMessage(CharacterBody body, string action, float firstDelay, float secondDelay) { yield return (object)new WaitForSeconds(firstDelay); TrashtalkingController globalTrashTalkingController = ((Component)Stage.instance).GetComponent<TrashtalkingController>(); if (!globalTrashTalkingController.canTrashTalkGlobally) { yield break; } string bestLocalizedBodyName = Util.GetBestBodyName(((Component)body).gameObject); if (!(bestLocalizedBodyName == "") && !(bestLocalizedBodyName == string.Empty)) { if (bestLocalizedBodyName == "???") { bestLocalizedBodyName = "Unknown monster"; } string finalString = "<color=#FFFF55>" + bestLocalizedBodyName + " #" + ((Component)body).GetComponent<TrashtalkingController>().randomAssignedID + " " + action + " the game</color>"; yield return (object)new WaitForSeconds(secondDelay); Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = finalString }); Util.PlaySound("Play_UI_chatMessage", ((Component)RoR2Application.instance).gameObject); } } public static void SendRandomPhrase(float chance, CharacterBody body, List<string> phrasesList, string prefix, bool nonPlayer = true) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 if (((int)body.teamComponent.teamIndex == 1 && nonPlayer) || (Object)(object)body.master == (Object)null) { return; } TrashtalkingController component = ((Component)body).GetComponent<TrashtalkingController>(); if (!component.canTrashTalk) { return; } TrashtalkingController component2 = ((Component)Stage.instance).GetComponent<TrashtalkingController>(); if (!component2.canTrashTalkGlobally) { return; } float num = 1.5f / Mathf.Pow(Run.instance.difficultyCoefficient, 0.6f); if (Util.CheckRoll(chance * num, 0f, (CharacterMaster)null)) { string text = Util.GetBestBodyName(((Component)body).gameObject); if (text == "???") { text = "Unknown monster"; } string text2 = "<color=#A5A5A5>*" + prefix.ToUpper() + "*</color> <style=cIsHealth>" + text + " #" + component.randomAssignedID + "</style>:"; string text3 = phrasesList[Run.instance.runRNG.RangeInt(0, phrasesList.Count)]; if (Util.CheckRoll(Main.uppercasePhraseChance.Value, 0f, (CharacterMaster)null)) { text3 = text3.ToUpper(); } string finalString = text2 + text3; ((MonoBehaviour)body).StartCoroutine(SendPhrase(finalString, body)); component.canTrashTalk = false; component2.canTrashTalkGlobally = false; } } public static IEnumerator SendPhrase(string finalString, CharacterBody body) { yield return (object)new WaitForSeconds(0.5f); Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = finalString }); Util.PlaySound("Play_UI_chatMessage", ((Component)RoR2Application.instance).gameObject); } } }