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 LastStand v1.0.3
RepoLastStandMod.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using RepoLastStandMod.Utility; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("RepoLastStandMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("RepoLastStandMod")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("3c62d521-f165-4e05-bf57-5cde43a5541d")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] [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 RepoLastStandMod { internal record Prefab(string Name, string Path) { internal GameObject GameObject => Resources.Load<GameObject>(Path); [CompilerGenerated] protected virtual bool PrintMembers(StringBuilder builder) { RuntimeHelpers.EnsureSufficientExecutionStack(); builder.Append("Name = "); builder.Append((object?)Name); builder.Append(", Path = "); builder.Append((object?)Path); return true; } } internal class StateManager { internal bool LastStandActive; internal IEnumerable<ProbabilityItem<Prefab>> PityWeapons; internal static StateManager Instance { get; } = new StateManager(); } [BepInPlugin("umbreon222.repo.laststand", "Repo Last Stand Mod", "1.0.0")] public class RepoLastStandMod : BaseUnityPlugin { [CompilerGenerated] private sealed class <BuildPityWeapons>d__7 : IEnumerable<ProbabilityItem<Prefab>>, IEnumerable, IEnumerator<ProbabilityItem<Prefab>>, IDisposable, IEnumerator { private int <>1__state; private ProbabilityItem<Prefab> <>2__current; private int <>l__initialThreadId; public RepoLastStandMod <>4__this; private ConfigEntry<float> <pistolProbability>5__1; private ConfigEntry<float> <tranquilizerProbability>5__2; private ConfigEntry<float> <ductTapedGrenadeProbability>5__3; private ConfigEntry<float> <grenadeProbability>5__4; private ConfigEntry<float> <shotgunProbability>5__5; private ConfigEntry<float> <baseballBatProbability>5__6; private ConfigEntry<float> <fryingPanProbability>5__7; private ConfigEntry<float> <inflatableHammerProbability>5__8; private ConfigEntry<float> <sledgeHammerProbability>5__9; private ConfigEntry<float> <swordProbability>5__10; private ConfigEntry<float> <explosiveMineProbability>5__11; private ConfigEntry<float> <rubberDuckProbability>5__12; private ConfigEntry<float> <clownBombProbability>5__13; ProbabilityItem<Prefab> IEnumerator<ProbabilityItem<Prefab>>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <BuildPityWeapons>d__7(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { <pistolProbability>5__1 = null; <tranquilizerProbability>5__2 = null; <ductTapedGrenadeProbability>5__3 = null; <grenadeProbability>5__4 = null; <shotgunProbability>5__5 = null; <baseballBatProbability>5__6 = null; <fryingPanProbability>5__7 = null; <inflatableHammerProbability>5__8 = null; <sledgeHammerProbability>5__9 = null; <swordProbability>5__10 = null; <explosiveMineProbability>5__11 = null; <rubberDuckProbability>5__12 = null; <clownBombProbability>5__13 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <pistolProbability>5__1 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "HandgunProbability", 0.15f, "Probability between 0 and 1 of spawning a handgun"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Handgun", "items/Item Gun Handgun"), <pistolProbability>5__1.Value); <>1__state = 1; return true; case 1: <>1__state = -1; <tranquilizerProbability>5__2 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "TranqGunProbability", 0.3f, "Probability between 0 and 1 of spawning a tranq gun"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Tranq Gun", "items/Item Gun Tranq"), <tranquilizerProbability>5__2.Value); <>1__state = 2; return true; case 2: <>1__state = -1; <ductTapedGrenadeProbability>5__3 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "DuctTapedGrenadeProbability", 0.4f, "Probability between 0 and 1 of spawning a duct taped grenade"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Duct Taped Grenade", "items/Item Grenade Duct Taped"), <ductTapedGrenadeProbability>5__3.Value); <>1__state = 3; return true; case 3: <>1__state = -1; <grenadeProbability>5__4 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "GrenadeProbability", 0.5f, "Probability between 0 and 1 of spawning a grenade"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Grenade", "items/Item Grenade Explosive"), <grenadeProbability>5__4.Value); <>1__state = 4; return true; case 4: <>1__state = -1; <shotgunProbability>5__5 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "ShotgunProbability", 0.05f, "Probability between 0 and 1 of spawning a shotgun"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Shotgun", "items/Item Gun Shotgun"), <shotgunProbability>5__5.Value); <>1__state = 5; return true; case 5: <>1__state = -1; <baseballBatProbability>5__6 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "BaseballBatProbability", 0.5f, "Probability between 0 and 1 of spawning a baseball bat"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Baseball Bat", "items/Item Melee Baseball Bat"), <baseballBatProbability>5__6.Value); <>1__state = 6; return true; case 6: <>1__state = -1; <fryingPanProbability>5__7 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "FryingPanProbability", 0.5f, "Probability between 0 and 1 of spawning a frying pan"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Frying Pan", "items/Item Melee Frying Pan"), <fryingPanProbability>5__7.Value); <>1__state = 7; return true; case 7: <>1__state = -1; <inflatableHammerProbability>5__8 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "InflatableHammerProbability", 0.4f, "Probability between 0 and 1 of spawning an inflatable hammer"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Inflatable Hammer", "items/Item Melee Inflatable Hammer"), <inflatableHammerProbability>5__8.Value); <>1__state = 8; return true; case 8: <>1__state = -1; <sledgeHammerProbability>5__9 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "SledgeHammerProbability", 0.3f, "Probability between 0 and 1 of spawning a sledge hammer"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Sledge Hammer", "items/Item Melee Sledge Hammer"), <sledgeHammerProbability>5__9.Value); <>1__state = 9; return true; case 9: <>1__state = -1; <swordProbability>5__10 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "SwordProbability", 0.3f, "Probability between 0 and 1 of spawning a sword"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Sword", "items/Item Melee Sword"), <swordProbability>5__10.Value); <>1__state = 10; return true; case 10: <>1__state = -1; <explosiveMineProbability>5__11 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "ExplosiveMineProbability", 0.5f, "Probability between 0 and 1 of spawning an explosive mine"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Mine", "items/Item Mine Explosive"), <explosiveMineProbability>5__11.Value); <>1__state = 11; return true; case 11: <>1__state = -1; <rubberDuckProbability>5__12 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "RubberDuckProbability", 0.01f, "Probability between 0 and 1 of spawning a rubber duck"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Rubber Duck", "items/Item Rubber Duck"), <rubberDuckProbability>5__12.Value); <>1__state = 12; return true; case 12: <>1__state = -1; <clownBombProbability>5__13 = ((BaseUnityPlugin)<>4__this).Config.Bind<float>("General", "ValuableClownProbability", 0.1f, "Probability between 0 and 1 of spawning a valuable clown"); <>2__current = new ProbabilityItem<Prefab>(new Prefab("Valuable Clown", "valuables/03 medium/Valuable Clown"), <clownBombProbability>5__13.Value); <>1__state = 13; return true; case 13: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<ProbabilityItem<Prefab>> IEnumerable<ProbabilityItem<Prefab>>.GetEnumerator() { <BuildPityWeapons>d__7 result; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; result = this; } else { result = new <BuildPityWeapons>d__7(0) { <>4__this = <>4__this }; } return result; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<ProbabilityItem<Prefab>>)this).GetEnumerator(); } } private const string pluginGuid = "umbreon222.repo.laststand"; private const string pluginName = "Repo Last Stand Mod"; private const string pluginVersion = "1.0.0"; internal static ManualLogSource LoggerInstance; private readonly Harmony _harmony = new Harmony("umbreon222.repo.laststand"); public void Awake() { LoggerInstance = ((BaseUnityPlugin)this).Logger; InitializeState(); _harmony.PatchAll(); LoggerInstance.LogInfo((object)"Repo Last Stand Mod has loaded!"); } private void InitializeState() { StateManager.Instance.LastStandActive = false; StateManager instance = StateManager.Instance; List<ProbabilityItem<Prefab>> list = new List<ProbabilityItem<Prefab>>(); list.AddRange(BuildPityWeapons()); instance.PityWeapons = new <>z__ReadOnlyList<ProbabilityItem<Prefab>>(list); } [IteratorStateMachine(typeof(<BuildPityWeapons>d__7))] private IEnumerable<ProbabilityItem<Prefab>> BuildPityWeapons() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <BuildPityWeapons>d__7(-2) { <>4__this = this }; } } } namespace RepoLastStandMod.Patches { [HarmonyPatch(typeof(PhysGrabObjectImpactDetector))] public static class PhysGrabObjectImpactDetectorPatches { [HarmonyPatch("BreakRPC")] [HarmonyPostfix] public static void BreakRPCPostfix() { if (SemiFunc.RunIsLevel()) { AfterValuableObjectBreak(); } } private static void AfterValuableObjectBreak() { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) int internalHaulGoal = RoundDirector.instance.GetInternalHaulGoal(); int num = internalHaulGoal / RoundDirector.instance.GetInternalExtractionPoints(); int num2 = RoundDirector.instance.GetInternalExtractionPointsCompleted() * num; float levelValuablesValue = GetLevelValuablesValue(); float num3 = levelValuablesValue + (float)num2; bool flag = num3 >= (float)internalHaulGoal; RepoLastStandMod.LoggerInstance.LogInfo((object)$"Can still extract: {flag}"); if (flag || StateManager.Instance.LastStandActive) { RepoLastStandMod.LoggerInstance.LogDebug((object)"Round is still completable or last stand is already active"); return; } StateManager.Instance.LastStandActive = true; RepoLastStandMod.LoggerInstance.LogInfo((object)"Last stand activated!"); SemiFunc.UIBigMessage("LAST STAND ACTIVATED", "{!}", 25f, Color.red, Color.red); SemiFunc.UIFocusText("Not enough loot to complete the level! Take your last stand!", Color.red, Color.red, 3f); Prefab prefab = ProbabilitySelector.SelectRandomItem(StateManager.Instance.PityWeapons); if ((object)prefab == null) { RepoLastStandMod.LoggerInstance.LogError((object)"Couldn't randomly select a pity weapon. Are probabilities all 0?"); return; } RepoLastStandMod.LoggerInstance.LogInfo((object)("Rolled a \"" + prefab.Name + "\" as a pity weapon; Spawning...")); if (!SemiFunc.IsMasterClientOrSingleplayer()) { RepoLastStandMod.LoggerInstance.LogError((object)("Failed to spawn \"" + prefab.Name + "\". You are not the host.")); return; } Vector3 val = ((Component)PlayerController.instance).transform.position + ((Component)PlayerController.instance).transform.up + ((Component)PlayerController.instance).transform.forward; if (SemiFunc.IsMultiplayer()) { PhotonNetwork.InstantiateRoomObject(prefab.Path, val, ((Component)PlayerController.instance).transform.rotation, (byte)0, (object[])null); } else { Object.Instantiate<GameObject>(prefab.GameObject, val, ((Component)PlayerController.instance).transform.rotation); } GameDirector.instance.CameraImpact.ShakeDistance(3f, 3f, 8f, val, 0.1f); GameDirector.instance.CameraShake.ShakeDistance(3f, 3f, 8f, val, 0.1f); } private static float GetLevelValuablesValue() { return Object.FindObjectsOfType<ValuableObject>().Aggregate(0f, (float sum, ValuableObject valuable) => sum + valuable.dollarValueCurrent); } } [HarmonyPatch(typeof(RoundDirector))] public static class RoundDirectorPatches { [HarmonyPatch("StartRoundLogic")] [HarmonyPrefix] public static void StartRoundLogicPrefix(int value) { StateManager.Instance.LastStandActive = false; } } } namespace RepoLastStandMod.Utility { internal record ProbabilityItem<T>(T Item, double Probability); internal static class ProbabilitySelector { private static readonly Random _random = new Random(); public static T SelectRandomItem<T>(IEnumerable<ProbabilityItem<T>> items) { if (items == null || !items.Any()) { return default(T); } double num = items.Sum((ProbabilityItem<T> i) => i.Probability); if (num <= 0.0) { return default(T); } double num2 = _random.NextDouble() * num; double num3 = 0.0; foreach (ProbabilityItem<T> item in items) { num3 += item.Probability; if (num2 <= num3) { return item.Item; } } return items.Last().Item; } } internal static class Extensions { public static int GetInternalHaulGoal(this RoundDirector roundDirector) { FieldInfo field = typeof(RoundDirector).GetField("haulGoal", BindingFlags.Instance | BindingFlags.NonPublic); return (int)field.GetValue(roundDirector); } public static int GetInternalExtractionPoints(this RoundDirector roundDirector) { FieldInfo field = typeof(RoundDirector).GetField("extractionPoints", BindingFlags.Instance | BindingFlags.NonPublic); return (int)field.GetValue(roundDirector); } public static int GetInternalExtractionPointsCompleted(this RoundDirector roundDirector) { FieldInfo field = typeof(RoundDirector).GetField("extractionPointsCompleted", BindingFlags.Instance | BindingFlags.NonPublic); return (int)field.GetValue(roundDirector); } } } namespace System.Runtime.CompilerServices { internal static class IsExternalInit { } } [CompilerGenerated] internal sealed class <>z__ReadOnlyList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { int ICollection.Count => _items.Count; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => _items.Count; T IReadOnlyList<T>.this[int index] => _items[index]; int ICollection<T>.Count => _items.Count; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyList(List<T> items) { _items = items; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { ((ICollection)_items).CopyTo(array, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return ((IList)_items).Contains(value); } int IList.IndexOf(object value) { return ((IList)_items).IndexOf(value); } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return ((IEnumerable<T>)_items).GetEnumerator(); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return _items.Contains(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { _items.CopyTo(array, arrayIndex); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return _items.IndexOf(item); } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } }