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 MapHazardsMoves v1.0.2
MapHazardsMoves.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using MapHazardsMoves.Patches; using MapHazardsMoves.Scripts; using MapHazardsMoves.Utils; using Microsoft.CodeAnalysis; using StaticNetcodeLib; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] [assembly: AssemblyCompany("MapHazardsMoves")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("MapHazardsMoves")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+4c9c4e97d1295b3c83314755c794c4afa66cd326")] [assembly: AssemblyProduct("MapHazardsMoves")] [assembly: AssemblyTitle("MapHazardsMoves")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MapHazardsMoves { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("wexop.maphazardsmoves", "MapHazardsMoves", "1.0.2")] public class MapHazardsMoves : BaseUnityPlugin { private const string GUID = "wexop.maphazardsmoves"; private const string NAME = "MapHazardsMoves"; private const string VERSION = "1.0.2"; public static MapHazardsMoves instance; public Dictionary<ulong, HazardObject> HazardsObjects = new Dictionary<ulong, HazardObject>(); public ConfigEntry<float> randomPercentChanceEntry; public ConfigEntry<float> minMovementDistanceEntry; public ConfigEntry<float> maxMovementDistanceEntry; public ConfigEntry<float> minMovementDelayEntry; public ConfigEntry<float> maxMovementDelayEntry; public ConfigEntry<float> landmineSpeedEntry; public ConfigEntry<bool> landmineEnabledEntry; public ConfigEntry<float> turretSpeedEntry; public ConfigEntry<bool> turretEnabledEntry; public ConfigEntry<float> spikeTrapSpeedEntry; public ConfigEntry<bool> spikeTrapEnabledEntry; public ConfigEntry<bool> enablePlayerDetectionEntry; public ConfigEntry<float> playerDetectionSpeedEntry; public ConfigEntry<float> playerDetectionDelayEntry; public ConfigEntry<float> playerDetectionDistanceEntry; public ConfigEntry<bool> enableCoilHeadModeEntry; public ConfigEntry<bool> enableDevLogsEntry; private void Awake() { instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)"MapHazardsMoves starting...."); randomPercentChanceEntry = ((BaseUnityPlugin)this).Config.Bind<float>("General", "ChanceOfMovement", 100f, "The chance for a map hazard to be able to walk. 0% is never, 100% is always. No need to restart the game :)"); CreateFloatConfig(randomPercentChanceEntry, 0f, 100f); minMovementDistanceEntry = ((BaseUnityPlugin)this).Config.Bind<float>("General", "minMovementDistance", 5f, "The minimum distance that hazard can walk to. No need to restart the game :)"); CreateFloatConfig(minMovementDistanceEntry, 0f, 100f); maxMovementDistanceEntry = ((BaseUnityPlugin)this).Config.Bind<float>("General", "maxMovementDistance", 15f, "The maximum distance that hazard can walk to. No need to restart the game :)"); CreateFloatConfig(maxMovementDistanceEntry, 0f, 100f); minMovementDelayEntry = ((BaseUnityPlugin)this).Config.Bind<float>("General", "minMovementDelay", 10f, "The minimum delay between each hazard movement. No need to restart the game :)"); CreateFloatConfig(minMovementDelayEntry, 0f, 100f); maxMovementDelayEntry = ((BaseUnityPlugin)this).Config.Bind<float>("General", "maxMovementDelay", 30f, "The maximum delay between each hazard movement. No need to restart the game :)"); CreateFloatConfig(maxMovementDelayEntry, 1f, 300f); landmineEnabledEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("LandMine", "landmineEnabled", true, "Enable landmines to move. No need to restart the game :)"); CreateBoolConfig(landmineEnabledEntry); landmineSpeedEntry = ((BaseUnityPlugin)this).Config.Bind<float>("LandMine", "landmineSpeed", 4f, "Landmines movement speed. No need to restart the game :)"); CreateFloatConfig(landmineSpeedEntry, 1f, 100f); turretEnabledEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("Turret", "turretEnabled", true, "Enable turrets to move. No need to restart the game :)"); CreateBoolConfig(turretEnabledEntry); turretSpeedEntry = ((BaseUnityPlugin)this).Config.Bind<float>("Turret", "turretSpeed", 4f, "Turrets movement speed . No need to restart the game :)"); CreateFloatConfig(turretSpeedEntry, 1f, 100f); spikeTrapEnabledEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("SpikeTrap", "spikeTrapEnabled", true, "Enable spike traps to move. No need to restart the game :)"); CreateBoolConfig(spikeTrapEnabledEntry); spikeTrapSpeedEntry = ((BaseUnityPlugin)this).Config.Bind<float>("SpikeTrap", "spikeTrapSpeed", 4f, "Spike traps movement speed. No need to restart the game :)"); CreateFloatConfig(spikeTrapSpeedEntry, 1f, 100f); enablePlayerDetectionEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("PlayerDetection", "EnablePlayerDetection", false, "Enable hazards to detect a player and run into it. No need to restart the game :)"); CreateBoolConfig(enablePlayerDetectionEntry); playerDetectionSpeedEntry = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerDetection", "playerDetectionSpeed", 8f, "Speed of hazards when they run into a player. No need to restart the game :)"); CreateFloatConfig(playerDetectionSpeedEntry, 1f, 100f); playerDetectionDelayEntry = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerDetection", "playerDetectionDelay", 20f, "Delay before an hazard can detect a player again. No need to restart the game :)"); CreateFloatConfig(playerDetectionDelayEntry, 1f, 180f); playerDetectionDistanceEntry = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerDetection", "playerDetectionDistance", 8f, "Distance of the player detection. No need to restart the game :)"); CreateFloatConfig(playerDetectionDistanceEntry, 1f, 100f); enableCoilHeadModeEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("Other", "CoilHeadMode", false, "Hazards stop walking when a player look at it. To have a behavior like coil heads, you can enable playerDetection ! No need to restart the game :)"); CreateBoolConfig(enableCoilHeadModeEntry); enableDevLogsEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("Dev", "enableLogs", false, "Enable dev logs. No need to restart the game :)"); CreateBoolConfig(enableDevLogsEntry); Harmony.CreateAndPatchAll(typeof(LandminePatch), (string)null); Harmony.CreateAndPatchAll(typeof(SpikeRoofTrapPatch), (string)null); Harmony.CreateAndPatchAll(typeof(TurretPatch), (string)null); Harmony.CreateAndPatchAll(typeof(RoundManagerPatch), (string)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"MapHazardsMoves is patched!"); } public void RegisterHazardObject(ulong networkId, MapHazardTypes mapHazardType = MapHazardTypes.Other) { bool flag = false; float num = Random.Range(0f, 100f); bool canWalk = !(randomPercentChanceEntry.Value < num); NetworkHazardsMoves.RegisterObjectClientRpc(networkId, canWalk, mapHazardType); } public float GetNewTimer() { return Random.Range(minMovementDelayEntry.Value, maxMovementDelayEntry.Value); } public Vector3 GetNewPos(Vector3 pos) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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) float value = minMovementDistanceEntry.Value; float value2 = maxMovementDistanceEntry.Value; float num = Random.Range(value, value2); float num2 = Random.Range(value, value2); if (Random.Range(0, 2) == 1) { num *= -1f; } if (Random.Range(0, 2) == 1) { num2 *= -1f; } return pos + new Vector3(num, 0f, num2); } public void OnUpdateHazardObject(ulong networkId, float speed, Vector3 position) { //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) if (!instance.HazardsObjects.ContainsKey(networkId)) { if (enableDevLogsEntry.Value) { Debug.LogError((object)$"No HazardObject found with networkId {networkId}"); } return; } HazardObject hazardObject = instance.HazardsObjects[networkId]; if (hazardObject == null) { if (enableDevLogsEntry.Value) { Debug.LogError((object)$"HazardObject is null for networkId {networkId}"); } } else { if (!hazardObject.canWalk) { return; } bool flag = instance.CheckIfPlayerLook(hazardObject); if (hazardObject.isStopped != flag) { hazardObject.isStopped = flag; NetworkHazardsMoves.ChangeHazardMovementStateClientRpc(networkId, flag); if (flag) { hazardObject.detectPlayerTimer = 0.5f; hazardObject.moveTimer = 0.5f; } } if (hazardObject.detectPlayerTimer > 0f) { hazardObject.detectPlayerTimer -= Time.deltaTime; } if (hazardObject.moveTimer > 0f) { hazardObject.moveTimer -= Time.deltaTime; return; } bool flag2 = false; hazardObject.moveTimer = instance.GetNewTimer(); Vector3 newPos = instance.GetNewPos(position); bool flag3 = false; NetworkHazardsMoves.OnUpdateObjectClientRpc(networkId, newPos, speed); } } public bool CheckIfPlayerLook(HazardObject hazardObject) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) bool result = false; if (!enableCoilHeadModeEntry.Value || hazardObject == null) { return false; } for (int i = 0; i < 4; i++) { if (StartOfRound.Instance.allPlayerScripts[i].HasLineOfSightToPosition(hazardObject.GetCenterPosition(), 68f, 60, -1f) && Vector3.Distance(((Component)StartOfRound.Instance.allPlayerScripts[i].gameplayCamera).transform.position, hazardObject.gameObject.transform.position) > 0.3f) { hazardObject.navMeshAgent.isStopped = true; result = true; } } return result; } private void CreateFloatConfig(ConfigEntry<float> configEntry, float min = 0f, float max = 30f) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown FloatSliderOptions val = new FloatSliderOptions(); ((BaseRangeOptions<float>)val).Min = min; ((BaseRangeOptions<float>)val).Max = max; ((BaseOptions)val).RequiresRestart = false; FloatSliderConfigItem val2 = new FloatSliderConfigItem(configEntry, val); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2); } private void CreateBoolConfig(ConfigEntry<bool> configEntry) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown BoolCheckBoxConfigItem val = new BoolCheckBoxConfigItem(configEntry, new BoolCheckBoxOptions { RequiresRestart = false }); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val); } } public static class PluginInfo { public const string PLUGIN_GUID = "MapHazardsMoves"; public const string PLUGIN_NAME = "MapHazardsMoves"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace MapHazardsMoves.Utils { public class HazardObject { public bool canWalk; public GameObject gameObject; public NavMeshAgent navMeshAgent; public DetectPlayer detectPlayer; public float moveTimer; public float detectPlayerTimer; public bool isStopped; public Vector3 centerPos = Vector3.up * 1.6f; public MapHazardTypes mapHazardType = MapHazardTypes.Other; public void Init() { //IL_001f: 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_002e: Unknown result type (might be due to invalid IL or missing references) if (mapHazardType == MapHazardTypes.SpikeTrap) { centerPos = new Vector3(0f, 1f, 1f) * 1.6f; } } public Vector3 GetCenterPosition() { //IL_000c: 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_001f: Unknown result type (might be due to invalid IL or missing references) return gameObject.transform.position + centerPos; } } public enum MapHazardTypes { SpikeTrap, Turret, Landmine, Other } [StaticNetcode] public class NetworkHazardsMoves { [ClientRpc] public static void RegisterObjectClientRpc(ulong networkID, bool canWalk, MapHazardTypes mapHazardType = MapHazardTypes.Other) { List<NetworkObject> list = Object.FindObjectsByType<NetworkObject>((FindObjectsSortMode)0).ToList(); NetworkObject val = list.Find((NetworkObject e) => e.NetworkObjectId == networkID); if ((Object)(object)val == (Object)null) { if (MapHazardsMoves.instance.enableDevLogsEntry.Value) { Debug.Log((object)$"OBJECT NOT FOUND {networkID}"); } return; } NavMeshAgent navMeshAgent = ((Component)val).gameObject.AddComponent<NavMeshAgent>(); DetectPlayer detectPlayer = ((Component)val).gameObject.AddComponent<DetectPlayer>(); SphereCollider val2 = ((Component)val).gameObject.AddComponent<SphereCollider>(); val2.radius = MapHazardsMoves.instance.playerDetectionDistanceEntry.Value; ((Collider)val2).isTrigger = true; HazardObject hazardObject = new HazardObject(); hazardObject.canWalk = canWalk; hazardObject.gameObject = ((Component)val).gameObject; hazardObject.moveTimer = 0f; hazardObject.detectPlayerTimer = 0f; hazardObject.navMeshAgent = navMeshAgent; hazardObject.navMeshAgent.height = 3.3f; hazardObject.navMeshAgent.radius = 1f; hazardObject.detectPlayer = detectPlayer; hazardObject.detectPlayer.networkId = networkID; hazardObject.mapHazardType = mapHazardType; hazardObject.Init(); MapHazardsMoves.instance.HazardsObjects.Add(networkID, hazardObject); if (MapHazardsMoves.instance.enableDevLogsEntry.Value) { Debug.Log((object)$"OBJECT ADDED {((Object)val).name} WITH ID {networkID} CAN WALK {canWalk}"); } } [ClientRpc] public static void OnUpdateObjectClientRpc(ulong networkId, Vector3 newPos, float speed) { //IL_0085: Unknown result type (might be due to invalid IL or missing references) bool flag = false; if (!MapHazardsMoves.instance.HazardsObjects.ContainsKey(networkId)) { Debug.LogError((object)$"No HazardObject found with networkId {networkId}"); return; } HazardObject hazardObject = MapHazardsMoves.instance.HazardsObjects[networkId]; if (hazardObject != null && hazardObject.canWalk && !((Object)(object)hazardObject.navMeshAgent == (Object)null)) { hazardObject.navMeshAgent.speed = speed; hazardObject.navMeshAgent.SetDestination(newPos); if (MapHazardsMoves.instance.enableDevLogsEntry.Value) { Debug.Log((object)("HAZARD MOVED " + ((Object)hazardObject.gameObject).name)); } } } public static void OnPlayerDetected(ulong networkId, Vector3 newPos) { //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) if (!MapHazardsMoves.instance.enablePlayerDetectionEntry.Value) { return; } if (!MapHazardsMoves.instance.HazardsObjects.ContainsKey(networkId)) { Debug.LogError((object)$"No HazardObject found with networkId {networkId}"); return; } HazardObject hazardObject = MapHazardsMoves.instance.HazardsObjects[networkId]; if (hazardObject != null && !(hazardObject.detectPlayerTimer > 0f)) { hazardObject.detectPlayerTimer = MapHazardsMoves.instance.playerDetectionDelayEntry.Value; hazardObject.moveTimer = MapHazardsMoves.instance.GetNewTimer(); OnUpdateObjectClientRpc(networkId, newPos, MapHazardsMoves.instance.playerDetectionSpeedEntry.Value); if (MapHazardsMoves.instance.enableDevLogsEntry.Value) { Debug.Log((object)$"PLAYER DETECTED WITH id {networkId} pos: {newPos} FROM {((Object)hazardObject.gameObject).name}"); } } } [ClientRpc] public static void ChangeHazardMovementStateClientRpc(ulong networkId, bool active) { if (!MapHazardsMoves.instance.HazardsObjects.ContainsKey(networkId)) { Debug.LogError((object)$"No HazardObject found with networkId {networkId}"); return; } HazardObject hazardObject = MapHazardsMoves.instance.HazardsObjects[networkId]; if (hazardObject != null) { hazardObject.navMeshAgent.isStopped = active; if (MapHazardsMoves.instance.enableDevLogsEntry.Value) { Debug.Log((object)$"HAZARD MOVEMENT STATE UPDATED TO {active} FOR {((Object)hazardObject.gameObject).name}"); } } } } } namespace MapHazardsMoves.Scripts { public class DetectPlayer : MonoBehaviour { public ulong? networkId = null; private void OnTriggerStay(Collider other) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (((Component)other).CompareTag("Player") && networkId.HasValue) { _ = ((Component)other).gameObject.transform.position; if (true && NetworkManager.Singleton.IsServer) { NetworkHazardsMoves.OnPlayerDetected(networkId.Value, ((Component)other).gameObject.transform.position); } } } } } namespace MapHazardsMoves.Patches { [HarmonyPatch(typeof(Landmine))] public class LandminePatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void StartPatch(Landmine __instance) { if (((NetworkBehaviour)__instance).IsServer) { MapHazardsMoves.instance.RegisterHazardObject(((NetworkBehaviour)__instance).NetworkObjectId, MapHazardTypes.Landmine); } } [HarmonyPatch("Update")] [HarmonyPostfix] private static void UpdatePatch(Landmine __instance) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) _ = ((NetworkBehaviour)__instance).NetworkObjectId; if (0 == 0 && ((NetworkBehaviour)__instance).IsServer && MapHazardsMoves.instance.landmineEnabledEntry.Value) { MapHazardsMoves.instance.OnUpdateHazardObject(((NetworkBehaviour)__instance).NetworkObjectId, MapHazardsMoves.instance.landmineSpeedEntry.Value, ((Component)__instance).gameObject.transform.position); } } } [HarmonyPatch(typeof(RoundManager))] public class RoundManagerPatch { [HarmonyPatch("LoadNewLevel")] [HarmonyPrefix] private static void LoadLevelPatch(RoundManager __instance) { MapHazardsMoves.instance.HazardsObjects.Clear(); if (MapHazardsMoves.instance.enableDevLogsEntry.Value) { Debug.Log((object)"MAP HAZARDS OBJECTS CLEANED"); } } } [HarmonyPatch(typeof(SpikeRoofTrap))] public class SpikeRoofTrapPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void StartPatch(SpikeRoofTrap __instance) { if (((NetworkBehaviour)__instance).IsServer) { MapHazardsMoves.instance.RegisterHazardObject(((NetworkBehaviour)__instance).NetworkObjectId, MapHazardTypes.SpikeTrap); } } [HarmonyPatch("Update")] [HarmonyPostfix] private static void UpdatePatch(SpikeRoofTrap __instance) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) _ = ((NetworkBehaviour)__instance).NetworkObjectId; if (0 == 0 && ((NetworkBehaviour)__instance).IsServer && MapHazardsMoves.instance.spikeTrapEnabledEntry.Value) { MapHazardsMoves.instance.OnUpdateHazardObject(((NetworkBehaviour)__instance).NetworkObjectId, MapHazardsMoves.instance.spikeTrapSpeedEntry.Value, ((Component)__instance).gameObject.transform.position); } } } [HarmonyPatch(typeof(Turret))] public class TurretPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void StartPatch(Turret __instance) { if (((NetworkBehaviour)__instance).IsServer) { MapHazardsMoves.instance.RegisterHazardObject(((NetworkBehaviour)__instance).NetworkObjectId, MapHazardTypes.Turret); } } [HarmonyPatch("Update")] [HarmonyPostfix] private static void UpdatePatch(Turret __instance) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) _ = ((NetworkBehaviour)__instance).NetworkObjectId; if (0 == 0 && ((NetworkBehaviour)__instance).IsServer && MapHazardsMoves.instance.turretEnabledEntry.Value) { MapHazardsMoves.instance.OnUpdateHazardObject(((NetworkBehaviour)__instance).NetworkObjectId, MapHazardsMoves.instance.turretSpeedEntry.Value, ((Component)__instance).gameObject.transform.position); } } } }