using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JLL.Components; using JLLConfigurator.Modules; using JLLConfigurator.Patches; using JLLConfigurator.Utils; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Tomatobird.JLLConfigurator")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("0.1.0.0")] [assembly: AssemblyInformationalVersion("0.1.0+987f5271c313ec1e8838e19ec65fa5832c997a62")] [assembly: AssemblyProduct("JLLConfigurator")] [assembly: AssemblyTitle("Tomatobird.JLLConfigurator")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 JLLConfigurator { [BepInPlugin("Tomatobird.JLLConfigurator", "JLLConfigurator", "0.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class JLLConfigurator : BaseUnityPlugin { internal static JRandomPropPlacerModule jRandomPropPlacerModule; internal static ConfigFile config; public static JLLConfigurator Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; config = ((BaseUnityPlugin)this).Config; jRandomPropPlacerModule = new JRandomPropPlacerModule(((BaseUnityPlugin)this).Config); Patch(); Logger.LogInfo((object)"Tomatobird.JLLConfigurator v0.1.0 has loaded!"); } internal static void Patch() { //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_0018: Expected O, but got Unknown if (Harmony == null) { Harmony = new Harmony("Tomatobird.JLLConfigurator"); } Logger.LogDebug((object)"Patching..."); jRandomPropPlacerModule.TryPatch(Harmony, typeof(JRandomPropPlacerPatcher)); Logger.LogDebug((object)"Finished patching!"); } internal static void Unpatch() { Logger.LogDebug((object)"Unpatching..."); Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } Logger.LogDebug((object)"Finished unpatching!"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Tomatobird.JLLConfigurator"; public const string PLUGIN_NAME = "JLLConfigurator"; public const string PLUGIN_VERSION = "0.1.0"; } } namespace JLLConfigurator.Utils { internal class CurveUtil { internal static AnimationCurve CreateCurve(string s) { //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) string[] array = s.Split(';'); if (array.Length == 1 && float.TryParse(array[0], out var result)) { return AnimationCurve.Constant(0f, 1f, result); } List list = new List(); string[] array2 = array; foreach (string text in array2) { string[] array3 = text.Split(","); if (array3.Length == 2) { string s2 = array3[0].Trim(); string s3 = array3[1].Trim(); if (float.TryParse(s2, out var result2) && float.TryParse(s3, out var result3)) { list.Add(new Keyframe(result2, result3)); } } else if (array3.Length == 6) { string s4 = array3[0].Trim(); string s5 = array3[1].Trim(); string s6 = array3[2].Trim(); string s7 = array3[3].Trim(); string s8 = array3[4].Trim(); string s9 = array3[5].Trim(); if (float.TryParse(s4, out var result4) && float.TryParse(s5, out var result5) && float.TryParse(s6, out var result6) && float.TryParse(s7, out var result7) && float.TryParse(s8, out var result8) && float.TryParse(s9, out var result9)) { list.Add(new Keyframe(result4, result5, result6, result7, result8, result9)); } } } return new AnimationCurve(list.ToArray()); } internal static string CurveToString(AnimationCurve curve) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) List list = new List(); if (curve == null || curve.length == 0) { return ""; } Keyframe[] keys = curve.keys; for (int i = 0; i < keys.Length; i++) { Keyframe val = keys[i]; string item = $"{((Keyframe)(ref val)).time},{((Keyframe)(ref val)).value},{((Keyframe)(ref val)).inTangent},{((Keyframe)(ref val)).outTangent},{((Keyframe)(ref val)).inWeight},{((Keyframe)(ref val)).outWeight};"; list.Add(item); } string text = ""; foreach (string item2 in list) { text += item2; } return text.TrimEnd(';'); } } } namespace JLLConfigurator.Patches { [HarmonyPatch(typeof(JRandomPropPlacer))] internal class JRandomPropPlacerPatcher { [HarmonyPatch("SpawnProps")] [HarmonyPrefix] internal static bool SpawnProps_Prefix(JRandomPropPlacer __instance) { //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) if (JLLConfigurator.jRandomPropPlacerModule.DisableSpawning.Value) { JLLConfigurator.Logger.LogInfo((object)"JRandomPropPlacer blocked from spawnning props."); return false; } if (__instance.spawnableProps == null) { return true; } SpawnableProp[] spawnableProps = __instance.spawnableProps; foreach (SpawnableProp val in spawnableProps) { if (val != null && !((Object)(object)val.prefabToSpawn == (Object)null)) { if (!JRandomPropPlacerModule.ConfigCache.TryGetValue(((Object)val.prefabToSpawn).name, out JRandomPropPlacerModule.PropSetSettings value)) { JLLConfigurator.Logger.LogDebug((object)("Generating configs for " + ((Object)val.prefabToSpawn).name)); value = new JRandomPropPlacerModule.PropSetSettings(JLLConfigurator.config, val); JRandomPropPlacerModule.ConfigCache.Add(((Object)val.prefabToSpawn).name, value); } val.randomAmount = CurveUtil.CreateCurve(value.randomAmount.Value); val.prefabWidth = value.prefabWidth.Value; val.spawnRotation = value.spawnRotation.Value; val.spawnFlushAgainstWall = value.spawnFlushAgainstWall.Value; val.distanceFromEntrances = value.distanceFromEntrances.Value; val.distanceBetweenSpawns = value.distanceBetweenSpawns.Value; val.randomSpawnRange = value.randomSpawnRange.Value; } } return true; } } } namespace JLLConfigurator.Modules { internal abstract class ConfigModule { public ConfigEntry Enabled; public string Name { get; } internal ConfigModule(ConfigFile config, string moduleName) { Name = moduleName; Enabled = config.Bind("General", "Enable" + moduleName + "Config", true, "Enable configuration of " + moduleName + "?"); BindSettings(config); } internal abstract void BindSettings(ConfigFile config); public void TryPatch(Harmony harmony, Type patchClass) { if (Enabled.Value) { JLLConfigurator.Logger.LogDebug((object)("Patching " + patchClass.Name)); harmony.PatchAll(patchClass); } } } internal class JRandomPropPlacerModule : ConfigModule { internal class PropSetSettings { public ConfigEntry randomAmount; public ConfigEntry prefabWidth; public ConfigEntry spawnRotation; public ConfigEntry spawnFlushAgainstWall; public ConfigEntry distanceFromEntrances; public ConfigEntry distanceBetweenSpawns; public ConfigEntry randomSpawnRange; public PropSetSettings(ConfigFile config, SpawnableProp prop) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) string text = "JRandomPropPlacer.Prop." + ((Object)prop.prefabToSpawn).name; randomAmount = config.Bind(text, "RandomAmount", CurveUtil.CurveToString(prop.randomAmount), "The randomizer curve used to randomize how many props should spawn. Values are evaluated from 0 to 1. Ex: 0,5 ; 0.5,5 ; 1,10 for a curve with first half flat at value 5 then linear increase to value 15 on other half. You can type in a single constant value as well. Ex: 10 You can also define in/out tangets and weights for each key like so: 0.4,0.2,1.1,2,0.4,0.6 (Check Keyframe declaration in unity documentation!)"); prefabWidth = config.Bind(text, "PrefabWidth", prop.prefabWidth, "Define width of the prefab."); spawnRotation = config.Bind(text, "SpawnRotation", prop.spawnRotation, "Define spawn rotation."); spawnFlushAgainstWall = config.Bind(text, "SpawnFlushAgainstWall", prop.spawnFlushAgainstWall, "Should prop spawn flush against wall?"); distanceFromEntrances = config.Bind(text, "DistanceFromEntrances", prop.distanceFromEntrances, "Define distance from entrances."); distanceBetweenSpawns = config.Bind(text, "DistanceBetweenSpawns", prop.distanceBetweenSpawns, "Define distance between sapawns."); randomSpawnRange = config.Bind(text, "RandomSpawnRange", prop.randomSpawnRange, "Define random spawn range."); } } public static Dictionary ConfigCache = new Dictionary(); public ConfigEntry DisableSpawning { get; private set; } = null; public JRandomPropPlacerModule(ConfigFile config) : base(config, "JRandomPropPlacer") { } internal override void BindSettings(ConfigFile config) { DisableSpawning = config.Bind(base.Name, "DisableSpawning", false, "Should JRandomPropPlacer be allowed to spawn objects? Setting this on effectively disables JRandomPropPlacer."); } } }