Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of MyCustomContent v0.5.0
MyCustomContent/MyCustomMod.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Dissonance.Config; using GameNetcodeStuff; using LethalLib.Extras; using LethalLib.Modules; using MonoMod.RuntimeDetour; using MyCustomContent; using MyCustomContent.Extensions; using MyCustomContent.MonoBehaviours; using MyCustomContent.Patches; using MyCustomMod.NetcodePatcher; using On; using Unity.Netcode; using Unity.Netcode.Components; using UnityEngine; using UnityEngine.Networking; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("MyCustomMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MyCustomMod")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("b061c52b-7af8-4e27-8d9b-ff26300ec612")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>(); } } namespace LethalLib.Modules { public class SaveData { public static List<string> saveKeys = new List<string>(); public static void Init() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown GameNetworkManager.ResetSavedGameValues += new hook_ResetSavedGameValues(GameNetworkManager_ResetSavedGameValues); GameNetworkManager.SaveItemsInShip += new hook_SaveItemsInShip(GameNetworkManager_SaveItemsInShip); StartOfRound.LoadShipGrabbableItems += new hook_LoadShipGrabbableItems(StartOfRound_LoadShipGrabbableItems); } private static void StartOfRound_LoadShipGrabbableItems(orig_LoadShipGrabbableItems orig, StartOfRound self) { orig.Invoke(self); SaveableObject[] array = Object.FindObjectsOfType<SaveableObject>(); SaveableNetworkBehaviour[] array2 = Object.FindObjectsOfType<SaveableNetworkBehaviour>(); SaveableObject[] array3 = array; foreach (SaveableObject saveableObject in array3) { saveableObject.LoadObjectData(); } SaveableNetworkBehaviour[] array4 = array2; foreach (SaveableNetworkBehaviour saveableNetworkBehaviour in array4) { saveableNetworkBehaviour.LoadObjectData(); } if (ES3.KeyExists("LethalLibItemSaveKeys", GameNetworkManager.Instance.currentSaveFileName)) { saveKeys = ES3.Load<List<string>>("LethalLibItemSaveKeys", GameNetworkManager.Instance.currentSaveFileName); } } private static void GameNetworkManager_SaveItemsInShip(orig_SaveItemsInShip orig, GameNetworkManager self) { orig.Invoke(self); SaveableObject[] array = Object.FindObjectsOfType<SaveableObject>(); SaveableNetworkBehaviour[] array2 = Object.FindObjectsOfType<SaveableNetworkBehaviour>(); SaveableObject[] array3 = array; foreach (SaveableObject saveableObject in array3) { saveableObject.SaveObjectData(); } SaveableNetworkBehaviour[] array4 = array2; foreach (SaveableNetworkBehaviour saveableNetworkBehaviour in array4) { saveableNetworkBehaviour.SaveObjectData(); } ES3.Save<List<string>>("LethalLibItemSaveKeys", saveKeys, GameNetworkManager.Instance.currentSaveFileName); } private static void GameNetworkManager_ResetSavedGameValues(orig_ResetSavedGameValues orig, GameNetworkManager self) { orig.Invoke(self); foreach (string saveKey in saveKeys) { ES3.DeleteKey(saveKey, GameNetworkManager.Instance.currentSaveFileName); } saveKeys.Clear(); } public static void SaveObjectData<T>(string key, T data, int objectId) { List<T> list = new List<T>(); if (ES3.KeyExists("LethalThingsSave_" + key, GameNetworkManager.Instance.currentSaveFileName)) { list = ES3.Load<List<T>>("LethalThingsSave_" + key, GameNetworkManager.Instance.currentSaveFileName); } List<int> list2 = new List<int>(); if (ES3.KeyExists("LethalThingsSave_objectIds_" + key, GameNetworkManager.Instance.currentSaveFileName)) { list2 = ES3.Load<List<int>>("LethalThingsSave_objectIds_" + key, GameNetworkManager.Instance.currentSaveFileName); } list.Add(data); list2.Add(objectId); if (!saveKeys.Contains("LethalThingsSave_" + key)) { saveKeys.Add("LethalThingsSave_" + key); } if (!saveKeys.Contains("LethalThingsSave_objectIds_" + key)) { saveKeys.Add("LethalThingsSave_objectIds_" + key); } ES3.Save<List<T>>("LethalThingsSave_" + key, list, GameNetworkManager.Instance.currentSaveFileName); ES3.Save<List<int>>("LethalThingsSave_objectIds_" + key, list2, GameNetworkManager.Instance.currentSaveFileName); } public static T LoadObjectData<T>(string key, int objectId) { List<T> list = new List<T>(); if (ES3.KeyExists("LethalThingsSave_" + key, GameNetworkManager.Instance.currentSaveFileName)) { list = ES3.Load<List<T>>("LethalThingsSave_" + key, GameNetworkManager.Instance.currentSaveFileName); } List<int> list2 = new List<int>(); if (ES3.KeyExists("LethalThingsSave_objectIds_" + key, GameNetworkManager.Instance.currentSaveFileName)) { list2 = ES3.Load<List<int>>("LethalThingsSave_objectIds_" + key, GameNetworkManager.Instance.currentSaveFileName); } if (!saveKeys.Contains("LethalThingsSave_" + key)) { saveKeys.Add("LethalThingsSave_" + key); } if (!saveKeys.Contains("LethalThingsSave_objectIds_" + key)) { saveKeys.Add("LethalThingsSave_objectIds_" + key); } if (list2.Contains(objectId)) { int index = list2.IndexOf(objectId); return list[index]; } return default(T); } } } namespace MyCustomMod { public class HalfFull : SaveableObject { public Transform spawnPoint; private RaycastHit[] objectsHitByBullet = (RaycastHit[])(object)new RaycastHit[20]; public int maxAmmo = 6; public int startingAmmo = 3; public LayerMask hitMask; private PlayerControllerB previousPlayerHeldBy; private NetworkVariable<int> currentAmmo = new NetworkVariable<int>(3, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); private NetworkVariable<bool> isLoaded = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)1); private bool localIsLoaded = false; private Ray ray; public AudioSource audioSrc; public AudioClip fireClip; public AudioClip emptyClip; public AudioClip spinClip; public Animator anim; public ParticleSystem fireParticals; private float spinCooldown = 0.7f; private float spinCooldownAtTime = 0f; private float fireCooldown = 0.6f; private float fireCooldownAtTime = 0f; public override void SaveObjectData() { SaveData.SaveObjectData("halfFullAmmoData", currentAmmo.Value, uniqueId); SaveData.SaveObjectData("halfFullLoadedData", isLoaded.Value, uniqueId); } public override void LoadObjectData() { if (((NetworkBehaviour)this).IsHost) { currentAmmo.Value = SaveData.LoadObjectData<int>("halfFullAmmoData", uniqueId); isLoaded.Value = SaveData.LoadObjectData<bool>("halfFullLoadedData", uniqueId); } } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); Plugin.logger.LogInfo((object)("Current Ammo: " + currentAmmo.Value + ", Is Loaded: " + isLoaded.Value)); if (((NetworkBehaviour)this).IsServer) { currentAmmo.Value = Config.revolverShots.Value; isLoaded.Value = localIsLoaded; } } public override void ItemActivate(bool used, bool buttonDown = true) { //IL_00f2: 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_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) ((GrabbableObject)this).ItemActivate(used, buttonDown); if (currentAmmo.Value > 0 && isLoaded.Value && fireCooldownAtTime + fireCooldown < Time.time) { if (((NetworkBehaviour)this).IsHost) { NetworkVariable<int> obj = currentAmmo; int value = obj.Value; obj.Value = value - 1; } anim.Play("fire"); audioSrc.PlayOneShot(fireClip); fireParticals.Play(); if (((NetworkBehaviour)this).IsOwner) { isLoaded.Value = false; if (((NetworkBehaviour)this).IsHost) { Fire(spawnPoint.position, spawnPoint.forward); } else { Plugin.logger.LogInfo((object)"Sending fire server rpc"); FireServerRpc(spawnPoint.position, spawnPoint.forward); } } fireCooldownAtTime = Time.time; } else if (fireCooldownAtTime + fireCooldown < Time.time) { Plugin.logger.LogInfo((object)"Bullet not loaded"); audioSrc.PlayOneShot(emptyClip); fireCooldownAtTime = Time.time; } } public void Fire(Vector3 pos, Vector3 dir) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) Plugin.logger.LogInfo((object)"Revolver fired"); ray = new Ray(pos, dir); int num = Physics.RaycastNonAlloc(ray, objectsHitByBullet, 100f, LayerMask.op_Implicit(hitMask), (QueryTriggerInteraction)2); Plugin.logger.LogInfo((object)("Number of hits: " + num)); IHittable val = default(IHittable); for (int i = 0; i < num; i++) { if (((Component)((RaycastHit)(ref objectsHitByBullet[i])).transform).TryGetComponent<IHittable>(ref val)) { val.Hit(85, spawnPoint.forward, previousPlayerHeldBy, false); continue; } Plugin.logger.LogInfo((object)("Could not get hittable script from collider, transform: " + ((Object)((RaycastHit)(ref objectsHitByBullet[i])).transform).name)); Plugin.logger.LogInfo((object)("collider: " + ((Object)((RaycastHit)(ref objectsHitByBullet[i])).collider).name)); } } [ServerRpc] public void FireServerRpc(Vector3 pos, Vector3 dir) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Invalid comparison between Unknown and I4 //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: 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_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1246519813u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref pos); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref dir); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1246519813u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { Plugin.logger.LogInfo((object)"Running Server rpc"); Fire(pos, dir); } } public override void ItemInteractLeftRight(bool right) { ((GrabbableObject)this).ItemInteractLeftRight(right); Plugin.logger.LogInfo((object)"Spinning barrel"); if (!right && spinCooldownAtTime + spinCooldown < Time.time) { anim.Play("spin"); audioSrc.PlayOneShot(spinClip); Plugin.logger.LogInfo((object)("Current ammo: " + currentAmmo.Value)); if (((NetworkBehaviour)this).IsOwner && currentAmmo.Value <= 0) { isLoaded.Value = false; Plugin.logger.LogInfo((object)"Chamber empty"); } else if (((NetworkBehaviour)this).IsOwner) { Random random = new Random(); double num = random.NextDouble() * (double)maxAmmo; bool value = ((!(num > (double)currentAmmo.Value)) ? true : false); isLoaded.Value = value; Plugin.logger.LogInfo((object)("Spun the chamber. Loaded bullet: " + value)); } spinCooldownAtTime = Time.time; } } public override void PocketItem() { ((GrabbableObject)this).PocketItem(); if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null) { ((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false; } } public override void DiscardItem() { ((GrabbableObject)this).DiscardItem(); if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null) { ((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false; } } public override void EquipItem() { ((GrabbableObject)this).EquipItem(); if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null) { previousPlayerHeldBy = ((GrabbableObject)this).playerHeldBy; ((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = true; } } protected override void __initializeVariables() { if (currentAmmo == null) { throw new Exception("HalfFull.currentAmmo cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)currentAmmo).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)currentAmmo, "currentAmmo"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)currentAmmo); if (isLoaded == null) { throw new Exception("HalfFull.isLoaded cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)isLoaded).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)isLoaded, "isLoaded"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)isLoaded); base.__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_HalfFull() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(1246519813u, new RpcReceiveHandler(__rpc_handler_1246519813)); } private static void __rpc_handler_1246519813(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_009b: 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_00ae: 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_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { Vector3 pos = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref pos); Vector3 dir = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref dir); target.__rpc_exec_stage = (__RpcExecStage)1; ((HalfFull)(object)target).FireServerRpc(pos, dir); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "HalfFull"; } } } namespace MyCustomContent { public class Config { public static ConfigEntry<int> davidSpawnWeight; public static ConfigEntry<int> amogusSpawnWeight; public static ConfigEntry<int> happyMealSpawnWeight; public static ConfigEntry<int> flamingoSpawnWeight; public static ConfigEntry<int> specterSpawnWeight; public static ConfigEntry<int> imposterSpawnWeight; public static ConfigEntry<int> imposterVoiceInterval; public static ConfigEntry<int> imposterFleeMeter; public static ConfigEntry<int> revolverPrice; public static ConfigEntry<int> revolverShots; public static ConfigEntry<int> shrineCost; public static ConfigFile VolumeConfig; public static ConfigEntry<string> version; public static void Load() { //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown davidSpawnWeight = Plugin.config.Bind<int>("Scrap", "David", 20, "How much David spawns (higher = more common)"); amogusSpawnWeight = Plugin.config.Bind<int>("Scrap", "Amogus", 20, "How much Amogus spawns (higher = more common)"); happyMealSpawnWeight = Plugin.config.Bind<int>("Scrap", "Happy Meal", 20, "How much Happy Meal spawns (higher = more common)"); flamingoSpawnWeight = Plugin.config.Bind<int>("Scrap", "Flamingo", 10, "How much flamingo spawns (higher = more common)"); specterSpawnWeight = Plugin.config.Bind<int>("Enemy", "Specter Chance", 40, "How often specters spawn (higher = more common)"); imposterSpawnWeight = Plugin.config.Bind<int>("Enemy", "Imposter Chance", 40, "How often imposters spawn (higher = more common)"); imposterVoiceInterval = Plugin.config.Bind<int>("Enemy", "Imposter voice cooldown", 8, "Time between imposter voicelines"); imposterFleeMeter = Plugin.config.Bind<int>("Enemy", "Imposter flee meter", 20, "Increase/decrease the amount of time needed staring at the imposter for it to flee"); revolverPrice = Plugin.config.Bind<int>("Item", "Revolver Price", 130, "Change price of the half full revolver"); revolverShots = Plugin.config.Bind<int>("Item", "Starting Revolver Rounds", 3, "Changes how many rounds the revolver starts with"); shrineCost = Plugin.config.Bind<int>("Item", "Shrine Cost", 220, "How much the shrine costs"); version = Plugin.config.Bind<string>("Misc", "Version", "1.0.0", "Version of the mod config."); VolumeConfig = new ConfigFile(Paths.ConfigPath + "\\MyCustomStuff.AudioVolume.cfg", true); } } public class Content { public class CustomItem { public string name = ""; public string itemPath = ""; public string infoPath = ""; public Action<Item> itemAction = delegate { }; public bool enabled = true; public CustomItem(string name, string itemPath, string infoPath, Action<Item> action = null) { this.name = name; this.itemPath = itemPath; this.infoPath = infoPath; if (action != null) { itemAction = action; } } public static CustomItem Add(string name, string itemPath, string infoPath = null, Action<Item> action = null) { return new CustomItem(name, itemPath, infoPath, action); } } public class CustomUnlockable { public string name = ""; public string unlockablePath = ""; public string infoPath = ""; public Action<UnlockableItem> unlockableAction = delegate { }; public bool enabled = true; public int unlockCost = -1; public CustomUnlockable(string name, string unlockablePath, string infoPath, Action<UnlockableItem> action = null, int unlockCost = -1) { this.name = name; this.unlockablePath = unlockablePath; this.infoPath = infoPath; if (action != null) { unlockableAction = action; } this.unlockCost = unlockCost; } public static CustomUnlockable Add(string name, string unlockablePath, string infoPath = null, Action<UnlockableItem> action = null, int unlockCost = -1, bool enabled = true) { CustomUnlockable customUnlockable = new CustomUnlockable(name, unlockablePath, infoPath, action, unlockCost); customUnlockable.enabled = enabled; return customUnlockable; } } public class CustomShopItem : CustomItem { public int itemPrice = 0; public CustomShopItem(string name, string itemPath, string infoPath = null, int itemPrice = 0, Action<Item> action = null) : base(name, itemPath, infoPath, action) { this.itemPrice = itemPrice; } public static CustomShopItem Add(string name, string itemPath, string infoPath = null, int itemPrice = 0, Action<Item> action = null, bool enabled = true) { CustomShopItem customShopItem = new CustomShopItem(name, itemPath, infoPath, itemPrice, action); customShopItem.enabled = enabled; return customShopItem; } } public class CustomScrap : CustomItem { public LevelTypes levelType = (LevelTypes)(-1); public int rarity = 0; public CustomScrap(string name, string itemPath, LevelTypes levelType, int rarity, Action<Item> action = null) : base(name, itemPath, null, action) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) this.levelType = levelType; this.rarity = rarity; } public static CustomScrap Add(string name, string itemPath, LevelTypes levelType, int rarity, Action<Item> action = null) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) return new CustomScrap(name, itemPath, levelType, rarity, action); } } public class CustomPlainItem : CustomItem { public CustomPlainItem(string name, string itemPath, Action<Item> action = null) : base(name, itemPath, null, action) { } public static CustomPlainItem Add(string name, string itemPath, Action<Item> action = null) { return new CustomPlainItem(name, itemPath, action); } } public class CustomEnemy { public string name; public string enemyPath; public int rarity; public LevelTypes levelFlags; public SpawnType spawnType; public string infoKeyword; public string infoNode; public bool enabled = true; public CustomEnemy(string name, string enemyPath, int rarity, LevelTypes levelFlags, SpawnType spawnType, string infoKeyword, string infoNode) { //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_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) this.name = name; this.enemyPath = enemyPath; this.rarity = rarity; this.levelFlags = levelFlags; this.spawnType = spawnType; this.infoKeyword = infoKeyword; this.infoNode = infoNode; } public static CustomEnemy Add(string name, string enemyPath, int rarity, LevelTypes levelFlags, SpawnType spawnType, string infoKeyword, string infoNode, bool enabled = true) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) CustomEnemy customEnemy = new CustomEnemy(name, enemyPath, rarity, levelFlags, spawnType, infoKeyword, infoNode); customEnemy.enabled = enabled; return customEnemy; } } public class CustomMapObject { public string name; public string objectPath; public LevelTypes levelFlags; public Func<SelectableLevel, AnimationCurve> spawnRateFunction; public bool enabled = true; public CustomMapObject(string name, string objectPath, LevelTypes levelFlags, Func<SelectableLevel, AnimationCurve> spawnRateFunction = null, bool enabled = false) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) this.name = name; this.objectPath = objectPath; this.levelFlags = levelFlags; this.spawnRateFunction = spawnRateFunction; this.enabled = enabled; } public static CustomMapObject Add(string name, string objectPath, LevelTypes levelFlags, Func<SelectableLevel, AnimationCurve> spawnRateFunction = null, bool enabled = false) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) return new CustomMapObject(name, objectPath, levelFlags, spawnRateFunction, enabled); } } public static AssetBundle MainAssets; public static Dictionary<string, GameObject> Prefabs = new Dictionary<string, GameObject>(); public static GameObject devMenuPrefab; public static List<CustomUnlockable> customUnlockables; public static List<CustomItem> customItems; public static List<CustomEnemy> customEnemies; public static List<CustomMapObject> customMapObjects; public static GameObject ConfigManagerPrefab; public static void TryLoadAssets() { if ((Object)(object)MainAssets == (Object)null) { MainAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "mybundle")); Plugin.logger.LogInfo((object)"Loaded asset bundle"); } } public static void Load() { //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_04fb: Unknown result type (might be due to invalid IL or missing references) //IL_0502: Unknown result type (might be due to invalid IL or missing references) //IL_05d3: Unknown result type (might be due to invalid IL or missing references) TryLoadAssets(); customItems = new List<CustomItem> { CustomScrap.Add("David", "Assets/Custom/Scrap/David/David.asset", (LevelTypes)(-1), Config.davidSpawnWeight.Value), CustomScrap.Add("Amogus", "Assets/Custom/Scrap/Amogus/purple.asset", (LevelTypes)(-1), Config.amogusSpawnWeight.Value), CustomScrap.Add("Happy Meal", "Assets/Custom/Scrap/HappyMeal/HappyMeal.asset", (LevelTypes)(-1), Config.happyMealSpawnWeight.Value), CustomScrap.Add("Flamingo", "Assets/Custom/Scrap/Flamingo/flamingo.asset", (LevelTypes)(-1), Config.flamingoSpawnWeight.Value), CustomShopItem.Add("Half Full Revolver", "Assets/Custom/ShopItems/HalfFull/HalfFull.asset", "Assets/Custom/ShopItems/HalfFull/HalfFullNode.asset", Config.revolverPrice.Value) }; customEnemies = new List<CustomEnemy> { CustomEnemy.Add("Specter", "Assets/Custom/Enemies/Specter/Specter.asset", Config.specterSpawnWeight.Value, (LevelTypes)(-1), (SpawnType)0, "Assets/Custom/Enemies/custom-keyword.asset", "Assets/Custom/Enemies/Specter/custom-node.asset"), CustomEnemy.Add("Imposter", "Assets/Custom/Enemies/Imposter/Imposter.asset", Config.imposterSpawnWeight.Value, (LevelTypes)(-1), (SpawnType)0, "Assets/Custom/Enemies/Imposter/Imposter_keyword.asset", "Assets/Custom/Enemies/Imposter/Imposter_node.asset") }; customUnlockables = new List<CustomUnlockable> { CustomUnlockable.Add("Shrine", "Assets/Custom/ShopItems/Shrine/Shrine.asset", "Assets/Custom/ShopItems/Shrine/ShrineNode.asset", null, Config.shrineCost.Value) }; customMapObjects = new List<CustomMapObject>(); foreach (CustomItem customItem in customItems) { if (customItem.enabled) { Item val = MainAssets.LoadAsset<Item>(customItem.itemPath); if ((Object)(object)val.spawnPrefab.GetComponent<NetworkTransform>() == (Object)null && (Object)(object)val.spawnPrefab.GetComponent<CustomNetworkTransform>() == (Object)null) { NetworkTransform val2 = val.spawnPrefab.AddComponent<NetworkTransform>(); val2.SlerpPosition = false; val2.Interpolate = false; val2.SyncPositionX = false; val2.SyncPositionY = false; val2.SyncPositionZ = false; val2.SyncScaleX = false; val2.SyncScaleY = false; val2.SyncScaleZ = false; val2.UseHalfFloatPrecision = true; } Prefabs.Add(customItem.name, val.spawnPrefab); Utilities.FixMixerGroups(val.spawnPrefab); NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab); customItem.itemAction(val); if (customItem is CustomShopItem) { TerminalNode val3 = MainAssets.LoadAsset<TerminalNode>(customItem.infoPath); Plugin.logger.LogInfo((object)$"Registering shop item {customItem.name} with price {((CustomShopItem)customItem).itemPrice}"); Items.RegisterShopItem(val, (TerminalNode)null, (TerminalNode)null, val3, ((CustomShopItem)customItem).itemPrice); } else if (customItem is CustomScrap) { Items.RegisterScrap(val, ((CustomScrap)customItem).rarity, ((CustomScrap)customItem).levelType); } else if (customItem is CustomPlainItem) { Items.RegisterItem(val); } } } foreach (CustomUnlockable customUnlockable in customUnlockables) { if (customUnlockable.enabled) { UnlockableItem unlockable = MainAssets.LoadAsset<UnlockableItemDef>(customUnlockable.unlockablePath).unlockable; if ((Object)(object)unlockable.prefabObject != (Object)null) { NetworkPrefabs.RegisterNetworkPrefab(unlockable.prefabObject); } Prefabs.Add(customUnlockable.name, unlockable.prefabObject); Utilities.FixMixerGroups(unlockable.prefabObject); TerminalNode val4 = null; if (customUnlockable.infoPath != null) { val4 = MainAssets.LoadAsset<TerminalNode>(customUnlockable.infoPath); } Unlockables.RegisterUnlockable(unlockable, (StoreType)2, (TerminalNode)null, (TerminalNode)null, val4, customUnlockable.unlockCost); Plugin.logger.LogInfo((object)$"Registered '{unlockable.unlockableName}' for price: {customUnlockable.unlockCost}"); } } foreach (CustomEnemy customEnemy in customEnemies) { if (customEnemy.enabled) { EnemyType val5 = MainAssets.LoadAsset<EnemyType>(customEnemy.enemyPath); TerminalNode val6 = MainAssets.LoadAsset<TerminalNode>(customEnemy.infoNode); TerminalKeyword val7 = null; if (customEnemy.infoKeyword != null) { val7 = MainAssets.LoadAsset<TerminalKeyword>(customEnemy.infoKeyword); } NetworkPrefabs.RegisterNetworkPrefab(val5.enemyPrefab); Prefabs.Add(customEnemy.name, val5.enemyPrefab); Utilities.FixMixerGroups(val5.enemyPrefab); Enemies.RegisterEnemy(val5, customEnemy.rarity, customEnemy.levelFlags, customEnemy.spawnType, val6, val7); Plugin.logger.LogInfo((object)("Registered enemy: " + customEnemy.name)); } } foreach (CustomMapObject customMapObject in customMapObjects) { if (customMapObject.enabled) { SpawnableMapObjectDef val8 = MainAssets.LoadAsset<SpawnableMapObjectDef>(customMapObject.objectPath); NetworkPrefabs.RegisterNetworkPrefab(val8.spawnableMapObject.prefabToSpawn); Prefabs.Add(customMapObject.name, val8.spawnableMapObject.prefabToSpawn); Utilities.FixMixerGroups(val8.spawnableMapObject.prefabToSpawn); MapObjects.RegisterMapObject(val8, customMapObject.levelFlags, customMapObject.spawnRateFunction); } } foreach (KeyValuePair<string, GameObject> prefab in Prefabs) { GameObject value = prefab.Value; string key = prefab.Key; AudioSource[] componentsInChildren = value.GetComponentsInChildren<AudioSource>(); if (componentsInChildren.Length != 0) { ConfigEntry<float> val9 = Config.VolumeConfig.Bind<float>("Volume", key ?? "", 100f, "Audio volume for " + key + " (0 - 100)"); AudioSource[] array = componentsInChildren; foreach (AudioSource val10 in array) { val10.volume *= val9.Value / 100f; } } } try { IEnumerable<Type> loadableTypes = Assembly.GetExecutingAssembly().GetLoadableTypes(); foreach (Type item in loadableTypes) { MethodInfo[] methods = item.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); } } } } catch (Exception) { } Plugin.logger.LogInfo((object)"Custom content loaded!"); } } public class CustomAI : EnemyAI { public AISearchRoutine searchForPlayers; public bool investigating = false; public bool hasBegunInvestigating = false; public Vector3 investigatePosition; private ManualLogSource myLogSource; public override void Start() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown ((EnemyAI)this).Start(); Transform val = ((Component)this).transform.Find("Model"); myLogSource = Plugin.logger; myLogSource.LogInfo((object)"Custom Enemy Spawned"); searchForPlayers = new AISearchRoutine(); ((Component)base.creatureVoice).gameObject.AddComponent<OccludeAudio>(); } public override void DoAIInterval() { //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0135: 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) ((EnemyAI)this).DoAIInterval(); if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead) { return; } base.targetPlayer = ((EnemyAI)this).CheckLineOfSightForClosestPlayer(80f, 60, 1, 1.5f); if ((Object)(object)base.targetPlayer != (Object)null) { myLogSource.LogInfo((object)"Found player"); ((EnemyAI)this).StopSearch(searchForPlayers, true); if (!base.movingTowardsTargetPlayer) { ((EnemyAI)this).SwitchToBehaviourState(1); } base.movingTowardsTargetPlayer = true; hasBegunInvestigating = false; investigating = false; if ((Object)(object)base.targetPlayer != (Object)(object)GameNetworkManager.Instance.localPlayerController) { ((EnemyAI)this).ChangeOwnershipOfEnemy(base.targetPlayer.actualClientId); } } else if (investigating) { myLogSource.LogInfo((object)"Investigating"); if (!hasBegunInvestigating) { hasBegunInvestigating = true; ((EnemyAI)this).StopSearch(base.currentSearch, false); ((EnemyAI)this).SetDestinationToPosition(investigatePosition, false); ((EnemyAI)this).SwitchToBehaviourState(0); } if (Vector3.Distance(((Component)this).transform.position, investigatePosition) < 5f) { investigating = false; hasBegunInvestigating = false; } } else if (!searchForPlayers.inProgress) { myLogSource.LogInfo((object)"Searching"); base.movingTowardsTargetPlayer = false; ((EnemyAI)this).StartSearch(((Component)this).transform.position, searchForPlayers); ((EnemyAI)this).SwitchToBehaviourState(0); } } public override void Update() { //IL_0046: 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) ((EnemyAI)this).Update(); if (base.ventAnimationFinished && (Object)(object)base.creatureAnimator != (Object)null && !base.isEnemyDead && !StartOfRound.Instance.allPlayersDead) { Vector3 serverPosition = base.serverPosition; if (base.stunNormalizedTimer > 0f) { base.agent.speed = 0f; } else if (((NetworkBehaviour)this).IsOwner) { base.agent.speed = 1.5f; } } } public override void OnCollideWithPlayer(Collider other) { //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: 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) ((EnemyAI)this).OnCollideWithPlayer(other); myLogSource.LogInfo((object)("Collider tag: " + ((Object)other).name + "Collider name: " + ((Object)other).name)); if (((Component)other).CompareTag("Player") || ((Component)((Component)other).transform.parent).CompareTag("Player")) { myLogSource.LogInfo((object)("Hitting player " + ((Object)((Component)other).gameObject).name)); PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false); if ((Object)(object)val != (Object)null) { myLogSource.LogInfo((object)"Player is collidable"); val.DamagePlayer(150, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); } else { myLogSource.LogInfo((object)"Player collider on parent?"); val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(((Component)((Component)other).transform.parent).GetComponent<Collider>(), false, false); val.DamagePlayer(150, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); } } } public override void DetectNoise(Vector3 noisePosition, float noiseLoudness, int timesPlayedInOneSpot = 0, int noiseID = 0) { //IL_0013: 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_0025: 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_004b: Unknown result type (might be due to invalid IL or missing references) myLogSource.LogInfo((object)"Custom Enemy Heard Noise"); ((EnemyAI)this).DetectNoise(noisePosition, noiseLoudness, timesPlayedInOneSpot, noiseID); float num = Vector3.Distance(noisePosition, ((Component)this).transform.position); if (!(num > 15f) && !base.movingTowardsTargetPlayer) { investigatePosition = noisePosition; } } public void InvestigatePosition(Vector3 position) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) myLogSource.LogInfo((object)"Investigating Position"); if (!hasBegunInvestigating) { investigatePosition = position; investigating = true; } } protected override void __initializeVariables() { ((EnemyAI)this).__initializeVariables(); } protected internal override string __getTypeName() { return "CustomAI"; } } public class ImposterAI : EnemyAI { public AISearchRoutine searchForPlayers; public bool investigating = false; public bool hasBegunInvestigating = false; public bool fleeing = false; public Vector3 investigatePosition; public SkinnedMeshRenderer rendererLOD0; public SkinnedMeshRenderer rendererLOD1; public SkinnedMeshRenderer rendererLOD2; private float voiceCD = 8f; private float lastSpoke = 0f; private bool startingToFlee = false; private float timeToStartFlee = 0f; private float waitToStartFlee = 0.6f; private int fleeMeter = 0; private int fleeMeterThreshold = 25; private float lastInSightCheck = 0f; private float inFleeTimer = 20f; private float timeWhenFled = 0f; private float targetDist = 999f; private List<Transform> ignoredNodes = new List<Transform>(); private Transform fleeNode; private Ray enemyRay; private RaycastHit enemyRayHit; private int currentFootstepSurfaceIndex; private int previousFootstepClip; private float footsetpInterval = 0.8f; private float lastFootstepTime = 0f; public AudioSource movementAudio; private float attackCooldownInterval = 3f; private float lastTimeAttacked = 0f; public override void Start() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown ((EnemyAI)this).Start(); Transform val = ((Component)this).transform.Find("Model"); searchForPlayers = new AISearchRoutine(); ((EnemyAI)this).SwitchToBehaviourState(0); base.agent.stoppingDistance = 0f; base.debugEnemyAI = false; voiceCD = Config.imposterVoiceInterval.Value; fleeMeterThreshold = Config.imposterFleeMeter.Value; PlayerControllerB val2 = StartOfRound.Instance.allPlayerScripts[Random.Range(0, StartOfRound.Instance.allPlayerScripts.Length)]; if (!val2.isPlayerControlled && StartOfRound.Instance.livingPlayers > 0) { while (!val2.isPlayerControlled) { val2 = StartOfRound.Instance.allPlayerScripts[Random.Range(0, StartOfRound.Instance.allPlayerScripts.Length)]; } } int currentSuitID = val2.currentSuitID; SetSuit(currentSuitID); SetSuitClientRpc(currentSuitID); } public override void DoAIInterval() { //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_04c1: Unknown result type (might be due to invalid IL or missing references) //IL_0466: Unknown result type (might be due to invalid IL or missing references) //IL_046c: Unknown result type (might be due to invalid IL or missing references) //IL_0453: Unknown result type (might be due to invalid IL or missing references) //IL_0339: Unknown result type (might be due to invalid IL or missing references) //IL_035e: Unknown result type (might be due to invalid IL or missing references) //IL_038c: Unknown result type (might be due to invalid IL or missing references) //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).DoAIInterval(); if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead) { return; } if (lastFootstepTime + footsetpInterval < Time.time) { PlayFootstepSound(); lastFootstepTime = Time.time; } Vector3 val; if (((EnemyAI)this).TargetClosestPlayer(1.5f, false, 360f) && !fleeing) { if ((Object)(object)base.targetPlayer != (Object)(object)GameNetworkManager.Instance.localPlayerController) { Plugin.logger.LogInfo((object)"player ownership changed"); ((EnemyAI)this).ChangeOwnershipOfEnemy(base.targetPlayer.actualClientId); } ((EnemyAI)this).StopSearch(base.currentSearch, true); ChooseClosestNodeToPlayer(); hasBegunInvestigating = false; investigating = false; targetDist = Vector3.Distance(((Component)base.targetPlayer).transform.position, ((Component)this).transform.position); if (targetDist <= 18f && lastSpoke + voiceCD < Time.time) { Plugin.logger.LogInfo((object)"Target in range, playing audio clip"); if (((NetworkBehaviour)this).IsHost) { PlaySample(); PlaySampleClientRpc(); } else { PlaySampleServerRpc(); } } if ((Object)(object)((EnemyAI)this).CheckLineOfSightForPlayer(90f, 15, -1) != (Object)null) { Plugin.logger.LogInfo((object)"Player is in sight and in range"); if (lastInSightCheck + 0.4f < Time.time) { Plugin.logger.LogInfo((object)"Imposter has been seen"); lastInSightCheck = Time.time; } base.movingTowardsTargetPlayer = true; fleeMeter++; } else { base.movingTowardsTargetPlayer = false; } if (fleeMeter >= fleeMeterThreshold) { Plugin.logger.LogInfo((object)"Imposter is now fleeing"); fleeing = true; timeToStartFlee = Time.time; startingToFlee = true; fleeMeter = 0; } else if (targetDist <= 4f && Object.op_Implicit((Object)(object)((EnemyAI)this).CheckLineOfSightForPlayer(90f, 60, -1))) { Plugin.logger.LogInfo((object)"kill player"); ((EnemyAI)this).SwitchToBehaviourState(2); PlayerControllerB targetPlayer = base.targetPlayer; val = default(Vector3); targetPlayer.DamagePlayer(50, true, true, (CauseOfDeath)0, 0, false, val); fleeing = true; timeToStartFlee = Time.time; fleeMeter = 0; startingToFlee = true; } return; } targetDist = 999f; if (fleeing) { if (timeToStartFlee + waitToStartFlee > Time.time) { Plugin.logger.LogInfo((object)"waiting for anim to flee"); } else if (startingToFlee) { ((EnemyAI)this).StopSearch(base.currentSearch, true); startingToFlee = false; fleeNode = ((EnemyAI)this).ChooseFarthestNodeFromPosition(((Component)this).transform.position, true, 0, false); base.targetNode = fleeNode; ((EnemyAI)this).SetDestinationToPosition(fleeNode.position, true); timeWhenFled = Time.time; ignoredNodes.Clear(); ManualLogSource logger = Plugin.logger; val = base.destination; logger.LogInfo((object)("Fleeing to: " + ((object)(Vector3)(ref val)).ToString())); if (base.currentBehaviourStateIndex != 0) { ((EnemyAI)this).SwitchToBehaviourState(0); } } else if (inFleeTimer + timeWhenFled < Time.time) { Plugin.logger.LogInfo((object)"stopped fleeing"); investigating = true; hasBegunInvestigating = false; fleeing = false; } } else if (investigating) { Plugin.logger.LogInfo((object)"Investigating"); if (!hasBegunInvestigating) { hasBegunInvestigating = true; ((EnemyAI)this).StopSearch(base.currentSearch, false); ((EnemyAI)this).SetDestinationToPosition(investigatePosition, false); } if (Vector3.Distance(((Component)this).transform.position, investigatePosition) < 5f) { investigating = false; hasBegunInvestigating = false; } } else if (!searchForPlayers.inProgress) { Plugin.logger.LogInfo((object)"Starting investigation"); ((EnemyAI)this).StartSearch(((Component)this).transform.position, searchForPlayers); base.movingTowardsTargetPlayer = false; } } public override void Update() { ((EnemyAI)this).Update(); if (!base.ventAnimationFinished || !((Object)(object)base.creatureAnimator != (Object)null) || base.isEnemyDead || StartOfRound.Instance.allPlayersDead) { return; } if (base.stunNormalizedTimer > 0f) { base.agent.speed = 0f; footsetpInterval = 999f; } else { if (!((NetworkBehaviour)this).IsOwner) { return; } if ((targetDist <= 10f && !fleeing) || (targetDist <= 10f && startingToFlee)) { base.agent.speed = 3f; footsetpInterval = 0.4f; if (Object.op_Implicit((Object)(object)((EnemyAI)this).CheckLineOfSightForPlayer(90f, 40, -1)) || targetDist <= 6f) { base.agent.speed = 0f; footsetpInterval = 999f; if (base.currentBehaviourStateIndex != 1 && base.currentBehaviourStateIndex != 2) { ((EnemyAI)this).SwitchToBehaviourState(1); } } } else { base.agent.speed = 8f; footsetpInterval = 0.2f; if (base.currentBehaviourStateIndex != 0 && base.currentBehaviourStateIndex != 2) { ((EnemyAI)this).SwitchToBehaviourState(0); } } } } public override void OnCollideWithPlayer(Collider other) { //IL_010c: 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_00a7: 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) ((EnemyAI)this).OnCollideWithPlayer(other); if (((Component)other).CompareTag("Player") || (((Component)((Component)other).transform.parent).CompareTag("Player") && attackCooldownInterval + lastTimeAttacked < Time.time)) { Plugin.logger.LogInfo((object)("Hitting player " + ((Object)((Component)other).gameObject).name)); PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false); if ((Object)(object)val != (Object)null) { Plugin.logger.LogInfo((object)"Player is collidable"); ((EnemyAI)this).SwitchToBehaviourState(2); val.DamagePlayer(50, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); fleeing = true; timeToStartFlee = Time.time; startingToFlee = true; } else { Plugin.logger.LogInfo((object)"Player collider on parent?"); val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(((Component)((Component)other).transform.parent).GetComponent<Collider>(), false, false); ((EnemyAI)this).SwitchToBehaviourState(2); val.DamagePlayer(50, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); fleeing = true; timeToStartFlee = Time.time; startingToFlee = true; } lastTimeAttacked = Time.time; } } [ClientRpc] public void PlaySampleClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2658930220u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2658930220u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { PlaySample(); } } } [ServerRpc] public void PlaySampleServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1219689617u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1219689617u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { PlaySampleClientRpc(); } } public void PlaySample() { AudioClip sample = SkinwalkerPersistent.Instance.GetSample(); base.creatureVoice.PlayOneShot(sample); lastSpoke = Time.time; } public void ChooseClosestNodeToPlayer() { //IL_0032: 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_0069: 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_010f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)base.targetNode == (Object)null) { base.targetNode = base.allAINodes[0].transform; } Transform val = ((EnemyAI)this).ChooseClosestNodeToPosition(((Component)base.targetPlayer).transform.position, true, 0); if ((Object)(object)val != (Object)null) { base.targetNode = val; } float num = Vector3.Distance(((Component)base.targetPlayer).transform.position, ((Component)this).transform.position); if (num - base.mostOptimalDistance < 0.1f && (!((EnemyAI)this).PathIsIntersectedByLineOfSight(((Component)base.targetPlayer).transform.position, true, true) || num < 3f)) { if (base.pathDistance > 10f && !ignoredNodes.Contains(base.targetNode) && ignoredNodes.Count < 4) { ignoredNodes.Add(base.targetNode); } base.movingTowardsTargetPlayer = true; } else { ((EnemyAI)this).SetDestinationToPosition(base.targetNode.position, false); } } [ClientRpc] public void SetSuitClientRpc(int suitId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1123682967u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, suitId); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1123682967u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { SetSuit(suitId); } } } public void SetSuit(int suitId) { Material suitMaterial = StartOfRound.Instance.unlockablesList.unlockables[suitId].suitMaterial; ((Renderer)rendererLOD0).material = suitMaterial; ((Renderer)rendererLOD1).material = suitMaterial; ((Renderer)rendererLOD2).material = suitMaterial; } public void GetMaterialStandingOn() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) enemyRay = new Ray(((Component)this).transform.position + Vector3.up, -Vector3.up); if (!Physics.Raycast(enemyRay, ref enemyRayHit, 6f, StartOfRound.Instance.walkableSurfacesMask, (QueryTriggerInteraction)1) || ((Component)((RaycastHit)(ref enemyRayHit)).collider).CompareTag(StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].surfaceTag)) { return; } for (int i = 0; i < StartOfRound.Instance.footstepSurfaces.Length; i++) { if (((Component)((RaycastHit)(ref enemyRayHit)).collider).CompareTag(StartOfRound.Instance.footstepSurfaces[i].surfaceTag)) { currentFootstepSurfaceIndex = i; break; } } } public void PlayFootstepSound() { GetMaterialStandingOn(); int num = Random.Range(0, StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips.Length); if (num == previousFootstepClip) { num = (num + 1) % StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips.Length; } movementAudio.pitch = Random.Range(0.93f, 1.07f); float num2 = 0.95f; if (!fleeing) { num2 = 0.75f; } movementAudio.PlayOneShot(StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips[num], num2); previousFootstepClip = num; WalkieTalkie.TransmitOneShotAudio(movementAudio, StartOfRound.Instance.footstepSurfaces[currentFootstepSurfaceIndex].clips[num], num2); } protected override void __initializeVariables() { ((EnemyAI)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_ImposterAI() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(2658930220u, new RpcReceiveHandler(__rpc_handler_2658930220)); NetworkManager.__rpc_func_table.Add(1219689617u, new RpcReceiveHandler(__rpc_handler_1219689617)); NetworkManager.__rpc_func_table.Add(1123682967u, new RpcReceiveHandler(__rpc_handler_1123682967)); } private static void __rpc_handler_2658930220(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((ImposterAI)(object)target).PlaySampleClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1219689617(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_008c: 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_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { target.__rpc_exec_stage = (__RpcExecStage)1; ((ImposterAI)(object)target).PlaySampleServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1123682967(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 suitClientRpc = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref suitClientRpc); target.__rpc_exec_stage = (__RpcExecStage)2; ((ImposterAI)(object)target).SetSuitClientRpc(suitClientRpc); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "ImposterAI"; } } public class SkinwalkerPersistent : MonoBehaviour { private string audioFolder; private List<AudioClip> cachedAudio = new List<AudioClip>(); private float nextTimeToCheckFolder = 30f; private float nextTimeToCheckEnemies = 30f; private const float folderScanInterval = 8f; private const float enemyScanInterval = 5f; public static SkinwalkerPersistent Instance { get; private set; } private void Awake() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) Instance = this; ((Component)this).transform.position = Vector3.zero; Plugin.logger.LogInfo((object)"skinwalker persistent initialized"); audioFolder = Path.Combine(Application.dataPath, "..", "Dissonance_Diagnostics"); EnableRecording(); Plugin.logger.LogInfo((object)audioFolder); if (!Directory.Exists(audioFolder)) { Directory.CreateDirectory(audioFolder); } } private void Update() { if (!(Time.realtimeSinceStartup > nextTimeToCheckFolder)) { return; } nextTimeToCheckFolder = Time.realtimeSinceStartup + 8f; if (!Directory.Exists(audioFolder)) { Plugin.logger.LogInfo((object)("Audio folder not present. Don't worry about it, it will be created automatically when you play with friends. (" + audioFolder + ")")); Directory.CreateDirectory(audioFolder); } string[] files = Directory.GetFiles(audioFolder); Plugin.logger.LogInfo((object)$"Got audio file paths ({files.Length})"); string[] array = files; string[] array2 = array; foreach (string path in array2) { ((MonoBehaviour)this).StartCoroutine(LoadWavFile(path, delegate(AudioClip audioClip) { cachedAudio.Add(audioClip); })); } } private void Start() { try { if (Directory.Exists(audioFolder)) { Directory.Delete(audioFolder, recursive: true); } } catch (Exception ex) { Plugin.logger.LogInfo((object)ex); } } private void OnApplicationQuit() { DisableRecording(); } private void EnableRecording() { DebugSettings.Instance.EnablePlaybackDiagnostics = true; DebugSettings.Instance.RecordFinalAudio = true; } internal IEnumerator LoadWavFile(string path, Action<AudioClip> callback) { UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, (AudioType)20); try { yield return www.SendWebRequest(); if ((int)www.result == 1) { AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www); if (audioClip.length > 0.9f) { callback(audioClip); } try { File.Delete(path); } catch (Exception) { } } } finally { ((IDisposable)www)?.Dispose(); } } private void DisableRecording() { DebugSettings.Instance.EnablePlaybackDiagnostics = false; DebugSettings.Instance.RecordFinalAudio = false; if (Directory.Exists(audioFolder)) { Directory.Delete(audioFolder, recursive: true); } } public AudioClip GetSample() { while (cachedAudio.Count > 200) { cachedAudio.RemoveAt(Random.Range(0, cachedAudio.Count)); } if (cachedAudio.Count > 0) { int index = Random.Range(0, cachedAudio.Count - 1); AudioClip result = cachedAudio[index]; cachedAudio.RemoveAt(index); return result; } return null; } public void ClearCache() { cachedAudio.Clear(); } } [BepInPlugin("camtas.myCustomContent", "My Custom Content", "0.5.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string ModGUID = "camtas.myCustomContent"; public const string ModName = "My Custom Content"; public const string ModVersion = "0.5.0"; public static ManualLogSource logger; public static ConfigFile config; public static bool devMode; private void Awake() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown logger = Logger.CreateLogSource("My Custom Log Source"); config = ((BaseUnityPlugin)this).Config; Utilities.Init(); Config.Load(); Content.Load(); MyCustomContent.Patches.Patches.Load(); GameObject val = new GameObject("MCC Mod Manager"); val.AddComponent<SkinwalkerPersistent>(); ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)val); } } public class Utilities { private static Dictionary<int, int> _masksByLayer; public static void Init() { GenerateLayerMap(); } public static void GenerateLayerMap() { _masksByLayer = new Dictionary<int, int>(); for (int i = 0; i < 32; i++) { int num = 0; for (int j = 0; j < 32; j++) { if (!Physics.GetIgnoreLayerCollision(i, j)) { num |= 1 << j; } } _masksByLayer.Add(i, num); } } public static int MaskForLayer(int layer) { return _masksByLayer[layer]; } public static void LoadPrefab(string name, Vector3 position) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) if (Content.Prefabs.ContainsKey(name)) { Plugin.logger.LogInfo((object)("Loading prefab " + name)); GameObject val = Object.Instantiate<GameObject>(Content.Prefabs[name], position, Quaternion.identity); val.GetComponent<NetworkObject>().Spawn(false); } else { Plugin.logger.LogWarning((object)("Prefab " + name + " not found!")); } } public static void TeleportPlayer(int playerObj, Vector3 teleportPos) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerObj]; if (Object.op_Implicit((Object)(object)Object.FindObjectOfType<AudioReverbPresets>())) { Object.FindObjectOfType<AudioReverbPresets>().audioPresets[2].ChangeAudioReverbForPlayer(val); } val.isInElevator = false; val.isInHangarShipRoom = false; val.isInsideFactory = true; val.averageVelocity = 0f; val.velocityLastFrame = Vector3.zero; StartOfRound.Instance.allPlayerScripts[playerObj].TeleportPlayer(teleportPos, false, 0f, false, true); StartOfRound.Instance.allPlayerScripts[playerObj].beamOutParticle.Play(); if ((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) { HUDManager.Instance.ShakeCamera((ScreenShakeType)1); } } public static IEnumerator TeleportPlayerBody(int playerObj, Vector3 teleportPosition) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) float startTime = Time.realtimeSinceStartup; yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance.allPlayerScripts[playerObj].deadBody != (Object)null || Time.realtimeSinceStartup - startTime > 2f)); if (StartOfRound.Instance.inShipPhase || SceneManager.sceneCount <= 1) { yield break; } DeadBodyInfo deadBody = StartOfRound.Instance.allPlayerScripts[playerObj].deadBody; if ((Object)(object)deadBody != (Object)null) { deadBody.attachedTo = null; deadBody.attachedLimb = null; deadBody.secondaryAttachedLimb = null; deadBody.secondaryAttachedTo = null; if ((Object)(object)deadBody.grabBodyObject != (Object)null && deadBody.grabBodyObject.isHeld && (Object)(object)deadBody.grabBodyObject.playerHeldBy != (Object)null) { deadBody.grabBodyObject.playerHeldBy.DropAllHeldItems(true, false); } deadBody.isInShip = false; deadBody.parentedToShip = false; ((Component)deadBody).transform.SetParent((Transform)null, true); deadBody.SetRagdollPositionSafely(teleportPosition, true); } } public static void TeleportEnemy(EnemyAI enemy, Vector3 teleportPos) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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) enemy.serverPosition = teleportPos; ((Component)enemy).transform.position = teleportPos; enemy.agent.Warp(teleportPos); enemy.SyncPositionToClients(); } public static void CreateExplosion(Vector3 explosionPosition, bool spawnExplosionEffect = false, int damage = 20, float minDamageRange = 0f, float maxDamageRange = 1f, int enemyHitForce = 6, CauseOfDeath causeOfDeath = 3, PlayerControllerB attacker = null) { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: 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) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0101: 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_02ee: 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_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"Spawning explosion at pos: {explosionPosition}"); Transform val = null; if ((Object)(object)RoundManager.Instance != (Object)null && (Object)(object)RoundManager.Instance.mapPropsContainer != (Object)null && (Object)(object)RoundManager.Instance.mapPropsContainer.transform != (Object)null) { val = RoundManager.Instance.mapPropsContainer.transform; } if (spawnExplosionEffect) { Object.Instantiate<GameObject>(StartOfRound.Instance.explosionPrefab, explosionPosition, Quaternion.Euler(-90f, 0f, 0f), val).SetActive(true); } float num = Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, explosionPosition); if (num < 14f) { HUDManager.Instance.ShakeCamera((ScreenShakeType)1); } else if (num < 25f) { HUDManager.Instance.ShakeCamera((ScreenShakeType)0); } Collider[] array = Physics.OverlapSphere(explosionPosition, maxDamageRange, 2621448, (QueryTriggerInteraction)2); PlayerControllerB val2 = null; for (int i = 0; i < array.Length; i++) { float num2 = Vector3.Distance(explosionPosition, ((Component)array[i]).transform.position); if (num2 > 4f && Physics.Linecast(explosionPosition, ((Component)array[i]).transform.position + Vector3.up * 0.3f, 256, (QueryTriggerInteraction)1)) { continue; } if (((Component)array[i]).gameObject.layer == 3) { val2 = ((Component)array[i]).gameObject.GetComponent<PlayerControllerB>(); if ((Object)(object)val2 != (Object)null && ((NetworkBehaviour)val2).IsOwner) { float num3 = 1f - Mathf.Clamp01((num2 - minDamageRange) / (maxDamageRange - minDamageRange)); val2.DamagePlayer((int)((float)damage * num3), true, true, causeOfDeath, 0, false, default(Vector3)); } } else if (((Component)array[i]).gameObject.layer == 21) { Landmine componentInChildren = ((Component)array[i]).gameObject.GetComponentInChildren<Landmine>(); if ((Object)(object)componentInChildren != (Object)null && !componentInChildren.hasExploded && num2 < 6f) { Debug.Log((object)"Setting off other mine"); } } else if (((Component)array[i]).gameObject.layer == 19) { EnemyAICollisionDetect componentInChildren2 = ((Component)array[i]).gameObject.GetComponentInChildren<EnemyAICollisionDetect>(); if ((Object)(object)componentInChildren2 != (Object)null && ((NetworkBehaviour)componentInChildren2.mainScript).IsOwner && num2 < 4.5f) { componentInChildren2.mainScript.HitEnemyOnLocalClient(enemyHitForce, default(Vector3), attacker, false); } } } int num4 = ~LayerMask.GetMask(new string[1] { "Room" }); num4 = ~LayerMask.GetMask(new string[1] { "Colliders" }); array = Physics.OverlapSphere(explosionPosition, 10f, num4); for (int j = 0; j < array.Length; j++) { Rigidbody component = ((Component)array[j]).GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.AddExplosionForce(70f, explosionPosition, 10f); } } } } } namespace MyCustomContent.Patches { public class Miscellaneous { public static void Load() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Expected O, but got Unknown //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Expected O, but got Unknown Hook val = new Hook((MethodBase)typeof(Object).GetMethod("Instantiate", new Type[3] { typeof(Object), typeof(Transform), typeof(bool) }), typeof(Miscellaneous).GetMethod("InstantiateOPI")); Hook val2 = new Hook((MethodBase)typeof(Object).GetMethod("Instantiate", new Type[2] { typeof(Object), typeof(Transform) }), typeof(Miscellaneous).GetMethod("InstantiateOP")); Hook val3 = new Hook((MethodBase)typeof(Object).GetMethod("Instantiate", new Type[1] { typeof(Object) }), typeof(Miscellaneous).GetMethod("InstantiateO")); Hook val4 = new Hook((MethodBase)typeof(Object).GetMethod("Instantiate", new Type[3] { typeof(Object), typeof(Vector3), typeof(Quaternion) }), typeof(Miscellaneous).GetMethod("InstantiateOPR")); Hook val5 = new Hook((MethodBase)typeof(Object).GetMethod("Instantiate", new Type[4] { typeof(Object), typeof(Vector3), typeof(Quaternion), typeof(Transform) }), typeof(Miscellaneous).GetMethod("InstantiateOPRP")); } public static Object InstantiateOPI(Func<Object, Transform, bool, Object> orig, Object original, Transform parent, bool instantiateInWorldSpace) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown Object val = orig(original, parent, instantiateInWorldSpace); if (val != (Object)null && val is GameObject) { GameObject val2 = (GameObject)val; Collider[] componentsInChildren = val2.GetComponentsInChildren<Collider>(); foreach (Collider val3 in componentsInChildren) { if (!((Object)(object)((Component)val3).gameObject.GetComponent<RootMarker>() != (Object)null)) { RootMarker rootMarker = ((Component)val3).gameObject.AddComponent<RootMarker>(); rootMarker.root = val2.transform; } } } return val; } public static Object InstantiateOP(Func<Object, Transform, Object> orig, Object original, Transform parent) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown Object val = orig(original, parent); if (val != (Object)null && val is GameObject) { GameObject val2 = (GameObject)val; Collider[] componentsInChildren = val2.GetComponentsInChildren<Collider>(); foreach (Collider val3 in componentsInChildren) { if (!((Object)(object)((Component)val3).gameObject.GetComponent<RootMarker>() != (Object)null)) { RootMarker rootMarker = ((Component)val3).gameObject.AddComponent<RootMarker>(); rootMarker.root = val2.transform; } } } return val; } public static Object InstantiateO(Func<Object, Object> orig, Object original) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown Object val = orig(original); if (val != (Object)null && val is GameObject) { GameObject val2 = (GameObject)val; Collider[] componentsInChildren = val2.GetComponentsInChildren<Collider>(); foreach (Collider val3 in componentsInChildren) { if (!((Object)(object)((Component)val3).gameObject.GetComponent<RootMarker>() != (Object)null)) { RootMarker rootMarker = ((Component)val3).gameObject.AddComponent<RootMarker>(); rootMarker.root = val2.transform; } } } return val; } public static Object InstantiateOPR(Func<Object, Vector3, Quaternion, Object> orig, Object original, Vector3 position, Quaternion rotation) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown Object val = orig(original, position, rotation); if (val != (Object)null && val is GameObject) { GameObject val2 = (GameObject)val; Collider[] componentsInChildren = val2.GetComponentsInChildren<Collider>(); foreach (Collider val3 in componentsInChildren) { if (!((Object)(object)((Component)val3).gameObject.GetComponent<RootMarker>() != (Object)null)) { RootMarker rootMarker = ((Component)val3).gameObject.AddComponent<RootMarker>(); rootMarker.root = val2.transform; } } } return val; } public static Object InstantiateOPRP(Func<Object, Vector3, Quaternion, Transform, Object> orig, Object original, Vector3 position, Quaternion rotation, Transform parent) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown Object val = orig(original, position, rotation, parent); if (val != (Object)null && val is GameObject) { GameObject val2 = (GameObject)val; Collider[] componentsInChildren = val2.GetComponentsInChildren<Collider>(); foreach (Collider val3 in componentsInChildren) { if (!((Object)(object)((Component)val3).gameObject.GetComponent<RootMarker>() != (Object)null)) { RootMarker rootMarker = ((Component)val3).gameObject.AddComponent<RootMarker>(); rootMarker.root = val2.transform; } } } return val; } private static void StartOfRound_Start(orig_Start orig, StartOfRound self) { orig.Invoke(self); SelectableLevel[] levels = self.levels; foreach (SelectableLevel val in levels) { val.spawnableScrap.RemoveAll((SpawnableItemWithRarity scrap) => ((Object)scrap.spawnableItem).name == "dingus"); } self.allItemsList.itemsList.RemoveAll((Item item) => ((Object)item).name == "dingus"); } } public class Patches { public static void Load() { SaveData.Init(); } } } namespace MyCustomContent.MonoBehaviours { public class CustomNetworkTransform : NetworkBehaviour { public bool syncPosition = true; public bool syncRotation = true; public bool syncScale = true; public float positionDiffLimit = 0.1f; public float rotationDiffLimit = 0.1f; public float scaleDiffLimit = 0.1f; public bool lerpPosition = true; public bool lerpRotation = true; public bool lerpScale = true; public float positionLerpSpeed = 10f; public float rotationLerpSpeed = 10f; public float scaleLerpSpeed = 10f; private Vector3 _lastPosition; private Vector3 _lastRotation; private Vector3 _lastScale; private Vector3 _targetPosition; private Quaternion _targetRotation; private Vector3 _targetScale; public void FixedUpdate() { //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_014f: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_018b: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: 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) if (((NetworkBehaviour)this).IsServer) { if (syncPosition && Vector3.Distance(((Component)this).transform.position, _lastPosition) > positionDiffLimit) { _lastPosition = ((Component)this).transform.position; UpdatePositionClientRpc(((Component)this).transform.position); } if (syncRotation && Quaternion.Angle(Quaternion.Euler(((Component)this).transform.eulerAngles), Quaternion.Euler(_lastRotation)) > rotationDiffLimit) { _lastRotation = ((Component)this).transform.eulerAngles; UpdateRotationClientRpc(((Component)this).transform.eulerAngles); } if (syncScale && Vector3.Distance(((Component)this).transform.localScale, _lastScale) > scaleDiffLimit) { _lastScale = ((Component)this).transform.localScale; UpdateScaleClientRpc(((Component)this).transform.localScale); } } else { if (lerpPosition) { ((Component)this).transform.position = Vector3.Lerp(((Component)this).transform.position, _targetPosition, Time.fixedDeltaTime * positionLerpSpeed); } if (lerpRotation) { ((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, _targetRotation, Time.fixedDeltaTime * rotationLerpSpeed); } if (lerpScale) { ((Component)this).transform.localScale = Vector3.Lerp(((Component)this).transform.localScale, _targetScale, Time.fixedDeltaTime * scaleLerpSpeed); } } } [ClientRpc] public void UpdatePositionClientRpc(Vector3 position) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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 != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3523576079u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref position); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3523576079u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && !((NetworkBehaviour)this).IsServer && syncPosition) { if (lerpPosition) { _targetPosition = position; } else { ((Component)this).transform.position = position; } } } [ClientRpc] public void UpdateRotationClientRpc(Vector3 rotation) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: 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 != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1681321577u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref rotation); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1681321577u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && !((NetworkBehaviour)this).IsServer && syncRotation) { if (lerpRotation) { _targetRotation = Quaternion.Euler(rotation); } else { ((Component)this).transform.rotation = Quaternion.Euler(rotation); } } } [ClientRpc] public void UpdateScaleClientRpc(Vector3 scale) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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 != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1994939058u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref scale); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1994939058u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && !((NetworkBehaviour)this).IsServer && syncScale) { if (lerpScale) { _targetScale = scale; } else { ((Component)this).transform.localScale = scale; } } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_CustomNetworkTransform() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(3523576079u, new RpcReceiveHandler(__rpc_handler_3523576079)); NetworkManager.__rpc_func_table.Add(1681321577u, new RpcReceiveHandler(__rpc_handler_1681321577)); NetworkManager.__rpc_func_table.Add(1994939058u, new RpcReceiveHandler(__rpc_handler_1994939058)); } private static void __rpc_handler_3523576079(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 position = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref position); target.__rpc_exec_stage = (__RpcExecStage)2; ((CustomNetworkTransform)(object)target).UpdatePositionClientRpc(position); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1681321577(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 rotation = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref rotation); target.__rpc_exec_stage = (__RpcExecStage)2; ((CustomNetworkTransform)(object)target).UpdateRotationClientRpc(rotation); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1994939058(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 scale = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref scale); target.__rpc_exec_stage = (__RpcExecStage)2; ((CustomNetworkTransform)(object)target).UpdateScaleClientRpc(scale); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "CustomNetworkTransform"; } } public class RootMarker : MonoBehaviour { public Transform root; } public abstract class SaveableNetworkBehaviour : NetworkBehaviour { public int uniqueId = 0; public abstract void SaveObjectData(); public abstract void LoadObjectData(); protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } protected internal override string __getTypeName() { return "SaveableNetworkBehaviour"; } } public abstract class SaveableObject : GrabbableObject { public int uniqueId = 0; public override void LoadItemSaveData(int saveData) { ((GrabbableObject)this).LoadItemSaveData(saveData); uniqueId = saveData; } public override int GetItemDataToSave() { return uniqueId; } public virtual void Awake() { if (((NetworkBehaviour)this).IsHost) { uniqueId = Random.Range(0, 1000000); Plugin.logger.LogInfo((object)"This is where it screws up"); SaveableNetworkBehaviour[] componentsInChildren = ((Component)((Component)this).transform).GetComponentsInChildren<SaveableNetworkBehaviour>(); SaveableNetworkBehaviour[] array = componentsInChildren; foreach (SaveableNetworkBehaviour saveableNetworkBehaviour in array) { saveableNetworkBehaviour.uniqueId = uniqueId; } } } public abstract void SaveObjectData(); public abstract void LoadObjectData(); protected override void __initializeVariables() { ((GrabbableObject)this).__initializeVariables(); } protected internal override string __getTypeName() { return "SaveableObject"; } } } namespace MyCustomContent.Extensions { public static class AssemblyExtensions { public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly) { try { return assembly.GetTypes(); } catch (ReflectionTypeLoadException ex) { return ex.Types.Where((Type t) => t != null); } } } } namespace MyCustomMod.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }