static void Postfix(SimGameState __instance, int timeLapse, SimGameInterruptManager ___interruptQueue, SimGameEventTracker ___companyEventTracker, SimGameEventTracker ___mechWarriorEventTracker, SimGameEventTracker ___deadEventTracker, SimGameEventTracker ___moraleEventTracker) { Mod.Log.Debug?.Write($"OnDayPassed called with timeLapse: {timeLapse}"); // Only check for events if another event isn't firing, and we're in orbit around a system if (!___interruptQueue.IsOpen && __instance.TravelState == SimGameTravelStatus.IN_SYSTEM) { foreach (Pilot pilot in __instance.PilotRoster) { CrewDetails details = ModState.GetCrewDetails(pilot.pilotDef); if (details.ExpirationDay <= __instance.DaysPassed) { Mod.Log.Debug?.Write($"CONTRACT FOR PILOT: {pilot.Name} HAS ELAPSED, FIRING EVENT"); ModState.ExpiredContracts.Enqueue((pilot, details)); } } if (ModState.ExpiredContracts.Count > 0) { // Fire the first event, if there are more they will be fired from OnEventDismissed{ Mod.Log.Info?.Write($"Contract expiration event fired."); (Pilot Pilot, CrewDetails Details)expired = ModState.ExpiredContracts.Peek(); SimGameEventDef newEvent = EventHelper.ModifyContractExpirationEventForPilot(expired.Pilot, expired.Details); ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, ___mechWarriorEventTracker); } else if (Mod.Config.HeadHunting.Enabled && __instance.TravelState == SimGameTravelStatus.IN_SYSTEM) { // TODO: Only do check if not at planet with blacklisted tags if (HeadHuntingHelper.ShouldCheckHeadHunting()) { Pilot headHuntedCrew = HeadHuntingHelper.TestAllCrews(); if (headHuntedCrew != null) { CrewDetails cd = ModState.GetCrewDetails(headHuntedCrew.pilotDef); SimGameEventDef newEvent = EventHelper.CreateHeadHuntingEvent(headHuntedCrew, cd, cd.HiringBonus, cd.HiringBonus); ModState.HeadHuntedPilot = headHuntedCrew; ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, ___mechWarriorEventTracker); HeadHuntingHelper.UpdateNextDayOnSuccess(); } else { HeadHuntingHelper.UpdateNextDayOnFailure(); } } } } }
static bool Prefix(string button) { Mod.Log.Info?.Write($"RBP invoked for button: {button}"); if ("Hiring".Equals(button, StringComparison.InvariantCultureIgnoreCase)) { if (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) { Mod.Log.Info?.Write("-- Regenerating pilots in system."); ModState.SimGameState.CurSystem.AvailablePilots.Clear(); ModState.SimGameState.CurSystem.GeneratePilots(ModState.SimGameState.Constants.Story.DefaultPilotsPerSystem); } else if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl) && Mod.Config.HeadHunting.Enabled && ModState.SimGameState.TravelState == SimGameTravelStatus.IN_SYSTEM) { Mod.Log.Info?.Write("-- Forcing poaching on random crew."); // Randomize pilots instead of sorting by skill? List <Pilot> pilots = ModState.SimGameState.PilotRoster.ToList(); pilots.Sort((p1, p2) => { CrewDetails p1cd = ModState.GetCrewDetails(p1.pilotDef); CrewDetails p2cd = ModState.GetCrewDetails(p2.pilotDef); return(CrewDetails.CompareByValue(p1cd, p2cd)); }); int idx = Mod.Random.Next(0, pilots.Count - 1); Pilot random = pilots[idx]; Mod.Log.Info?.Write($"-- Headhunted pilot: {random.Name}"); CrewDetails cd = ModState.GetCrewDetails(random.pilotDef); SimGameEventDef newEvent = EventHelper.CreateHeadHuntingEvent(random, cd, cd.HiringBonus, cd.HiringBonus); Traverse mechWarriorEventTrackerT = Traverse.Create(ModState.SimGameState).Field("mechWarriorEventTracker"); SimGameEventTracker mechWarriorEventTracker = mechWarriorEventTrackerT.GetValue <SimGameEventTracker>(); ModState.HeadHuntedPilot = random; Mod.Log.Info?.Write($"-- Firing debug event"); ModState.SimGameState.Context.SetObject(GameContextObjectTagEnum.TargetMechWarrior, random); ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, mechWarriorEventTracker); return(false); } else if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) && ModState.SimGameState.TravelState == SimGameTravelStatus.IN_SYSTEM) { Mod.Log.Info?.Write("-- Forcing contract expiration on random crew."); // Randomize pilots instead of sorting by skill? List <Pilot> pilots = ModState.SimGameState.PilotRoster.ToList(); pilots.Sort((p1, p2) => { CrewDetails p1cd = ModState.GetCrewDetails(p1.pilotDef); CrewDetails p2cd = ModState.GetCrewDetails(p2.pilotDef); return(CrewDetails.CompareByValue(p1cd, p2cd)); }); int idx = Mod.Random.Next(0, pilots.Count - 1); Pilot random = pilots[idx]; Mod.Log.Info?.Write($"-- Expired pilot: {random.Name}"); CrewDetails cd = ModState.GetCrewDetails(random.pilotDef); ModState.ExpiredContracts.Enqueue((random, cd)); SimGameEventDef newEvent = EventHelper.ModifyContractExpirationEventForPilot(random, cd); Traverse mechWarriorEventTrackerT = Traverse.Create(ModState.SimGameState).Field("mechWarriorEventTracker"); SimGameEventTracker mechWarriorEventTracker = mechWarriorEventTrackerT.GetValue <SimGameEventTracker>(); ModState.SimGameState.OnEventTriggered(newEvent, EventScope.MechWarrior, mechWarriorEventTracker); return(false); } } return(true); }