public static SimDescription UnpackSim(MiniSimDescription ths, bool updateGenealogy) { try { if (ths == null) { return(null); } // Calling ImportSimDescription prior to the Aging Manager being available is invalid, don't allow it if (AgingManager.Singleton == null) { return(null); } SimDescription desc = new SimDescription(); ResourceKeyContentCategory installed = ResourceKeyContentCategory.kInstalled; DownloadContent.ImportSimDescription(ths.mTravelKey, desc, ref installed); desc.SimDescriptionId = ths.mSimDescriptionId; if (desc.CareerManager != null) { // Fixup for careers require a household, which is not set until later in this process desc.CareerManager.mJob = null; desc.CareerManager.mSchool = null; } desc.Fixup(); if (updateGenealogy && !GameStates.IsTravelling) { if (desc.DefaultOutfitKey == ResourceKey.kInvalidResourceKey) { SimOutfit outfit = desc.GetOutfit(OutfitCategories.Everyday, 0x0); if ((outfit == null) || (!outfit.IsValid)) { desc.Dispose(false, false); return(null); } desc.UpdateFromOutfit(OutfitCategories.Everyday); } desc.CASGenealogy = ths.CASGenealogy; } Corrections.CleanupBrokenSkills(desc, null); OccultTypeHelper.ValidateOccult(desc, null); return(desc); } catch (Exception e) { Common.Exception(ths.FullName, e); return(null); } }
public static bool Run(AlienUtils.ReturnAlienBaby ths) { bool flag = TwoButtonDialog.Show( Localization.LocalizeString("Duglarogg/Abductor/Interactions/ReturnAlienBabyEx:Dialogue"), Localization.LocalizeString("Duglarogg/Abductor/Interactions/ReturnAlienBabyEx:DialogueAccept"), Localization.LocalizeString("Duglarogg/Abductor/Interactions/ReturnAlineBabyEx:DialogueReject")); if (flag) { SimDescription description = ths.Target.SimDescription; ths.Target.DisableInteractions(); ths.Target.InteractionQueue.CancelAllInteractions(); ths.mEffect = VisualEffect.Create("ep8BabyTeleportFx"); ths.mEffect.SetPosAndOrient(ths.Target.Position, ths.Target.ForwardVector, ths.Target.UpVector); ths.mEffect.Start(); ths.Target.FadeOut(true); List <IGenealogy> list = new List <IGenealogy>(description.Genealogy.IParents); list.AddRange(description.Genealogy.ISiblings); foreach (IGenealogy current in list) { description.Genealogy.RemoveDirectRelation(current); } ths.Actor.Household.Remove(description); description.Dispose(); Simulator.Sleep(30u); } return(true); }
public override bool Run() { bool flag = TwoButtonDialog.Show( Common.Localize("ReturnAlienBabyEx:Dialogue", Actor.SimDescription.IsFemale, new object[] { Actor }), Common.Localize("ReturnAlienBabyEx:DialogueAccept"), Common.Localize("ReturnAlienBabyEx:DialogueReject")); if (flag) { SimDescription description = Target.SimDescription; Target.DisableInteractions(); Target.InteractionQueue.CancelAllInteractions(); mEffect = VisualEffect.Create("ep8BabyTeleportFx"); mEffect.SetPosAndOrient(Target.Position, Target.ForwardVector, Target.UpVector); mEffect.Start(); Target.FadeOut(true); List <IGenealogy> list = new List <IGenealogy>(description.Genealogy.IParents); list.AddRange(description.Genealogy.ISiblings); foreach (IGenealogy current in list) { description.Genealogy.RemoveDirectRelation(current); } Actor.Household.Remove(description); description.Dispose(); Simulator.Sleep(30u); } return(true); }
public new List <SimDescription> CreateNewbornsBeforePacking(float bonusMoodPoints, bool addToFamily, int numSims, int numPets) { SimDescription geneticMom = null, geneticDad = null, robotDad = null; MiniSimDescription miniMom = null, miniDad = null, miniRoboDad = null; List <SimDescription> results; GetParentDescriptions(ref geneticMom, ref miniMom, ref geneticDad, ref miniDad, ref robotDad, ref miniRoboDad); if (RobotDadDescriptionID != 0uL) { results = CreateNewbornsBeforePacking(geneticMom, robotDad, geneticDad, bonusMoodPoints, addToFamily, numSims, numPets); } else { results = CreateNewbornsBeforePacking(geneticMom, geneticDad, bonusMoodPoints, addToFamily, numSims, numPets); } if (miniMom != null) { geneticMom.Dispose(true, true); } if (miniDad != null) { geneticDad.Dispose(true, true); } if (miniRoboDad != null) { robotDad.Dispose(true, true); } return(results); }
public static void PackUpToMiniSimDescription(SimDescription ths) { if (ths.CreatedSim != null) { ths.CreatedSim.Destroy(); Common.Sleep(); } if (Find(ths.SimDescriptionId) != null) { SimDescription father = null; if (ths.Pregnancy != null) { if ((ths.Pregnancy.mDad == null) || ths.Pregnancy.mDad.HasBeenDestroyed) { if (SimDescription.Find(ths.Pregnancy.DadDescriptionId) == null) { MiniSimDescription description = Find(ths.Pregnancy.DadDescriptionId); if (description != null) { father = UnpackSim(description); father.Genealogy.SetSimDescription(father); Household.TouristHousehold.AddTemporary(father); } } } } PackSim(ths); if (father != null) { father.Dispose(true, true); } } else { MiniSimDescription.AddMiniSim(ths); ths.Household.RemoveTemporary(ths); MiniSimDescription miniSim; if (MiniSimDescription.sMiniSims.TryGetValue(ths.SimDescriptionId, out miniSim)) { GenerateCrossWorldThumbnail(miniSim, ths, true); } ths.Dispose(true, true); } ths.mPackingDescriptionTask = null; if (!GameStates.IsTravelling) { (Sims3.Gameplay.UI.Responder.Instance.HudModel as Sims3.Gameplay.UI.HudModel).OnSimCurrentWorldChanged(false, ths); } ths.ClearOutfits(true); }
public static Results UpdateThumbnailKey(MiniSimDescription ths) { SimDescription sim = null; Results result = UpdateThumbnailKey(ths, ref sim); if (result == Results.Unnecessary) { return(result); } if (sim != null) { try { bool agingEnabled = sim.HasFlags(SimDescription.FlagField.AgingEnabled); if (AgingManager.Singleton == null) { // Stops the game from pushing or popping the aging when there is no Aging Manager available sim.SetFlags(SimDescription.FlagField.AgingEnabled, false); } try { sim.Dispose(false, true); } catch (Exception e) { Common.DebugException(sim, e); } finally { sim.SetFlags(SimDescription.FlagField.AgingEnabled, agingEnabled); } if (sim.Household != null) { sim.Household.Remove(sim); } } catch (Exception e) { Common.Exception(sim, e); } } return(result); }
public static ThumbnailKey GetThumbnailKey(IMiniSimDescription ths, ThumbnailSize size, int thumbIndex) { try { if (ths == null) { return(ThumbnailKey.kInvalidThumbnailKey); } MiniSimDescription miniSim = ths as MiniSimDescription; if (miniSim != null) { if (!ThumbnailManager.KeyExistsInDB(miniSim.mThumbKey)) { SimDescription sim = MiniSims.UnpackSim(miniSim); ThumbnailKey thumbnailKey = sim.GetThumbnailKey(ThumbnailSize.Large, 0x0); try { sim.Dispose(false, true); } catch (Exception e) { Common.Exception(sim, e); } return(thumbnailKey); } return(miniSim.mThumbKey); } else if ((ths.CASGenealogy == null) || (ths.CASGenealogy.IsAlive())) { return(ths.GetThumbnailKey(size, thumbIndex)); } else { return(ths.GetDeceasedThumbnailKey(size, thumbIndex)); } } catch (Exception e) { Common.Exception(ths.FullName, e); return(ThumbnailKey.kInvalidThumbnailKey); } }
public static void PackSim(SimDescription desc) { MiniSimDescription miniSim; if (MiniSimDescription.sMiniSims.TryGetValue(desc.SimDescriptionId, out miniSim)) { FixUpForeignPregnantSims(desc); miniSim.SetMemberFields(desc, true); GenerateCrossWorldThumbnail(miniSim, desc, true); if (desc.Household != null) { desc.Household.RemoveTemporary(desc); } miniSim.Instantiated = false; desc.Dispose(false, true); } }
public new void CreateBabyBeforePacking() { if (GameUtils.IsOnVacation() || GameUtils.IsUniversityWorld()) { if (mMom.Household != null) { int numSims = 0; int numPets = 0; mMom.Household.GetNumberOfSimsAndPets(true, out numSims, out numPets); List <SimDescription> list = CreateNewbornsBeforePacking(0f, true, numSims, numPets); foreach (SimDescription current in list) { MiniSimDescription.AddMiniSim(current); } mMom.Household.InvalidateThumbnail(); List <SimDescription> allDescriptions = mMom.Household.AllSimDescriptions; foreach (SimDescription current2 in allDescriptions) { MiniSimDescription miniSimDescription = MiniSimDescription.Find(current2.SimDescriptionId); if (miniSimDescription != null) { miniSimDescription.UpdateHouseholdMembers(allDescriptions); } } Simulator.Sleep(0u); } } else { MiniSimDescription miniSimDescription2 = MiniSimDescription.Find(mMom.SimDescription.SimDescriptionId); if (miniSimDescription2 != null) { int numSims2 = 1; int numPets2 = 0; List <ulong> list2 = new List <ulong>(); if (miniSimDescription2.HouseholdMembers != null) { numSims2 = miniSimDescription2.NumSimMemberIncludingPregnant; numPets2 = miniSimDescription2.NumPetMemberIncludingPregnant; list2.AddRange(miniSimDescription2.HouseholdMembers); } else { list2.Add(miniSimDescription2.SimDescriptionId); } List <SimDescription> list3 = CreateNewbornsBeforePacking(0f, false, numSims2, numPets2); while (list3.Count > 0) { SimDescription description = list3[0]; MiniSimDescription.AddMiniSim(description); MiniSimDescription miniSimDescription3 = MiniSimDescription.Find(description.SimDescriptionId); miniSimDescription3.mMotherDescId = miniSimDescription2.SimDescriptionId; list2.Add(description.SimDescriptionId); list3.RemoveAt(0); description.Dispose(); } foreach (ulong current3 in list2) { MiniSimDescription miniSimDescription4 = MiniSimDescription.Find(current3); if (miniSimDescription4 != null) { miniSimDescription4.UpdateHouseholdMembers(list2); } } } } mMom.SimDescription.ClearPregnancyData(); if (!mMom.HasBeenDestroyed) { mMom.SwitchToOutfitWithoutSpin(OutfitCategories.Everyday); } }
public static SimDescription UnpackSim(MiniSimDescription ths, bool updateGenealogy) { try { if (ths == null) return null; // Calling ImportSimDescription prior to the Aging Manager being available is invalid, don't allow it if (AgingManager.Singleton == null) return null; SimDescription desc = new SimDescription(); ResourceKeyContentCategory installed = ResourceKeyContentCategory.kInstalled; DownloadContent.ImportSimDescription(ths.mTravelKey, desc, ref installed); desc.SimDescriptionId = ths.mSimDescriptionId; if (desc.CareerManager != null) { // Fixup for careers require a household, which is not set until later in this process desc.CareerManager.mJob = null; desc.CareerManager.mSchool = null; } desc.Fixup(); if (updateGenealogy && !GameStates.IsTravelling) { if (desc.DefaultOutfitKey == ResourceKey.kInvalidResourceKey) { SimOutfit outfit = desc.GetOutfit(OutfitCategories.Everyday, 0x0); if ((outfit == null) || (!outfit.IsValid)) { desc.Dispose(false, false); return null; } desc.UpdateFromOutfit(OutfitCategories.Everyday); } desc.CASGenealogy = ths.CASGenealogy; } Corrections.CleanupBrokenSkills(desc, null); OccultTypeHelper.ValidateOccult(desc, null); return desc; } catch (Exception e) { Common.Exception(ths.FullName, e); return null; } }
private static void CreateBabyBeforePacking(Pregnancy ths) { try { Sim mom = ths.Mom; if (mom == null) { return; } if ((GameUtils.IsOnVacation()) || (GameUtils.IsUniversityWorld())) { Household household = mom.Household; if (household != null) { int simCount = 0x0; int petCount = 0x0; household.GetNumberOfSimsAndPets(true, out simCount, out petCount); foreach (SimDescription description in CreateNewbornsBeforePacking(ths, 0f, true, simCount, petCount)) { MiniSimDescription.AddMiniSim(description); } household.InvalidateThumbnail(); List <SimDescription> simDescriptions = household.AllSimDescriptions; foreach (SimDescription description2 in simDescriptions) { MiniSimDescription description3 = Find(description2.SimDescriptionId); if (description3 != null) { description3.UpdateHouseholdMembers(simDescriptions); } } Common.Sleep(); } } else { MiniSimDescription description4 = Find(mom.SimDescription.SimDescriptionId); if (description4 != null) { int householdSimMembers = 0x1; int householdPetMembers = 0x0; List <ulong> currentMembers = new List <ulong>(); if (description4.HouseholdMembers != null) { householdSimMembers = description4.NumSimMemberIncludingPregnant; householdPetMembers = description4.NumPetMemberIncludingPregnant; currentMembers.AddRange(description4.HouseholdMembers); } else { currentMembers.Add(description4.SimDescriptionId); } List <SimDescription> list4 = CreateNewbornsBeforePacking(ths, 0f, false, householdSimMembers, householdPetMembers); while (list4.Count > 0x0) { SimDescription desc = list4[0x0]; list4.RemoveAt(0x0); if (desc != null) { MiniSimDescription.AddMiniSim(desc); MiniSimDescription miniSim = Find(desc.SimDescriptionId); if (miniSim != null) { miniSim.mMotherDescId = description4.SimDescriptionId; } currentMembers.Add(desc.SimDescriptionId); desc.Dispose(); } } foreach (ulong num2 in currentMembers) { MiniSimDescription description7 = Find(num2); if (description7 != null) { description7.UpdateHouseholdMembers(currentMembers); } } } } if (mom.SimDescription != null) { mom.SimDescription.ClearPregnancyData(); if (!mom.HasBeenDestroyed) { mom.SwitchToOutfitWithoutSpin(OutfitCategories.Everyday); } } } catch (Exception e) { Common.Exception(ths.mMom, ths.mDad, e); } }
public static bool Perform(SimDescription sim, bool cleanse) { if (sim == null) return false; Common.StringBuilder msg = new Common.StringBuilder("Perform" + Common.NewLine); Household house = sim.Household; try { Sim createdSim = sim.CreatedSim; if (createdSim != null) { createdSim.ReservedVehicle = null; } if (PetAdoption.sNeighborAdoption != null) { if (PetAdoption.sNeighborAdoption.mMother == sim) { try { PetAdoption.ResetNeighborAdoption(); } catch (Exception e) { Common.Exception(sim, e); } finally { PetAdoption.sNeighborAdoption = null; } } else { PetAdoption.sNeighborAdoption.mPetsToAdopt.Remove(sim); } } foreach (Service service in Services.AllServices) { try { if (service == null) continue; msg += Common.NewLine + "Service: " + service.GetType(); if (sim.CreatedSim != null) { service.RemoveAssignment(sim.CreatedSim); } service.RemovePreferredSim(sim); service.mPool.Remove(sim); ResortWorker resortWorker = service as ResortWorker; if (resortWorker != null) { if (resortWorker.mWorkerInfo != null) { List<ObjectGuid> remove = new List<ObjectGuid>(); foreach (KeyValuePair<ObjectGuid, ResortWorker.WorkerInfo> info in resortWorker.mWorkerInfo) { if ((info.Value.CurrentSimDescriptionID == sim.SimDescriptionId) || (info.Value.DesiredSimDescriptionID == sim.SimDescriptionId)) { remove.Add(info.Key); } } foreach (ObjectGuid rem in remove) { resortWorker.mWorkerInfo[rem] = new ResortWorker.WorkerInfo(); } } } } catch (Exception e) { Common.Exception(sim, null, msg, e); } } msg += Common.NewLine + "A"; List<Household> houses = new List<Household>(); if (house != null) { houses.Add(house); } foreach (Household check in Household.sHouseholdList) { if (check == house) continue; if (check.Contains(sim)) { houses.Add(check); } } foreach(Household remove in houses) { Household.HouseholdSimsChangedCallback changedCallback = null; try { changedCallback = remove.HouseholdSimsChanged; remove.HouseholdSimsChanged = null; remove.Remove(sim, !remove.IsSpecialHousehold); } finally { remove.HouseholdSimsChanged = changedCallback; } } msg += Common.NewLine + "B"; try { if (cleanse) { if (sim.LifeEventManager != null) { sim.LifeEventManager.Purge(); } } } catch (Exception e) { Common.Exception(sim, null, msg, e); } msg += Common.NewLine + "C"; RemoveSimDescriptionRelationships(sim); msg += Common.NewLine + "D"; PetPoolManager.RemoveIdFromPool(sim.SimDescriptionId); msg += Common.NewLine + "E"; try { if (sim.CareerManager != null) { sim.CareerManager.LeaveAllJobs(Career.LeaveJobReason.kDied); } } catch (Exception e) { sim.CareerManager.mJob = null; sim.CareerManager.mSchool = null; Common.Exception(sim, null, msg, e); } msg += Common.NewLine + "F"; if (sim.CASGenealogy == null) { // Necessary to stop an error in MidLifeCrisisManager sim.mGenealogy = new Genealogy(sim); } msg += Common.NewLine + "G"; try { if (sim.Partner != null) { sim.Partner.Partner = null; } sim.Partner = null; } catch (Exception e) { Common.Exception(sim, null, msg, e); } msg += Common.NewLine + "H"; if (sim.DeathStyle != SimDescription.DeathType.None) { // Passing in a household can invoke the social worker, so don't bother Urnstone.FinalizeSimDeath(sim, null/*house*/); } msg += Common.NewLine + "I"; Urnstone urnstone = Urnstones.FindGhostsGrave(sim); msg += Common.NewLine + "J"; if ((cleanse) && (urnstone != null)) { if (urnstone.InInventory) { Inventory inventory = Inventories.ParentInventory(urnstone); if (inventory != null) { inventory.RemoveByForce(urnstone); } } if (urnstone.DeadSimsDescription != null) { urnstone.DeadSimsDescription.Fixup(); } try { urnstone.Dispose(); } catch (Exception e) { Common.DebugException(sim, null, msg, e); } urnstone.Destroy(); } msg += Common.NewLine + "K"; if ((FakeMetaAutonomy.Instance != null) && (FakeMetaAutonomy.Instance.mPool != null)) { FakeMetaAutonomy.Instance.mPool.Remove(sim); } msg += Common.NewLine + "L"; if (Sims3.Gameplay.Services.FakeMetaAutonomy.mToDestroy != null) { Sims3.Gameplay.Services.FakeMetaAutonomy.mToDestroy.Remove(sim); } msg += Common.NewLine + "M"; if ((houses.Contains(Household.ActiveHousehold)) && (sim.CreatedSim != null)) { HudModel model = HudController.Instance.Model as HudModel; foreach (SimInfo info in model.mSimList) { if (info.mGuid == sim.CreatedSim.ObjectId) { model.RemoveSimInfo(info); model.mSimList.Remove(info); break; } } } msg += Common.NewLine + "N"; try { if (sim.AssignedRole != null) { sim.AssignedRole.RemoveSimFromRole(); } } catch (Exception e) { Common.DebugException(sim, null, msg, e); sim.AssignedRole = null; } msg += Common.NewLine + "O1"; if ((CarNpcManager.Singleton != null) && (CarNpcManager.Singleton.NpcDriversManager != null)) { foreach (Stack<SimDescription> stack in CarNpcManager.Singleton.NpcDriversManager.mDescPools) { if (stack == null) continue; List<SimDescription> sims = new List<SimDescription>(); bool found = false; foreach(SimDescription stackSim in stack) { if (stackSim == sim) { found = true; } else { sims.Add(stackSim); } } if (found) { stack.Clear(); foreach (SimDescription stackSim in sims) { stack.Push(stackSim); } } } } msg += Common.NewLine + "O2"; if (cleanse) { sim.Dispose(); } msg += Common.NewLine + "P"; if ((house != null) && (createdSim != null)) { house.OnMemberChanged(sim, createdSim); } return true; } catch (Exception e) { Common.Exception(sim, null, msg, e); if (house != null) { Household.HouseholdSimsChangedCallback changedCallback = null; try { changedCallback = house.HouseholdSimsChanged; house.HouseholdSimsChanged = null; house.Add(sim); } finally { house.HouseholdSimsChanged = changedCallback; } } return false; } }
public static bool Dispose(SimDescription sim, Logger log) { if (sim == null) { return(false); } Genealogy oldGene = sim.Genealogy; if (sim.CelebrityManager == null) { // If missing, the Dispose() fires a script error sim.CelebrityManager = new Sims3.Gameplay.CelebritySystem.CelebrityManager(); } try { if (sim.Genealogy == null) { MiniSimDescription miniSim = MiniSimDescription.Find(sim.SimDescriptionId); if (miniSim != null) { sim.mGenealogy = miniSim.Genealogy; } if (sim.Genealogy == null) { sim.mGenealogy = new Genealogy(sim); } } Urnstone stone = Urnstones.FindGhostsGrave(sim); if (stone != null) { Inventory inventory = Inventories.ParentInventory(stone); if (inventory != null) { inventory.RemoveByForce(stone); } try { stone.Dispose(); stone.Destroy(); } catch (Exception e) { Common.Exception(sim, e); if (inventory != null) { inventory.TryToAdd(stone, false); } } } else { sim.Dispose(true, false, true); } if (log != null) { log(" Disposed: " + sim.FullName); } return(true); } catch (Exception e) { Common.Exception(sim, e); return(false); } finally { // Reassign the genealogy, to compensate for an issue where the miniSim is reprocessed later sim.mGenealogy = oldGene; } }
public override List <Sim> CreateNewborns(float bonusMoodPoints, bool interactive, bool homeBirth) { SimDescription alien = null; MiniSimDescription miniAlien = null; if (mDad != null && !mDad.HasBeenDestroyed) { alien = mDad.SimDescription; } if (alien == null) { alien = SimDescription.Find(DadDescriptionId); if (alien == null) { miniAlien = MiniSimDescription.Find(DadDescriptionId); if (miniAlien != null) { alien = miniAlien.UnpackSim(); if (alien != null) { Household household = Household.Create(false); if (household != null) { household.AddTemporary(alien); alien.Genealogy.SetSimDescription(alien); } } } } } float averageMoodForBirth = GetAverageMoodForBirth(alien, bonusMoodPoints); Random pregoRandom = new Random(mRandomGenSeed); int numSimMembers = 0; int numPetMembers = 0; mMom.Household.GetNumberOfSimsAndPets(true, out numSimMembers, out numPetMembers); int numForBirth = GetNumForBirth(alien, pregoRandom, numSimMembers, numPetMembers); Random gen = new Random(mRandomGenSeed); List <Sim> list = new List <Sim>(); for (int i = 0; i < numForBirth; i++) { DetermineGenderOfBaby(gen); CASAgeGenderFlags gender = mGender; mGender = CASAgeGenderFlags.None; SimDescription babyDescription = AlienGenetics.MakeAlienBaby(alien, mMom.SimDescription, gender, averageMoodForBirth, pregoRandom, interactive); mMom.Household.Add(babyDescription); Sim baby = babyDescription.Instantiate(Vector3.Empty); baby.SetPosition(mMom.Position); if (homeBirth) { TotallyHideBaby(baby); } list.Add(baby); CheckForGhostBaby(baby); if (baby.SimDescription.IsPlayableGhost) { EventTracker.SendEvent(EventTypeId.kHadGhostBaby, mMom, baby); } if (i == 0) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBaby, baby.SimDescription)); } MidlifeCrisisManager.OnHadChild(mMom.SimDescription); EventTracker.SendEvent(EventTypeId.kNewOffspring, mMom, baby); //EventTracker.SendEvent(EventTypeId.kParentAdded, baby, mMom); if (mDad != null) { EventTracker.SendEvent(EventTypeId.kNewOffspring, mDad, baby); EventTracker.SendEvent(EventTypeId.kParentAdded, baby, mDad); } EventTracker.SendEvent(EventTypeId.kChildBornOrAdopted, null, baby); } if (miniAlien != null) { alien.Household.Destroy(); alien.Household.RemoveTemporary(alien); alien.Dispose(true, true); } if (mMom.Household != null) { mMom.Household.InvalidateThumbnail(); } switch (numForBirth) { case 1: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabySingle, mMom.SimDescription)); break; case 2: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTwins, mMom.SimDescription)); break; case 3: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTriplets, mMom.SimDescription)); break; case 4: break; } return(list); }
public override bool Run() { try { if (!Actor.RouteToSlotAndCheckInUse(Target, BotMakingStation.kOperatorRoutingSlot)) { return(false); } StandardEntry(); BeginCommodityUpdates(); CASAgeGenderFlags adult = CASAgeGenderFlags.Adult; CASAgeGenderFlags gender = CASAgeGenderFlags.None | CASAgeGenderFlags.Male; RobotForms humanoid = RobotForms.Humanoid; SimDescription simDescription = OccultRobot.MakeRobot(adult, gender, humanoid); if (simDescription == null) { StandardExit(); return(false); } FutureSkill.SetupReactToFutureTech(Target); EnterStateMachine("BotMakingStation", "Enter", "x"); SetActor("BotMakingStation", Target); Target.SetGeometryState("on"); Animate("x", "CreateServoBot"); bool flag = false; Household.NpcHousehold.Add(simDescription); try { new Sims.Advanced.EditInCAS(true).Perform(new GameHitParameters <SimDescriptionObject>(Sim.ActiveActor, new SimDescriptionObject(simDescription), GameObjectHit.NoHit)); while (GameStates.NextInWorldStateId != InWorldState.SubState.LiveMode) { SpeedTrap.Sleep(); } flag |= CASChangeReporter.Instance.CasCancelled; Household.NpcHousehold.Remove(simDescription); Target.LotCurrent.SetDisplayLevel(LotManager.GetBestLevelToDisplayForSim(Actor, Target.LotCurrent)); Household household = Actor.Household; /* Overstuffed * if (!household.CanAddSimDescriptionToHousehold(simDescription)) * { * flag = true; * } */ if (flag) { AnimateSim("CancelCreateServoBot"); simDescription.Dispose(); AnimateSim("Exit"); } else { CASRobotData supernaturalData = simDescription.SupernaturalData as CASRobotData; supernaturalData.CreatorSim = Actor.SimDescription.SimDescriptionId; supernaturalData.BotQualityLevel = Target.GetCreationLevel(Actor); household.Add(simDescription); Sim sim = null; Slot[] containmentSlots = Target.GetContainmentSlots(); if ((containmentSlots != null) && (containmentSlots.Length > 0x0)) { Vector3 slotPosition = Target.GetSlotPosition(containmentSlots[0x0]); Vector3 forwardOfSlot = Target.GetForwardOfSlot(containmentSlots[0x0]); sim = Genetics.InstantiateRobotAndGrantPhone(simDescription, slotPosition); sim.SetPosition(slotPosition); sim.SetForward(forwardOfSlot); } else { Vector3 position = Actor.Position; Vector3 forwardVector = Actor.ForwardVector; sim = simDescription.Instantiate(position); GlobalFunctions.FindGoodLocationNearby(sim, ref position, ref forwardVector); sim.SetPosition(position); sim.SetForward(forwardVector); } Actor.Genealogy.AddChild(sim.Genealogy); InteractionQueue interactionQueue = sim.InteractionQueue; mLinkedInteraction = BotMakingStation.BeCreated.Singleton.CreateInstance(Target, sim, new InteractionPriority(InteractionPriorityLevel.CriticalNPCBehavior), false, false) as BotMakingStation.BeCreated; mLinkedInteraction.SyncTarget = Actor; interactionQueue.AddNext(mLinkedInteraction); Actor.SynchronizationRole = Sim.SyncRole.Initiator; Actor.SynchronizationTarget = sim; Actor.SynchronizationLevel = Sim.SyncLevel.Routed; if (!Actor.WaitForSynchronizationLevelWithSim(sim, Sim.SyncLevel.Started, 40f)) { Actor.ClearSynchronizationData(); AnimateJoinSims("CompleteCreateServoBot"); AnimateSim("ExitWithBot"); Target.SetGeometryState("off"); EndCommodityUpdates(false); StandardExit(); return(false); } SetActorAndEnter("y", sim, "BotEnter"); CASRobotData data2 = simDescription.SupernaturalData as CASRobotData; if (data2 != null) { SetParameter("IsHoverBot", data2.Form == RobotForms.Hovering); } else { SetParameter("IsHoverBot", false); } Actor.ModifyFunds(-BotMakingStation.kCostToBuildServoBot); AnimateJoinSims("CompleteCreateServoBot"); AnimateSim("ExitWithBot"); BotBuildingSkill element = Actor.SkillManager.GetElement(SkillNames.BotBuilding) as BotBuildingSkill; sim.SimDescription.TraitChipManager.UpgradeNumTraitChips(element.GetSimMaxAllowedUpgradeSlots()); EventTracker.SendEvent(EventTypeId.kCreatedBot, Actor, sim); element.OnBotCreated(); } } catch { simDescription.Dispose(); } Target.SetGeometryState("off"); EndCommodityUpdates(!flag); StandardExit(); return(true); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); } return(false); }
public override List <Sim> CreateNewborns(float bonusMoodPoints, bool interactive, bool homeBirth) { SimDescription robot = mRobot.SimDescription; MiniSimDescription miniBot = null; if (robot == null) { robot = SimDescription.Find(mRobotDescriptionID); if (robot == null) { miniBot = MiniSimDescription.Find(mRobotDescriptionID); if (miniBot != null) { robot = miniBot.UnpackSim(); if (robot != null) { Household household = Household.Create(false); if (household != null) { household.AddTemporary(robot); robot.Genealogy.SetSimDescription(robot); } } else { miniBot = null; } } } } SimDescription father = SimDescription.Find(DadDescriptionId); MiniSimDescription miniDad = null; if (father == null) { miniDad = MiniSimDescription.Find(DadDescriptionId); if (miniDad != null) { father = miniDad.UnpackSim(); if (father == null) { miniDad = null; } } } float averageMoodForBirth = GetAverageMoodForBirth(robot, bonusMoodPoints); Random pregoRandom = new Random(mRandomGenSeed); int numSims = 0; int numPets = 0; mMom.Household.GetNumberOfSimsAndPets(true, out numSims, out numPets); int numBirth = GetNumForBirth(father, pregoRandom, numSims, numPets); Random gen = new Random(mRandomGenSeed); List <Sim> list = new List <Sim>(); for (int i = 0; i < numBirth; i++) { DetermineGenderOfBaby(gen); CASAgeGenderFlags gender = mGender; mGender = CASAgeGenderFlags.None; SimDescription babyDesc; if (!mBabyCustomizeData.IsBabyCustomized) { babyDesc = Genetics.MakeBaby(father, mMom.SimDescription, gender, averageMoodForBirth, pregoRandom, interactive); } else { babyDesc = Genetics.MakeCustomizedBaby(father, mMom.SimDescription, gender, averageMoodForBirth, pregoRandom, interactive, mBabyCustomizeData); } babyDesc.WasCasCreated = false; mMom.Household.Add(babyDesc); Sim baby = babyDesc.Instantiate(Vector3.Empty); baby.SetPosition(mMom.Position); if (homeBirth) { TotallyHideBaby(baby); } list.Add(baby); CheckForGhostBaby(baby); if (baby.SimDescription.IsPlayableGhost) { EventTracker.SendEvent(EventTypeId.kHadGhostBaby, mMom, baby); if (mRobot != null) { EventTracker.SendEvent(EventTypeId.kHadGhostBaby, mRobot, baby); } } if (i == 0) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBaby, baby.SimDescription)); } MidlifeCrisisManager.OnHadChild(mMom.SimDescription); EventTracker.SendEvent(EventTypeId.kNewOffspring, mMom, baby); EventTracker.SendEvent(EventTypeId.kParentAdded, baby, mMom); if (mRobot != null) { MidlifeCrisisManager.OnHadChild(mRobot.SimDescription); EventTracker.SendEvent(EventTypeId.kNewOffspring, mRobot, baby); EventTracker.SendEvent(EventTypeId.kParentAdded, baby, mRobot); } EventTracker.SendEvent(EventTypeId.kChildBornOrAdopted, null, baby); if (baby.Household.IsActive && ((mRobot != null && !mRobot.TraitManager.HasElement(TraitNames.FutureSim)) || mRobot == null) && !mMom.TraitManager.HasElement(TraitNames.FutureSim) && baby.TraitManager.HasElement(TraitNames.FutureSim)) { baby.TraitManager.RemoveElement(TraitNames.FutureSim); } } if (miniBot != null) { robot.Household.Destroy(); robot.Household.RemoveTemporary(robot); robot.Dispose(true, true); } if (mMom.Household != null) { mMom.Household.InvalidateThumbnail(); } switch (numBirth) { case 2: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTwins, mMom.SimDescription)); if (mRobot != null) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTwins, mRobot.SimDescription)); } break; case 3: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTriplets, mMom.SimDescription)); if (mRobot != null) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTriplets, mRobot.SimDescription)); } break; default: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabySingle, mMom.SimDescription)); if (mRobot != null) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabySingle, mRobot.SimDescription)); } break; } return(list); }
public override List <Sim> CreateNewborns(float bonusMoodPoints, bool interactive, bool homeBirth) { SimDescription geneticMom = null, geneticDad = null, robotDad = null; MiniSimDescription miniMom = null, miniDad = null, miniRoboDad = null; List <Sim> results; GetParentDescriptions(ref geneticMom, ref miniMom, ref geneticDad, ref miniDad, ref robotDad, ref miniRoboDad); if (RobotDadDescriptionID != 0uL) { results = CreateNewborns(geneticMom, robotDad, geneticDad, bonusMoodPoints, interactive, homeBirth); if (miniRoboDad != null) { robotDad.Household.Destroy(); robotDad.Household.RemoveTemporary(robotDad); robotDad.Dispose(true, true); } } else { results = CreateNewborns(geneticMom, geneticDad, bonusMoodPoints, interactive, homeBirth); if (miniDad != null) { geneticDad.Household.Destroy(); geneticDad.Household.RemoveTemporary(geneticDad); geneticDad.Dispose(true, true); } } switch (results.Count) { case 2: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTwins, mMom.SimDescription)); if (mDad != null) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTwins, mDad.SimDescription)); } break; case 3: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTriplets, mMom.SimDescription)); if (mDad != null) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabyTriplets, mDad.SimDescription)); } break; default: EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabySingle, mMom.SimDescription)); if (mDad != null) { EventTracker.SendEvent(new SimDescriptionEvent(EventTypeId.kNewBabySingle, mDad.SimDescription)); } break; } if (mMom.Household != null) { mMom.Household.InvalidateThumbnail(); } return(results); }
public new void CreateBabyBeforePacking() { if (GameUtils.IsOnVacation() || GameUtils.IsUniversityWorld()) { if (mMom.Household != null) { int numSims = 0, numPets = 0; mMom.Household.GetNumberOfSimsAndPets(true, out numSims, out numPets); List <SimDescription> list = CreateNewbornsBeforePacking(0f, true, numSims, numPets); foreach (SimDescription current in list) { MiniSimDescription.AddMiniSim(current); } mMom.Household.InvalidateThumbnail(); List <SimDescription> allDescriptions = mMom.Household.AllSimDescriptions; foreach (SimDescription current2 in allDescriptions) { MiniSimDescription miniSimDescription = MiniSimDescription.Find(current2.SimDescriptionId); if (miniSimDescription != null) { miniSimDescription.UpdateHouseholdMembers(allDescriptions); } } Simulator.Sleep(0u); } } else { MiniSimDescription miniSimDescription = MiniSimDescription.Find(RobotMomDescriptionID); if (miniSimDescription != null) { int numSims = 1, numPets = 0; List <ulong> list = new List <ulong>(); if (miniSimDescription.HouseholdMembers != null) { numSims = miniSimDescription.NumSimMemberIncludingPregnant; numPets = miniSimDescription.NumPetMemberIncludingPregnant; list.AddRange(miniSimDescription.HouseholdMembers); } else { list.Add(miniSimDescription.SimDescriptionId); } List <SimDescription> newborns = CreateNewbornsBeforePacking(0f, false, numSims, numPets); while (newborns.Count > 0) { SimDescription simDescription = newborns[0]; MiniSimDescription.AddMiniSim(simDescription); MiniSimDescription miniSimDescription2 = MiniSimDescription.Find(simDescription.SimDescriptionId); miniSimDescription2.mMotherDescId = miniSimDescription.SimDescriptionId; list.Add(simDescription.SimDescriptionId); newborns.RemoveAt(0); simDescription.Dispose(); } foreach (ulong current3 in list) { MiniSimDescription miniSimDescription4 = MiniSimDescription.Find(current3); if (miniSimDescription4 != null) { miniSimDescription4.UpdateHouseholdMembers(list); } } } } mMom.SimDescription.ClearPregnancyData(); }
public bool CleansingKill(SimDescription sim, SimDescription.DeathType deathType, bool cleanse) { AddTry("CleansingKill"); if (!GameStates.IsLiveState) { IncStat("CleansingKill Mode Save"); return(false); } string name = sim.FullName; if (cleanse) { Annihilation.CleanseGenealogy(sim); SetCleansed(sim); } bool bSuccess = false; Sim createdSim = sim.CreatedSim; if (createdSim != null) { try { if (createdSim.InteractionQueue != null) { createdSim.InteractionQueue.CancelAllInteractions(); SpeedTrap.Sleep(); } if ((deathType != SimDescription.DeathType.None) || (cleanse)) { if (createdSim.Kill(deathType)) { bSuccess = true; } } } catch (Exception e) { Common.DebugException(createdSim, e); } } if (!bSuccess) { if (createdSim == PlumbBob.SelectedActor) { IntroTutorial.ForceExitTutorial(); } if (Sims == null) { AddSuccess("CleansingKill: Destruct Fail"); return(false); } if (!Annihilation.Perform(sim, cleanse)) { Main.RemoveSim(sim.SimDescriptionId); } else { if (!cleanse) { sim.Dispose(true, false, true); } // Special case to stop HangWithCoworker bounces Careers.RemoveSim(sim.SimDescriptionId); } bSuccess = true; } if (bSuccess) { AddSuccess("CleansingKill: Success"); IncStat("Killed: " + name, Common.DebugLevel.High); return(true); } else { return(false); } }
protected override bool PrivateUpdate(ScenarioFrame frame) { if (mNewSim != null) { mSpecies = mNewSim.Species; } if (HouseholdsEx.IsFull(this, Sim.Household, mSpecies, 0, true, true)) { IncStat("Full"); return(false); } bool created = false; if (mNewSim == null) { using (SimFromBin <ManagerLot> simBin = new SimFromBin <ManagerLot>(this, Lots)) { CASAgeGenderFlags gender = BabyGenderScenario.GetGenderByFirstBorn(Manager, GetValue <ImmigrateScenario.GenderOption, BabyGenderScenario.FirstBornGender>(), false); mNewSim = simBin.CreateNewSim(Ages, gender, mSpecies); created = true; } } if (mNewSim != null) { if (Households.MoveSim(mNewSim, Sim.Household)) { mNewSim.LastName = Sim.LastName; mNewSim.WasAdopted = true; Relationship relation = ManagerSim.GetRelationship(Sim, mNewSim); if (relation != null) { relation.LTR.SetLiking(Delta); } Relationships.CheckAddHumanParentFlagOnAdoption(Sim, mNewSim); if (Sim.Partner != null) { Relationships.CheckAddHumanParentFlagOnAdoption(Sim.Partner, mNewSim); } if (SimTypes.IsEquivalentSpecies(mNewSim, Sim)) { Sim.Genealogy.AddChild(mNewSim.Genealogy); } UpdateDayOfLastOption(Sim); if ((Sim.Partner != null) && (Sim.IsMarried)) { if (SimTypes.IsEquivalentSpecies(mNewSim, Sim)) { Sim.Partner.Genealogy.AddChild(mNewSim.Genealogy); } UpdateDayOfLastOption(Sim.Partner); } return(true); } else if (created) { mNewSim.Dispose(); mNewSim = null; } } IncStat("No New Sim"); return(false); }
protected override void OnPerform() { int roomId = 0; Lot lot = null; if (mTarget.CreatedSim != null) { Vector3 location = mTarget.CreatedSim.PositionOnFloor; lot = mTarget.CreatedSim.LotCurrent; roomId = mTarget.CreatedSim.RoomId; List <GnomeData> gnomes = new List <GnomeData>(); if (mTarget.TraitManager.HasElement(TraitNames.CultureChina)) { gnomes.Add(new GnomeData(0x000000000098977D, ProductVersion.EP1)); } else if ((mTarget.TraitManager.HasElement(TraitNames.CultureEgypt)) || (mTarget.IsMummy)) { gnomes.Add(new GnomeData(0x000000000098977C, ProductVersion.EP1)); } else if (mTarget.TraitManager.HasElement(TraitNames.CultureFrance)) { gnomes.Add(new GnomeData(0x000000000098977E, ProductVersion.EP1)); } else if (mTarget.IsVampire) { gnomes.Add(new GnomeData(0x000000000098A1C2, ProductVersion.EP3)); } else if (mTarget.IsFrankenstein) { gnomes.Add(new GnomeData(0x0000000000989CD9, ProductVersion.EP2)); } else if ((mTarget.IsCelebrity) || (mTarget.AssignedRole is RolePaparazzi)) { gnomes.Add(new GnomeData(0x000000000098A1C4, ProductVersion.EP3)); } else if (mTarget.Occupation is MagicianCareer) { gnomes.Add(new GnomeData(0x000000000098D215, ProductVersion.EP6)); // Magician } else if (mTarget.Occupation is SingerCareer) { gnomes.Add(new GnomeData(0x000000000098D214, ProductVersion.EP6)); // Singer } else if (mTarget.IsCat) { gnomes.Add(new GnomeData(0x000000000098AAD6, ProductVersion.EP5)); // Pet Cat } else if (mTarget.IsADogSpecies) { gnomes.Add(new GnomeData(0x000000000098AAD5, ProductVersion.EP5)); // Pet Dog } else if (mTarget.IsHorse) { gnomes.Add(new GnomeData(0x000000000098AAD4, ProductVersion.EP5)); // Pet Horse } else { gnomes.Add(new GnomeData(0x000000000000058B, ProductVersion.BaseGame)); // Normal if (GameUtils.IsInstalled(ProductVersion.EP1)) { gnomes.Add(new GnomeData(0x000000000098977D, ProductVersion.EP1)); // China gnomes.Add(new GnomeData(0x000000000098977C, ProductVersion.EP1)); // Egypt gnomes.Add(new GnomeData(0x000000000098977E, ProductVersion.EP1)); // France } if (GameUtils.IsInstalled(ProductVersion.EP2)) { gnomes.Add(new GnomeData(0x0000000000989EEC, ProductVersion.EP2)); // Caveman gnomes.Add(new GnomeData(0x0000000000989CD9, ProductVersion.EP2)); // Inventor gnomes.Add(new GnomeData(0x0000000000989EDF, ProductVersion.EP2)); // Laundry gnomes.Add(new GnomeData(0x0000000000989CF2, ProductVersion.EP2)); // Sculptor } if (GameUtils.IsInstalled(ProductVersion.EP3)) { gnomes.Add(new GnomeData(0x000000000098A1C4, ProductVersion.EP3)); // Celebrity gnomes.Add(new GnomeData(0x000000000098A1C2, ProductVersion.EP3)); // Vampire } if (GameUtils.IsInstalled(ProductVersion.EP5)) { gnomes.Add(new GnomeData(0x000000000098AEB1, ProductVersion.EP5)); // Freezer Bunny gnomes.Add(new GnomeData(0x000000000098AAD6, ProductVersion.EP5)); // Pet Cat gnomes.Add(new GnomeData(0x000000000098AAD5, ProductVersion.EP5)); // Pet Dog gnomes.Add(new GnomeData(0x000000000098AAD4, ProductVersion.EP5)); // Pet Horse } if (GameUtils.IsInstalled(ProductVersion.EP6)) { gnomes.Add(new GnomeData(0x000000000098D215, ProductVersion.EP6)); // Magician gnomes.Add(new GnomeData(0x000000000098D214, ProductVersion.EP6)); // Singer } } if (gnomes.Count > 0) { GnomeData preferred = RandomUtil.GetRandomObjectFromList(gnomes); MagicGnomeBase gnome = ObjectCreation.CreateObject(preferred.mInstance, preferred.mVersion, null) as MagicGnomeBase; if (gnome != null) { NameComponent name = gnome.GetComponent <NameComponent>(); if (name != null) { name.mName = mTarget.FullName; } gnome.SetPosition(location); gnome.AddToWorld(); } } } Genealogy genealogy = mTarget.CASGenealogy as Genealogy; if (genealogy != null) { genealogy.ClearAllGenealogyInformation(); } foreach (SimDescription other in SimDescription.GetSimDescriptionsInWorld()) { MiniSimDescription miniOther = MiniSimDescription.Find(other.SimDescriptionId); if (miniOther == null) { continue; } miniOther.RemoveMiniRelatioship(mTarget.SimDescriptionId); } Annihilation.RemoveMSD(mTarget.SimDescriptionId); Relationship.RemoveSimDescriptionRelationships(mTarget); Urnstone urnstone = Urnstone.FindGhostsGrave(mTarget); if (urnstone != null) { if ((urnstone.InInventory) && (urnstone.Parent != null) && (urnstone.Parent.Inventory != null)) { urnstone.Parent.Inventory.RemoveByForce(urnstone); } urnstone.DestroyGrave(); try { urnstone.Dispose(); } catch { } } try { mTarget.Dispose(); Assassination skill = Assassination.EnsureSkill(mActor); if (skill != null) { skill.AddPotentialKill(mTarget, true); bool witnessed = false; if (lot != null) { witnessed = Assassination.WasWitnessed(lot, roomId, mActor.SimDescription, mTarget, new List <Sim>()); } skill.AddActualKill(mTarget, false, witnessed); } } catch { } }
public static bool Perform(SimDescription sim, bool cleanse) { if (sim == null) { return(false); } Common.StringBuilder msg = new Common.StringBuilder("Perform" + Common.NewLine); Household house = sim.Household; try { Sim createdSim = sim.CreatedSim; if (createdSim != null) { createdSim.ReservedVehicle = null; } if (PetAdoption.sNeighborAdoption != null) { if (PetAdoption.sNeighborAdoption.mMother == sim) { try { PetAdoption.ResetNeighborAdoption(); } catch (Exception e) { Common.Exception(sim, e); } finally { PetAdoption.sNeighborAdoption = null; } } else { PetAdoption.sNeighborAdoption.mPetsToAdopt.Remove(sim); } } foreach (Service service in Services.AllServices) { try { if (service == null) { continue; } msg += Common.NewLine + "Service: " + service.GetType(); if (sim.CreatedSim != null) { service.RemoveAssignment(sim.CreatedSim); } service.RemovePreferredSim(sim); service.mPool.Remove(sim); ResortWorker resortWorker = service as ResortWorker; if (resortWorker != null) { if (resortWorker.mWorkerInfo != null) { List <ObjectGuid> remove = new List <ObjectGuid>(); foreach (KeyValuePair <ObjectGuid, ResortWorker.WorkerInfo> info in resortWorker.mWorkerInfo) { if ((info.Value.CurrentSimDescriptionID == sim.SimDescriptionId) || (info.Value.DesiredSimDescriptionID == sim.SimDescriptionId)) { remove.Add(info.Key); } } foreach (ObjectGuid rem in remove) { resortWorker.mWorkerInfo[rem] = new ResortWorker.WorkerInfo(); } } } } catch (Exception e) { Common.Exception(sim, null, msg, e); } } msg += Common.NewLine + "A"; List <Household> houses = new List <Household>(); if (house != null) { houses.Add(house); } foreach (Household check in Household.sHouseholdList) { if (check == house) { continue; } if (check.Contains(sim)) { houses.Add(check); } } foreach (Household remove in houses) { Household.HouseholdSimsChangedCallback changedCallback = null; try { changedCallback = remove.HouseholdSimsChanged; remove.HouseholdSimsChanged = null; remove.Remove(sim, !remove.IsSpecialHousehold); } finally { remove.HouseholdSimsChanged = changedCallback; } } msg += Common.NewLine + "B"; try { if (cleanse) { if (sim.LifeEventManager != null) { sim.LifeEventManager.Purge(); } } } catch (Exception e) { Common.Exception(sim, null, msg, e); } msg += Common.NewLine + "C"; RemoveSimDescriptionRelationships(sim); msg += Common.NewLine + "D"; PetPoolManager.RemoveIdFromPool(sim.SimDescriptionId); msg += Common.NewLine + "E"; try { if (sim.CareerManager != null) { sim.CareerManager.LeaveAllJobs(Career.LeaveJobReason.kDied); } } catch (Exception e) { sim.CareerManager.mJob = null; sim.CareerManager.mSchool = null; Common.Exception(sim, null, msg, e); } msg += Common.NewLine + "F"; if (sim.CASGenealogy == null) { // Necessary to stop an error in MidLifeCrisisManager sim.mGenealogy = new Genealogy(sim); } msg += Common.NewLine + "G"; try { if (sim.Partner != null) { sim.Partner.Partner = null; } sim.Partner = null; } catch (Exception e) { Common.Exception(sim, null, msg, e); } msg += Common.NewLine + "H"; if (sim.DeathStyle != SimDescription.DeathType.None) { // Passing in a household can invoke the social worker, so don't bother Urnstone.FinalizeSimDeath(sim, null /*house*/); } msg += Common.NewLine + "I"; Urnstone urnstone = Urnstones.FindGhostsGrave(sim); msg += Common.NewLine + "J"; if ((cleanse) && (urnstone != null)) { if (urnstone.InInventory) { Inventory inventory = Inventories.ParentInventory(urnstone); if (inventory != null) { inventory.RemoveByForce(urnstone); } } if (urnstone.DeadSimsDescription != null) { urnstone.DeadSimsDescription.Fixup(); } try { urnstone.Dispose(); } catch (Exception e) { Common.DebugException(sim, null, msg, e); } urnstone.Destroy(); } msg += Common.NewLine + "K"; if ((FakeMetaAutonomy.Instance != null) && (FakeMetaAutonomy.Instance.mPool != null)) { FakeMetaAutonomy.Instance.mPool.Remove(sim); } msg += Common.NewLine + "L"; if (Sims3.Gameplay.Services.FakeMetaAutonomy.mToDestroy != null) { Sims3.Gameplay.Services.FakeMetaAutonomy.mToDestroy.Remove(sim); } msg += Common.NewLine + "M"; if ((houses.Contains(Household.ActiveHousehold)) && (sim.CreatedSim != null)) { HudModel model = HudController.Instance.Model as HudModel; foreach (SimInfo info in model.mSimList) { if (info.mGuid == sim.CreatedSim.ObjectId) { model.RemoveSimInfo(info); model.mSimList.Remove(info); break; } } } msg += Common.NewLine + "N"; try { if (sim.AssignedRole != null) { sim.AssignedRole.RemoveSimFromRole(); } } catch (Exception e) { Common.DebugException(sim, null, msg, e); sim.AssignedRole = null; } msg += Common.NewLine + "O1"; if ((CarNpcManager.Singleton != null) && (CarNpcManager.Singleton.NpcDriversManager != null)) { foreach (Stack <SimDescription> stack in CarNpcManager.Singleton.NpcDriversManager.mDescPools) { if (stack == null) { continue; } List <SimDescription> sims = new List <SimDescription>(); bool found = false; foreach (SimDescription stackSim in stack) { if (stackSim == sim) { found = true; } else { sims.Add(stackSim); } } if (found) { stack.Clear(); foreach (SimDescription stackSim in sims) { stack.Push(stackSim); } } } } msg += Common.NewLine + "O2"; if (cleanse) { sim.Dispose(); } msg += Common.NewLine + "P"; if ((house != null) && (createdSim != null)) { house.OnMemberChanged(sim, createdSim); } return(true); } catch (Exception e) { Common.Exception(sim, null, msg, e); if (house != null) { Household.HouseholdSimsChangedCallback changedCallback = null; try { changedCallback = house.HouseholdSimsChanged; house.HouseholdSimsChanged = null; house.Add(sim); } finally { house.HouseholdSimsChanged = changedCallback; } } return(false); } }
protected override bool PrivateUpdate(ScenarioFrame frame) { if (mCheckRequired) { if (!mRequirement.mRequired) { return(false); } } List <CASAgeGenderFlags> ageGenderRequirements = new List <CASAgeGenderFlags>(); if ((!mRequirement.mNeedMale) && (!mRequirement.mNeedFemale)) { if (BabyGenderScenario.GetGenderByFirstBorn(Manager, GetValue <GenderOption, BabyGenderScenario.FirstBornGender>(), false) == CASAgeGenderFlags.Male) { mRequirement.mNeedMale = true; } else { mRequirement.mNeedFemale = true; } } bool teenMoveIn = false; if (mRequirement.mMate == null) { if (RandomUtil.RandomChance(GetValue <TeenChanceOption, int>())) { teenMoveIn = true; } } else if (mRequirement.mMate.Teen) { teenMoveIn = true; } if (mRequirement.mNeedMale) { CASAgeGenderFlags age = CASAgeGenderFlags.Male | CASAgeGenderFlags.Human; if (teenMoveIn) { age |= CASAgeGenderFlags.Teen; } else //if ((mRequirement.CareerLevel != null) && (mRequirement.CareerLevel.Level > 5)) { age |= CASAgeGenderFlags.YoungAdult; age |= CASAgeGenderFlags.Adult; } ageGenderRequirements.Add(age); } if (mRequirement.mNeedFemale) { CASAgeGenderFlags age = CASAgeGenderFlags.Female | CASAgeGenderFlags.Human; if (teenMoveIn) { age |= CASAgeGenderFlags.Teen; } else if (mRequirement.mFertile) { age |= CASAgeGenderFlags.YoungAdult; } else //((mRequirement.CareerLevel != null) && (mRequirement.CareerLevel.Level > 5) && ) { age |= CASAgeGenderFlags.YoungAdult; age |= CASAgeGenderFlags.Adult; } ageGenderRequirements.Add(age); } bool singleParent = false; Lot familyLot = null; if (((mRequirement.mMate == null) || (!mCheckRequired)) && (GetValue <WholeFamilyOption, int>() > 0) && (!RandomUtil.RandomChance(GetValue <SingleSimOption, int>()))) { IncStat("WholeFamily"); familyLot = Lots.FindLot(this, null, 0, ManagerLot.FindLotFlags.CheapestHome | ManagerLot.FindLotFlags.Inspect, OnLotPriceCheck); if (familyLot == null) { return(false); } if (RandomUtil.RandomChance(GetValue <ChanceOfSingleOption, int>())) { IncStat("Single Parent"); singleParent = true; } else if (familyLot.CountObjects <IBedDouble>() == 0) { if (familyLot.CountObjects <IBedSingle>() > 1) { IncStat("Single Parent"); singleParent = true; } else { IncStat("No Double Bed"); familyLot = null; } } } using (SimFromBin <ManagerLot> simBin = new SimFromBin <ManagerLot>(this, Lots)) { List <SimDescription> sims = new List <SimDescription>(); CASAgeGenderFlags genders = CASAgeGenderFlags.Male | CASAgeGenderFlags.Female; if (familyLot != null) { BabyGenderScenario.FirstBornGender genderPref = GetValue <GenderOption, BabyGenderScenario.FirstBornGender>(); bool bothGenders = true; if ((genderPref == BabyGenderScenario.FirstBornGender.Male) || (genderPref == BabyGenderScenario.FirstBornGender.Female)) { bothGenders = false; } else if (RandomUtil.RandomChance(GetValue <ManagerFlirt.ChanceOfGaySim, int>())) { bothGenders = false; } if (ageGenderRequirements.Count == 1) { if (bothGenders) { if ((ageGenderRequirements[0] & CASAgeGenderFlags.Male) == CASAgeGenderFlags.Male) { ageGenderRequirements.Add(CASAgeGenderFlags.Female | (ageGenderRequirements[0] & CASAgeGenderFlags.AgeMask)); } else { ageGenderRequirements.Add(CASAgeGenderFlags.Male | (ageGenderRequirements[0] & CASAgeGenderFlags.AgeMask)); } } else { genders = ageGenderRequirements[0] & CASAgeGenderFlags.GenderMask; ageGenderRequirements.Add(ageGenderRequirements[0]); } } } foreach (CASAgeGenderFlags ageGender in ageGenderRequirements) { SimDescription sim = simBin.CreateNewSim(ageGender & CASAgeGenderFlags.AgeMask, ageGender & CASAgeGenderFlags.GenderMask, CASAgeGenderFlags.Human); if (sim == null) { IncStat("Creation Failure"); } else { sims.Add(sim); } } if (familyLot == null) { if (sims.Count > 0) { Add(frame, new ImmigrantMailOrderScenario(mRequirement, sims), ScenarioResult.Start); } } else { bool createChildren = true; SimDescription otherParent = null; List <SimDescription> parents = new List <SimDescription>(sims); if (parents.Count > 1) { otherParent = parents[1]; if (parents[1].IsMale) { parents[0].InternalIncreaseGenderPreferenceMale(); } else { parents[0].InternalIncreaseGenderPreferenceFemale(); } if (parents[0].IsMale) { parents[1].InternalIncreaseGenderPreferenceMale(); } else { parents[1].InternalIncreaseGenderPreferenceFemale(); } Relationship relation = Relationship.Get(parents[0], parents[1], true); if (relation != null) { relation.MakeAcquaintances(); } if (GameUtils.IsUniversityWorld()) { createChildren = true; IncStat("Immigrant Friends"); } else if (!RandomUtil.RandomChance(GetValue <ChanceOfFriendsOption, int>())) { Dictionary <string, List <News.NewsTuning.ArticleTuning> > namedArticles = News.sNewsTuning.mNamedArticles; try { // Doing so stops Marriage notices of imported sims from appearing in the newspaper News.sNewsTuning.mNamedArticles = new Dictionary <string, List <News.NewsTuning.ArticleTuning> >(); if (RandomUtil.RandomChance(GetValue <ChanceOfPartnerOption, int>())) { IncStat("Immigrant Partners"); while (relation.CurrentLTR != LongTermRelationshipTypes.Partner) { if (!Romances.BumpToHigherState(this, parents[0], parents[1])) { break; } } } else { if (!Romances.BumpToHighestState(this, parents[0], parents[1])) { IncStat("Unmarriable"); createChildren = false; } else { parents[1].LastName = parents[0].LastName; } } } finally { News.sNewsTuning.mNamedArticles = namedArticles; } } else { createChildren = false; IncStat("Immigrant Friends"); } } if (createChildren) { Lot.LotMetrics metrics = new Lot.LotMetrics(); familyLot.GetLotMetrics(ref metrics); int totalChildren = GetValue <WholeFamilyOption, int>(); if (totalChildren > Options.GetValue <MaximumSizeOption, int>()) { totalChildren = Options.GetValue <MaximumSizeOption, int>(); } totalChildren -= parents.Count; totalChildren = RandomUtil.GetInt(totalChildren - 1) + 1; AddStat("Allowed Children", totalChildren); int totalBeds = metrics.BedCount - parents.Count; if (totalBeds > totalChildren) { totalBeds = totalChildren; } AddStat("Available Beds", totalBeds); if (!GameUtils.IsUniversityWorld()) { int numCribs = RandomUtil.GetInt((int)familyLot.CountObjects <Sims3.Gameplay.Objects.Beds.Crib>()); // Create the children if (numCribs > 2) { numCribs = 2; } if (numCribs > totalChildren) { numCribs = totalChildren; } AddStat("Available Cribs", numCribs); for (int i = 0; i < numCribs; i++) { SimDescription sim = simBin.CreateNewSim(parents[0], otherParent, CASAgeGenderFlags.Toddler, genders, parents[0].Species, true); if (sim == null) { IncStat("Creation Failure"); } else { sims.Add(sim); totalBeds--; } } if ((!parents[0].Teen) && ((otherParent == null) || (!otherParent.Teen))) { for (int i = 0; i < totalBeds; i++) { SimDescription sim = simBin.CreateNewSim(parents[0], otherParent, CASAgeGenderFlags.Child | CASAgeGenderFlags.Teen, genders, parents[0].Species, true); if (sim == null) { IncStat("Creation Failure"); } else { sims.Add(sim); } } } } else { for (int i = 0; i < totalBeds; i++) { SimDescription sim = simBin.CreateNewSim(CASAgeGenderFlags.YoungAdult | CASAgeGenderFlags.Adult, genders, parents[0].Species); if (sim == null) { IncStat("Creation Failure"); } else { sims.Add(sim); } } } if ((singleParent) && (otherParent != null)) { sims.Remove(otherParent); parents.Remove(otherParent); if (otherParent.Partner != null) { otherParent.Partner.Partner = null; otherParent.Partner = null; } otherParent.Dispose(true, false, true); } } } if ((GameUtils.IsInstalled(ProductVersion.EP5)) && (RandomUtil.RandomChance(GetValue <PetChanceOption, int>()))) { List <CASAgeGenderFlags> choices = new List <CASAgeGenderFlags>(); foreach (SimDescription sim in sims) { PetAdoptionBaseScenario.GetPossibleSpecies(this, familyLot, sim, false, choices); } AddStat("Pet Choices", choices.Count); if (choices.Count > 0) { int numberPets = RandomUtil.GetInt(1, GetValue <MaximumPetsOption, int>() - 1); AddStat("Pet Immigrants", numberPets); for (int i = 0; i < numberPets; i++) { CASAgeGenderFlags species = RandomUtil.GetRandomObjectFromList(choices); if (Sims.HasEnough(this, species)) { continue; } SimDescription pet = simBin.CreateNewSim(CASAgeGenderFlags.Child | CASAgeGenderFlags.Adult | CASAgeGenderFlags.Elder, CASAgeGenderFlags.Male | CASAgeGenderFlags.Female, species); if (pet != null) { pet.LastName = sims[0].LastName; sims.Add(pet); } else { IncStat("Pet Creation Fail"); } } } } Add(frame, new ImmigrantMoveInScenario(sims), ScenarioResult.Start); Add(frame, new NewImmigrantScenario(sims, mRequirement), ScenarioResult.Success); } return(true); }
public static bool Dispose(SimDescription sim, Logger log) { if (sim == null) return false; Genealogy oldGene = sim.Genealogy; if (sim.CelebrityManager == null) { // If missing, the Dispose() fires a script error sim.CelebrityManager = new Sims3.Gameplay.CelebritySystem.CelebrityManager(); } try { if (sim.Genealogy == null) { MiniSimDescription miniSim = MiniSimDescription.Find(sim.SimDescriptionId); if (miniSim != null) { sim.mGenealogy = miniSim.Genealogy; } if (sim.Genealogy == null) { sim.mGenealogy = new Genealogy(sim); } } Urnstone stone = Urnstones.FindGhostsGrave(sim); if (stone != null) { Inventory inventory = Inventories.ParentInventory(stone); if (inventory != null) { inventory.RemoveByForce(stone); } try { stone.Dispose(); stone.Destroy(); } catch (Exception e) { Common.Exception(sim, e); if (inventory != null) { inventory.TryToAdd(stone, false); } } } else { sim.Dispose(true, false, true); } if (log != null) { log(" Disposed: " + sim.FullName); } return true; } catch (Exception e) { Common.Exception(sim, e); return false; } finally { // Reassign the genealogy, to compensate for an issue where the miniSim is reprocessed later sim.mGenealogy = oldGene; } }