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 Economy Mod v1.0.7
LethalCompanyEconomyMod.dll
Decompiled 7 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; 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 GameNetcodeStuff; using HarmonyLib; using LethalNetworkAPI; using LethalNetworkAPI.Utils; using TMPro; 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("LethalCompanyEconomyMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LethalCompanyEconomyMod")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("11dfcace-cb6f-4ed9-b69c-c5bd5a6e6722")] [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")] namespace LethalCompanyEconomyMod; [BepInPlugin("com.raalplay.lethalcompanyeconomy", "EconomyMod", "1.0.7")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class EconomyMod : BaseUnityPlugin { private static class EconomyModPatches { public static class ModConfig { public static ConfigEntry<float> EventProbability { get; private set; } public static ConfigEntry<float> NextExecutionMin { get; private set; } public static ConfigEntry<float> NextExecutionMax { get; private set; } public static void LoadConfig(ConfigFile config) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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 //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown EventProbability = config.Bind<float>("General", "Event Probability", 1f, new ConfigDescription("Probability (0.0 to 1.0) of the event occurring.", (AcceptableValueBase)null, Array.Empty<object>())); NextExecutionMin = config.Bind<float>("Timing", "Next Execution Minimum", 70f, new ConfigDescription("Minimum time (in seconds) before the next execution.", (AcceptableValueBase)null, Array.Empty<object>())); NextExecutionMax = config.Bind<float>("Timing", "Next Execution Maximum", 300f, new ConfigDescription("Maximum time (in seconds) before the next execution.", (AcceptableValueBase)null, Array.Empty<object>())); } public static float GetNextExecutionTime() { return Random.Range(NextExecutionMin.Value, NextExecutionMax.Value); } } [HarmonyPatch(typeof(StartOfRound), "StartGame")] public static class StartOfRound_StartGame_Patch { [CompilerGenerated] private sealed class <<Postfix>g__Event|0_0>d : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <<Postfix>g__Event|0_0>d(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; hasInitialized = true; eventProbability = ModConfig.EventProbability.Value; <>2__current = (object)new WaitForSeconds(nextExecution); <>1__state = 1; return true; case 1: <>1__state = -1; if (ProbabilityHelper.Attempt(eventProbability)) { quotaMultiplier = 1f; daysToDeadlineExtension = 0; GenerateEconomicEvent(); LastExecutionTime = DateTime.UtcNow; } nextExecution = Generator.RandomNumber(ModConfig.NextExecutionMin.Value, ModConfig.NextExecutionMax.Value); hasInitialized = false; 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(); } } [HarmonyPostfix] private static void Postfix(ref StartOfRound __instance) { if (LNetworkUtils.IsHostOrServer) { RefreshPlayerList(__instance); if (!hasInitialized) { ((MonoBehaviour)__instance).StartCoroutine(Event()); } } [IteratorStateMachine(typeof(<<Postfix>g__Event|0_0>d))] static IEnumerator Event() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <<Postfix>g__Event|0_0>d(0); } } } public class EconomicEvent { public string message; public float multiplier; public int daysExtension; public bool isRare; public bool isGood; public int quotaChange; public Func<bool> condition; public EconomicEvent(string message, float multiplier, int daysExtension, bool isGood, int quotaChange, Func<bool> condition = null, bool isRare = false) { this.message = message; this.multiplier = multiplier; this.daysExtension = daysExtension; this.isRare = isRare; this.isGood = isGood; this.quotaChange = quotaChange; this.condition = condition; } public bool IsConditionMet() { if (condition == null) { return true; } return condition(); } } [CompilerGenerated] private sealed class <PlayEvent>d__12 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public EconomicEvent economicEvent; private TimeOfDay <timeOfDayInstance>5__1; private int <newProfitQuota>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PlayEvent>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <timeOfDayInstance>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: { <>1__state = -1; HUDManager.Instance.DisplayTip(economicEvent.isGood ? "¡Enhorabuena!" : "¡Malas noticias!", hudMessage.RemoveDiacritics(), !economicEvent.isGood, false, "LC_Tip1"); ShowMessageInChat((economicEvent.isGood ? "¡Enhorabuena!" : "¡Malas noticias!") + "\n" + hudMessage); <timeOfDayInstance>5__1 = TimeOfDay.Instance; <newProfitQuota>5__2 = Mathf.RoundToInt((float)<timeOfDayInstance>5__1.profitQuota * quotaMultiplier); <timeOfDayInstance>5__1.profitQuota = <newProfitQuota>5__2; TimeOfDay obj = <timeOfDayInstance>5__1; obj.timeUntilDeadline += (float)(int)(<timeOfDayInstance>5__1.totalTime * (float)daysToDeadlineExtension); if (economicEvent.quotaChange < 0) { TimeOfDay obj2 = <timeOfDayInstance>5__1; obj2.quotaFulfilled += ((<timeOfDayInstance>5__1.quotaFulfilled >= Mathf.Abs(economicEvent.quotaChange)) ? economicEvent.quotaChange : (<timeOfDayInstance>5__1.quotaFulfilled * -1)); } else { TimeOfDay obj3 = <timeOfDayInstance>5__1; obj3.quotaFulfilled += economicEvent.quotaChange; } if (economicEvent.multiplier != 1f) { <>2__current = (object)new WaitForSeconds(10f); <>1__state = 1; return true; } <timeOfDayInstance>5__1.UpdateProfitQuotaCurrentTime(); break; } case 1: <>1__state = -1; HUDManager.Instance.DisplayNewDeadline(0); break; } Logger.LogInfo((object)"Reseteando cuota y días al inicio de la partida"); 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(); } } [CompilerGenerated] private sealed class <_ShowHUDMessage>d__15 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <_ShowHUDMessage>d__15(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(10f); <>1__state = 1; return true; case 1: <>1__state = -1; HUDManager.Instance.DisplayStatusEffect("Test"); 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(); } } public static float quotaMultiplier = 1f; public static int daysToDeadlineExtension = 0; private static string hudMessage; private static List<string> eventLog = new List<string>(); private static bool hasInitialized = false; private static PlayerControllerB[] playersList; private static DateTime LastExecutionTime = new DateTime(0L); private static float nextExecution = Generator.RandomNumber(ModConfig.NextExecutionMin.Value, ModConfig.NextExecutionMax.Value); private static float eventProbability = ModConfig.EventProbability.Value; public static void EconomicEventReceiveFromServer(EconomicEvent arg1) { ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(PlayEvent(arg1)); } [IteratorStateMachine(typeof(<PlayEvent>d__12))] private static IEnumerator PlayEvent(EconomicEvent economicEvent) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PlayEvent>d__12(0) { economicEvent = economicEvent }; } public static void ShowMessageInChat(string message) { HUDManager.Instance.AddTextToChatOnServer(message, -1); } private static void DisplayGlobalNotification(string displayText) { HUDManager instance = HUDManager.Instance; instance.globalNotificationAnimator.SetTrigger("TriggerNotif"); ((TMP_Text)instance.globalNotificationText).text = displayText; instance.UIAudio.PlayOneShot(instance.globalNotificationSFX); } [IteratorStateMachine(typeof(<_ShowHUDMessage>d__15))] private static IEnumerator _ShowHUDMessage() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <_ShowHUDMessage>d__15(0); } public static string getRandomPlayerName() { return playersList[Random.Range(0, playersList.Length - 1)].playerUsername; } public static PlayerControllerB getRandomPlayer() { return playersList[Random.Range(0, playersList.Length - 1)]; } private static void RefreshPlayerList(StartOfRound __instance) { playersList = __instance.ClientPlayerList.Select((KeyValuePair<ulong, int> x) => __instance.allPlayerScripts[x.Value]).ToArray(); Logger.LogInfo((object)("Random player: " + getRandomPlayer().playerUsername)); } public static void GenerateEconomicEvent() { float num = quotaMultiplier; int num2 = daysToDeadlineExtension; quotaMultiplier = 1f; daysToDeadlineExtension = 0; TimeOfDay timeOfDayInstance = TimeOfDay.Instance; int daysUntilDeadline = (int)(timeOfDayInstance.timeUntilDeadline / timeOfDayInstance.totalTime); GrabbableObject[] source = Object.FindObjectsOfType<GrabbableObject>(); GrabbableObject[] objectsInShipRoom = source.Where((GrabbableObject obj) => obj.isInShipRoom).ToArray(); PlayerControllerB randomPlayer = getRandomPlayer(); PlayerControllerB randomLowHealthPlayer = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.health <= 20)); PlayerControllerB randomTypingChatPlayer = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.isTypingChat)); PlayerControllerB randomDrowningDeadPlayer = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => (int)x.causeOfDeath == 9)); PlayerControllerB randomInTerminalPlayer = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.inTerminalMenu)); PlayerControllerB randomDeadPlayer = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.isPlayerDead)); PlayerControllerB randomSprintingPlayer = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.isSprinting)); PlayerControllerB val = ((IEnumerable<PlayerControllerB>)playersList).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.isPlayerAlone)); List<EconomicEvent> list = new List<EconomicEvent> { new EconomicEvent("La demanda de chatarra ha aumentado. ¡Prepárense para el multón!", 1.5f, 0, isGood: false, 0), new EconomicEvent("La demanda de chatarra ha disminuido. Hoy los jefes se despertaron con buena pata.", 0.7f, 0, isGood: true, Generator.RandomNumber(10, 15), null, isRare: true), new EconomicEvent("Tus jefes están de buen humor. ¡Milagro! Disfruten este breve momento de paz y oren.", 0.9f, 2, isGood: true, 3), new EconomicEvent(getRandomPlayerName() + " ha realizado un trabajo a puerta cerrada con el jefe de la compañía.", 1f, 0, isGood: true, Generator.RandomNumber(5, 15)), new EconomicEvent("Tus jefes están de mal humor. ¡Corran por sus vidas! Y trabajen el doble, que viva la explotación y el capitalismo.", 1.2f, -1, isGood: false, 0, () => daysUntilDeadline >= 3), new EconomicEvent("Un comprador especial con gustos peculiares apareció. ¡A vender!", Generator.RandomNumber(1.1f, 1.5f), 0, isGood: true, Generator.RandomNumber(35, 80)), new EconomicEvent("Problemas técnicos. La máquina de chatarra está en huelga... contra nosotros.", 1.1f, 0, isGood: false, 0), new EconomicEvent("Inflación. Hasta el aire que respiramos es más caro. ¡Y la cuota también!", 1.3f, 0, isGood: false, 0), new EconomicEvent("Deflación. Los precios bajan, pero no se confíen.", 0.8f, 0, isGood: true, 0), new EconomicEvent("Fusión de empresas. ¡Alguien vendió el alma al diablo!.", 2f, 0, isGood: false, 0, () => daysUntilDeadline >= 3, isRare: true), new EconomicEvent("Huelga de trabajadores. ¡¿Huelga, acaso somos los unicos que trabajamos en esta empresa?!.", 1f, -1, isGood: false, 0, () => daysUntilDeadline >= 2), new EconomicEvent("Bono de productividad. Un aplauso para el que no se durmió en el trabajo. Tomen algo extra.", 1f, 0, isGood: true, Generator.RandomNumber(7, 15), null, isRare: true), new EconomicEvent("Inspección sorpresa. ¡¿Quién dejó esto así?! Multa por vivir en un basurero.", 1f, 0, isGood: false, Generator.RandomNumber(-15, -5), () => objectsInShipRoom.Length > 12 && timeOfDayInstance.quotaFulfilled >= 15), new EconomicEvent("Mercado saturado. Los precios de la chatarra cayeron... ¡¿Nos vamos a declarar en bancarrota?!", 1.5f, 0, isGood: false, 0, () => daysUntilDeadline >= 2), new EconomicEvent("Nuevo competidor. Esa nueva compañía de chatarra nos está quitando el negocio. ¡¿Qué vamos a hacer?!", 1f, -1, isGood: false, 0, () => daysUntilDeadline >= 2), new EconomicEvent("Subvención gubernamental. ¡El tío Sam nos echa una mano!.", 0.9f, 2, isGood: true, Generator.RandomNumber(7, 15), () => daysUntilDeadline <= 2 && timeOfDayInstance.quotaFulfilled < timeOfDayInstance.profitQuota.PercentageOf(50m)), new EconomicEvent("Avería de maquinaria. La máquina dijo 'no' hoy, pero te damos más tiempo para que te recuperes del susto.", 1f, 1, isGood: false, 0), new EconomicEvent("Demanda sin precedentes. ¡La chatarra es el nuevo oro!", 1.55f, 0, isGood: false, 0, () => daysUntilDeadline >= 2), new EconomicEvent("Cambios regulatorios. Parece que alguien no leyó la letra pequeña... ¡Prepárense para las consecuencias!", 1.25f, 0, isGood: false, -45, () => daysUntilDeadline >= 2, isRare: true), new EconomicEvent("Desastre natural. La Madre Naturaleza nos odia. Cuota más alta y menos tiempo. ¡Buena suerte con eso!", 1.45f, -1, isGood: false, -80, () => daysUntilDeadline >= 3, isRare: true), new EconomicEvent("Inversión extranjera. ¡Al parecer alguien decidió lavar dinero con nuestra compañía!.", 0.75f, 0, isGood: true, 50, () => daysUntilDeadline <= 3 && timeOfDayInstance.quotaFulfilled < timeOfDayInstance.profitQuota.PercentageOf(70m), isRare: true), new EconomicEvent("Reorganización interna. Tu cuota se reduce temporalmente. ¡No se acostumbren!", 0.85f, 0, isGood: true, 0, () => daysUntilDeadline >= 2), new EconomicEvent("Robo de material. ¡¿Dónde están nuestros ahorros?!... Y tenemos menos tiempo, genial.", 1f, -1, isGood: false, -90, () => daysUntilDeadline >= 2, isRare: true), new EconomicEvent("Premio a la eficiencia. Sigan así y tal vez les demos una palmadita en la espalda...", 1f, 0, isGood: true, Generator.RandomNumber(2, 15), () => daysUntilDeadline >= 2, isRare: true), new EconomicEvent("Auditoría fiscal. Alguien olvidó declarar sus ganancias. ¡A pagar el pato!", 1f, 0, isGood: false, -65, () => daysUntilDeadline >= 2 && timeOfDayInstance.quotaFulfilled >= 65, isRare: true), new EconomicEvent("Uno de los pasajeros ha evadido impuestos y el gobierno no pudo saber cuál de todos era por lo que ha decidido multar a toda la nave.", 1f, 0, isGood: false, -75, () => daysUntilDeadline >= 2 && timeOfDayInstance.quotaFulfilled >= 75, isRare: true), new EconomicEvent(getRandomPlayerName() + " no se ha bajado correctamente de la nave y ha roto la escalera, habrá que pagar reparación.", 1f, 0, isGood: false, -75, () => daysUntilDeadline >= 2 && timeOfDayInstance.quotaFulfilled >= 75, isRare: true), new EconomicEvent("¡La competencia ha lanzado una campaña de desprestigio! Tu reputación (y tus ganancias) se ven afectadas.", 1.4f, 0, isGood: false, 0, () => daysUntilDeadline >= 2), new EconomicEvent("Se rumorea que un coleccionista excéntrico está buscando chatarra rara. ¡Precios altos si encuentras algo interesante!", 0.75f, 0, isGood: true, 0, () => daysUntilDeadline >= 2, isRare: true), new EconomicEvent("Un error contable inesperado a tu favor...", 1f, 0, isGood: true, Generator.RandomNumber(2, 45), () => daysUntilDeadline <= 3, isRare: true), new EconomicEvent("La galaxia entera está celebrando un festival de reciclaje. ¡La demanda ha aumentado!", 1.2f, 1, isGood: false, 0, () => daysUntilDeadline >= 1), new EconomicEvent("Has encontrado unas facturas que no habias entregado en un rincón remoto de la nave. ¡Es tu día de suerte!", 0.85f, 0, isGood: true, 0, () => daysUntilDeadline <= 2, isRare: true) }; list.AddRange(new EconomicEvent[7] { new EconomicEvent("Mientras todos estaban distraídos " + randomPlayer?.playerUsername + " robo unos tornillos a una familia de ratoncitos que vivían en la fabrica.", 1f, 0, isGood: true, Generator.RandomNumber(5, 15), () => randomPlayer.isInsideFactory), new EconomicEvent($"{randomLowHealthPlayer?.playerUsername} fue diagnosticado con cancer tipo {Random.Range(3, 5)}. Hemos pagado el seguro.", 1f, 0, isGood: true, Generator.RandomNumber(-25, -8), delegate { int result3; if ((Object)(object)randomLowHealthPlayer != (Object)null) { PlayerControllerB obj4 = randomLowHealthPlayer; result3 = ((obj4 != null && obj4.health < 20) ? 1 : 0); } else { result3 = 0; } return (byte)result3 != 0; }), new EconomicEvent(randomLowHealthPlayer?.playerUsername + " ha perdido mucha sangre. Hemos tenido que pagar una transfusión.", 1f, 0, isGood: true, Generator.RandomNumber(-25, -8), delegate { int result2; if ((Object)(object)randomLowHealthPlayer != (Object)null) { PlayerControllerB obj3 = randomLowHealthPlayer; result2 = ((obj3 != null && obj3.health < 20) ? 1 : 0); } else { result2 = 0; } return (byte)result2 != 0; }), new EconomicEvent(randomLowHealthPlayer?.playerUsername + " es el mejor guerrero de dios. La compañía le da un bono por su gran labor.", 1f, 0, isGood: true, Generator.RandomNumber(5, 15), () => (Object)(object)randomLowHealthPlayer != (Object)null), new EconomicEvent("Le hemos cobrado impuestos " + randomTypingChatPlayer?.playerUsername + " por utilizar el chat. Hoy en día ya nada es gratis.", 1f, 0, isGood: true, Generator.RandomNumber(-15, -5), () => (Object)(object)randomTypingChatPlayer != (Object)null), new EconomicEvent("Ha llegado a los oídos del jefe que " + randomDrowningDeadPlayer?.playerUsername + " se le ocurrió vivir como un pececito y no le salió bien. Os han multado.", 1f, 0, isGood: true, Generator.RandomNumber(-25, -10), () => (Object)(object)randomDrowningDeadPlayer != (Object)null), new EconomicEvent(randomInTerminalPlayer?.playerUsername + " ha usado mas electricidad en la Terminal que en su casa jugando este juego. ¡Hora de pagar la luz!", 1f, 0, isGood: true, Generator.RandomNumber(-25, -10), () => (Object)(object)randomInTerminalPlayer != (Object)null) }); list.AddRange(new EconomicEvent[12] { new EconomicEvent("Advertencia de Saneamiento. ¡La nave está asquerosamente sucia! Multa inmediata por riesgo biológico.", 1.1f, 0, isGood: false, Generator.RandomNumber(-20, -10), () => objectsInShipRoom.Length > 20), new EconomicEvent("¡Inspección sorpresa de la Junta de Limpieza Intergaláctica! Has pasado raspando. Pequeño bono por esfuerzo.", 0.9f, 0, isGood: true, Generator.RandomNumber(5, 10), () => objectsInShipRoom.Length <= 5), new EconomicEvent("La unidad de control de plagas detectó una infestación. Han fumigado y nos dan más tiempo para que te recuperes del olor.", 1f, 1, isGood: false, Generator.RandomNumber(-10, -5), null, isRare: true), new EconomicEvent("Venta de 'Chatarra Histórica'. Un coleccionista compró un objeto de la nave que consideró 'antiguo y auténtico'.", 1f, 0, isGood: true, Generator.RandomNumber(40, 60), () => objectsInShipRoom.Length >= 1, isRare: true), new EconomicEvent("Fallo en el sistema de soporte vital por acumulación de polvo. ¡Paga la reparación!", 1f, 0, isGood: false, Generator.RandomNumber(-35, -20), () => daysUntilDeadline >= 2 && objectsInShipRoom.Length > 15), new EconomicEvent("Condiciones climáticas ideales en el planeta. Los equipos de recolección están más motivados. ¡Multiplicador extra!", 0.85f, 0, isGood: true, 0), new EconomicEvent("Tormenta de radiación solar. Los equipos se dañan y los envíos se retrasan. La cuota aumenta por la urgencia.", 1.4f, -1, isGood: false, 0, () => daysUntilDeadline >= 2), new EconomicEvent("El gobierno local aprobó una exención fiscal para recolectores de chatarra en esta órbita. ¡Aprovéchala!", 0.75f, 0, isGood: true, 0, null, isRare: true), new EconomicEvent("Has excedido el 75% de la cuota con dos días de sobra. ¡Bono por gestión eficiente!", 0.9f, 0, isGood: true, Generator.RandomNumber(30, 50), () => daysUntilDeadline >= 2 && timeOfDayInstance.quotaFulfilled >= timeOfDayInstance.profitQuota.PercentageOf(75m)), new EconomicEvent("¡Acumulación de stock! Tienes demasiada chatarra sin vender. Se aplica una penalización por almacenamiento.", 1.3f, 0, isGood: false, 0, () => objectsInShipRoom.Length > 30 && daysUntilDeadline <= 1), new EconomicEvent("Pánico en el mercado: tu cuota es demasiado baja. Los inversores exigen un esfuerzo extra inmediato.", 1.5f, -1, isGood: false, 0, () => daysUntilDeadline >= 2 && timeOfDayInstance.quotaFulfilled < timeOfDayInstance.profitQuota.PercentageOf(50m)), new EconomicEvent("Oferta de 'Último Minuto': Un comprador privado ofrece un precio fijo, pero solo por una pequeña cantidad de chatarra.", 1f, 0, isGood: true, Generator.RandomNumber(5, 15), () => daysUntilDeadline <= 1) }); list.AddRange(new EconomicEvent[5] { new EconomicEvent("¡" + randomDeadPlayer?.playerUsername + " ha dejado un testamento! Se acordo de todos sus compañeros y le dejo un tornillo a cada uno.", 1f, 0, isGood: true, Generator.RandomNumber(5, 10), () => (Object)(object)randomDeadPlayer != (Object)null && timeOfDayInstance.quotaFulfilled < timeOfDayInstance.profitQuota.PercentageOf(50m)), new EconomicEvent(randomLowHealthPlayer?.playerUsername + " se lesionó intentando hacer una maniobra de parkour y tuvimos que pagar el seguro.", 1f, 0, isGood: false, Generator.RandomNumber(-30, -15), delegate { int result; if ((Object)(object)randomLowHealthPlayer != (Object)null) { PlayerControllerB obj2 = randomLowHealthPlayer; result = ((obj2 != null && obj2.health <= 50) ? 1 : 0); } else { result = 0; } return (byte)result != 0; }), new EconomicEvent("El jefe vio a " + randomSprintingPlayer?.playerUsername + " correr. Creyó que era entusiasmo laboral. ¡Bono por 'iniciativa'!", 1f, 0, isGood: true, Generator.RandomNumber(7, 18), () => (Object)(object)randomSprintingPlayer != (Object)null), new EconomicEvent("¡" + randomPlayer?.playerUsername + " ha sido atrapado in fraganti usando el terminal para pagar la suscripción de una pagina de alienígenas sexys en tanga! Gracias a dios no era tan cara.", 1f, 0, isGood: false, Generator.RandomNumber(-12, -7), () => (Object)(object)randomInTerminalPlayer != (Object)null), new EconomicEvent("Por su 'actitud cuestionable' en el último planeta, " + randomPlayer?.playerUsername + " ha sido penalizado por dañar la imagen corporativa.", 1f, 0, isGood: false, Generator.RandomNumber(-30, -15), () => (Object)(object)randomPlayer != (Object)null) }); bool selectRareEvent = Random.value < 0.1f; List<EconomicEvent> list2 = list.Where((EconomicEvent e) => e.IsConditionMet() && e.isRare == selectRareEvent).ToList(); if (list2.Count == 0) { Logger.LogInfo((object)$"No se encontraron eventos que coincidieran con las condiciones. isRare: {selectRareEvent}"); return; } EconomicEvent economicEvent = list2[Random.Range(0, list2.Count)]; quotaMultiplier = Mathf.Clamp(quotaMultiplier * economicEvent.multiplier, 0.1f, 5f); daysToDeadlineExtension += economicEvent.daysExtension; daysToDeadlineExtension = Mathf.Clamp(daysToDeadlineExtension, -7, 7); string text = economicEvent.message; if (economicEvent.multiplier != 1f) { float num3 = (quotaMultiplier / num - 1f) * 100f; string text2 = num3.ToString("F0", CultureInfo.InvariantCulture); text = text + " Cuota " + ((num3 > 0f) ? "+" : "") + text2 + "%."; } if (economicEvent.daysExtension != 0) { text += string.Format(" Plazo: {0}{1} {2}", (economicEvent.daysExtension > 0) ? "+" : "", economicEvent.daysExtension, (Mathf.Abs(economicEvent.daysExtension) != 1) ? "días." : "día."); } if (economicEvent.quotaChange != 0) { text += string.Format(" Se {0} ${1} a tu cuenta.", (economicEvent.quotaChange > 0) ? "añadieron" : "restaron", economicEvent.quotaChange); } hudMessage = text; eventLog.Add($"Evento: {economicEvent.message} - Multiplicador: {quotaMultiplier}, Días extra: {daysToDeadlineExtension}, Cambio de Quota: {economicEvent.quotaChange}"); Logger.LogInfo((object)("Evento: " + text)); EconomyMod.economicEvent.SendClients(economicEvent); } } public const string modGUID = "com.raalplay.lethalcompanyeconomy"; public const string modName = "EconomyMod"; public const string modVersion = "1.0.7"; private readonly Harmony harmony = new Harmony("com.raalplay.lethalcompanyeconomy"); internal static ManualLogSource Logger; private static LNetworkMessage<EconomyModPatches.EconomicEvent> economicEvent; internal static EconomyMod Instance { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Plugin EconomyMod se ha cargado correctamente!"); EconomyModPatches.ModConfig.LoadConfig(((BaseUnityPlugin)this).Config); Logger.LogInfo((object)"Configuraciones cargadas correctamente!"); LNetworkUtils.OnNetworkStart += delegate { economicEvent = LNetworkMessage<EconomyModPatches.EconomicEvent>.Connect("economicEvent", (Action<EconomyModPatches.EconomicEvent, ulong>)null, (Action<EconomyModPatches.EconomicEvent>)null, (Action<EconomyModPatches.EconomicEvent, ulong>)null); economicEvent.OnClientReceived += EconomyModPatches.EconomicEventReceiveFromServer; Logger.LogInfo((object)"LethalNetworkAPI ha iniciado correctamente."); }; if ((Object)(object)Instance == (Object)null) { Instance = this; Object.DontDestroyOnLoad((Object)(object)this); } else { if ((Object)(object)((Component)Instance).gameObject != (Object)null) { Object.Destroy((Object)(object)((Component)Instance).gameObject); } else { Object.Destroy((Object)(object)Instance); } Instance = this; } try { harmony.PatchAll(typeof(EconomyModPatches.StartOfRound_StartGame_Patch)); Logger.LogInfo((object)"Parches de Harmony aplicados."); } catch (Exception ex) { Logger.LogError((object)("Error al aplicar parches de Harmony: " + ex.Message)); } } } public static class StringExtensions { public static string RemoveDiacritics(this string text) { if (string.IsNullOrEmpty(text)) { return text; } string text2 = text.Normalize(NormalizationForm.FormD); StringBuilder stringBuilder = new StringBuilder(); string text3 = text2; foreach (char c in text3) { UnicodeCategory unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); if (unicodeCategory != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } } public static class Generator { private static readonly Random random = new Random(); public static int RandomNumber(int minValue, int maxValue) { if (minValue >= maxValue) { throw new ArgumentException("minValue debe ser menor que maxValue"); } return random.Next(minValue, maxValue + 1); } public static float RandomNumber(float minValue, float maxValue) { if (minValue >= maxValue) { throw new ArgumentException("minValue debe ser menor que maxValue"); } double num = random.NextDouble(); float num2 = (float)(num * (double)(maxValue - minValue) + (double)minValue); return (float)Math.Round(num2, 2); } public static int WeightedRandomNumber(int min, int max, int mode) { if (min >= max || mode < min || mode > max) { throw new ArgumentException("Invalid arguments"); } double num = random.NextDouble(); double a = ((!(num < (double)(mode - min) / (double)(max - min))) ? ((double)max - Math.Sqrt((1.0 - num) * (double)(max - mode) * (double)(max - min))) : ((double)min + Math.Sqrt(num * (double)(mode - min) * (double)(max - min)))); return (int)Math.Round(a); } public static float WeightedRandomNumber(float min, float max, float mode) { if (min >= max || mode < min || mode > max) { throw new ArgumentException("Invalid arguments"); } double num = random.NextDouble(); double num2 = ((!(num < (double)(mode - min) / (double)(max - min))) ? ((double)max - Math.Sqrt((1.0 - num) * (double)(max - mode) * (double)(max - min))) : ((double)min + Math.Sqrt(num * (double)(mode - min) * (double)(max - min)))); return (float)num2; } } public static class NumericExtensions { public static T PercentageOf<T>(this T value, decimal percentage) where T : struct, IComparable, IFormattable, IConvertible { decimal num = Convert.ToDecimal(value); decimal num2 = num * (percentage / 100m); return (T)Convert.ChangeType(num2, typeof(T)); } } public static class ProbabilityHelper { public static bool Attempt(float probability) { if ((double)probability < 0.0 || (double)probability > 1.0) { throw new ArgumentOutOfRangeException("probability", "Probability must be between 0.0 and 1.0."); } Random random = new Random(); double num = random.NextDouble(); return num < (double)probability; } }