public static void Perform() { Dictionary <ulong, bool> taxiDrivers = new Dictionary <ulong, bool>(); List <ulong> paps = new List <ulong>(); if ((CarNpcManager.Singleton != null) && (CarNpcManager.Singleton.NpcDriversManager != null)) { for (int i = 0; i < CarNpcManager.Singleton.NpcDriversManager.mDescPools.Length; i++) { Stack <SimDescription> stack = CarNpcManager.Singleton.NpcDriversManager.mDescPools[i]; if (stack == null) { continue; } NpcDriversManager.NpcDrivers type = (NpcDriversManager.NpcDrivers)(i + 0x95d01441); while (stack.Count > 10) { SimDescription sim = stack.Pop(); try { AttemptServiceDisposal(sim, false, "Too Many " + type); } catch (Exception e) { Common.Exception(sim, e); } } foreach (SimDescription sim in stack) { if (taxiDrivers.ContainsKey(sim.SimDescriptionId)) { continue; } taxiDrivers.Add(sim.SimDescriptionId, true); } } } Dictionary <ulong, bool> statueSims = new Dictionary <ulong, bool>(); CauseEffectService instance = CauseEffectService.GetInstance(); if (instance != null) { statueSims[instance.GetTimeTravelerSimID()] = true; List <ITimeStatueUiData> timeStatueData = instance.GetTimeAlmanacTimeStatueData(); if (timeStatueData != null) { foreach (ITimeStatueUiData data in timeStatueData) { TimeStatueRecordData record = data as TimeStatueRecordData; if (record == null) { continue; } statueSims[record.mRecordHolderId] = true; } } } foreach (SimDescription sim in new List <SimDescription> (Households.All(Household.NpcHousehold))) { try { if (SimTypes.IsDead(sim)) { continue; } if (taxiDrivers.ContainsKey(sim.SimDescriptionId)) { continue; } CommonCorrections(sim); if (SimTypes.InServicePool(sim, ServiceType.GrimReaper)) { continue; } if (statueSims.ContainsKey(sim.SimDescriptionId)) { continue; } uint spanLevel = 0; OptionsModel.GetOptionSetting("AgingInterval", out spanLevel); float averageElderAge = AgingManager.Singleton.GetAverageSimLifespanInDays((int)spanLevel); ServiceType type = ServiceType.None; if (sim.CreatedByService != null) { type = sim.CreatedByService.ServiceType; } if (AgingManager.Singleton.GetCurrentAgeInDays(sim) > averageElderAge) { if (sim.LotHome == null) { bool isRole = sim.AssignedRole != null; AttemptServiceDisposal(sim, true, "Too Old " + (!isRole ? type.ToString() : sim.AssignedRole.Type.ToString())); } } if (sim.AssignedRole != null && sim.AssignedRole is RolePaparazzi) { paps.Add(sim.SimDescriptionId); } if (sim.AssignedRole != null) { continue; } if (SimTypes.IsOccult(sim, OccultTypes.ImaginaryFriend)) { bool found = false; foreach (ImaginaryDoll doll in Sims3.Gameplay.Queries.GetObjects <ImaginaryDoll>()) { if (sim.SimDescriptionId == doll.mLiveStateSimDescId) { found = true; break; } } if (found) { continue; } AttemptServiceDisposal(sim, false, "Imaginary"); } else if (SimTypes.IsOccult(sim, OccultTypes.Genie)) { bool found = false; foreach (GenieLamp lamp in Sims3.Gameplay.Queries.GetObjects <GenieLamp>()) { if (sim == lamp.mGenieDescription) { found = true; break; } } if (found) { continue; } AttemptServiceDisposal(sim, false, "Genie"); } else if (sim.IsBonehilda) { bool found = false; foreach (BonehildaCoffin coffin in Sims3.Gameplay.Queries.GetObjects <BonehildaCoffin>()) { if (sim == coffin.mBonehilda) { found = true; break; } } if (found) { continue; } AttemptServiceDisposal(sim, false, "BoneHilda"); } else if ((sim.AssignedRole == null) && (!SimTypes.InServicePool(sim))) { AttemptServiceDisposal(sim, false, "No Purpose"); } else if ((type != ServiceType.None) && (sim.Age & ServiceNPCSpecifications.GetAppropriateAges(type.ToString())) == CASAgeGenderFlags.None) { AttemptServiceDisposal(sim, false, "Wrong Age " + type); } else if (!ServiceNPCSpecifications.ShouldUseServobot(type.ToString()) && sim.IsEP11Bot) { AttemptServiceDisposal(sim, false, "Not EP11 Bot " + type); } } catch (Exception e) { Common.Exception(sim, e); } } // kill extra paps if (paps.Count > Register.Settings.mMaximumPaparazzi) { int count = paps.Count; while (count > Register.Settings.mMaximumPaparazzi && count > 0) { SimDescription sim = SimDescription.Find(paps[0]); if (sim != null) { AttemptServiceDisposal(sim, false, "Too many Paparazzi"); } paps.Remove(paps[0]); count = count - 1; } } foreach (SimDescription sim in new List <SimDescription> (Households.All(Household.PetHousehold))) { try { if (SimTypes.IsDead(sim)) { continue; } CommonCorrections(sim); if ((sim.IsDeer) || (sim.IsRaccoon)) { if (sim.AssignedRole == null) { AttemptServiceDisposal(sim, false, "Roleless"); } else if (sim.Elder) { AttemptServiceDisposal(sim, true, "Elder"); } } else { bool noPool; PetPoolType pool = SimTypes.GetPetPool(sim, out noPool); if ((!noPool) && (pool == PetPoolType.None)) { AttemptServiceDisposal(sim, false, "Not Pooled"); } } } catch (Exception e) { Common.Exception(sim, e); } } }
protected static void LunarUpdate(bool change) { HudModel model = Sims3.UI.Responder.Instance.HudModel as HudModel; LunarCycleManager.LunarPhase[] choices = null; uint result; OptionsModel.GetOptionSetting("EnableLunarPhase", out result); if (result == 0x0) { choices = GetCycle(); if (change) { Overwatch.Settings.mCurrentPhaseIndex++; } if (Overwatch.Settings.mCurrentPhaseIndex >= choices.Length) { Overwatch.Settings.mCurrentPhaseIndex = 0; } World.ForceLunarPhase((int)choices[Overwatch.Settings.mCurrentPhaseIndex]); } LunarCycleManager.LunarPhase phase = (LunarCycleManager.LunarPhase)World.GetLunarPhase(); if (phase != LunarCycleManager.LunarPhase.kFullMoon) { if ((LunarCycleManager.sFullMoonZombies == null) || (LunarCycleManager.sFullMoonZombies.Count == 0)) { foreach (Sim sim in LotManager.Actors) { if (sim.LotHome != null) { continue; } if (sim.BuffManager == null) { continue; } sim.BuffManager.RemoveElement(BuffNames.Zombie); } } OnDewolf(false); } else { new Common.AlarmTask(Common.AlarmTask.TimeTo(World.GetSunriseTime()), TimeUnit.Hours, OnDewolf); } EventTracker.SendEvent(new MoonRiseEvent((uint)World.GetLunarPhase())); if (model.LunarUpdate != null) { model.LunarUpdate((uint)World.GetLunarPhase()); } if (Overwatch.Settings.mDisableFullMoonLighting) { if (LunarCycleManager.mLunarEffectsAlarm != AlarmHandle.kInvalidHandle) { AlarmManager.Global.RemoveAlarm(LunarCycleManager.mLunarEffectsAlarm); LunarCycleManager.mLunarEffectsAlarm = AlarmHandle.kInvalidHandle; } } foreach (MoonDial dial in Sims3.Gameplay.Queries.GetObjects <MoonDial>()) { try { if (dial.mLunarFXLookUp.Length > Overwatch.Settings.mCurrentPhaseIndex) { dial.StartLunarFX(dial.mLunarFXLookUp[Overwatch.Settings.mCurrentPhaseIndex]); } } catch { } } if (choices != null) { SimDisplay display = SimDisplay.Instance; if (display != null) { int numDaysUntilFullMoon = 0; int index = Overwatch.Settings.mCurrentPhaseIndex; while ((choices[index] != LunarCycleManager.LunarPhase.kFullMoon) && (numDaysUntilFullMoon < choices.Length)) { numDaysUntilFullMoon++; index++; if (index >= choices.Length) { index = 0; } } if (display.mLunarCycleIcon != null) { string entryKey = "UI/LunarCycle:MoonString" + ((uint)World.GetLunarPhase() + 0x1); display.mLunarCycleIcon.TooltipText = Common.LocalizeEAString(entryKey); if (numDaysUntilFullMoon > 0x0) { display.mLunarCycleIcon.TooltipText = display.mLunarCycleIcon.TooltipText + "\n"; display.mLunarCycleIcon.TooltipText = display.mLunarCycleIcon.TooltipText + Common.LocalizeEAString(false, "UI/LunarCycle:NextFullMoon", new object[] { numDaysUntilFullMoon }); } } } } }