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 ToonukiMadz v1.0.0
plugins/ToonukiMadz/ToonukiMadz.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using System.Timers; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalLib.Modules; using LethalNetworkAPI; using Microsoft.CodeAnalysis; using ModelReplacement; using ToonukiMadz.Commands; using ToonukiMadz.Configuration; using ToonukiMadz.NetcodePatcher; using ToonukiMadz.src.BodyReplacements; using ToonukiMadz.src.patches; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ToonukiMadz")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Very mysterious epic")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ToonukiMadz")] [assembly: AssemblyTitle("ToonukiMadz")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } 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 ToonukiMadz { internal class RenderCharacterAI : EnemyAI { private enum State { SearchingForPlayer, StickingInFrontOfPlayer, HeadSwingAttackInProgress } private enum CreatureSounds { Spawn, Notice, Chasing, Death } public Transform turnCompass; public Transform attackArea; [SerializeField] public AudioClip deathSound; [SerializeField] public AudioClip spawnSound; [SerializeField] public AudioClip noticeSound; [SerializeField] public AudioClip chasingSound; private float timeSinceHittingLocalPlayer; private float timeSinceNewRandPos; private Vector3 positionRandomness; private Vector3 StalkPos; private Random enemyRandom; private bool isDeadAnimationDone; [Conditional("DEBUG")] private void LogIfDebugBuild(string text) { Plugin.Logger.LogInfo((object)text); } public override void Start() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: 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) ((EnemyAI)this).Start(); timeSinceHittingLocalPlayer = 0f; base.creatureAnimator.SetTrigger("startWalk"); timeSinceNewRandPos = 0f; positionRandomness = new Vector3(0f, 0f, 0f); enemyRandom = new Random(StartOfRound.Instance.randomMapSeed + base.thisEnemyIndex); isDeadAnimationDone = false; TryPlaySoundClientRpc(0); base.enemyType.enemyPrefab.GetComponent<GameObject>(); base.currentBehaviourStateIndex = 0; ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); base.enemyType.canDie = true; base.enemyType.destroyOnDeath = true; base.creatureVoice.loop = true; } public override void Update() { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).Update(); if (base.isEnemyDead) { if (!isDeadAnimationDone) { TryStopSoundClientRpc(isCreatureVoice: true); isDeadAnimationDone = true; base.creatureVoice.Stop(); base.creatureVoice.PlayOneShot(base.dieSFX); } return; } timeSinceHittingLocalPlayer += Time.deltaTime; timeSinceNewRandPos += Time.deltaTime; int currentBehaviourStateIndex = base.currentBehaviourStateIndex; if ((Object)(object)base.targetPlayer != (Object)null && (currentBehaviourStateIndex == 1 || currentBehaviourStateIndex == 2)) { turnCompass.LookAt(((Component)base.targetPlayer.gameplayCamera).transform.position); ((Component)this).transform.rotation = Quaternion.Lerp(((Component)this).transform.rotation, Quaternion.Euler(new Vector3(0f, turnCompass.eulerAngles.y, 0f)), 4f * Time.deltaTime); } if (base.stunNormalizedTimer > 0f) { base.agent.speed = 0f; } } public override void DoAIInterval() { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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_00ce: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).DoAIInterval(); if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead) { return; } switch (base.currentBehaviourStateIndex) { case 0: base.agent.speed = 5f; if (FoundClosestPlayerInRange(25f, 3f)) { TryPlaySoundClientRpc(1); base.creatureVoice.Play(); ((EnemyAI)this).StopSearch(base.currentSearch, true); ((EnemyAI)this).SwitchToBehaviourClientRpc(1); } break; case 1: base.agent.speed = 6.5f; if (!TargetClosestPlayerInAnyCase() || (Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) > 20f && !((EnemyAI)this).HasLineOfSightToPosition(((Component)base.targetPlayer).transform.position, 45f, 60, -1f))) { TryStopSoundClientRpc(isCreatureVoice: true); ((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null); ((EnemyAI)this).SwitchToBehaviourClientRpc(0); } else { StickingInFrontOfPlayer(); } break; case 2: break; } } private bool FoundClosestPlayerInRange(float range, float senseRange) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).TargetClosestPlayer(1.5f, true, 70f); if ((Object)(object)base.targetPlayer == (Object)null) { ((EnemyAI)this).TargetClosestPlayer(1.5f, false, 70f); range = senseRange; } if ((Object)(object)base.targetPlayer != (Object)null) { return Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) < range; } return false; } private bool TargetClosestPlayerInAnyCase() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) base.mostOptimalDistance = 2000f; base.targetPlayer = null; for (int i = 0; i < StartOfRound.Instance.connectedPlayersAmount + 1; i++) { base.tempDist = Vector3.Distance(((Component)this).transform.position, ((Component)StartOfRound.Instance.allPlayerScripts[i]).transform.position); if (base.tempDist < base.mostOptimalDistance) { base.mostOptimalDistance = base.tempDist; base.targetPlayer = StartOfRound.Instance.allPlayerScripts[i]; } } if ((Object)(object)base.targetPlayer == (Object)null) { return false; } return true; } private void StickingInFrontOfPlayer() { //IL_003b: 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) //IL_005f: 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_0069: 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) //IL_0075: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)base.targetPlayer == (Object)null) && ((NetworkBehaviour)this).IsOwner && timeSinceNewRandPos > 0.7f) { timeSinceNewRandPos = 0f; StalkPos = ((Component)base.targetPlayer).transform.position - Vector3.Scale(new Vector3(-2f, 0f, -2f), ((Component)base.targetPlayer).transform.forward); ((EnemyAI)this).SetDestinationToPosition(StalkPos, false); } } [ClientRpc] private void TryPlaySoundClientRpc(int soundToPlay, bool shouldLoop = false, bool interrupt = false) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3755047771u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, soundToPlay); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref shouldLoop, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref interrupt, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3755047771u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } try { base.creatureSFX.loop = shouldLoop; if (interrupt || !base.creatureVoice.isPlaying) { switch (soundToPlay) { case 0: base.creatureSFX.PlayOneShot(spawnSound); break; case 1: base.creatureSFX.PlayOneShot(noticeSound); break; case 2: base.creatureVoice.Play(); break; case 3: base.creatureSFX.PlayOneShot(deathSound); break; } } } catch (Exception ex) { Plugin.mls.LogError((object)("Failed to play sound: " + ex.Message)); } } [ClientRpc] private void TryStopSoundClientRpc(bool isCreatureVoice) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(287724415u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isCreatureVoice, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 287724415u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } try { if (!isCreatureVoice) { if (base.creatureSFX.isPlaying) { base.creatureSFX.Stop(); } } else if (base.creatureVoice.isPlaying) { base.creatureVoice.Stop(); } } catch (Exception ex) { Plugin.mls.LogError((object)("Failed to play sound: " + ex.Message)); } } public override void OnCollideWithPlayer(Collider other) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).OnCollideWithPlayer(other); if (!(timeSinceHittingLocalPlayer < 0.3f)) { PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false); if ((Object)(object)val != (Object)null) { ExplodeRpcServerRpc(((Component)val).transform.position); timeSinceHittingLocalPlayer = 0f; } } } public bool IsAnimationPlaying(string animationName) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) Animator component = ((Component)this).GetComponent<Animator>(); if ((Object)(object)component == (Object)null) { return false; } AnimatorClipInfo[] currentAnimatorClipInfo = component.GetCurrentAnimatorClipInfo(0); for (int i = 0; i < currentAnimatorClipInfo.Length; i++) { AnimatorClipInfo val = currentAnimatorClipInfo[i]; if (((Object)((AnimatorClipInfo)(ref val)).clip).name == animationName) { return true; } } return false; } [ServerRpc(RequireOwnership = false)] public void ExplodeRpcServerRpc(Vector3 playerPosition) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(328391219u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref playerPosition); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 328391219u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ((MonoBehaviour)this).StartCoroutine(ExplodeAfterDelay(playerPosition)); } } } private IEnumerator ExplodeAfterDelay(Vector3 playerPosition) { //IL_000e: 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) if (!IsAnimationPlaying("die-Head")) { TryStopSoundClientRpc(isCreatureVoice: true); TryPlaySoundClientRpc(3, shouldLoop: false, interrupt: true); DoAnimationClientRpc("KillEnemy"); base.agent.speed = 0f; yield return (object)new WaitForSeconds(1.07f); SpawnExplosionServerRpc(playerPosition, spawnEffects: true, 2.4f, 5f); ((EnemyAI)this).KillEnemyServerRpc(true); } } [ServerRpc(RequireOwnership = false)] public void SpawnExplosionServerRpc(Vector3 explosionPos, bool spawnEffects, float killRange, float damageRange) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_011a: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3659870034u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref explosionPos); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref spawnEffects, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref killRange, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref damageRange, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3659870034u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { SpawnExplosionClientRpc(explosionPos, spawnEffects, killRange, damageRange); } } } [ClientRpc] public void SpawnExplosionClientRpc(Vector3 explosionPos, bool spawnEffects, float killRange, float damageRange) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_0119: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2400778082u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref explosionPos); ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref spawnEffects, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref killRange, default(ForPrimitives)); ((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref damageRange, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2400778082u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { Landmine.SpawnExplosion(explosionPos, spawnEffects, killRange, damageRange); Plugin.mls.LogInfo((object)"SpawnExplosionServerRpc SENT"); } } } [ClientRpc] public void DoAnimationClientRpc(string animationName) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(595964035u, val, (RpcDelivery)0); bool flag = animationName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(animationName, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 595964035u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { base.creatureAnimator.SetTrigger(animationName); } } public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false) { ((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX); if (!base.isEnemyDead) { base.enemyHP -= force; if (((NetworkBehaviour)this).IsOwner && base.enemyHP <= 0 && !base.isEnemyDead) { ((MonoBehaviour)this).StopCoroutine(base.searchCoroutine); } } } protected override void __initializeVariables() { ((EnemyAI)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_RenderCharacterAI() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(3755047771u, new RpcReceiveHandler(__rpc_handler_3755047771)); NetworkManager.__rpc_func_table.Add(287724415u, new RpcReceiveHandler(__rpc_handler_287724415)); NetworkManager.__rpc_func_table.Add(328391219u, new RpcReceiveHandler(__rpc_handler_328391219)); NetworkManager.__rpc_func_table.Add(3659870034u, new RpcReceiveHandler(__rpc_handler_3659870034)); NetworkManager.__rpc_func_table.Add(2400778082u, new RpcReceiveHandler(__rpc_handler_2400778082)); NetworkManager.__rpc_func_table.Add(595964035u, new RpcReceiveHandler(__rpc_handler_595964035)); } private static void __rpc_handler_3755047771(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_008e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int soundToPlay = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref soundToPlay); bool shouldLoop = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref shouldLoop, default(ForPrimitives)); bool interrupt = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref interrupt, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((RenderCharacterAI)(object)target).TryPlaySoundClientRpc(soundToPlay, shouldLoop, interrupt); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_287724415(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool isCreatureVoice = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isCreatureVoice, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((RenderCharacterAI)(object)target).TryStopSoundClientRpc(isCreatureVoice); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_328391219(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 playerPosition = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref playerPosition); target.__rpc_exec_stage = (__RpcExecStage)1; ((RenderCharacterAI)(object)target).ExplodeRpcServerRpc(playerPosition); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3659870034(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 explosionPos = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref explosionPos); bool spawnEffects = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref spawnEffects, default(ForPrimitives)); float killRange = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref killRange, default(ForPrimitives)); float damageRange = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref damageRange, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)1; ((RenderCharacterAI)(object)target).SpawnExplosionServerRpc(explosionPos, spawnEffects, killRange, damageRange); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2400778082(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 explosionPos = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref explosionPos); bool spawnEffects = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref spawnEffects, default(ForPrimitives)); float killRange = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref killRange, default(ForPrimitives)); float damageRange = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref damageRange, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((RenderCharacterAI)(object)target).SpawnExplosionClientRpc(explosionPos, spawnEffects, killRange, damageRange); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_595964035(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string animationName = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref animationName, false); } target.__rpc_exec_stage = (__RpcExecStage)2; ((RenderCharacterAI)(object)target).DoAnimationClientRpc(animationName); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "RenderCharacterAI"; } } [BepInPlugin("burk.ToonukiMadz", "ToonukiMadz", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string ModGUID = "burk.ToonukiMadz"; internal static ManualLogSource Logger; public static AssetBundle ModAssets; private readonly Harmony _harmony = new Harmony("burk.ToonukiMadz"); public static Dictionary<SelectableLevel, List<SpawnableEnemyWithRarity>> levelEnemySpawns; public static Dictionary<SpawnableEnemyWithRarity, int> enemyRaritys; public static Dictionary<SpawnableEnemyWithRarity, AnimationCurve> enemyPropCurves; public static ManualLogSource mls; public static SelectableLevel currentLevel; public static EnemyVent[] currentLevelVents; public static RoundManager currentRound; public static bool RoundInProgress = false; public static Timer stacieTimer; internal static bool isHost; internal static PlayerControllerB playerRef; internal static Dictionary<string, Type> suitNamesToReplace = new Dictionary<string, Type> { { "madz", typeof(BodyReplacementMadz) }, { "kappa", typeof(BodyReplacementKappa) }, { "circle", typeof(BodyReplacementCircle) }, { "ivan", typeof(BodyReplacementIvan) }, { "celshock", typeof(BodyReplacementCel) } }; [PublicNetworkVariable] public static LethalNetworkVariable<List<string>> adminList = new LethalNetworkVariable<List<string>>("adminList") { Value = new List<string>() }; [PublicNetworkVariable] public static LethalNetworkVariable<Dictionary<string, bool>> speedHackList = new LethalNetworkVariable<Dictionary<string, bool>>("speedHackList") { Value = new Dictionary<string, bool>() }; [PublicNetworkVariable] public static LethalNetworkVariable<Dictionary<string, bool>> godModeList = new LethalNetworkVariable<Dictionary<string, bool>>("godModeList") { Value = new Dictionary<string, bool>() }; [PublicNetworkVariable] public static LethalNetworkVariable<string> commandPrefix = new LethalNetworkVariable<string>("commandPrefix") { Value = "." }; [PublicNetworkVariable] public static LethalNetworkVariable<bool> stacieTroll = new LethalNetworkVariable<bool>("stacieTroll") { Value = true }; [PublicNetworkVariable] public static LethalNetworkVariable<(string, string)> teleportVictims = new LethalNetworkVariable<(string, string)>("teleportVictims") { Value = ("", "") }; [PublicNetworkVariable] public static LethalNetworkVariable<bool> madsTroll = new LethalNetworkVariable<bool>("madsTroll") { Value = true }; [PublicNetworkVariable] public static LethalNetworkVariable<bool> burkTroll = new LethalNetworkVariable<bool>("burkTroll") { Value = true }; internal static Plugin Instance; public static CommandHandler commandHandler; internal static PluginConfig BoundConfig { get; private set; } = null; public Plugin() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown Instance = this; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; burkTroll.OnValueChanged += BurkTrollCommand.UpdateBurkTrollVariable; adminList.OnValueChanged += AdminCommand.UpdateAdminListVariable; speedHackList.OnValueChanged += SpeedHackCommand.UpdateSpeedHackListVariable; godModeList.OnValueChanged += GodModeCommand.UpdateGodModeListVariable; commandPrefix.OnValueChanged += ChangePrefixCommand.UpdateCommandPrefixVariable; stacieTroll.OnValueChanged += StacieTrollCommand.UpdateStacieTrollVariable; madsTroll.OnValueChanged += MadsTrollCommand.UpdateMadsTrollVariable; teleportVictims.OnValueChanged += TeleportCommand.TeleportVictimsVariable; BoundConfig = new PluginConfig((BaseUnityPlugin)(object)this); InitializeNetworkBehaviours(); string path = "rendercharassets"; ModAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), path)); if ((Object)(object)ModAssets == (Object)null) { Logger.LogError((object)"Failed to load custom assets."); return; } EnemyType obj = ModAssets.LoadAsset<EnemyType>("Render"); TerminalNode val = ModAssets.LoadAsset<TerminalNode>("RenderTN"); TerminalKeyword val2 = ModAssets.LoadAsset<TerminalKeyword>("RenderTK"); NetworkPrefabs.RegisterNetworkPrefab(obj.enemyPrefab); Enemies.RegisterEnemy(obj, BoundConfig.SpawnWeight.Value, (LevelTypes)(-1), (SpawnType)0, val, val2); Logger.LogInfo((object)"Plugin burk.ToonukiMadz is loaded!"); foreach (KeyValuePair<string, Type> item in suitNamesToReplace) { ModelReplacementAPI.RegisterSuitModelReplacement(item.Key, item.Value); } mls = Logger.CreateLogSource("ToonukiMadz"); mls.LogInfo((object)"Loaded burk.ToonukiMadz. Patching."); _harmony.PatchAll(typeof(GMPatches)); _harmony.PatchAll(typeof(Plugin)); mls = Logger; enemyRaritys = new Dictionary<SpawnableEnemyWithRarity, int>(); levelEnemySpawns = new Dictionary<SelectableLevel, List<SpawnableEnemyWithRarity>>(); enemyPropCurves = new Dictionary<SpawnableEnemyWithRarity, AnimationCurve>(); } private static void InitializeNetworkBehaviours() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); for (int i = 0; i < types.Length; i++) { MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0) { methodInfo.Invoke(null, null); } } } } } public static class PluginInfo { public const string PLUGIN_GUID = "ToonukiMadz"; public const string PLUGIN_NAME = "ToonukiMadz"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace ToonukiMadz.Configuration { public class PluginConfig { public ConfigEntry<int> SpawnWeight; public PluginConfig(BaseUnityPlugin plugin) { SpawnWeight = plugin.Config.Bind<int>("ToonukiMadz", "Spawn weight", 100, "The spawn chance weight for ToonukiMadz, relative to other existing enemies.\nGoes up from 0, lower is more rare, 100 and up is very common."); ClearUnusedEntries(plugin); } private void ClearUnusedEntries(BaseUnityPlugin plugin) { ((Dictionary<ConfigDefinition, string>)((object)plugin.Config).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(plugin.Config, null)).Clear(); plugin.Config.Save(); } } } namespace ToonukiMadz.Commands { public class AdminCommand : ICommand { public string Name => "admin"; public List<string> Aliases => new List<string>(1) { "admins" }; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "playerName", ArgType = typeof(string), Optional = true } }; public void Execute(string[] args) { PlayerControllerB playerToModify = null; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; if (args.Length != 0) { PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val in array) { if (val.playerUsername.ToLower().Contains(args[0].ToLower())) { playerToModify = val; break; } } if ((Object)(object)playerToModify != (Object)null) { if (!Plugin.adminList.Value.Any((string m) => m == playerToModify.playerUsername)) { Plugin.adminList.Value.Add(playerToModify.playerUsername); Plugin.adminList.Value = Plugin.adminList.Value.Distinct().ToList(); HUDManager.Instance.DisplayTip("Admin Modification", "Added " + playerToModify.playerUsername + " to admins", false, false, "LC_Tip1"); } else { Plugin.adminList.Value = Plugin.adminList.Value.Where((string m) => m != playerToModify.playerUsername).ToList(); HUDManager.Instance.DisplayTip("Admin Modification", "Removed " + playerToModify.playerUsername + " from admins", false, false, "LC_Tip1"); } } else { HUDManager.Instance.DisplayTip("Admin Modification", "Could not find the player '" + args[0] + "'", false, false, "LC_Tip1"); } } else { HUDManager.Instance.DisplayTip("Admins", string.Join(", ", Plugin.adminList.Value) ?? "", false, false, "LC_Tip1"); } } public static void UpdateAdminListVariable(List<string> data) { Plugin.adminList.Value = data; } } public class BuyItemsCommand : ICommand { private readonly List<string> itemList = new List<string>(12) { "Walkie-Talkie", "Pro Flashlight", "Normal Flashlight", "Shovel", "Lockpicker", "Stun Grenade", "Boom Box", "Inhaler", "Stun Gun", "Jet Pack", "Extension Ladder", "Radar Booster" }; private readonly Dictionary<string, int> itemID = new Dictionary<string, int> { { "Walkie-Talkie", 0 }, { "Pro Flashlight", 4 }, { "Normal Flashlight", 1 }, { "Shovel", 2 }, { "Lockpicker", 3 }, { "Stun Grenade", 5 }, { "Boom Box", 6 }, { "Inhaler", 7 }, { "Stun Gun", 8 }, { "Jet Pack", 9 }, { "Extension Ladder", 10 }, { "Radar Booster", 11 } }; public string Name => "buy"; public List<ArgumentModel> Args => new List<ArgumentModel>(2) { new ArgumentModel { Name = "itemName", ArgType = typeof(string) }, new ArgumentModel { Name = "itemCount", ArgType = typeof(int), Optional = true } }; public void Execute(string[] args) { string text = "Item Buying"; string text2 = ""; Terminal val = Object.FindObjectOfType<Terminal>(); if ((Object)(object)val != (Object)null && args.Length != 0) { if (args[0] == "?") { HUDManager.Instance.AddTextToChatOnServer("List of Items:\n" + string.Join("\n", itemList), -1); return; } bool flag = false; if (args.Length > 1) { if (!int.TryParse(args[1], out var result)) { return; } foreach (string item in itemList) { if (item.ToLower().Contains(args[0])) { flag = true; List<int> list = (from _ in Enumerable.Range(0, result) select itemID[item]).ToList(); val.BuyItemsServerRpc(list.ToArray(), val.groupCredits, 0); text2 = $"Bought {result} {item}s"; break; } } if (!flag) { return; } } if (!flag) { bool flag2 = false; foreach (string item2 in itemList) { if (item2.ToLower().Contains(args[0])) { flag2 = true; int[] array = new int[1] { itemID[item2] }; val.BuyItemsServerRpc(array, val.groupCredits, 0); text2 = "Bought 1 " + item2; } } if (!flag2) { text2 = "No item found with that name"; } } } HUDManager.Instance.DisplayTip(text, text2, false, false, "LC_Tip1"); } } public class ChangePrefixCommand : ICommand { public string Name => "prefix"; public List<string> Aliases => new List<string>(3) { "changeprefix", "setprefix", "updateprefix" }; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "prefixText", ArgType = typeof(string) } }; public void Execute(string[] args) { Plugin.commandPrefix.Value = args[0]; HUDManager.Instance.DisplayTip("Prefix Changed", "Changed to '" + args[0] + "'", false, false, "LC_Tip1"); } public static void UpdateCommandPrefixVariable(string data) { Plugin.commandPrefix.Value = data; } } public class EnemiesCommand : ICommand { public string Name => "enemies"; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "pageNumber", ArgType = typeof(int), Optional = true } }; public void Execute(string[] args) { if ((Object)(object)Plugin.currentLevel == (Object)null) { HUDManager.Instance.DisplayTip("Invalid", "There's no available enemies in space!", false, false, "LC_Tip1"); return; } IQueryable<string> source = Plugin.currentLevel.Enemies.Select((SpawnableEnemyWithRarity m) => m.enemyType.enemyName).AsQueryable(); int num = ((args.Length == 0) ? 1 : int.Parse(args[0])); int num2 = 5; int num3 = (num - 1) * num2; int num4 = Math.Min(num3 + num2, source.Count()); if (num3 >= num4) { HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer("No commands to display on this page.", -1); return; } IQueryable<string> values = source.Skip(num3).Take(num2); string text = string.Join("\n", values); int num5 = (int)Math.Ceiling((double)source.Count() / (double)num2); string text2 = $"Page {num} of {num5} Enemy List:" + "\n" + text; HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer(text2, -1); } } public class GodModeCommand : ICommand { public string Name => "god"; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "player", ArgType = typeof(string), Optional = true } }; public void Execute(string[] args) { string text = "God Mode"; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; Plugin.godModeList.Value = AddOrUpdateValue(Plugin.godModeList.Value, GameNetworkManager.Instance.localPlayerController.playerUsername, !Plugin.godModeList.Value.GetValueOrDefault(GameNetworkManager.Instance.localPlayerController.playerUsername)); PlayerControllerB val = GameNetworkManager.Instance.localPlayerController; if (args.Length != 0) { PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val2 in array) { if (val2.playerUsername.ToLower().Contains(args[0].ToLower())) { val = val2; break; } } } if (Plugin.godModeList.Value.GetValueOrDefault(GameNetworkManager.Instance.localPlayerController.playerUsername)) { val.health = 100000; HUDManager.Instance.DisplayTip(text, string.Format("God Mode{0}set to: {1}", ((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) ? " " : (" for " + val.playerUsername + " "), Plugin.godModeList.Value.GetValueOrDefault(GameNetworkManager.Instance.localPlayerController.playerUsername)), false, false, "LC_Tip1"); } else { val.health = 100; val.healthRegenerateTimer = 0f; HUDManager.Instance.DisplayTip(text, "God Mode" + (((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) ? " " : (" for " + val.playerUsername + " ")) + "disabled", false, false, "LC_Tip1"); } Dictionary<string, bool> value = Plugin.godModeList.Value; Plugin.godModeList.Value = null; Plugin.godModeList.Value = value; } public static void UpdateGodModeListVariable(Dictionary<string, bool> data) { Plugin.godModeList.Value = data; } private Dictionary<TKey, TValue> AddOrUpdateValue<TKey, TValue>(Dictionary<TKey, TValue> dictionary, TKey key, TValue value) { if (dictionary.ContainsKey(key)) { dictionary[key] = value; } else { dictionary.Add(key, value); } return dictionary; } } public class HelpCommand : ICommand { public string Name => "help"; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "pageNumberOrCommand", ArgType = typeof(string), Optional = true } }; public List<string> Aliases => new List<string>(3) { "?", "commands", "info" }; public void Execute(string[] args) { List<ICommand> list = (from m in Plugin.commandHandler.GetRegisteredCommands() where !m.HideInHelp select m).ToList(); int num = 1; string commandToSearch = ""; if (args.Length != 0) { if (int.TryParse(args[0], out var result)) { num = Math.Max(1, result); } else { commandToSearch = args[0]; } } int num2 = 5; int num3 = (num - 1) * num2; int num4 = Math.Min(num3 + num2, list.Count); if (num3 >= num4) { HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer("No commands to display on this page.", -1); return; } IEnumerable<ICommand> source = list.Skip(num3).Take(num2); if (!string.IsNullOrWhiteSpace(commandToSearch)) { ICommand command = list.FirstOrDefault((ICommand cmd) => cmd.Name.Equals(commandToSearch, StringComparison.OrdinalIgnoreCase) || cmd.Aliases.Any((string alias) => alias.Equals(commandToSearch, StringComparison.OrdinalIgnoreCase))); if (command != null) { string text = "Command Information\nName:" + command.Name + ((!string.IsNullOrWhiteSpace(command.Description)) ? ("\nDescription: " + command.Description) : "") + (command.Aliases.Any() ? ("\nAliases: " + string.Join(", ", command.Aliases)) : "") + (command.Args.Any() ? ("\nArguments: " + string.Join(", ", command.Args.Select((ArgumentModel m) => m.Name))) : ""); HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer(text, -1); } else { HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer("No command named '" + commandToSearch + "' found.", -1); } } else { string text2 = string.Join("\n", source.Select((ICommand cmd) => cmd.Name)); int num5 = (int)Math.Ceiling((double)list.Count / (double)num2); string text3 = $"Page {num} of {num5} Command List:" + "\n" + text2; HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer(text3, -1); } } } public class CommandHandler { private readonly List<ICommand> commands = new List<ICommand>(); private string _prefix; public CommandHandler(string prefix = "/") { _prefix = prefix; RegisterCommand(new ChangePrefixCommand()); RegisterCommand(new HelpCommand()); RegisterCommand(new EnemiesCommand()); RegisterCommand(new ScrapCommand()); RegisterCommand(new AdminCommand()); RegisterCommand(new MoneyCommand()); RegisterCommand(new SpawnCommand()); RegisterCommand(new ToggleLightsCommand()); RegisterCommand(new BuyItemsCommand()); RegisterCommand(new GodModeCommand()); RegisterCommand(new SpeedHackCommand()); RegisterCommand(new BurkTrollCommand()); RegisterCommand(new MadsTrollCommand()); RegisterCommand(new StacieTrollCommand()); RegisterCommand(new TeleportCommand()); } public List<ICommand> GetRegisteredCommands() { return commands; } public bool HandleCommand(string commandText) { if (!commandText.StartsWith(_prefix)) { return false; } if (!Plugin.adminList.Value.Any((string m) => m == GameNetworkManager.Instance.username)) { HUDManager.Instance.DisplayTip("Command", "Unable to send command since you are not an admin.", false, false, "LC_Tip1"); return true; } if (commandText.Length > _prefix.Length) { string text = commandText; int length = _prefix.Length; commandText = text.Substring(length, text.Length - length); } List<string> list = SplitCommand(commandText); string commandName = list[0]; ICommand command = commands.FirstOrDefault((ICommand cmd) => cmd.Name.ToLower() == commandName || cmd.Aliases.Any((string a) => a.ToLower() == commandName)); if (command != null) { string[] args = list.Skip(1).ToArray(); if (command.HasRequiredArgs(args)) { command.Execute(args); } } else { HUDManager.Instance.DisplayTip("Invalid", "Command not found", false, false, "LC_Tip1"); } return true; } private List<string> SplitCommand(string commandText) { List<string> list = new List<string>(); bool flag = false; int start = 0; for (int i = 0; i < commandText.Length; i++) { if (commandText[i] == '"') { flag = !flag; } else if (commandText[i] == ' ' && !flag) { AddArgument(list, commandText, start, i); start = i + 1; } } AddArgument(list, commandText, start, commandText.Length); return list; } private void AddArgument(List<string> splitCommand, string commandText, int start, int end) { string text = commandText.Substring(start, end - start); if (text.StartsWith("\"") && text.EndsWith("\"")) { string text2 = text; text = text2.Substring(1, text2.Length - 1 - 1); } splitCommand.Add(text); } private void RegisterCommand(ICommand command) { commands.Add(command); } } public interface ICommand { string Name { get; } string Description => ""; List<string> Aliases => new List<string>(); List<ArgumentModel> Args => new List<ArgumentModel>(); bool HideInHelp => false; void Execute(string[] args); bool HasRequiredArgs(string[] args) { List<string> list = new List<string>(); List<string> list2 = new List<string>(); for (int i = 0; i < Args.AsQueryable().Count(); i++) { if (args.Length < i + 1 || string.IsNullOrEmpty(args[i])) { if (!Args[i].Optional) { list.Add(Args[i].Name); } continue; } string value = args[i]; Type conversionType = Args[i].ArgType ?? typeof(string); try { Convert.ChangeType(value, conversionType); } catch (Exception) { list2.Add(Args[i].Name); } } if (list2.Any()) { HUDManager.Instance.DisplayTip("Invalid", "Wrong input for Arguments: " + string.Join(", ", list2), false, false, "LC_Tip1"); } else if (list.Any()) { HUDManager.Instance.DisplayTip("Invalid", "Missing Arguments: " + string.Join(", ", list), false, false, "LC_Tip1"); } if (!list.Any()) { return !list2.Any(); } return false; } } public class ArgumentModel { public Func<string, bool> Validate { get; set; } = (string argument) => true; public string Name { get; set; } public Type ArgType { get; set; } public bool Optional { get; set; } } public class MoneyCommand : ICommand { public string Name => "money"; public List<string> Aliases => new List<string>(2) { "credits", "credit" }; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "moneyAmount", ArgType = typeof(int) } }; public void Execute(string[] args) { Terminal val = Object.FindObjectOfType<Terminal>(); if (args.Length != 0) { val.SyncGroupCreditsServerRpc(int.Parse(args[0]), val.numberOfItemsInDropship); HUDManager.Instance.DisplayTip("Credits Command", "Set Terminal money to " + args[0], false, false, "LC_Tip1"); } } } public class ScrapCommand : ICommand { public string Name => "scrap"; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "pageNumber", ArgType = typeof(int), Optional = true } }; public void Execute(string[] args) { if ((Object)(object)Plugin.currentLevel == (Object)null) { HUDManager.Instance.DisplayTip("Invalid", "There's no available scrap in space!", false, false, "LC_Tip1"); return; } IQueryable<string> source = Plugin.currentLevel.spawnableScrap.Select((SpawnableItemWithRarity m) => m.spawnableItem.itemName).AsQueryable(); int num = ((args.Length == 0) ? 1 : int.Parse(args[0])); int num2 = 5; int num3 = (num - 1) * num2; int num4 = Math.Min(num3 + num2, source.Count()); if (num3 >= num4) { HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer("No commands to display on this page.", -1); return; } IQueryable<string> values = source.Skip(num3).Take(num2); string text = string.Join("\n", values); int num5 = (int)Math.Ceiling((double)source.Count() / (double)num2); string text2 = $"Page {num} of {num5} Scrap List:" + "\n" + text; HUDManager.Instance.AddTextToChatOnServer("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", -1); HUDManager.Instance.AddTextToChatOnServer(text2, -1); } } public class SpawnCommand : ICommand { private static bool spawnSuccessful = false; private static string spawnedThingName = ""; private static string thingTypeName = ""; private static int amountToSpawn = 1; private static int scrapValue = 100; private static Vector3? playerPosition = null; private static string noticeTitle = ""; private static string noticeBody = ""; public string Name => "spawn"; public string Description => "Can spawn either scrap or enemies.\nFor enemies, type " + Plugin.commandPrefix.Value + "spawn <" + Args[0].Name + "> <" + Args[1].Name + "> <" + Args[2].Name + ">\nFor scrap, type " + Plugin.commandPrefix.Value + "spawn <" + Args[0].Name + "> <" + Args[1].Name + "> <scrapValue>"; public List<ArgumentModel> Args => new List<ArgumentModel>(3) { new ArgumentModel { Name = "thingName", ArgType = typeof(string) }, new ArgumentModel { Name = "thingCount", ArgType = typeof(int), Optional = true }, new ArgumentModel { Name = "playerToSpawnOn", ArgType = typeof(string), Optional = true } }; public void Execute(string[] args) { //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) spawnSuccessful = false; spawnedThingName = ""; thingTypeName = ""; amountToSpawn = 1; scrapValue = 1; playerPosition = null; noticeTitle = ""; noticeBody = ""; if ((Object)(object)Plugin.currentLevel == (Object)null) { HUDManager.Instance.DisplayTip("Invalid", "You can't spawn things in space", false, false, "LC_Tip1"); return; } amountToSpawn = ((args.Length <= 1) ? 1 : int.Parse(args[1])); PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; if (args.Length > 2) { PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val in array) { if (val.playerUsername.ToLower().Contains(args[2].ToLower())) { playerPosition = ((Component)val).transform.position; break; } if (args[2].ToLower() == "@me" && val.playerUsername.ToLower().Contains(HUDManager.Instance.localPlayer.playerUsername.ToLower())) { playerPosition = ((Component)val).transform.position; break; } } } List<List<SpawnableEnemyWithRarity>> mainEnemyList = new List<List<SpawnableEnemyWithRarity>> { Plugin.currentLevel.Enemies, Plugin.currentLevel.OutsideEnemies }; List<SpawnableItemWithRarity> spawnableScrap = Plugin.currentLevel.spawnableScrap; bool flag = Plugin.currentLevel.Enemies.Any((SpawnableEnemyWithRarity m) => m.enemyType.enemyName.ToLower().Contains(args[0].ToLower())) || Plugin.currentLevel.OutsideEnemies.Any((SpawnableEnemyWithRarity m) => m.enemyType.enemyName.ToLower().Contains(args[0].ToLower())); bool flag2 = spawnableScrap.Where((SpawnableItemWithRarity m) => m.spawnableItem.itemName.ToLower().Contains(args[0].ToLower())).Count() != 0; if (flag && flag2) { noticeTitle = "Invalid"; noticeBody = "Found results for enemies and scrap.\nBe more specific!"; } else if (flag) { thingTypeName = "Enemy"; EnemyLoop(args, mainEnemyList); } else if (flag2) { thingTypeName = "Scrap"; ScrapLoop(args, spawnableScrap); } if (!spawnSuccessful) { noticeTitle = "Invalid"; noticeBody = "Failed to spawn thing, check your command."; } else { noticeTitle = "Spawned " + thingTypeName; noticeBody = $"Spawned {amountToSpawn}: {spawnedThingName}"; } HUDManager.Instance.DisplayTip(noticeTitle, noticeBody, false, false, "LC_Tip1"); } public static void ScrapLoop(string[] args, List<SpawnableItemWithRarity> mainScrapList) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) _ = StartOfRound.Instance.allPlayerScripts; playerPosition = ((Component)HUDManager.Instance.localPlayer).transform.position; foreach (SpawnableItemWithRarity mainScrap in mainScrapList) { if (mainScrap.spawnableItem.itemName.ToLower().Contains(args[0].ToLower())) { try { spawnSuccessful = true; spawnedThingName = mainScrap.spawnableItem.itemName; amountToSpawn = ((args.Length <= 1 || !int.TryParse(args[1], out var result)) ? 1 : result); scrapValue = ((args.Length <= 2 || !int.TryParse(args[2], out var result2)) ? 1 : result2); SpawnScrap(mainScrap, amountToSpawn, scrapValue, playerPosition); } catch (Exception) { } noticeBody = $"Spawned {amountToSpawn}: {spawnedThingName} that is worth ${scrapValue}"; break; } } } public static void EnemyLoop(string[] args, List<List<SpawnableEnemyWithRarity>> mainEnemyList) { foreach (List<SpawnableEnemyWithRarity> mainEnemy in mainEnemyList) { foreach (SpawnableEnemyWithRarity item in mainEnemy) { if (!item.enemyType.enemyName.ToLower().Contains(args[0].ToLower())) { continue; } try { spawnSuccessful = true; spawnedThingName = item.enemyType.enemyName; if (playerPosition.HasValue) { SpawnEnemy(item, amountToSpawn, mainEnemy == Plugin.currentLevel.Enemies, playerPosition); } else { SpawnEnemy(item, amountToSpawn, mainEnemy == Plugin.currentLevel.Enemies); } } catch (Exception ex) { Plugin.mls.LogInfo((object)"Could not spawn enemy"); Plugin.mls.LogError((object)("The game tossed an error: " + ex.Message)); } break; } if (spawnSuccessful) { break; } } } public static void SpawnScrap(SpawnableItemWithRarity scrap, int amount, int value, Vector3? playerPosition = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //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) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: 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) Plugin.mls.LogInfo((object)"Got to the main SpawnScrap function"); try { bool flag = false; for (int i = 0; i < amount; i++) { GameObject spawnPrefab = scrap.spawnableItem.spawnPrefab; Quaternion val = Quaternion.Euler(Quaternion.identity.x, Random.Range(0f, 360f), Quaternion.identity.z); for (int j = 0; j < amount; j++) { GrabbableObject component = Object.Instantiate<GameObject>(spawnPrefab, playerPosition.Value, val, Plugin.currentRound.spawnedScrapContainer).GetComponent<GrabbableObject>(); component.startFallingPosition = playerPosition.Value; component.targetFloorPosition = component.GetItemFloorPosition(playerPosition.Value); component.SetScrapValue(value); ((NetworkBehaviour)component).NetworkObject.Spawn(false); } flag = true; } if (!flag) { Plugin.mls.LogWarning((object)("Could not spawn " + scrap.spawnableItem.itemName)); } } catch (Exception ex) { Plugin.mls.LogError((object)(ex.Message ?? "")); Plugin.mls.LogInfo((object)"Failed to spawn scrap, check your command."); } } public static void SpawnEnemy(SpawnableEnemyWithRarity enemy, int amount, bool inside, Vector3? playerPosition = null) { //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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_006e: Unknown result type (might be due to invalid IL or missing references) Plugin.mls.LogInfo((object)"Got to the main SpawnEnemy function"); if (inside) { try { for (int i = 0; i < amount; i++) { int num = Random.Range(0, Plugin.currentRound.allEnemyVents.Length); Vector3 val = (Vector3)(((??)playerPosition) ?? Plugin.currentRound.allEnemyVents[num].floorNode.position); Plugin.currentRound.SpawnEnemyOnServer(val, Plugin.currentRound.allEnemyVents[num].floorNode.eulerAngles.y, Plugin.currentLevel.Enemies.IndexOf(enemy)); } return; } catch (Exception ex) { Plugin.mls.LogError((object)(ex.Message ?? "")); Plugin.mls.LogInfo((object)"Failed to spawn enemies, check your command."); return; } } for (int j = 0; j < amount; j++) { Plugin.mls.LogInfo((object)("Spawned an enemy. Total Spawned: " + j)); Object.Instantiate<GameObject>(Plugin.currentLevel.OutsideEnemies[Plugin.currentLevel.OutsideEnemies.IndexOf(enemy)].enemyType.enemyPrefab, GameObject.FindGameObjectsWithTag("OutsideAINode")[Random.Range(0, GameObject.FindGameObjectsWithTag("OutsideAINode").Length - 1)].transform.position, Quaternion.Euler(Vector3.zero)).gameObject.GetComponentInChildren<NetworkObject>().Spawn(true); } } } public class SpeedHackCommand : ICommand { private PlayerControllerB playerToModify = GameNetworkManager.Instance.localPlayerController; private string noticeTitle = "Speedhack"; private string noticeBody = ""; public string Name => "speed"; public List<ArgumentModel> Args => new List<ArgumentModel>(2) { new ArgumentModel { Name = "player", ArgType = typeof(string), Optional = true }, new ArgumentModel { Name = "speed", ArgType = typeof(float), Optional = true } }; public void Execute(string[] args) { playerToModify = GameNetworkManager.Instance.localPlayerController; noticeTitle = "Speedhack"; noticeBody = ""; if (args.Length == 1) { if (!float.TryParse(args[0], out var result)) { UpdateSpeed(args[0], null); } else { UpdateSpeed(playerToModify.playerUsername, result); } } else if (args.Length == 2) { if (float.TryParse(args[1], out var result2)) { UpdateSpeed(args[0], result2); } else { UpdateSpeed(args[0], null); } } else { UpdateSpeed(playerToModify.playerUsername, null); } } public static void UpdateSpeedHackListVariable(Dictionary<string, bool> data) { Plugin.speedHackList.Value = data; } private void UpdateSpeed(string playerName, float? speed) { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; bool flag = false; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val in array) { if (val.playerUsername.ToLower().Contains(playerName.ToLower()) && !Regex.IsMatch(val.playerUsername.ToLower(), "player #[0-9]{1,2}")) { playerToModify = val; break; } if (Regex.IsMatch(val.playerUsername.ToLower(), "player #[0-9]{1,2}")) { flag = true; } } if (!flag) { if (!Plugin.speedHackList.Value.TryGetValue(playerToModify.playerUsername, out var value)) { SetSpeedHackNetVal(playerToModify.playerUsername, value: true); } else { SetSpeedHackNetVal(playerToModify.playerUsername, !value); } if (Plugin.speedHackList.Value.GetValueOrDefault(playerToModify.playerUsername) || speed.HasValue) { float valueOrDefault = speed.GetValueOrDefault(); if (!speed.HasValue) { valueOrDefault = 10f; speed = valueOrDefault; } playerToModify.movementSpeed = speed.Value; playerToModify.climbSpeed = speed.Value; HUDManager.Instance.DisplayTip(noticeTitle, string.Format("Speed{0}set to {1}", ((Object)(object)playerToModify == (Object)(object)GameNetworkManager.Instance.localPlayerController) ? " " : (" for " + playerToModify.playerUsername + " "), speed), false, false, "LC_Tip1"); SetSpeedHackNetVal(playerToModify.playerUsername, value: true); } else { SetSpeedHackNetVal(playerToModify.playerUsername, value: false); playerToModify.movementSpeed = 4.6f; playerToModify.climbSpeed = 3.6f; HUDManager.Instance.DisplayTip(noticeTitle, "Speed" + (((Object)(object)playerToModify == (Object)(object)GameNetworkManager.Instance.localPlayerController) ? " " : (" for " + playerToModify.playerUsername + " ")) + "disabled", false, false, "LC_Tip1"); } } else { HUDManager.Instance.DisplayTip(noticeTitle, "Player '" + playerName + "' not found", false, false, "LC_Tip1"); } } private void SetSpeedHackNetVal(string playerName, bool value) { Plugin.speedHackList.Value = AddOrUpdateValue(Plugin.speedHackList.Value, playerName, value); Dictionary<string, bool> value2 = Plugin.speedHackList.Value; Plugin.speedHackList.Value = null; Plugin.speedHackList.Value = value2; } private Dictionary<TKey, TValue> AddOrUpdateValue<TKey, TValue>(Dictionary<TKey, TValue> dictionary, TKey key, TValue value) { if (dictionary.ContainsKey(key)) { dictionary[key] = value; } else { dictionary.Add(key, value); } return dictionary; } } public class TeleportCommand : ICommand { public string Name => "teleport"; public List<string> Aliases => new List<string>(4) { "tp", "tele", "tel", "warp" }; public List<ArgumentModel> Args => new List<ArgumentModel>(2) { new ArgumentModel { Name = "victimPlayer", ArgType = typeof(string), Optional = true }, new ArgumentModel { Name = "witnessPlayer", ArgType = typeof(string), Optional = true } }; public void Execute(string[] args) { PlayerControllerB val = GameNetworkManager.Instance.localPlayerController; PlayerControllerB val2 = null; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; if (args.Length != 0 && !args[0].Contains(GameNetworkManager.Instance.localPlayerController.playerUsername)) { PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val3 in array) { if (val3.playerUsername.ToLower().Contains(args[0].ToLower())) { val = val3; break; } } } if (args.Length > 1) { PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val4 in array) { if (val4.playerUsername.ToLower().Contains(args[1].ToLower())) { val2 = val4; break; } } } Plugin.teleportVictims.Value = (val?.playerUsername, val2?.playerUsername); if (HUDManager.Instance.localPlayer.playerUsername != val?.playerUsername) { val.beamUpParticle.Play(); val.beamOutBuildupParticle.Play(); } if ((Object)(object)val2 != (Object)null) { string text = ((val.playerUsername != GameNetworkManager.Instance.localPlayerController.playerUsername) ? val.playerUsername : "yourself") ?? ""; string text2 = ((val2.playerUsername != GameNetworkManager.Instance.localPlayerController.playerUsername) ? val2.playerUsername : "yourself") ?? ""; if (text != text2) { HUDManager.Instance.DisplayTip("Teleportation", "Teleported " + text + " to " + text2, false, false, "LC_Tip1"); } else { HUDManager.Instance.DisplayTip("Teleportation", "Teleported to... yourself?", false, false, "LC_Tip1"); } } else if (val.playerUsername != GameNetworkManager.Instance.localPlayerController.playerUsername) { HUDManager.Instance.DisplayTip("Teleportation", "Teleported " + val.playerUsername + " to the ship", false, false, "LC_Tip1"); } else { HUDManager.Instance.DisplayTip("Teleportation", "Teleported yourself to the ship", false, false, "LC_Tip1"); } } public static void TeleportVictimsVariable((string, string) data) { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_0106: 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) PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; if (!(data.Item1 == HUDManager.Instance.localPlayer.playerUsername)) { return; } HUDManager.Instance.localPlayer.beamUpParticle.Play(); HUDManager.Instance.localPlayer.beamOutBuildupParticle.Play(); if (data.Item2 != null) { PlayerControllerB val = null; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val2 in array) { if (val2.playerUsername.ToLower().Contains(data.Item2.ToLower())) { val = val2; break; } } HUDManager.Instance.localPlayer.TeleportPlayer(((Component)val).transform.position, false, 0f, false, true); } else { Terminal val3 = Object.FindObjectOfType<Terminal>(); if ((Object)val3 != (Object)null) { HUDManager.Instance.localPlayer.beamUpParticle.Play(); HUDManager.Instance.localPlayer.beamOutBuildupParticle.Play(); HUDManager.Instance.localPlayer.TeleportPlayer(((Component)val3).transform.position, false, 0f, false, true); } } } } public class ToggleLightsCommand : ICommand { public string Name => "togglelights"; public void Execute(string[] args) { string text = ""; string text2 = ""; BreakerBox val = Object.FindObjectOfType<BreakerBox>(); if ((Object)(object)val != (Object)null) { text = "Light Change"; if (val.isPowerOn) { Plugin.currentRound.TurnBreakerSwitchesOff(); Plugin.currentRound.TurnOnAllLights(false); val.isPowerOn = false; text2 = "Turned the lights off"; } else { Plugin.currentRound.PowerSwitchOnClientRpc(); text2 = "Turned the lights on"; } } HUDManager.Instance.DisplayTip(text, text2, false, false, "LC_Tip1"); } } public class BurkTrollCommand : ICommand { public string Name => "burkTroll"; public bool HideInHelp => true; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "state", ArgType = typeof(bool) } }; public void Execute(string[] args) { Plugin.burkTroll.Value = bool.Parse(args[0]); } public static void UpdateBurkTrollVariable(bool data) { Plugin.burkTroll.Value = data; } } public class MadsTrollCommand : ICommand { public string Name => "madsTroll"; public bool HideInHelp => true; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "state", ArgType = typeof(bool) } }; public void Execute(string[] args) { Plugin.madsTroll.Value = bool.Parse(args[0]); } public static void UpdateMadsTrollVariable(bool data) { Plugin.madsTroll.Value = data; } } public class StacieTrollCommand : ICommand { public string Name => "stacieTroll"; public bool HideInHelp => true; public List<ArgumentModel> Args => new List<ArgumentModel>(1) { new ArgumentModel { Name = "state", ArgType = typeof(bool) } }; public void Execute(string[] args) { Plugin.stacieTroll.Value = bool.Parse(args[0]); } public static void UpdateStacieTrollVariable(bool data) { Plugin.stacieTroll.Value = data; } } } namespace ToonukiMadz.src.patches { public class GMPatches { [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPrefix] private static void SetIsHost() { Plugin.mls.LogInfo((object)("Host Status: " + ((NetworkBehaviour)RoundManager.Instance).NetworkManager.IsHost)); Plugin.isHost = ((NetworkBehaviour)RoundManager.Instance).NetworkManager.IsHost; } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPrefix] private static void setCurrentRound() { Plugin.currentRound = RoundManager.Instance; } [HarmonyPatch(typeof(PlayerControllerB), "Start")] [HarmonyPrefix] private static void GetPlayerRef(ref PlayerControllerB __instance) { Plugin.playerRef = __instance; if (GameNetworkManager.Instance.isHostingGame) { Plugin.adminList.Value.Add(GameNetworkManager.Instance.username); Plugin.adminList.Value = Plugin.adminList.Value.Distinct().ToList(); } } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPostfix] private static void UpdateNewInfo(ref EnemyVent[] ___allEnemyVents, ref SelectableLevel ___currentLevel) { Plugin.currentLevel = ___currentLevel; Plugin.currentLevelVents = ___allEnemyVents; HUDManager.Instance.chatTextField.characterLimit = 999; } [HarmonyPatch(typeof(RoundManager), "AdvanceHourAndSpawnNewBatchOfEnemies")] [HarmonyPrefix] private static void UpdateCurrentLevelInfo(ref EnemyVent[] ___allEnemyVents, ref SelectableLevel ___currentLevel) { Plugin.currentLevel = ___currentLevel; Plugin.currentLevelVents = ___allEnemyVents; } [HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")] [HarmonyPrefix] private static void ToonukiMadzCommands(HUDManager __instance) { string text = __instance.chatTextField.text; Plugin.mls.LogInfo((object)text); Plugin.commandHandler = new CommandHandler(Plugin.commandPrefix.Value); if (Plugin.commandHandler.HandleCommand(text)) { __instance.chatTextField.text = ""; } } [HarmonyPatch(typeof(PlayerControllerB), "AllowPlayerDeath")] [HarmonyPrefix] private static bool OverrideDeath() { PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; if (Plugin.godModeList.Value.GetValueOrDefault(GameNetworkManager.Instance.localPlayerController.playerUsername)) { localPlayerController.health = 100000; } return !Plugin.godModeList.Value.GetValueOrDefault(GameNetworkManager.Instance.localPlayerController.playerUsername); } } } namespace ToonukiMadz.src.BodyReplacements { public class BodyReplacementCel : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "ModelCel"; GameObject result = Plugin.ModAssets.LoadAsset<GameObject>(text); _ = ((Component)this).GetComponent<PlayerControllerB>().currentSuitID; StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem m) => m.unlockableName == "celshock").FirstOrDefault().unlockableName.ToLower().Replace(" ", ""); return result; } } public class BodyReplacementCircle : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "ModelCircle"; GameObject result = Plugin.ModAssets.LoadAsset<GameObject>(text); _ = ((Component)this).GetComponent<PlayerControllerB>().currentSuitID; StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem m) => m.unlockableName == "circle").FirstOrDefault().unlockableName.ToLower().Replace(" ", ""); return result; } } public class BodyReplacementIvan : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "ModelIvan"; GameObject result = Plugin.ModAssets.LoadAsset<GameObject>(text); _ = ((Component)this).GetComponent<PlayerControllerB>().currentSuitID; StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem m) => m.unlockableName == "ivan").FirstOrDefault().unlockableName.ToLower().Replace(" ", ""); return result; } } public class BodyReplacementKappa : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "ModelKappa"; GameObject result = Plugin.ModAssets.LoadAsset<GameObject>(text); _ = ((Component)this).GetComponent<PlayerControllerB>().currentSuitID; StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem m) => m.unlockableName == "kappa").FirstOrDefault().unlockableName.ToLower().Replace(" ", ""); return result; } } public class BodyReplacementMadz : BodyReplacementBase { protected override GameObject LoadAssetsAndReturnModel() { string text = "ModelMadz"; GameObject result = Plugin.ModAssets.LoadAsset<GameObject>(text); _ = ((Component)this).GetComponent<PlayerControllerB>().currentSuitID; StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem m) => m.unlockableName == "madz").FirstOrDefault().unlockableName.ToLower().Replace(" ", ""); return result; } } } namespace ToonukiMadz.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }