Decompiled source of SawTapes v3.0.2
SawTapes.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
using 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 BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LegaFusionCore; using LegaFusionCore.Behaviours.Addons; using LegaFusionCore.Behaviours.Shaders; using LegaFusionCore.Managers; using LegaFusionCore.Managers.NetworkManagers; using LegaFusionCore.Registries; using LegaFusionCore.Utilities; using LethalLib.Modules; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SawTapes.Behaviours.Bathroom; using SawTapes.Behaviours.Enemies; using SawTapes.Behaviours.Games; using SawTapes.Behaviours.Games.EscapeGame; using SawTapes.Behaviours.Games.ExplosiveGame; using SawTapes.Behaviours.Games.HuntingGame; using SawTapes.Behaviours.Games.SurvivalGame; using SawTapes.Behaviours.Items; using SawTapes.Behaviours.Items.Addons; using SawTapes.Behaviours.Items.Addons.Scripts; using SawTapes.Files; using SawTapes.Files.Values; using SawTapes.Managers; using SawTapes.NetcodePatcher; using SawTapes.Patches; using SawTapes.Values; using TMPro; using Unity.AI.Navigation; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.EventSystems; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("EasyTextEffects")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("SawTapes")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SawTapes")] [assembly: AssemblyTitle("SawTapes")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] 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 SawTapes { public class Constants { public const string IMPOSSIBLE_ACTION = "Impossible Action"; public const string INFORMATION = "Information"; public const string MESSAGE_IMPAC_KEY = "This key is needed by a tested player to survive"; public const string MESSAGE_IMPAC_SAW = "This saw is needed by the tested players to survive"; public const string MESSAGE_IMPAC_TESTED_PLAYER = "You are not a tested player, the game can't start"; public const string GLOBAL = "_Global_"; public const string HUD = "_HUD_"; public const string SURVIVAL_GAME = "Survival Game"; public const string HUNTING_GAME = "Hunting Game"; public const string ESCAPE_GAME = "Escape Game"; public const string EXPLOSIVE_GAME = "Explosive Game"; public const string JIGSAW_JUDGEMENT = "Jigsaw Judgement"; public const string HUNTER_MARK = "Hunter Mark"; public const string SHOVEL = "Shovel"; public const string REVERSE_BEAR_TRAP = "Reverse Bear Trap"; public const string SAW = "Saw"; public const string SAW_TAPE = "Saw Tape"; public const string JIGSAW_JUDGEMENT_NAME = "Jigsaw's Judgement"; public const string BLEEDING_CHAINS = "Bleeding Chains"; public const string FINAL_DETONATION = "Final Detonation"; public const string HUNTER_MARK_NAME = "Hunter's Mark"; public const string SPRINT_BURST = "Sprint Burst"; } [BepInPlugin("Lega.SawTapes", "Saw Tapes", "3.0.2")] public class SawTapes : BaseUnityPlugin { internal const string modGUID = "Lega.SawTapes"; internal const string modName = "Saw Tapes"; internal const string modVersion = "3.0.2"; private readonly Harmony harmony = new Harmony("Lega.SawTapes"); private static readonly AssetBundle bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "sawtapes")); internal static ManualLogSource mls; public static ConfigFile configFile; public static GameObject managerPrefab = NetworkPrefabs.CreateNetworkPrefab("SawTapesNetworkManager"); public static SawTape sawTape; public static Bathroom bathroom; public static HashSet<EnemyType> allEnemies = new HashSet<EnemyType>(); public static List<SawTapeValue> sawTapeValues = new List<SawTapeValue>(); public static Item billyPuppet; public static Item billyPuppetJJ; public static Item billyHead; public static Item billyBody; public static Item sawEscape; public static Item sawBombExplosive; public static Item billyPuppetFD; public static Item rBTrapHunting; public static Item sawKeyHunting; public static Item billyPuppetHunting; public static Item billyPuppetHM; public static Item billyPuppetSurvival; public static Item billyPuppetSB; public static Item sawKeyBathroom; public static Item sawBathroom; public static Item sawBC; public static EnemyType billyAnnouncementEnemy; public static EnemyType billyBathroomEnemy; public static EnemyType billyFDEnemy; public static EnemyType billyHMEnemy; public static GameObject puzzleBoardInterface; public static GameObject puzzleBoardPrefab; public static GameObject puzzlePiecePrefab; public static GameObject chainEscapeObj; public static GameObject sawBoxExplosiveObj; public static GameObject bathroomObj; public static GameObject bleedingChainsObj; public static GameObject redExplosionParticle; public static GameObject bleedingChainsAudio; public void Awake() { mls = Logger.CreateLogSource("SawTapes"); configFile = ((BaseUnityPlugin)this).Config; ConfigManager.Load(); LoadManager(); NetcodePatcher(); LoadItems(); LoadEnemies(); LoadPrefabs(); harmony.PatchAll(typeof(HUDManagerPatch)); harmony.PatchAll(typeof(StartOfRoundPatch)); harmony.PatchAll(typeof(PlayerControllerBPatch)); harmony.PatchAll(typeof(RoundManagerPatch)); harmony.PatchAll(typeof(ShovelPatch)); harmony.PatchAll(typeof(EnemyAIPatch)); } public static void LoadManager() { Utilities.FixMixerGroups(managerPrefab); managerPrefab.AddComponent<SawTapesNetworkManager>(); } private static void NetcodePatcher() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } } public void LoadItems() { List<SawTapeValue> list = new List<SawTapeValue>(4); list.Add(new SawTapeValue(typeof(SurvivalTape), bundle.LoadAsset<Item>("Assets/SawTape/SurvivalTapeItem.asset"), ConfigManager.SurvivalRarity, ConfigManager.survivalMinPlayers.Value, ConfigManager.survivalMaxPlayers.Value, ConfigManager.survivalInteriorExclusions.Value)); list.Add(new SawTapeValue(typeof(HuntingTape), bundle.LoadAsset<Item>("Assets/SawTape/HuntingTapeItem.asset"), ConfigManager.HuntingRarity, ConfigManager.huntingMinPlayers.Value, ConfigManager.huntingMaxPlayers.Value, ConfigManager.huntingInteriorExclusions.Value)); list.Add(new SawTapeValue(typeof(EscapeTape), bundle.LoadAsset<Item>("Assets/SawTape/EscapeTapeItem.asset"), ConfigManager.EscapeRarity, ConfigManager.escapeMinPlayers.Value, ConfigManager.escapeMaxPlayers.Value, ConfigManager.escapeInteriorExclusions.Value)); list.Add(new SawTapeValue(typeof(ExplosiveTape), bundle.LoadAsset<Item>("Assets/SawTape/ExplosiveTapeItem.asset"), ConfigManager.ExplosiveRarity, ConfigManager.explosiveMinPlayers.Value, ConfigManager.explosiveMaxPlayers.Value, ConfigManager.explosiveInteriorExclusions.Value)); sawTapeValues = list; foreach (SawTapeValue sawTapeValue in sawTapeValues) { RegisterItem(sawTapeValue.Type, sawTapeValue.Item); } billyPuppet = RegisterItem(typeof(BillyPuppet), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetItem.asset")); billyPuppetJJ = RegisterItem(typeof(BillyPuppetJJ), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetJJItem.asset")); billyHead = RegisterItem(typeof(BillyHead), bundle.LoadAsset<Item>("Assets/Billy/Head/BillyHeadItem.asset")); billyBody = RegisterItem(typeof(BillyBody), bundle.LoadAsset<Item>("Assets/Billy/Body/BillyBodyItem.asset")); sawEscape = RegisterItem(typeof(SawEscape), bundle.LoadAsset<Item>("Assets/Saw/SawEscapeItem.asset")); sawBombExplosive = RegisterItem(typeof(SawBombExplosive), bundle.LoadAsset<Item>("Assets/SawBomb/SawBombExplosiveItem.asset")); billyPuppetFD = RegisterItem(typeof(BillyPuppetFD), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetFDItem.asset")); rBTrapHunting = RegisterItem(typeof(RBTrapHunting), bundle.LoadAsset<Item>("Assets/ReverseBearTrap/RBTrapHuntingItem.asset")); sawKeyHunting = RegisterItem(typeof(SawKeyHunting), bundle.LoadAsset<Item>("Assets/SawKey/SawKeyHuntingItem.asset")); billyPuppetHunting = RegisterItem(typeof(BillyPuppetHunting), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetHuntingItem.asset")); billyPuppetHM = RegisterItem(typeof(BillyPuppetHM), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetHMItem.asset")); billyPuppetSurvival = RegisterItem(typeof(BillyPuppetSurvival), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetSurvivalItem.asset")); billyPuppetSB = RegisterItem(typeof(BillyPuppetSB), bundle.LoadAsset<Item>("Assets/Billy/Puppet/BillyPuppetSBItem.asset")); sawKeyBathroom = RegisterItem(typeof(SawKeyBathroom), bundle.LoadAsset<Item>("Assets/SawKey/SawKeyBathroomItem.asset")); sawBathroom = RegisterItem(typeof(SawBathroom), bundle.LoadAsset<Item>("Assets/Saw/SawBathroomItem.asset")); sawBC = RegisterItem(typeof(SawBC), bundle.LoadAsset<Item>("Assets/Saw/SawBC.asset")); } public Item RegisterItem(Type type, Item item) { if ((Object)(object)item.spawnPrefab.GetComponent(type) == (Object)null) { Component obj = item.spawnPrefab.AddComponent(type); PhysicsProp val = (PhysicsProp)(object)((obj is PhysicsProp) ? obj : null); ((GrabbableObject)val).grabbable = true; ((GrabbableObject)val).grabbableToEnemies = true; ((GrabbableObject)val).itemProperties = item; } NetworkPrefabs.RegisterNetworkPrefab(item.spawnPrefab); Utilities.FixMixerGroups(item.spawnPrefab); Items.RegisterItem(item); return item; } public void LoadEnemies() { List<EnemyType> list = new List<EnemyType>(4) { billyAnnouncementEnemy = bundle.LoadAsset<EnemyType>("Assets/Billy/Enemy/BillyAnnouncementEnemy.asset"), billyBathroomEnemy = bundle.LoadAsset<EnemyType>("Assets/Billy/Enemy/BillyBathroomEnemy.asset"), billyFDEnemy = bundle.LoadAsset<EnemyType>("Assets/Billy/Enemy/BillyFDEnemy.asset"), billyHMEnemy = bundle.LoadAsset<EnemyType>("Assets/Billy/Enemy/BillyHMEnemy.asset") }; list.ForEach(delegate(EnemyType e) { NetworkPrefabs.RegisterNetworkPrefab(e.enemyPrefab); }); } public static void LoadPrefabs() { puzzleBoardPrefab = bundle.LoadAsset<GameObject>("Assets/SlidingPuzzle/PuzzleBoard.prefab"); puzzlePiecePrefab = bundle.LoadAsset<GameObject>("Assets/SlidingPuzzle/PuzzlePiece.prefab"); List<GameObject> list = new List<GameObject>(6) { sawBoxExplosiveObj = bundle.LoadAsset<GameObject>("Assets/SawBox/SawBoxExplosive.prefab"), chainEscapeObj = bundle.LoadAsset<GameObject>("Assets/Chain/ChainEscape.prefab"), bathroomObj = bundle.LoadAsset<GameObject>("Assets/Addons/JigsawJudgement/Bathroom.prefab"), bleedingChainsObj = bundle.LoadAsset<GameObject>("Assets/Addons/BleedingChains/BleedingChains.prefab"), redExplosionParticle = bundle.LoadAsset<GameObject>("Assets/Particles/RedExplosionParticle.prefab"), bleedingChainsAudio = bundle.LoadAsset<GameObject>("Assets/Audios/Prefabs/BleedingChainsAudio.prefab") }; list.ForEach(delegate(GameObject o) { NetworkPrefabs.RegisterNetworkPrefab(o); Utilities.FixMixerGroups(o); }); } } public class STUtilities { public static bool IsEligiblePlayer(PlayerControllerB player) { if (player.isPlayerControlled && !player.isPlayerDead && ((Object)(object)SawTapes.bathroom == (Object)null || ((Object)(object)SawTapes.bathroom != (Object)null && (Object)(object)SawTapes.bathroom.player != (Object)(object)player))) { if (!string.IsNullOrEmpty(ConfigManager.excludedPlayers.Value)) { return !ConfigManager.excludedPlayers.Value.Contains(player.playerUsername); } return true; } return false; } public static Transform FindMainEntrancePoint() { return ((IEnumerable<EntranceTeleport>)LFCSpawnRegistry.GetAllAs<EntranceTeleport>()).FirstOrDefault((Func<EntranceTeleport, bool>)((EntranceTeleport e) => e.entranceId == 0 && !e.isEntranceToBuilding))?.entrancePoint; } public static Vector3[] GetFurthestPositions(Vector3 position, int? amount = null) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) IOrderedEnumerable<Vector3> source = from n in RoundManager.Instance.insideAINodes select n.transform.position into p orderby Vector3.Distance(position, p) descending select p; if (!amount.HasValue) { return source.ToArray(); } return source.Take(amount.Value).ToArray(); } public static Vector3? GetFurthestValidPosition(Vector3 position, NavMeshAgent agent, GameObject[] nodes) { //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) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_002f: 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_0051: 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_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) Vector3? result = null; float num = -1f; foreach (GameObject val in nodes) { Vector3 position2 = val.transform.position; NavMeshPath val2 = new NavMeshPath(); if (agent.CalculatePath(position2, val2) && !(Vector3.Distance(val2.corners[val2.corners.Length - 1], position2) > 1.55f)) { float num2 = Vector3.Distance(position, position2); if (num2 > num) { num = num2; result = position2; } } } return result; } public static Vector3? GetClosestPositionScrapSpawn(Vector3 position, float minDistance, Item itemToSpawn) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) RandomScrapSpawn val = (from s in Object.FindObjectsOfType<RandomScrapSpawn>() where Vector3.Distance(position, ((Component)s).transform.position) >= minDistance orderby Vector3.Distance(position, ((Component)s).transform.position) select s).FirstOrDefault(); if (!val.spawnedItemsCopyPosition) { ((Component)val).transform.position = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(((Component)val).transform.position, val.itemSpawnRange, RoundManager.Instance.navHit, RoundManager.Instance.AnomalyRandom, -1, 1f) + Vector3.up * itemToSpawn.verticalOffset; } return ((Component)val).transform.position + Vector3.up * 0.5f; } public static Vector3 GetFurthestPositionScrapSpawn(Vector3 position, Item itemToSpawn) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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) //IL_00b9: 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_00c9: 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) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) RandomScrapSpawn val = (from s in Object.FindObjectsOfType<RandomScrapSpawn>() where !s.spawnUsed orderby Vector3.Distance(position, ((Component)s).transform.position) descending select s).FirstOrDefault(); if ((Object)(object)val == (Object)null) { val = (from p in Object.FindObjectsOfType<RandomScrapSpawn>() orderby Vector3.Distance(position, ((Component)p).transform.position) descending select p).FirstOrDefault(); } if (val.spawnedItemsCopyPosition) { val.spawnUsed = true; } else { ((Component)val).transform.position = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(((Component)val).transform.position, val.itemSpawnRange, RoundManager.Instance.navHit, RoundManager.Instance.AnomalyRandom, -1, 1f) + Vector3.up * itemToSpawn.verticalOffset; } return ((Component)val).transform.position + Vector3.up * 0.5f; } public static void ShowAuraAimedEnemy(PlayerControllerB player, string tag, float distance, ref EnemyAI aimedEnemy) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); if (Physics.Raycast(new Ray(((Component)player.gameplayCamera).transform.position, ((Component)player.gameplayCamera).transform.forward), ref val, distance, 524288, (QueryTriggerInteraction)2)) { EnemyAICollisionDetect component = ((Component)((RaycastHit)(ref val)).collider).GetComponent<EnemyAICollisionDetect>(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component.mainScript == (Object)null)) { if ((Object)(object)aimedEnemy != (Object)null && (Object)(object)aimedEnemy != (Object)(object)component.mainScript) { RemoveAuraFromEnemy(tag, ref aimedEnemy); } aimedEnemy = component.mainScript; CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { ((Component)component.mainScript).gameObject }, LegaFusionCore.transparentShader, tag, Color.red); } } else { RemoveAuraFromEnemy(tag, ref aimedEnemy); } } public static void RemoveAuraFromEnemy(string tag, ref EnemyAI aimedEnemy) { if (!((Object)(object)aimedEnemy == (Object)null)) { CustomPassManager.RemoveAuraFromObjects((GameObject[])(object)new GameObject[1] { ((Component)aimedEnemy).gameObject }, tag); aimedEnemy = null; } } public static void ShowAuraAimedPlayer(PlayerControllerB player, string tag, float distance, ref PlayerControllerB aimedPlayer) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) RaycastHit[] array = Physics.RaycastAll(new Ray(((Component)player.gameplayCamera).transform.position, ((Component)player.gameplayCamera).transform.forward), distance); Array.Sort(array, (RaycastHit a, RaycastHit b) => ((RaycastHit)(ref a)).distance.CompareTo(((RaycastHit)(ref b)).distance)); RaycastHit[] array2 = array; for (int i = 0; i < array2.Length; i++) { RaycastHit val = array2[i]; PlayerControllerB component = ((Component)((RaycastHit)(ref val)).collider).GetComponent<PlayerControllerB>(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component == (Object)(object)player)) { if ((Object)(object)aimedPlayer != (Object)null && (Object)(object)aimedPlayer != (Object)(object)component) { RemoveAuraFromPlayer(tag, ref aimedPlayer); } aimedPlayer = component; CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { ((Component)component).gameObject }, LegaFusionCore.transparentShader, tag, Color.yellow); return; } } RemoveAuraFromPlayer(tag, ref aimedPlayer); } public static void RemoveAuraFromPlayer(string tag, ref PlayerControllerB aimedPlayer) { if (!((Object)(object)aimedPlayer == (Object)null)) { CustomPassManager.RemoveAuraFromObjects((GameObject[])(object)new GameObject[1] { ((Component)aimedPlayer).gameObject }, tag); aimedPlayer = null; } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "SawTapes"; public const string PLUGIN_NAME = "SawTapes"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace SawTapes.Values { public class EscapeHazard { public string HazardName { get; internal set; } public bool SpawnFacingAwayFromWall { get; internal set; } public bool SpawnFacingWall { get; internal set; } public bool SpawnWithBackToWall { get; internal set; } public bool SpawnWithBackFlushAgainstWall { get; internal set; } public EscapeHazard(string hazardName, bool spawnFacingAwayFromWall, bool spawnFacingWall, bool spawnWithBackToWall, bool spawnWithBackFlushAgainstWall) { HazardName = hazardName; SpawnFacingAwayFromWall = spawnFacingAwayFromWall; SpawnFacingWall = spawnFacingWall; SpawnWithBackToWall = spawnWithBackToWall; SpawnWithBackFlushAgainstWall = spawnWithBackFlushAgainstWall; base..ctor(); } } public class SawTapeValue { public Type Type { get; internal set; } public Item Item { get; internal set; } public int DefaultRarity { get; internal set; } public int Rarity { get; internal set; } public int MinPlayers { get; internal set; } public int MaxPlayers { get; internal set; } public string InteriorsExclusion { get; internal set; } public SawTapeValue(Type type, Item item, int rarity, int minPlayers, int maxPlayers, string interiorsExclusion) { Type = type; Item = item; DefaultRarity = rarity; Rarity = rarity; MinPlayers = minPlayers; MaxPlayers = maxPlayers; InteriorsExclusion = interiorsExclusion; base..ctor(); } } } namespace SawTapes.Patches { internal class EnemyAIPatch { [HarmonyPatch(typeof(EnemyAI), "KillEnemy")] [HarmonyPostfix] private static void KillEnemy(ref EnemyAI __instance) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (LFCUtilities.IsServer && !((Object)(object)SawTapes.sawTape == (Object)null) && SawTapes.sawTape is HuntingTape huntingTape && huntingTape.spawnedEnemies.Contains(__instance.thisNetworkObject)) { LFCObjectsManager.SpawnObjectForServer(SawTapes.sawKeyHunting.spawnPrefab, ((Component)__instance).transform.position); } } [HarmonyPatch(typeof(EnemyAI), "PlayerIsTargetable")] [HarmonyPrefix] private static bool IsPlayerTargetable(ref bool __result) { if (PlayerControllerBPatch.isTargetable) { return true; } __result = false; return false; } } internal class HUDManagerPatch { public static TextMeshProUGUI chronoText; public static TextMeshProUGUI subtitleText; public static bool isPlayingGame; public static bool isChronoEnded; public static int remainedTime; public static bool isFlashFilterUsed; [HarmonyPatch(typeof(HUDManager), "Start")] [HarmonyPostfix] private static void StartHUDManager() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: 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_00c0: Unknown result type (might be due to invalid IL or missing references) chronoText = CreateUIElement("ChronoUI", new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(0f, 1f), new Vector2(ConfigManager.chronoPosX.Value, ConfigManager.chronoPosY.Value), new Vector2(300f, 300f), (TextAlignmentOptions)257); if (ConfigManager.isSubtitles.Value) { subtitleText = CreateUIElement("SubtitleUI", new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, -125f), new Vector2(600f, 200f), (TextAlignmentOptions)514); } } public static TextMeshProUGUI CreateUIElement(string name, Vector2 anchorMin, Vector2 anchorMax, Vector2 pivot, Vector2 anchoredPosition, Vector2 sizeDelta, TextAlignmentOptions alignment) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) Transform transform = GameObject.Find("Systems/UI/Canvas/Panel/GameObject/PlayerScreen").transform; GameObject val = new GameObject(name); val.transform.localPosition = Vector3.zero; RectTransform val2 = val.AddComponent<RectTransform>(); ((Transform)val2).SetParent(transform, false); val2.anchorMin = anchorMin; val2.anchorMax = anchorMax; val2.pivot = pivot; val2.anchoredPosition = anchoredPosition; val2.sizeDelta = sizeDelta; TextMeshProUGUI val3 = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val3).alignment = alignment; ((TMP_Text)val3).font = ((TMP_Text)HUDManager.Instance.controlTipLines[0]).font; ((TMP_Text)val3).fontSize = 14f; return val3; } public static IEnumerator StartChronoCoroutine(int seconds) { isPlayingGame = true; remainedTime = seconds; while (!IsChronoEnded(remainedTime)) { remainedTime--; yield return (object)new WaitForSecondsRealtime(1f); } } private static bool IsChronoEnded(int totalSeconds) { int num = (int)Math.Floor((double)totalSeconds / 60.0); int num2 = (int)Math.Floor((double)totalSeconds % 60.0); ((TMP_Text)chronoText).text = $"{num:D2}:{num2:D2}"; if (GameNetworkManager.Instance.localPlayerController.isPlayerDead || isChronoEnded || (num == 0 && num2 == 0)) { isPlayingGame = false; isChronoEnded = false; ((TMP_Text)chronoText).text = ""; return true; } return false; } [HarmonyPatch(typeof(HUDManager), "SetScreenFilters")] [HarmonyPrefix] private static bool UpdateScreenFilters() { return !isFlashFilterUsed; } } internal class PlayerControllerBPatch { public static bool isTargetable = true; [HarmonyPatch(typeof(PlayerControllerB), "spawnPlayerAnimTimer")] [HarmonyPostfix] private static IEnumerator SpawnPlayerAnim(IEnumerator __result) { isTargetable = false; while (__result.MoveNext()) { yield return __result.Current; } isTargetable = true; } [HarmonyPatch(typeof(PlayerControllerB), "Discard_performed")] [HarmonyPrefix] private static bool PreDiscardPerformed(ref PlayerControllerB __instance) { if (!((NetworkBehaviour)__instance).IsOwner || !__instance.isPlayerControlled || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject) || (Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } if (__instance.currentlyHeldObjectServer is SawBombExplosive sawBombExplosive) { sawBombExplosive.RemoveAuraFromPlayer(); if (!sawBombExplosive.isTransferred && !sawBombExplosive.hasBeenDestroyed && !((GrabbableObject)sawBombExplosive).deactivated) { sawBombExplosive.SpawnExplosionEveryoneRpc(); } return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")] [HarmonyPrefix] private static bool PreKillPlayer(ref PlayerControllerB __instance) { if (StartOfRound.Instance.shipIsLeaving || HUDManagerPatch.isPlayingGame || (Object)(object)__instance != (Object)(object)GameNetworkManager.Instance.localPlayerController || (Object)(object)SawTapes.bathroom != (Object)null) { return true; } JigsawJudgement addonComponent = LFCUtilities.GetAddonComponent<JigsawJudgement>(__instance); if ((Object)(object)addonComponent != (Object)null && !((AddonComponent)addonComponent).onCooldown) { ((AddonComponent)addonComponent).ActivateAddonAbility(); return false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "KillPlayerServerRpc")] [HarmonyPrefix] private static void KillPlayerForServer(int playerId) { if (SawTapes.sawTape?.players != null && SawTapes.sawTape is HuntingTape huntingTape) { PlayerControllerB val = ((IEnumerable<PlayerControllerB>)SawTapes.sawTape.players).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB p) => (Object)(object)p == (Object)null || (int)p.playerClientId == playerId)); if ((Object)(object)val != (Object)null && huntingTape.playerRBTs.TryGetValue(val, out var value)) { LFCObjectsManager.DestroyObjectOfTypeForServer<RBTrapHunting>(value); } } } [HarmonyPatch(typeof(PlayerControllerB), "KillPlayerClientRpc")] [HarmonyPrefix] private static void KillPlayerForEveryone(int playerId) { if (SawTapes.sawTape?.players != null) { SawTapes.sawTape.players.RemoveWhere((PlayerControllerB p) => (Object)(object)p == (Object)null || (int)p.playerClientId == playerId); if (!((Object)(object)SawTapes.sawTape.sawTheme == (Object)null) && !((Object)(object)((Component)SawTapes.sawTape.sawTheme).transform == (Object)null)) { ((Component)SawTapes.sawTape.sawTheme).transform.SetParent((Transform)null); } } } } internal class RoundManagerPatch { [HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")] [HarmonyPostfix] private static void SpawnItems() { AddNewItems(); } public static void AddNewItems() { List<RandomScrapSpawn> list = (from s in Object.FindObjectsOfType<RandomScrapSpawn>() where !s.spawnUsed select s).ToList(); SpawnTape(list[new Random().Next(0, list.Count)]); } public static void SpawnTape(RandomScrapSpawn randomScrapSpawn) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0070: 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) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009f: 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) if ((Object)(object)randomScrapSpawn == (Object)null) { return; } SawTapeValue sawTapeValue = GetSawTapeValue(); if (sawTapeValue != null) { if (randomScrapSpawn.spawnedItemsCopyPosition) { randomScrapSpawn.spawnUsed = true; } else { ((Component)randomScrapSpawn).transform.position = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(((Component)randomScrapSpawn).transform.position, randomScrapSpawn.itemSpawnRange, RoundManager.Instance.navHit, RoundManager.Instance.AnomalyRandom, -1, 1f) + Vector3.up * sawTapeValue.Item.verticalOffset; } LFCObjectsManager.SpawnObjectForServer(sawTapeValue.Item.spawnPrefab, ((Component)randomScrapSpawn).transform.position + Vector3.up * 0.5f); } } public static SawTapeValue GetSawTapeValue() { SawTapeValue sawTapeValue = null; LFCUtilities.Shuffle<SawTapeValue>((IList<SawTapeValue>)SawTapes.sawTapeValues); foreach (SawTapeValue sawTapeValue3 in SawTapes.sawTapeValues) { if ((string.IsNullOrEmpty(sawTapeValue3.InteriorsExclusion) || !sawTapeValue3.InteriorsExclusion.Contains(((Object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow).name)) && sawTapeValue3.MinPlayers <= StartOfRound.Instance.allPlayerScripts.Count(STUtilities.IsEligiblePlayer) && sawTapeValue == null && new Random().Next(1, 100) <= sawTapeValue3.Rarity) { sawTapeValue = sawTapeValue3; sawTapeValue3.Rarity = sawTapeValue3.DefaultRarity; break; } } if (sawTapeValue == null) { SawTapeValue sawTapeValue2 = SawTapes.sawTapeValues.FirstOrDefault(); sawTapeValue2.Rarity = Mathf.Min(100, sawTapeValue2.Rarity + ConfigManager.rarityIncrement.Value); } return sawTapeValue; } } internal class ShovelPatch { [HarmonyPatch(typeof(Shovel), "HitShovel")] [HarmonyPrefix] private static void HitShovel(ref Shovel __instance) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)SawTapes.sawTape == (Object)null || !(SawTapes.sawTape is EscapeTape escapeTape)) { return; } PlayerControllerB previousPlayerHeldBy = __instance.previousPlayerHeldBy; if ((Object)(object)previousPlayerHeldBy == (Object)null) { return; } RaycastHit[] array = Physics.SphereCastAll(((Component)previousPlayerHeldBy.gameplayCamera).transform.position + ((Component)previousPlayerHeldBy.gameplayCamera).transform.right * -0.35f, 0.8f, ((Component)previousPlayerHeldBy.gameplayCamera).transform.forward, 1.5f, __instance.shovelMask, (QueryTriggerInteraction)2); RaycastHit[] array2 = array; for (int i = 0; i < array2.Length; i++) { RaycastHit val = array2[i]; GameObject gameObject = ((Component)((Component)((RaycastHit)(ref val)).collider).transform.root).gameObject; if (escapeTape.hazards.Contains(gameObject)) { escapeTape.DespawnHazardServerRpc(NetworkObjectReference.op_Implicit(gameObject.GetComponent<NetworkObject>())); break; } } } } internal class StartOfRoundPatch { [HarmonyPatch(typeof(StartOfRound), "Start")] [HarmonyBefore(new string[] { "evaisa.lethallib" })] [HarmonyPostfix] private static void StartRound(ref StartOfRound __instance) { if (NetworkManager.Singleton.IsHost && (Object)(object)SawTapesNetworkManager.Instance == (Object)null) { GameObject val = Object.Instantiate<GameObject>(SawTapes.managerPrefab, ((Component)__instance).transform.parent); val.GetComponent<NetworkObject>().Spawn(false); SawTapes.mls.LogInfo((object)"Spawning SawTapesNetworkManager"); } AffectEnemiesForSawGames(); SubtitleFile.LoadJSON(); } public static void AffectEnemiesForSawGames() { SawTapes.allEnemies.Clear(); EnemyAI val = default(EnemyAI); foreach (EnemyType item in Resources.FindObjectsOfTypeAll<EnemyType>().Distinct()) { if (!((Object)(object)item == (Object)null) && !((Object)(object)item.enemyPrefab == (Object)null) && item.enemyPrefab.TryGetComponent<EnemyAI>(ref val) && (Object)(object)val != (Object)null) { SawTapes.allEnemies.Add(item); } } } [HarmonyPatch(typeof(StartOfRound), "ShipLeave")] [HarmonyPostfix] public static void EndRound() { LFCStatRegistry.RemoveModifier("Speed", "Saw TapesJigsawJudgement"); Object.FindObjectsOfType<SawTape>().ToList().ForEach((Action<SawTape>)LFCObjectsManager.DestroyObjectOfTypeForServer<SawTape>); SawTapes.sawTape = null; } [HarmonyPatch(typeof(StartOfRound), "OnDisable")] [HarmonyPostfix] public static void OnDisable() { SawTapesNetworkManager.Instance = null; } } } namespace SawTapes.Managers { public class ConfigManager { public static ConfigEntry<int> rarityIncrement; public static ConfigEntry<bool> isSawTheme; public static ConfigEntry<float> sawThemeVolume; public static ConfigEntry<float> gassingDistance; public static ConfigEntry<string> excludedPlayers; public static ConfigEntry<bool> isSubtitles; public static ConfigEntry<float> chronoPosX; public static ConfigEntry<float> chronoPosY; public static ConfigEntry<int> survivalRarity; public static ConfigEntry<int> survivalMinPlayers; public static ConfigEntry<int> survivalMaxPlayers; public static ConfigEntry<int> survivalDuration; public static ConfigEntry<int> survivalBillyValue; public static ConfigEntry<string> survivalEnemies; public static ConfigEntry<string> survivalInteriorExclusions; public static ConfigEntry<float> survivalItemDistance; public static ConfigEntry<int> survivalItemCooldown; public static ConfigEntry<int> huntingRarity; public static ConfigEntry<int> huntingMinPlayers; public static ConfigEntry<int> huntingMaxPlayers; public static ConfigEntry<int> huntingDuration; public static ConfigEntry<int> huntingBillyValue; public static ConfigEntry<string> huntingEnemies; public static ConfigEntry<string> huntingInteriorExclusions; public static ConfigEntry<float> huntingItemAuraDuration; public static ConfigEntry<int> huntingItemCooldown; public static ConfigEntry<int> escapeRarity; public static ConfigEntry<int> escapeMinPlayers; public static ConfigEntry<int> escapeMaxPlayers; public static ConfigEntry<int> escapeDuration; public static ConfigEntry<int> escapeBillyValue; public static ConfigEntry<string> escapeHazards; public static ConfigEntry<string> escapeInteriorExclusions; public static ConfigEntry<int> explosiveRarity; public static ConfigEntry<int> explosiveMinPlayers; public static ConfigEntry<int> explosiveMaxPlayers; public static ConfigEntry<int> explosiveDuration; public static ConfigEntry<int> explosiveBillyValue; public static ConfigEntry<float> explosiveAura; public static ConfigEntry<string> explosiveInteriorExclusions; public static ConfigEntry<float> bathroomPosX; public static ConfigEntry<float> bathroomPosY; public static ConfigEntry<int> bathroomDuration; public static ConfigEntry<int> bathroomCooldown; public static ConfigEntry<int> bleedingChainsCooldown; public static ConfigEntry<int> finalDetonationCooldown; public static ConfigEntry<string> finalDetonationEnemiesExclusions; public static ConfigEntry<int> hunterMarkCooldown; public static ConfigEntry<string> hunterMarkEnemiesExclusions; public static ConfigEntry<int> sprintBurstCooldown; public static int SurvivalRarity => survivalRarity.Value; public static int HuntingRarity => huntingRarity.Value; public static int EscapeRarity => escapeRarity.Value; public static int ExplosiveRarity => explosiveRarity.Value; public static void Load() { rarityIncrement = SawTapes.configFile.Bind<int>("_Global_", "Rarity increment", 15, "By how much does the chance of a Saw game appearing increase with each round if it hasn't appeared?"); isSawTheme = SawTapes.configFile.Bind<bool>("_Global_", "Enable Saw theme", true, "Is Saw theme enabled?"); sawThemeVolume = SawTapes.configFile.Bind<float>("_Global_", "Saw theme volume", 1f, "Saw theme volume (between 0 and 1)"); gassingDistance = SawTapes.configFile.Bind<float>("_Global_", "Gassing distance", 30f, "Maximum distance between the player and the tape before he is gassed"); excludedPlayers = SawTapes.configFile.Bind<string>("_Global_", "Excluded players", "", "List of players who cannot be selected for mini-games"); isSubtitles = SawTapes.configFile.Bind<bool>("_HUD_", "Enable subtitles", false, "Is subtitles enabled?"); chronoPosX = SawTapes.configFile.Bind<float>("_HUD_", "Chrono pos X", 106f, "X position of chrono on interface."); chronoPosY = SawTapes.configFile.Bind<float>("_HUD_", "Chrono pos Y", -50f, "Y position of chrono on interface."); survivalRarity = SawTapes.configFile.Bind<int>("Survival Game", "Rarity", 20, "Default probability of the Survival Game mini-game appearing"); survivalMinPlayers = SawTapes.configFile.Bind<int>("Survival Game", "Min players", 2, "Minimum number of players for Survival Game - Set to -1 to limit it to the number of connected players who can participate"); survivalMaxPlayers = SawTapes.configFile.Bind<int>("Survival Game", "Max players", -1, "Maximum number of players for Survival Game - Set to -1 to limit it to the number of connected players who can participate"); survivalDuration = SawTapes.configFile.Bind<int>("Survival Game", "Duration", 120, "Duration of the Survival Game"); survivalBillyValue = SawTapes.configFile.Bind<int>("Survival Game", "Billy value", 120, "Billy value for the Survival Game"); survivalEnemies = SawTapes.configFile.Bind<string>("Survival Game", "Enemies list", "Blob,Crawler,Bunker Spider,Flowerman,Puffer,Hoarding bug,Spring,Clay Surgeon,Masked,Nutcracker,Butler", "List of creatures that will be selected by the Survival Game.\nYou can add enemies by separating them with a comma."); survivalInteriorExclusions = SawTapes.configFile.Bind<string>("Survival Game", "Interiors exclusion list", "", "List of interiors in which the Survival Game will not appear."); survivalItemDistance = SawTapes.configFile.Bind<float>("Survival Game", "Item activation range", 10f, "Maximum distance between player and enemy to activate the item in the Survival Game"); survivalItemCooldown = SawTapes.configFile.Bind<int>("Survival Game", "Item cooldown", 20, "Cooldown for the item in the Survival Game"); huntingRarity = SawTapes.configFile.Bind<int>("Hunting Game", "Rarity", 20, "Default probability of the Hunting Game mini-game appearing"); huntingMinPlayers = SawTapes.configFile.Bind<int>("Hunting Game", "Min players", 2, "Minimum number of players for Hunting Game - Set to -1 to limit it to the number of connected players who can participate"); huntingMaxPlayers = SawTapes.configFile.Bind<int>("Hunting Game", "Max players", -1, "Maximum number of players for Hunting Game - Set to -1 to limit it to the number of connected players who can participate"); huntingDuration = SawTapes.configFile.Bind<int>("Hunting Game", "Duration", 150, "Duration of the Hunting Game"); huntingBillyValue = SawTapes.configFile.Bind<int>("Hunting Game", "Billy value", 90, "Billy value for the Hunting Game"); huntingEnemies = SawTapes.configFile.Bind<string>("Hunting Game", "Enemies list", "Crawler,Bunker Spider,Flowerman,Hoarding bug,Masked,Nutcracker,Butler", "List of creatures that will be selected by the Hunting Game.\nYou can add enemies by separating them with a comma."); huntingInteriorExclusions = SawTapes.configFile.Bind<string>("Hunting Game", "Interiors exclusion list", "", "List of interiors in which the Hunting Game will not appear."); huntingItemAuraDuration = SawTapes.configFile.Bind<float>("Hunting Game", "Item aura duration", 5f, "Duration for which the enemy's aura, given by the item, is visible through walls for the Hunting Game"); huntingItemCooldown = SawTapes.configFile.Bind<int>("Hunting Game", "Item cooldown", 20, "Cooldown for the item in the Hunting Game"); escapeRarity = SawTapes.configFile.Bind<int>("Escape Game", "Rarity", 20, "Default probability of the Escape Game mini-game appearing"); escapeMinPlayers = SawTapes.configFile.Bind<int>("Escape Game", "Min players", 2, "Minimum number of players for Escape Game - Set to -1 to limit it to the number of connected players who can participate"); escapeMaxPlayers = SawTapes.configFile.Bind<int>("Escape Game", "Max players", -1, "Maximum number of players for Escape Game - Set to -1 to limit it to the number of connected players who can participate"); escapeDuration = SawTapes.configFile.Bind<int>("Escape Game", "Duration", 150, "Duration of the Escape Game"); escapeBillyValue = SawTapes.configFile.Bind<int>("Escape Game", "Billy value", 90, "Billy value for the Escape Game"); escapeHazards = SawTapes.configFile.Bind<string>("Escape Game", "Hazards list", "Landmine:2:false:false:false:false,SpikeRoofTrapHazard:3:false:true:true:true,TurretContainer:1:true:false:false:false,LaserTurret:2:false:false:false:false,FanTrapAnimated:2:false:false:false:false,FunctionalMicrowave:1:false:false:false:false", "List of spawnable hazards for the Escape Game.\nThe format is 'HazardName:Weight:SpawnFacingAwayFromWall:SpawnFacingWall:SpawnWithBackToWall:SpawnWithBackFlushAgainstWall'."); escapeInteriorExclusions = SawTapes.configFile.Bind<string>("Escape Game", "Interiors exclusion list", "GrandArmoryFlow,Level3Flow,StorehouseFlow", "List of interiors in which the Escape Game will not appear."); explosiveRarity = SawTapes.configFile.Bind<int>("Explosive Game", "Rarity", 20, "Default probability of the Explosive Game mini-game appearing"); explosiveMinPlayers = SawTapes.configFile.Bind<int>("Explosive Game", "Min players", 2, "Minimum number of players for Explosive Game - Set to -1 to limit it to the number of connected players who can participate"); explosiveMaxPlayers = SawTapes.configFile.Bind<int>("Explosive Game", "Max players", -1, "Maximum number of players for Explosive Game - Set to -1 to limit it to the number of connected players who can participate"); explosiveDuration = SawTapes.configFile.Bind<int>("Explosive Game", "Duration", 150, "Duration of the Explosive Game"); explosiveBillyValue = SawTapes.configFile.Bind<int>("Explosive Game", "Billy value", 60, "Billy value for the Explosive Game"); explosiveAura = SawTapes.configFile.Bind<float>("Explosive Game", "Aura duration", 30f, "Duration for which the Hoarding bug's aura is visible through walls"); explosiveInteriorExclusions = SawTapes.configFile.Bind<string>("Explosive Game", "Interiors exclusion list", "", "List of interiors in which the Explosive Game will not appear."); bathroomPosX = SawTapes.configFile.Bind<float>("Jigsaw Judgement", "Position X", -700f, "Position X of the Bathroom"); bathroomPosY = SawTapes.configFile.Bind<float>("Jigsaw Judgement", "Position Y", -200f, "Position Y of the Bathroom"); bathroomDuration = SawTapes.configFile.Bind<int>("Jigsaw Judgement", "Duration", 60, "Duration of the Jigsaw Judgement"); bathroomCooldown = SawTapes.configFile.Bind<int>("Jigsaw Judgement", "Cooldown", 600, "Cooldown duration of the Jigsaw Judgement"); bleedingChainsCooldown = SawTapes.configFile.Bind<int>("Bleeding Chains", "Cooldown", 45, "Cooldown duration of the Bleeding Chains"); finalDetonationCooldown = SawTapes.configFile.Bind<int>("Final Detonation", "Cooldown", 600, "Cooldown duration of the Final Detonation"); finalDetonationEnemiesExclusions = SawTapes.configFile.Bind<string>("Final Detonation", "Enemies exclusion list", "Doctor's Corpse", "List of invulnerable creatures that will not be impacted by the Final Detonation addon.\nYou can add enemies by separating them with a comma."); hunterMarkCooldown = SawTapes.configFile.Bind<int>("Hunter Mark", "Cooldown", 180, "Cooldown duration of the Hunter Mark"); hunterMarkEnemiesExclusions = SawTapes.configFile.Bind<string>("Hunter Mark", "Enemies exclusion list", "Doctor's Brain,Billy", "List of creatures that will not be impacted by the Hunter Mark addon.\nYou can add enemies by separating them with a comma."); sprintBurstCooldown = SawTapes.configFile.Bind<int>("Sprint Burst", "Cooldown", 45, "Cooldown duration of the Sprint Burst"); } } public class EnemySTManager { public static NetworkObject SpawnEnemyForServer(EnemyType enemyType, Vector3 spawnPosition) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(enemyType.enemyPrefab, spawnPosition, Quaternion.identity); NetworkObject componentInChildren = val.GetComponentInChildren<NetworkObject>(); componentInChildren.Spawn(true); return componentInChildren; } public static void DespawnEnemiesForServer(List<NetworkObject> spawnedEnemies) { foreach (NetworkObject spawnedEnemy in spawnedEnemies) { if (!((Object)(object)spawnedEnemy == (Object)null)) { EnemyAI componentInChildren = ((Component)spawnedEnemy).GetComponentInChildren<EnemyAI>(); if (!((Object)(object)componentInChildren?.thisNetworkObject == (Object)null) && componentInChildren.thisNetworkObject.IsSpawned && !componentInChildren.isEnemyDead) { DespawnEnemy(spawnedEnemy); } } } } public static void DespawnEnemy(NetworkObject spawnedEnemy) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) EnemyAI val = ((spawnedEnemy != null) ? ((Component)spawnedEnemy).GetComponentInChildren<EnemyAI>() : null); if (!((Object)(object)val == (Object)null) && !val.isEnemyDead) { LFCNetworkManager.Instance.PlayParticleEveryoneRpc("Lega Fusion Core" + ((Object)LegaFusionCore.smokeParticle).name, ((Component)spawnedEnemy).transform.position, Quaternion.Euler(-90f, 0f, 0f)); NutcrackerEnemyAI val2 = (NutcrackerEnemyAI)(object)((val is NutcrackerEnemyAI) ? val : null); if (val2 != null && (Object)(object)val2.gun != (Object)null) { LFCNetworkManager.Instance.DestroyObjectEveryoneRpc(NetworkObjectReference.op_Implicit(((Component)val2.gun).GetComponent<NetworkObject>())); } spawnedEnemy.Despawn(true); } } } public class SawGameSTManager { public static GameObject SpawnHazard(GameObject hazardPrefab, Vector3 position, bool spawnFacingAwayFromWall, bool spawnFacingWall, bool spawnWithBackToWall, bool spawnWithBackFlushAgainstWall) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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_0068: 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: 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_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Unknown result type (might be due to invalid IL or missing references) Random random = new Random(StartOfRound.Instance.randomMapSeed + 587); List<RandomMapObject> source = (from m in Object.FindObjectsOfType<RandomMapObject>() where Vector3.Distance(position, ((Component)m).transform.position) <= 5f select m).ToList(); if (source.Any()) { RandomMapObject val = source.First(); position = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(((Component)val).transform.position, 2f, default(NavMeshHit), random, -1, 1f); } RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(position + Vector3.up * 2f, Vector3.down, ref val2, 80f, 268437760, (QueryTriggerInteraction)1)) { position = ((RaycastHit)(ref val2)).point; GameObject val3 = Object.Instantiate<GameObject>(hazardPrefab, position, Quaternion.identity, RoundManager.Instance.mapPropsContainer.transform); val3.transform.eulerAngles = (spawnFacingAwayFromWall ? new Vector3(0f, RoundManager.Instance.YRotationThatFacesTheFarthestFromPosition(position + Vector3.up * 0.2f, 25f, 6), 0f) : (spawnFacingWall ? new Vector3(0f, RoundManager.Instance.YRotationThatFacesTheNearestFromPosition(position + Vector3.up * 0.2f, 25f, 6), 0f) : new Vector3(val3.transform.eulerAngles.x, (float)random.Next(0, 360), val3.transform.eulerAngles.z))); RaycastHit val4 = default(RaycastHit); if (spawnWithBackToWall && Physics.Raycast(val3.transform.position, -val3.transform.forward, ref val4, 100f, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { val3.transform.position = ((RaycastHit)(ref val4)).point; if (spawnWithBackFlushAgainstWall) { val3.transform.forward = ((RaycastHit)(ref val4)).normal; val3.transform.eulerAngles = new Vector3(0f, val3.transform.eulerAngles.y, 0f); } } val3.GetComponent<NetworkObject>().Spawn(true); return val3; } SawTapes.mls.LogWarning((object)"No surface detected to place the trap."); return null; } public static void DespawnHazard(GameObject hazard) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)hazard == (Object)null) && !((Object)(object)hazard.transform == (Object)null)) { LFCNetworkManager.Instance.PlayParticleEveryoneRpc("Lega Fusion Core" + ((Object)LegaFusionCore.smokeParticle).name, hazard.transform.position, Quaternion.Euler(-90f, 0f, 0f)); hazard.GetComponent<NetworkObject>().Despawn(true); } } } public class SawTapesNetworkManager : NetworkBehaviour { public static SawTapesNetworkManager Instance; public void Awake() { Instance = this; } [Rpc(/*Could not decode attribute arguments.*/)] public void SpawnBathroomServerRpc(int playerId) { //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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: 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_0076: 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_0092: 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_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(1592624267u, val2, val, (SendTo)2, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val3, playerId); ((NetworkBehaviour)this).__endSendRpc(ref val3, 1592624267u, val2, val, (SendTo)2, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; GameObject val4 = Object.Instantiate<GameObject>(SawTapes.bathroomObj, Vector3.up * ConfigManager.bathroomPosY.Value + Vector3.right * ConfigManager.bathroomPosX.Value, Quaternion.identity); val4.GetComponent<NetworkObject>().Spawn(false); SawTapes.bathroom = val4.GetComponent<Bathroom>(); SawTapes.bathroom.InitializeBathroomEveryoneRpc(playerId, NetworkObjectReference.op_Implicit(val4.GetComponent<NetworkObject>())); } } } [Rpc(/*Could not decode attribute arguments.*/)] public void SpawnBleedingChainsEveryoneRpc(NetworkObjectReference entityObj, int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: 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_0082: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: 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) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0104: 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) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0126: 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)base.__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(643054802u, val2, val, (SendTo)6, (RpcDelivery)0); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref entityObj, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val3, playerId); ((NetworkBehaviour)this).__endSendRpc(ref val3, 643054802u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 1) { return; } base.__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val4 = default(NetworkObject); if (((NetworkObjectReference)(ref entityObj)).TryGet(ref val4, (NetworkManager)null)) { GameObject gameObject = ((Component)val4).gameObject; BoxCollider componentInChildren = gameObject.GetComponentInChildren<BoxCollider>(); Vector3 val5; if (componentInChildren == null) { val5 = gameObject.transform.position; } else { Bounds bounds = ((Collider)componentInChildren).bounds; val5 = ((Bounds)(ref bounds)).center; } Vector3 val6 = val5; GameObject val7 = Object.Instantiate<GameObject>(SawTapes.bleedingChainsObj, val6, gameObject.transform.rotation, gameObject.transform); BCScript component = val7.GetComponent<BCScript>(); component.entity = gameObject; component.playerWhoHit = playerId; } } [Rpc(/*Could not decode attribute arguments.*/)] public void SpawnFinalDetonationServerRpc(NetworkObjectReference entityObj, int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: 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_0082: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: 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) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(3507942983u, val2, val, (SendTo)2, (RpcDelivery)0); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref entityObj, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val3, playerId); ((NetworkBehaviour)this).__endSendRpc(ref val3, 3507942983u, val2, val, (SendTo)2, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; PlayerControllerB component = StartOfRound.Instance.allPlayerObjects[playerId].GetComponent<PlayerControllerB>(); Vector3 val4 = ((Component)component.gameplayCamera).transform.position + ((Component)component.gameplayCamera).transform.forward; val4 = RoundManager.Instance.GetNavMeshPosition(val4, default(NavMeshHit), 2f, -1); NetworkObject val5 = EnemySTManager.SpawnEnemyForServer(SawTapes.billyFDEnemy, val4); SpawnFinalDetonationEveryoneRpc(NetworkObjectReference.op_Implicit(val5), entityObj, playerId); } } } [Rpc(/*Could not decode attribute arguments.*/)] public void SpawnFinalDetonationEveryoneRpc(NetworkObjectReference billyObj, NetworkObjectReference entityObj, int playerId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: 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_0082: 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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: 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)base.__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(3866684181u, val2, val, (SendTo)6, (RpcDelivery)0); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref billyObj, default(ForNetworkSerializable)); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref entityObj, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val3, playerId); ((NetworkBehaviour)this).__endSendRpc(ref val3, 3866684181u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 1) { return; } base.__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val4 = default(NetworkObject); NetworkObject val5 = default(NetworkObject); if (((NetworkObjectReference)(ref billyObj)).TryGet(ref val4, (NetworkManager)null) && ((NetworkObjectReference)(ref entityObj)).TryGet(ref val5, (NetworkManager)null)) { BillyFD billyFD = ((Component)val4).gameObject.GetComponentInChildren<EnemyAI>() as BillyFD; if ((Object)(object)billyFD != (Object)null && (Object)(object)((Component)val5).gameObject != (Object)null) { billyFD.player = StartOfRound.Instance.allPlayerObjects[playerId].GetComponent<PlayerControllerB>(); billyFD.targetedEntity = ((Component)val5).gameObject; } } } [Rpc(/*Could not decode attribute arguments.*/)] public void SpawnHunterMarkServerRpc(int playerId) { //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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: 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_0076: 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_0092: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(3671512855u, val2, val, (SendTo)2, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val3, playerId); ((NetworkBehaviour)this).__endSendRpc(ref val3, 3671512855u, val2, val, (SendTo)2, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; PlayerControllerB component = StartOfRound.Instance.allPlayerObjects[playerId].GetComponent<PlayerControllerB>(); Vector3 val4 = ((Component)component.gameplayCamera).transform.position + ((Component)component.gameplayCamera).transform.forward; val4 = RoundManager.Instance.GetNavMeshPosition(val4, default(NavMeshHit), 2f, -1); EnemySTManager.SpawnEnemyForServer(SawTapes.billyHMEnemy, val4); } } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } protected override void __initializeRpcs() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown ((NetworkBehaviour)this).__registerRpc(1592624267u, new RpcReceiveHandler(__rpc_handler_1592624267), "SpawnBathroomServerRpc"); ((NetworkBehaviour)this).__registerRpc(643054802u, new RpcReceiveHandler(__rpc_handler_643054802), "SpawnBleedingChainsEveryoneRpc"); ((NetworkBehaviour)this).__registerRpc(3507942983u, new RpcReceiveHandler(__rpc_handler_3507942983), "SpawnFinalDetonationServerRpc"); ((NetworkBehaviour)this).__registerRpc(3866684181u, new RpcReceiveHandler(__rpc_handler_3866684181), "SpawnFinalDetonationEveryoneRpc"); ((NetworkBehaviour)this).__registerRpc(3671512855u, new RpcReceiveHandler(__rpc_handler_3671512855), "SpawnHunterMarkServerRpc"); ((NetworkBehaviour)this).__initializeRpcs(); } private static void __rpc_handler_1592624267(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SawTapesNetworkManager)(object)target).SpawnBathroomServerRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_643054802(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_003e: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference entityObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref entityObj, default(ForNetworkSerializable)); int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SawTapesNetworkManager)(object)target).SpawnBleedingChainsEveryoneRpc(entityObj, playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3507942983(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_003e: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference entityObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref entityObj, default(ForNetworkSerializable)); int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SawTapesNetworkManager)(object)target).SpawnFinalDetonationServerRpc(entityObj, playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3866684181(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_004a: 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) //IL_0059: 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_0077: 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) //IL_008e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference billyObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref billyObj, default(ForNetworkSerializable)); NetworkObjectReference entityObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref entityObj, default(ForNetworkSerializable)); int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SawTapesNetworkManager)(object)target).SpawnFinalDetonationEveryoneRpc(billyObj, entityObj, playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3671512855(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); target.__rpc_exec_stage = (__RpcExecStage)1; ((SawTapesNetworkManager)(object)target).SpawnHunterMarkServerRpc(playerId); target.__rpc_exec_stage = (__RpcExecStage)0; } } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "SawTapesNetworkManager"; } } } namespace SawTapes.Files { public class SubtitleFile { public static string FilePath = Path.Combine(Paths.ConfigPath, "ST.subtitles.json"); public static HashSet<SubtitleMapping> survivalGameSubtitles; public static HashSet<SubtitleMapping> huntingGameSubtitles; public static HashSet<SubtitleMapping> escapeGameSubtitles; public static HashSet<SubtitleMapping> explosiveGameSubtitles; public static HashSet<SubtitleMapping> billyAnnouncementSubtitles; public static HashSet<SubtitleMapping> billyBathroomSubtitles; public static string Get() { return "{\n \"survival_game\": [\n {\n \"timestamp\": 0,\n // Hello workers\n \"text\": \"Bonjour travailleurs\"\n },\n {\n \"timestamp\": 1.2,\n // All your life, you have fled from responsibility\n \"text\": \"Toute votre vie, vous avez fui toute responsabilité\"\n },\n {\n \"timestamp\": 4.01,\n // sacrificing others to ensure your own survival\n \"text\": \"sacrifiant les autres pour assurer votre propre survie\"\n },\n {\n \"timestamp\": 7.59,\n // But today, there is no escape\n \"text\": \"Mais aujourd’hui, il n’y a plus d’échappatoire\"\n },\n {\n \"timestamp\": 9.94,\n // You are being hunted and you will inevitably draw the attention of the creatures lurking here\n \"text\": \"Vous êtes traqués et vous attirerez inévitablement l’attention des créatures qui rôdent ici\"\n },\n {\n \"timestamp\": 15.11,\n // A single eye may divert their gaze… but at the cost of another sacrifice\n \"text\": \"Un œil peut détourner leur regard… mais au prix d’un autre sacrifice\"\n },\n {\n \"timestamp\": 19.56,\n // Let the game begin\n \"text\": \"Que le jeu commence\"\n }\n ],\n \"hunting_game\": [\n {\n \"timestamp\": 0,\n // Hello workers\n \"text\": \"Bonjour travailleurs\"\n },\n {\n \"timestamp\": 1.25,\n // All your life, you have spilled blood without consequences\n \"text\": \"Toute votre vie, vous avez fait couler le sang sans conséquences\"\n },\n {\n \"timestamp\": 4.91,\n // finding pleasure in the pain of others\n \"text\": \"trouvant du plaisir dans la douleur des autres\"\n },\n {\n \"timestamp\": 7.44,\n // Today, that brutality has become your only way out\n \"text\": \"Aujourd’hui, cette brutalité est devenue votre seule issue\"\n },\n {\n \"timestamp\": 11.41,\n // A key is your salvation, but it lies within the guts of beasts you must hunt\n \"text\": \"Une clé est votre salut, mais elle repose dans les entrailles de bêtes que vous devrez traquer\"\n },\n {\n \"timestamp\": 16.63,\n // Live or die, the choice is yours\n \"text\": \"Vivre ou mourir, à vous de choisir\"\n }\n ],\n \"escape_game\": [\n {\n \"timestamp\": 0,\n // Hello workers\n \"text\": \"Bonjour travailleurs\"\n },\n {\n \"timestamp\": 1.27,\n // Until now\n \"text\": \"Jusqu'à maintenant\"\n },\n {\n \"timestamp\": 2.21,\n // you have made decisions that impacted the lives of others without facing the consequences yourselves\n \"text\": \"vous avez pris des décisions qui ont affecté la vie des autres sans en subir vous-même les conséquences\"\n },\n {\n \"timestamp\": 8.43,\n // But today, your lives are bound together\n \"text\": \"Mais aujourd'hui, vos vies sont liées\"\n },\n {\n \"timestamp\": 11.16,\n // The chains that tether you represent your ability—or inability—to work as one\n \"text\": \"Les chaînes qui vous attachent représentent votre capacité, ou votre incapacité, à travailler ensemble\"\n },\n {\n \"timestamp\": 16.85,\n // Path to freedom is littered with deadly traps\n \"text\": \"Votre chemin vers la liberté est jonché de pièges mortels\"\n },\n {\n \"timestamp\": 20.41,\n // Reach the saw before it's too late, or prepare to perish together\n \"text\": \"Atteignez la scie avant qu'il ne soit trop tard, ou préparez-vous à périr ensemble\"\n },\n {\n \"timestamp\": 24.93,\n // The choice is yours\n \"text\": \"Le choix est à vous\"\n }\n ],\n \"explosive_game\": [\n {\n \"timestamp\": 0,\n // Hello workers\n \"text\": \"Bonjour travailleurs\"\n },\n {\n \"timestamp\": 1.24,\n // You’ve played with fire your entire lives\n \"text\": \"Vous avez joué avec le feu toute votre vie\"\n },\n {\n \"timestamp\": 3.85,\n // taking reckless risks without ever facing the consequences\n \"text\": \"prenant des risques inconsidérés sans jamais en assumer les conséquences\"\n },\n {\n \"timestamp\": 7.96,\n // Today, danger rests in your hands\n \"text\": \"Aujourd'hui, le danger repose entre vos mains\"\n },\n {\n \"timestamp\": 10.74,\n // One of you holds an unstable bomb\n \"text\": \"L'un d'entre vous détient une bombe instable\"\n },\n {\n \"timestamp\": 13.04,\n // Pass it on… or perish with it\n \"text\": \"Transmettez-la... ou périssez avec elle\"\n },\n {\n \"timestamp\": 15.33,\n // But remember, every action comes at a price\n \"text\": \"Mais n'oubliez pas que chaque action a un prix\"\n },\n {\n \"timestamp\": 18.66,\n // Find the container… if you hope to survive\n \"text\": \"Trouvez le conteneur, si vous espérez survivre\"\n },\n {\n \"timestamp\": 21.37,\n // Let the game begin\n \"text\": \"Que le jeu commence\"\n }\n ],\n \"billy_announcement\": [\n {\n \"timestamp\": 0,\n // Congratulations\n \"text\": \"Félicitations\"\n },\n {\n \"timestamp\": 1.37,\n // you've survived\n \"text\": \"vous avez survécu\"\n },\n {\n \"timestamp\": 2.71,\n // Today, you have emerged from this trial changed\n \"text\": \"Aujourd'hui, vous êtes sorti de cette épreuve changé\"\n },\n {\n \"timestamp\": 6.13,\n // But remember... life is made of choices\n \"text\": \"Mais rappelez-vous… la vie est faite de choix\"\n }\n ],\n \"billy_bathroom\": [\n {\n \"timestamp\": 0,\n // Hello worker\n \"text\": \"Bonjour travailleur\"\n },\n {\n \"timestamp\": 1.1,\n // You have survived many trials\n \"text\": \"Tu as survécu à de nombreuses épreuves\"\n },\n {\n \"timestamp\": 3.13,\n // You may believe this grants you respite… but today, a new opportunity lies before you\n \"text\": \"Tu crois peut-être que cela t’offre un répit… mais aujourd’hui, c’est une nouvelle opportunité qui s’offre à toi\"\n },\n {\n \"timestamp\": 8.78,\n // In this room hides the object that will set you free\n \"text\": \"Dans cette pièce se cache ce dont tu as besoin pour te libérer\"\n },\n {\n \"timestamp\": 12.08,\n // Yet another path stands open to you: the blade before you offers immediate freedom… at the cost of your flesh\n \"text\": \"Mais une autre possibilité s'offre à toi, la lame devant toi peut t’offrir la liberté immédiate… au prix de ta chair\"\n },\n {\n \"timestamp\": 19.08,\n // The choice is yours\n \"text\": \"Fais ton choix\"\n }\n ]\n}"; } public static void LoadJSON() { string text = Path.Combine(Paths.ConfigPath, FilePath); if (File.Exists(text)) { try { string text2 = File.ReadAllText(text); JObject parsedJson = JObject.Parse(text2); if (!ValidateJsonStructure(parsedJson)) { RenameOldFile(text); } } catch (Exception) { RenameOldFile(text); } } else { File.WriteAllText(text, Get()); } using (new StreamReader(Path.Combine(Paths.ConfigPath, FilePath))) { survivalGameSubtitles = LoadSurvivalGameSubtitles(); huntingGameSubtitles = LoadHuntingGameSubtitles(); escapeGameSubtitles = LoadEscapeGameSubtitles(); explosiveGameSubtitles = LoadExplosiveGameSubtitles(); billyAnnouncementSubtitles = LoadBillyAnnouncementSubtitles(); billyBathroomSubtitles = LoadBillyBathroomSubtitles(); } } public static bool ValidateJsonStructure(JObject parsedJson) { List<string> list = new List<string>(6) { "survival_game", "hunting_game", "escape_game", "explosive_game", "billy_announcement", "billy_bathroom" }; foreach (string item in list) { if (parsedJson[item] == null) { return false; } JToken obj = parsedJson[item]; JArray val = (JArray)(object)((obj is JArray) ? obj : null); if (val == null) { continue; } foreach (JToken item2 in val) { if (item2[(object)"timestamp"] == null || item2[(object)"text"] == null) { return false; } } } return true; } public static void RenameOldFile(string filePath) { string text = filePath + ".old"; if (File.Exists(text)) { File.Delete(text); } File.Move(filePath, text); File.WriteAllText(filePath, Get()); } public static HashSet<SubtitleMapping> LoadSurvivalGameSubtitles() { string text = File.ReadAllText(FilePath); return JObject.Parse(text)["survival_game"].ToObject<HashSet<SubtitleMapping>>(); } public static HashSet<SubtitleMapping> LoadHuntingGameSubtitles() { string text = File.ReadAllText(FilePath); return JObject.Parse(text)["hunting_game"].ToObject<HashSet<SubtitleMapping>>(); } public static HashSet<SubtitleMapping> LoadEscapeGameSubtitles() { string text = File.ReadAllText(FilePath); return JObject.Parse(text)["escape_game"].ToObject<HashSet<SubtitleMapping>>(); } public static HashSet<SubtitleMapping> LoadExplosiveGameSubtitles() { string text = File.ReadAllText(FilePath); return JObject.Parse(text)["explosive_game"].ToObject<HashSet<SubtitleMapping>>(); } public static HashSet<SubtitleMapping> LoadBillyAnnouncementSubtitles() { string text = File.ReadAllText(FilePath); return JObject.Parse(text)["billy_announcement"].ToObject<HashSet<SubtitleMapping>>(); } public static HashSet<SubtitleMapping> LoadBillyBathroomSubtitles() { string text = File.ReadAllText(FilePath); return JObject.Parse(text)["billy_bathroom"].ToObject<HashSet<SubtitleMapping>>(); } } } namespace SawTapes.Files.Values { public class SubtitleMapping { public string GameName { get; internal set; } [JsonProperty("timestamp")] public float Timestamp { get; internal set; } [JsonProperty("text")] public string Text { get; internal set; } } } namespace SawTapes.Behaviours.Items { public class BillyBody : PhysicsProp { public BillyHead aimedHead; public override void Update() { ((GrabbableObject)this).Update(); if (((GrabbableObject)this).isHeld && !((GrabbableObject)this).isPocketed && !((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null) && !((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)(object)GameNetworkManager.Instance.localPlayerController)) { ShowAuraTargetedHead(); } } public void ShowAuraTargetedHead() { //IL_0010: 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) //IL_002a: 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) RaycastHit val = default(RaycastHit); if (Physics.Raycast(new Ray(((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.position, ((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.forward), ref val, 3f, 832, (QueryTriggerInteraction)2)) { BillyHead component = ((Component)((RaycastHit)(ref val)).collider).GetComponent<BillyHead>(); if (!((Object)(object)component == (Object)null)) { if ((Object)(object)aimedHead != (Object)null && (Object)(object)aimedHead != (Object)(object)component) { RemoveAuraFromHead(); } aimedHead = component; CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { ((Component)aimedHead).gameObject }, LegaFusionCore.transparentShader, "Saw TapesBillyPiece", Color.yellow); } } else { RemoveAuraFromHead(); } } public override void ItemActivate(bool used, bool buttonDown = true) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) ((GrabbableObject)this).ItemActivate(used, buttonDown); if (buttonDown && !((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null) && !((Object)(object)aimedHead == (Object)null)) { SpawnBillyServerRpc(NetworkObjectReference.op_Implicit(((Component)aimedHead).GetComponent<NetworkObject>())); RemoveAuraFromHead(); } } [Rpc(/*Could not decode attribute arguments.*/)] public void SpawnBillyServerRpc(NetworkObjectReference obj) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: 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_0082: 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_009c: Unknown result type (might be due to invalid IL or missing referenc