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 FindItemsForQuota v1.2.3
FindItemsForQuota5/FindItemsForQuotaBepin5.dll
Decompiled 2 years 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.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using FindItemsForQuotaBepin5.Networking; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Collections; using Unity.Netcode; 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(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("FindItemsForQuotaBepin5")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("My first plugin")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("FindItemsForQuotaBepin5")] [assembly: AssemblyTitle("FindItemsForQuotaBepin5")] [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 FindItemsForQuotaBepin5 { internal class FindItemsForQuotaBepin5Config { private readonly ConfigFile Config; public Dictionary<string, ConfigEntry<bool>> Filter; private readonly List<string> GeneralItems; private readonly List<string> SpecialItems; public FindItemsForQuotaBepin5Config(ConfigFile File) { Config = File; GeneralItems = new List<string>(new <>z__ReadOnlyArray<string>(new string[21] { "PerfumeBottle", "LaserPointer", "FancyLamp", "RedSodaCan", "FancyGlass", "MagnifyingGlass", "Dentures", "Mug", "Painting", "TragedyMask", "RobotToy", "FancyRing", "HandBell", "Hairdryer", "Magic7Ball", "ComedyMask", "OldPhone", "Airhorn", "ToyCube", "BinFullOfBottles", "Hairbrush" })); SpecialItems = new List<string>(new <>z__ReadOnlyArray<string>(new string[8] { "PickleJar", "LungApparatusTurnedOff", "GoldBar", "RedLocustHive", "ShotgunItem", "RubberDucky", "CashRegisterItem", "KnifeItem" })); base..ctor(); } public void RegisterOptions() { Filter = new Dictionary<string, ConfigEntry<bool>>(); foreach (string generalItem in GeneralItems) { Filter.Add(generalItem, Config.Bind<bool>("Filter", generalItem, false, "Decides if the mod should filter (until no longer possible) this item.")); } foreach (string specialItem in SpecialItems) { Filter.Add(specialItem, Config.Bind<bool>("Filter", specialItem, true, "Decides if the mod should filter (until no longer possible) this item.")); } } } [BepInPlugin("Rbmukthegreat.FindItemsForQuotaMod", "Find Items For Quota Mod", "1.2.3")] public class Plugin : BaseUnityPlugin { private const string modGUID = "Rbmukthegreat.FindItemsForQuotaMod"; private const string modName = "Find Items For Quota Mod"; private const string modVersion = "1.2.3"; internal static FindItemsForQuotaBepin5Config ConfigInstance; private readonly Harmony harmony = new Harmony("Rbmukthegreat.FindItemsForQuotaMod"); internal static ManualLogSource Log; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin FindItemsForQuotaBepin5 is loaded!"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Current version: 1.0.0"); ConfigInstance = new FindItemsForQuotaBepin5Config(((BaseUnityPlugin)this).Config); ConfigInstance.RegisterOptions(); harmony.PatchAll(Assembly.GetExecutingAssembly()); } } internal class Przydatek { public static List<int> PrzydatekFast(List<int> a, int B) { int num = a.Count(); if (num == 0) { return null; } Random r = new Random(Guid.NewGuid().GetHashCode()); List<int> result = new List<int>(new int[num]); int num2 = B; for (int i = 0; i < 40; i++) { int delta_curr = B; List<int> x = new List<int>(new int[num]); foreach (int item in from y in Enumerable.Range(0, num) orderby r.Next() select y) { if (a[item] <= delta_curr) { x[item] = 1; delta_curr -= a[item]; } } List<int> list = (from index in x.Select((int value, int index) => (value == 1) ? index : (-1)) where index != -1 select index).ToList(); foreach (int item2 in from y in Enumerable.Range(0, list.Count()) orderby r.Next() select y) { int index2 = list[item2]; if (delta_curr == 0) { break; } IEnumerable<(int, int)> enumerable = from valueIndexPair in a.Select((int al, int l) => (x[l] == 0 && 0 < al - a[index2] && al - a[index2] <= delta_curr) ? (al, l) : (0, -1)) where valueIndexPair.Item2 != -1 select valueIndexPair; if (enumerable.Any()) { int index3 = MaxIndex(enumerable); delta_curr -= a[index3] - a[index2]; x[index3] = 1; x[index2] = 0; } } if (delta_curr < num2) { result = x; num2 = delta_curr; } if (num2 == 0) { break; } } return result; } private static int MaxIndex(IEnumerable<(int, int)> T) { int num = int.MinValue; int result = -1; foreach (var (num2, num3) in T) { if (num2 > num) { num = num2; result = num3; } } return result; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "FindItemsForQuotaBepin5"; public const string PLUGIN_NAME = "FindItemsForQuotaBepin5"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace FindItemsForQuotaBepin5.Patches { [HarmonyPatch] internal class FindItemsForQuotaPatcher { private static readonly ManualLogSource Log = Plugin.Log; private static GameObject _ship; private static int Credits; private static int ProfitQuota => TimeOfDay.Instance.profitQuota; private static int QuotaFulfilled => TimeOfDay.Instance.quotaFulfilled; private static SelectableLevel CurrentLevel => StartOfRound.Instance?.currentLevel; private static PlayerControllerB Player => StartOfRound.Instance?.localPlayerController; private static bool ShipLanded => StartOfRound.Instance.shipHasLanded; [HarmonyPatch(typeof(Terminal), "Start")] [HarmonyPostfix] private static void UpdateCreditsStart(int ___groupCredits) { Credits = ___groupCredits; } [HarmonyPatch(typeof(Terminal), "BuyItemsServerRpc")] [HarmonyPostfix] private static void UpdateCreditsAfterPurchase(int ___groupCredits) { Credits = ___groupCredits; } [HarmonyPatch(typeof(HUDManager), "AddTextToChatOnServer")] [HarmonyPostfix] private static void GetText(string chatMessage) { Log.LogMessage((object)chatMessage); string[] array = chatMessage.Split(new char[1] { ' ' }); if (array.Length >= 2) { if (array[0] == ".find" && int.TryParse(array[1], out var result)) { FindItems(null, result); } else if (array[0] == ".find" && (array[1].ToLower() == "rend" || array[1].ToLower() == "art")) { FindItems(array[1], 0); } } } [HarmonyPatch(typeof(StartOfRound), "openingDoorsSequence")] [HarmonyPostfix] private static void LogShipLanded() { ((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(LogShipLandedCoroutine()); } private static IEnumerator LogShipLandedCoroutine() { yield return (object)new WaitForSeconds(21.05f); Log.LogMessage((object)"Ship has landed!"); } private static void FindItems(string moon, int target) { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)CurrentLevel)) { Log.LogMessage((object)"Scene hasn't loaded yet!"); return; } if (!ShipLanded) { Log.LogMessage((object)"Ship hasn't landed yet!"); return; } if (CurrentLevel.levelID != 3) { Log.LogMessage((object)"Not at company building!"); return; } int num = CalculateMoneyNeeded(moon, target); Log.LogMessage((object)$"Money needed: {num}"); List<GrabbableObject> loot2 = GetLoot(num); Vector3 position = default(Vector3); ((Vector3)(ref position))..ctor(-27.95f, -2.62f, -31.36f); ((Component)Player).transform.position = position; List<int> subset = Przydatek.PrzydatekFast(loot2.Select((GrabbableObject loot) => loot.scrapValue).ToList(), num); Log.LogMessage((object)$"Total items being sold: {subset.Sum()}"); loot2 = loot2.Where((GrabbableObject loot, int index) => subset[index] == 1).ToList(); TeleportObjects(loot2); } private static List<GrabbableObject> GetLoot(int moneyNeeded) { if (!Object.op_Implicit((Object)(object)_ship)) { _ship = GameObject.Find("/Environment/HangarShip"); } string Clone = "(Clone)"; List<GrabbableObject> list = (from obj in _ship.GetComponentsInChildren<GrabbableObject>() where obj.itemProperties.isScrap && !(obj is RagdollGrabbableObject) && ((Object)obj).name.Substring(0, ((Object)obj).name.Count() - Clone.Count()) != "GiftBox" select obj).ToList(); List<GrabbableObject> list2 = list.Where((GrabbableObject loot) => IsItemAllowed(((Object)loot).name.Substring(0, ((Object)loot).name.Count() - Clone.Count()), Plugin.ConfigInstance.Filter)).ToList(); if (list2.Select((GrabbableObject loot) => loot.scrapValue).Sum() > moneyNeeded) { list = list2; } return list; } private static int CalculateMoneyNeeded(string moon, int totalNeeded) { if (moon != null) { int num = ((moon == "rend") ? 550 : 1500); return Mathf.Max(NeedToSell(num - Credits), ProfitQuota - QuotaFulfilled); } return (NeedToSell(totalNeeded) < totalNeeded) ? NeedToSell(totalNeeded) : totalNeeded; } private static int NeedToSell(int target) { int num = 15; return Mathf.CeilToInt(1f / 6f * (float)(5 * (target + num) + ProfitQuota - QuotaFulfilled)); } private static bool IsItemAllowed(string item, Dictionary<string, ConfigEntry<bool>> Filter) { ConfigEntry<bool> value; return !Filter.TryGetValue(item, out value) || !value.Value; } private static void TeleportObjects(List<GrabbableObject> loot) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) foreach (GrabbableObject item in loot) { DropItemAt(item, ((Component)Player).transform.position); } int num = loot.Select((GrabbableObject loot) => loot.scrapValue).Sum(); Log.LogMessage((object)$"Total sold: {num}"); } private static void DropItemAt(GrabbableObject item, Vector3 position) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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) NetworkFunctions.NetworkingObjectManager.MakeObjectFallClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)item).NetworkObject), position, Quaternion.identity); } } } namespace FindItemsForQuotaBepin5.Networking { internal class NetworkFunctions { public class NetworkingObjectManager : NetworkBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static HandleNamedMessageDelegate <>9__3_0; internal void <NetworkManagerInit>b__3_0(ulong senderClientId, FastBufferReader reader) { //IL_001c: 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) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) if (senderClientId != Player.playerClientId) { NetworkObjectReference val = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref val, default(ForNetworkSerializable)); Vector3 placementPosition = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementPosition); Quaternion placementRotation = default(Quaternion); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementRotation); NetworkObject val2 = default(NetworkObject); if (((NetworkObjectReference)(ref val)).TryGet(ref val2, (NetworkManager)null)) { GrabbableObject component = ((Component)val2).GetComponent<GrabbableObject>(); MakeObjectFall(component, placementPosition, placementRotation); } } } } public static void MakeObjectFall(GrabbableObject obj, Vector3 placementPosition, Quaternion placementRotation) { //IL_000c: 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_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) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) ((Component)obj).gameObject.transform.SetPositionAndRotation(placementPosition, placementRotation); obj.hasHitGround = false; obj.startFallingPosition = placementPosition; obj.floorYRot = -1; if ((Object)(object)((Component)obj).transform.parent != (Object)null) { obj.startFallingPosition = ((Component)obj).transform.parent.InverseTransformPoint(obj.startFallingPosition); } obj.FallToGround(false); obj.floorYRot = -1; } [ClientRpc] public static void MakeObjectFallClientRpc(NetworkObjectReference obj, Vector3 placementPosition, Quaternion placementRotation) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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_0090: Unknown result type (might be due to invalid IL or missing references) NetworkManager singleton = NetworkManager.Singleton; if (singleton == null || !singleton.IsListening) { return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(256, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<NetworkObjectReference>(ref obj, default(ForNetworkSerializable)); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementPosition); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementRotation); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("MakeObjectFall", val, (NetworkDelivery)2); NetworkObject val2 = default(NetworkObject); if (((NetworkObjectReference)(ref obj)).TryGet(ref val2, (NetworkManager)null)) { GrabbableObject obj2 = default(GrabbableObject); if (((Component)val2).TryGetComponent<GrabbableObject>(ref obj2)) { MakeObjectFall(obj2, placementPosition, placementRotation); } else { Log.LogError((object)"Failed to get grabbable object ref from network object - ClientRpc"); } } } [ServerRpc] public static void MakeObjectFallServerRpc(NetworkObjectReference obj, Vector3 placementPosition, Quaternion placementRotation) { //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Invalid comparison between Unknown and I4 //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) NetworkManager singleton = NetworkManager.Singleton; if ((Object)(object)singleton == (Object)null) { Log.LogError((object)"Network Manager == null"); return; } if (!singleton.IsListening) { Log.LogError((object)"Network Manager not listening"); return; } if (((NetworkBehaviour)Player).OwnerClientId != singleton.LocalClientId) { if ((int)singleton.LogLevel <= 1) { Log.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(256, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<NetworkObjectReference>(ref obj, default(ForNetworkSerializable)); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementPosition); ((FastBufferWriter)(ref val)).WriteValueSafe(ref placementRotation); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("MakeObjectFall", val, (NetworkDelivery)2); NetworkObject val2 = default(NetworkObject); if (((NetworkObjectReference)(ref obj)).TryGet(ref val2, (NetworkManager)null)) { GrabbableObject obj2 = default(GrabbableObject); if (((Component)val2).TryGetComponent<GrabbableObject>(ref obj2)) { MakeObjectFall(obj2, placementPosition, placementRotation); } else { Log.LogError((object)"Failed to get grabbable object ref from network object - ServerRpc"); } } } public static void NetworkManagerInit() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown Log.LogMessage((object)"Registering named message"); CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager; object obj = <>c.<>9__3_0; if (obj == null) { HandleNamedMessageDelegate val = delegate(ulong senderClientId, FastBufferReader reader) { //IL_001c: 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) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) if (senderClientId != Player.playerClientId) { NetworkObjectReference val2 = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref val2, default(ForNetworkSerializable)); Vector3 placementPosition = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementPosition); Quaternion placementRotation = default(Quaternion); ((FastBufferReader)(ref reader)).ReadValueSafe(ref placementRotation); NetworkObject val3 = default(NetworkObject); if (((NetworkObjectReference)(ref val2)).TryGet(ref val3, (NetworkManager)null)) { GrabbableObject component = ((Component)val3).GetComponent<GrabbableObject>(); MakeObjectFall(component, placementPosition, placementRotation); } } }; <>c.<>9__3_0 = val; obj = (object)val; } customMessagingManager.RegisterNamedMessageHandler("MakeObjectFall", (HandleNamedMessageDelegate)obj); } [ClientRpc] public static void RunClientRpc(NetworkObjectReference obj, Vector3 placementPosition, Quaternion placementRotation) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //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) MakeObjectFallServerRpc(obj, placementPosition, placementRotation); } } private static readonly ManualLogSource Log = Plugin.Log; private static PlayerControllerB Player => StartOfRound.Instance?.localPlayerController; } } internal sealed class <>z__ReadOnlyArray<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { int ICollection.Count => _items.Length; 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.Length; T IReadOnlyList<T>.this[int index] => _items[index]; int ICollection<T>.Count => _items.Length; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyArray(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 ((ICollection<T>)_items).Contains(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { ((ICollection<T>)_items).CopyTo(array, arrayIndex); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return ((IList<T>)_items).IndexOf(item); } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } }