public static bool Perform() { try { if (!GameUtils.IsInstalled(ProductVersion.EP2)) { return(true); } if (EventTracker.Instance == null) { return(false); } if (EventTracker.Instance.mListeners == null) { return(false); } // Required to stop a hang when an inactive firefighter reaches level 10 Dictionary <ulong, List <EventListener> > dictionary; if (!EventTracker.Instance.mListeners.TryGetValue((ulong)EventTypeId.kActiveCareerAdvanceLevel, out dictionary)) { return(false); } foreach (List <EventListener> list in dictionary.Values) { if (list == null) { continue; } foreach (EventListener listener in list) { if (listener == null) { continue; } DelegateListener delListener = listener as DelegateListener; if (delListener != null) { RewardsManager.OccupationRewardInfo target = delListener.mProcessEvent.Target as RewardsManager.OccupationRewardInfo; if ((target != null) && (delListener.mProcessEvent != null)) { delListener.mProcessEvent = new Middleman(delListener.mProcessEvent).OnEvent; } } } } } catch (Exception e) { Common.Exception("DisableRewardCeremonies", e); } return(true); }
protected override bool Run(SimDescription me, bool singleSelection) { Sims3.Gameplay.Careers.Career career = me.Occupation as Sims3.Gameplay.Careers.Career; if (career != null) { List <CareerLevel> levels = AllLevels(career); if ((levels == null) || (levels.Count == 0)) { return(false); } List <Item> allOptions = new List <Item>(); foreach (CareerLevel level in levels) { allOptions.Add(new Item(me, level)); } Item choice = new CommonSelection <Item>(Name, me.FullName, allOptions).SelectSingle(); if (choice == null) { return(false); } List <CareerLevel> order = null; if (choice.mLevel.Level < me.Occupation.CareerLevel) { order = LevelsBetween(choice.mLevel, career.CurLevel, true); } else { order = LevelsBetween(career.CurLevel, choice.mLevel, false); } if (order.Count == 0) { List <CareerLevel> oldBranches = AllBranches(career.CurLevel); List <CareerLevel> newBranches = AllBranches(choice.mLevel); CareerLevel common = null; foreach (CareerLevel branch in newBranches) { if (oldBranches.Contains(branch)) { common = branch; break; } } if (common != null) { order.AddRange(LevelsBetween(common, career.CurLevel, true)); order.AddRange(LevelsBetween(common, choice.mLevel, false)); } } foreach (CareerLevel level in order) { if (career.CurLevel == level) { continue; } if (career.CurLevel.LastLevel == level) { career.DemoteSim(); } else { Promote(career, level); } } return(true); } else { XpBasedCareer xpCareer = me.Occupation as XpBasedCareer; if (xpCareer != null) { List <Item> allOptions = new List <Item>(); for (int level = 1; level <= xpCareer.HighestLevel; level++) { allOptions.Add(new Item(xpCareer.LevelJobTitle(level), level)); } Item choice = new CommonSelection <Item>(Name, me.FullName, allOptions).SelectSingle(); if (choice == null) { return(false); } if (choice.mXPLevel < me.Occupation.CareerLevel) { xpCareer.mLevel = choice.mXPLevel; xpCareer.mXp = 0; } else { Dictionary <DelegateListener, ProcessEventDelegate> retain = new Dictionary <DelegateListener, ProcessEventDelegate>(); Dictionary <ulong, List <EventListener> > dictionary; EventTracker.Instance.mListeners.TryGetValue((ulong)EventTypeId.kActiveCareerAdvanceLevel, out dictionary); // Required to stop a hang when an inactive firefighter is promoted to level 10 if (me.Household != Household.ActiveHousehold) { foreach (List <EventListener> list in dictionary.Values) { foreach (EventListener listener in list) { DelegateListener delListener = listener as DelegateListener; if (delListener != null) { RewardsManager.OccupationRewardInfo target = delListener.mProcessEvent.Target as RewardsManager.OccupationRewardInfo; if (target != null) { retain.Add(delListener, delListener.mProcessEvent); delListener.mProcessEvent = OnStub; } } } } } xpCareer.ForcePromoteToLevel(choice.mXPLevel); if (me.Household != Household.ActiveHousehold) { foreach (List <EventListener> list in dictionary.Values) { foreach (EventListener listener in list) { DelegateListener delListener = listener as DelegateListener; if (delListener != null) { RewardsManager.OccupationRewardInfo target = delListener.mProcessEvent.Target as RewardsManager.OccupationRewardInfo; if (target != null) { delListener.mProcessEvent = retain[delListener]; } } } } } } return(true); } } return(false); }