예제 #1
0
        protected override void OnPerform()
        {
            if (mSim.Posture != null)
            {
                mSim.Posture.PreviousPosture = null;
            }

            if (mSim.SimDescription.AgingState == null)
            {
                if (mSim.SimDescription.AgingEnabled)
                {
                    AgingManager.Singleton.AddSimDescription(mSim.SimDescription);
                }
                else
                {
                    mSim.SimDescription.AgingState = new AgingState(mSim.SimDescription);
                }
            }

            if (mSim.InteractionQueue != null)
            {
                mSim.InteractionQueue.CancelAllInteractions();
            }

            if ((mSim.BuffManager != null) && (mSim.BuffManager.HasTransformBuff()))
            {
                mSim.BuffManager.RemoveAllElements();
            }

            using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(mSim.Household, false))
            {
                AgingManager.Singleton.AgeTransitionWithoutCake(mSim);
            }
        }
예제 #2
0
        public override void Apply()
        {
            try
            {
                List <SimDescription> allSims = new List <SimDescription>();
                if (mSourceSimList != null)
                {
                    foreach (KeyValuePair <ISimDescription, bool> pair in mSourceSimList)
                    {
                        SimDescription sim = pair.Key as SimDescription;
                        if (sim == null)
                        {
                            continue;
                        }

                        allSims.Add(sim);
                    }
                }

                if (mTargetSimList != null)
                {
                    foreach (KeyValuePair <ISimDescription, bool> pair in mTargetSimList)
                    {
                        SimDescription sim = pair.Key as SimDescription;
                        if (sim == null)
                        {
                            continue;
                        }

                        allSims.Add(sim);
                    }
                }

                using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(allSims, Mover.Settings.mDreamCatcher))
                {
                    try
                    {
                        SplitMergeHouseholds += OnMerge;

                        base.Apply();
                    }
                    catch (Exception e)
                    {
                        Common.Exception("Apply", e);
                    }
                    finally
                    {
                        SplitMergeHouseholds -= OnMerge;

                        ProgressDialog.Close();
                    }
                }
            }
            catch (ExecutionEngineException)
            { }
        }
예제 #3
0
            protected RestartTask(Sim selectedActor, int count)
            {
                mSelectedActor = selectedActor;
                mCount = count;

                if (mSelectedActor != null)
                {
                    mStore = new DreamCatcher.HouseholdStore(mSelectedActor.Household, true);
                }
            }
예제 #4
0
            protected RestartTask(Sim selectedActor, int count)
            {
                mSelectedActor = selectedActor;
                mCount         = count;

                if (mSelectedActor != null)
                {
                    mStore = new DreamCatcher.HouseholdStore(mSelectedActor.Household, true);
                }
            }
예제 #5
0
        public static bool ActivateSimScreenMaskedFuncFromHousehold(PlayFlowModel ths, Household selectedHousehold, Lot selectedLot)
        {
            if ((selectedHousehold == null) || (selectedLot == null))
            {
                return(false);
            }

            using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(selectedHousehold, Mover.Settings.mDreamCatcher))
            {
                Camera.SetMapViewActiveLotMode(true);
                LotManager.LockActiveLot(selectedLot);

                // Custom
                DreamCatcher.Task.PrepareToBecomeActiveHousehold(selectedHousehold);

                Sim sim = BinCommon.ActivateSim(selectedHousehold, selectedLot);
                if (sim == null)
                {
                    sim = Households.AllSims(selectedHousehold)[0];
                    if (sim != null)
                    {
                        PlumbBob.ForceSelectActor(sim);
                    }
                }

                LotManager.SetWallsViewMode(0x12e);
                selectedLot.SetDisplayLevel(selectedLot.DoesFoundationExistOnLot() ? 0x1 : 0x0);
                if (sim.LotCurrent == sim.LotHome)
                {
                    Camera.FocusOnSelectedSim();
                    Camera.SetView(CameraView.SimView, false, false);
                }
                else
                {
                    Camera.FocusOnLot(sim.LotHome.LotId, 0f);
                    Camera.SetView(CameraView.HouseView, false, false);
                }
            }

            selectedLot.CheckIfLotNeedsBabysitter();
            ths.Sleep(1.5);
            return(true);
        }
예제 #6
0
        public static bool ActivateSimScreenMaskedFuncFromHousehold(PlayFlowModel ths, Household selectedHousehold, Lot selectedLot)
        {
            if ((selectedHousehold == null) || (selectedLot == null))
            {
                return false;
            }

            using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(selectedHousehold, Mover.Settings.mDreamCatcher))
            {
                Camera.SetMapViewActiveLotMode(true);
                LotManager.LockActiveLot(selectedLot);

                // Custom
                DreamCatcher.Task.PrepareToBecomeActiveHousehold(selectedHousehold);

                Sim sim = BinCommon.ActivateSim(selectedHousehold, selectedLot);
                if (sim == null)
                {
                    sim = Households.AllSims(selectedHousehold)[0];
                    if (sim != null)
                    {
                        PlumbBob.ForceSelectActor(sim);
                    }
                }

                LotManager.SetWallsViewMode(0x12e);
                selectedLot.SetDisplayLevel(selectedLot.DoesFoundationExistOnLot() ? 0x1 : 0x0);
                if (sim.LotCurrent == sim.LotHome)
                {
                    Camera.FocusOnSelectedSim();
                    Camera.SetView(CameraView.SimView, false, false);
                }
                else
                {
                    Camera.FocusOnLot(sim.LotHome.LotId, 0f);
                    Camera.SetView(CameraView.HouseView, false, false);
                }
            }

            selectedLot.CheckIfLotNeedsBabysitter();
            ths.Sleep(1.5);
            return true;
        }
예제 #7
0
        public override bool Run()
        {
            try
            {
                using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(Target.Household, false))
                {
                    return(base.Run());
                }
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
            }

            return(false);
        }
예제 #8
0
        public override bool Run()
        {
            try
            {
                using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(Target.Household, false))
                {
                    return base.Run();
                }
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
            }

            return false;
        }
예제 #9
0
        public static Sim Perform(Sim sim, bool fadeOut)
        {
            if (sim == null) return null;

            try
            {
                SimDescription simDesc = sim.SimDescription;

                if (Simulator.GetProxy(sim.ObjectId) == null)
                {
                    if (simDesc != null)
                    {
                        sim.Destroy();
                    }                  

                    //sim.mSimDescription = null;
                    return null;
                }

                if (simDesc == null)
                {
                    sim.mSimDescription = new SimDescription();

                    sim.Destroy();                    
                    return null;
                }

                if (sim.LotHome != null)
                {
                    simDesc.IsZombie = false;

                    if (simDesc.CreatedSim != sim)
                    {
                        sim.Destroy();

                        simDesc.CreatedSim = null;                        

                        return null;
                    }
                    else
                    {                        
                        Bed myBed = null;
                        BedData myBedData = null;

                        foreach (Bed bed in sim.LotHome.GetObjects<Bed>())
                        {
                            myBedData = bed.GetPartOwnedBy(sim);
                            if (myBedData != null)
                            {
                                myBed = bed;
                                break;
                            }
                        }

                        ResetPosture(sim);

                        if (simDesc.TraitManager == null)
                        {
                            simDesc.mTraitManager = new TraitManager();
                        }

                        try
                        {
                            simDesc.Fixup();

                            Corrections.CleanupBrokenSkills(simDesc, null);

                            ResetCareer(simDesc);

                            simDesc.ClearSpecialFlags();

                            if (simDesc.Pregnancy == null)
                            {
                                try
                                {
                                    if (simDesc.mMaternityOutfits == null)
                                    {
                                        simDesc.mMaternityOutfits = new OutfitCategoryMap();
                                    }
                                    simDesc.SetPregnancy(0, false);

                                    simDesc.ClearMaternityOutfits();
                                }
                                catch (Exception e)
                                {
                                    Common.Exception(sim, null, "Pregnancy", e);
                                }
                            }

                            if (sim.CurrentCommodityInteractionMap == null)
                            {
                                try
                                {
                                    LotManager.PlaceObjectOnLot(sim, sim.ObjectId);

                                    if (sim.CurrentCommodityInteractionMap == null)
                                    {
                                        sim.ChangeCommodityInteractionMap(sim.LotHome.Map);
                                    }
                                }
                                catch (Exception e)
                                {
                                    Common.Exception(sim, null, "ChangeCommodityInteractionMap", e);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Common.Exception(sim, null, "Fixup", e);
                        }

                        ResetSituations(sim);

                        CleanupSlots(sim);

                        ResetInventory(sim);

                        if (fadeOut)
                        {
                            bool active = (Sim.ActiveActor == sim);

                            if (sSimReset.Valid)
                            {
                                sSimReset.Invoke<bool>(new object[] { simDesc.SimDescriptionId });
                            }

                            ResetRouting(sim);

                            using (CreationProtection protection = new CreationProtection(simDesc, sim, false, true, false))
                            {
                                sim.Destroy();

                                Common.Sleep();

                                sim = FixInvisibleTask.InstantiateAtHome(simDesc, null);
                            }

                            if (sim != null)
                            {
                                if (active)
                                {
                                    try
                                    {
                                        foreach (Sim member in Households.AllSims(sim.Household))
                                        {
                                            if (member.CareerManager == null) continue;

                                            Occupation occupation = member.CareerManager.Occupation;
                                            if (occupation == null) continue;

                                            occupation.FormerBoss = null;
                                        }

                                        using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(sim.Household, true))
                                        {
                                            PlumbBob.DoSelectActor(sim, true);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        Common.Exception(sim, null, "DoSelectActor", e);
                                    }
                                }

                                if ((myBed != null) && (myBedData != null))
                                {
                                    if ((sim.Partner != null) && (sim.Partner.CreatedSim != null))
                                    {
                                        myBed.ClaimOwnership(sim, myBedData);
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (sim.Inventory == null)
                            {
                                sim.AddComponent<InventoryComponent>(new object[0x0]);
                            }                           

                            if (Instantiation.AttemptToPutInSafeLocation(sim, false))
                            {
                                ResetRouting(sim);

                                sim.SetObjectToReset();                                

                                // This is necessary to clear certain types of interactions
                                //   (it is also called in SetObjectToReset(), though doesn't always work there)
                                if (sim.InteractionQueue != null)
                                {
                                    sim.InteractionQueue.OnReset();
                                }
                            }
                        }

                        ResetSkillModifiers(simDesc);

                        ResetRole(sim);

                        if (simDesc.IsEnrolledInBoardingSchool())
                        {
                            simDesc.BoardingSchool.OnRemovedFromSchool();
                        }

                        MiniSimDescription miniSim = MiniSimDescription.Find(simDesc.SimDescriptionId);
                        if (miniSim != null)
                        {
                            miniSim.Instantiated = true;
                        }

                        UpdateInterface(sim);

                        return sim;
                    }
                }
                else if (simDesc.Service is Butler)
                {
                    if (Instantiation.AttemptToPutInSafeLocation(sim, true))
                    {
                        sim.Motives.RecreateMotives(sim);
                        sim.SetObjectToReset();
                    }

                    return sim;
                }
                else if (simDesc.IsImaginaryFriend)
                {
                    OccultImaginaryFriend friend;
                    if (OccultImaginaryFriend.TryGetOccultFromSim(sim, out friend))
                    {
                        if (Simulator.GetProxy(friend.mDollId) != null)
                        {
                            friend.TurnBackIntoDoll(OccultImaginaryFriend.Destination.Owner);

                            return null;
                        }
                    }
                }
                else if (simDesc.IsBonehilda)
                {
                    foreach (BonehildaCoffin coffin in Sims3.Gameplay.Queries.GetObjects<BonehildaCoffin>())
                    {
                        if (coffin.mBonehilda == simDesc)
                        {
                            coffin.mBonehildaSim = null;
                            break;
                        }
                    }
                }

                if (fadeOut)
                {
                    sim.Destroy();
                }

                return null;
            }
            catch (Exception exception)
            {
                Common.Exception(sim, exception);
                return sim;
            }
        }
예제 #10
0
        public static Sim Perform(Sim sim, bool fadeOut)
        {
            if (sim == null)
            {
                return(null);
            }

            try
            {
                SimDescription simDesc = sim.SimDescription;

                if (Simulator.GetProxy(sim.ObjectId) == null)
                {
                    if (simDesc != null)
                    {
                        sim.Destroy();
                    }

                    //sim.mSimDescription = null;
                    return(null);
                }

                if (simDesc == null)
                {
                    sim.mSimDescription = new SimDescription();

                    sim.Destroy();
                    return(null);
                }

                if (sim.LotHome != null)
                {
                    simDesc.IsZombie = false;

                    if (simDesc.CreatedSim != sim)
                    {
                        sim.Destroy();

                        simDesc.CreatedSim = null;

                        return(null);
                    }
                    else
                    {
                        Bed     myBed     = null;
                        BedData myBedData = null;

                        foreach (Bed bed in sim.LotHome.GetObjects <Bed>())
                        {
                            myBedData = bed.GetPartOwnedBy(sim);
                            if (myBedData != null)
                            {
                                myBed = bed;
                                break;
                            }
                        }

                        ResetPosture(sim);

                        if (simDesc.TraitManager == null)
                        {
                            simDesc.mTraitManager = new TraitManager();
                        }

                        try
                        {
                            simDesc.Fixup();

                            Corrections.CleanupBrokenSkills(simDesc, null);

                            ResetCareer(simDesc);

                            simDesc.ClearSpecialFlags();

                            if (simDesc.Pregnancy == null)
                            {
                                try
                                {
                                    if (simDesc.mMaternityOutfits == null)
                                    {
                                        simDesc.mMaternityOutfits = new OutfitCategoryMap();
                                    }
                                    simDesc.SetPregnancy(0, false);

                                    simDesc.ClearMaternityOutfits();
                                }
                                catch (Exception e)
                                {
                                    Common.Exception(sim, null, "Pregnancy", e);
                                }
                            }

                            if (sim.CurrentCommodityInteractionMap == null)
                            {
                                try
                                {
                                    LotManager.PlaceObjectOnLot(sim, sim.ObjectId);

                                    if (sim.CurrentCommodityInteractionMap == null)
                                    {
                                        sim.ChangeCommodityInteractionMap(sim.LotHome.Map);
                                    }
                                }
                                catch (Exception e)
                                {
                                    Common.Exception(sim, null, "ChangeCommodityInteractionMap", e);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Common.Exception(sim, null, "Fixup", e);
                        }

                        ResetSituations(sim);

                        CleanupSlots(sim);

                        ResetInventory(sim);

                        if (fadeOut)
                        {
                            bool active = (Sim.ActiveActor == sim);

                            if (sSimReset.Valid)
                            {
                                sSimReset.Invoke <bool>(new object[] { simDesc.SimDescriptionId });
                            }

                            ResetRouting(sim);

                            using (CreationProtection protection = new CreationProtection(simDesc, sim, false, true, false))
                            {
                                sim.Destroy();

                                Common.Sleep();

                                sim = FixInvisibleTask.InstantiateAtHome(simDesc, null);
                            }

                            if (sim != null)
                            {
                                if (active)
                                {
                                    try
                                    {
                                        foreach (Sim member in Households.AllSims(sim.Household))
                                        {
                                            if (member.CareerManager == null)
                                            {
                                                continue;
                                            }

                                            Occupation occupation = member.CareerManager.Occupation;
                                            if (occupation == null)
                                            {
                                                continue;
                                            }

                                            occupation.FormerBoss = null;
                                        }

                                        using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(sim.Household, true))
                                        {
                                            PlumbBob.DoSelectActor(sim, true);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        Common.Exception(sim, null, "DoSelectActor", e);
                                    }
                                }

                                if ((myBed != null) && (myBedData != null))
                                {
                                    if (!(myBed is BedMultiPart) || (myBed is BedMultiPart && ((sim.Partner != null) && (sim.Partner.CreatedSim != null))))
                                    {
                                        myBed.ClaimOwnership(sim, myBedData);
                                    }
                                    else
                                    {
                                        HandleDoubleBed(sim, myBed, myBedData);
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (sim.Inventory == null)
                            {
                                sim.AddComponent <InventoryComponent>(new object[0x0]);
                            }

                            if (Instantiation.AttemptToPutInSafeLocation(sim, false))
                            {
                                ResetRouting(sim);

                                sim.SetObjectToReset();

                                // This is necessary to clear certain types of interactions
                                //   (it is also called in SetObjectToReset(), though doesn't always work there)
                                if (sim.InteractionQueue != null)
                                {
                                    sim.InteractionQueue.OnReset();
                                }
                            }
                        }

                        ResetSkillModifiers(simDesc);

                        ResetRole(sim);

                        if (simDesc.IsEnrolledInBoardingSchool())
                        {
                            simDesc.BoardingSchool.OnRemovedFromSchool();
                        }

                        MiniSimDescription miniSim = MiniSimDescription.Find(simDesc.SimDescriptionId);
                        if (miniSim != null)
                        {
                            miniSim.Instantiated = true;
                        }

                        UpdateInterface(sim);

                        return(sim);
                    }
                }
                else if (simDesc.Service is Butler)
                {
                    if (Instantiation.AttemptToPutInSafeLocation(sim, true))
                    {
                        sim.Motives.RecreateMotives(sim);
                        sim.SetObjectToReset();
                    }

                    return(sim);
                }
                else if (simDesc.IsImaginaryFriend)
                {
                    OccultImaginaryFriend friend;
                    if (OccultImaginaryFriend.TryGetOccultFromSim(sim, out friend))
                    {
                        if (Simulator.GetProxy(friend.mDollId) != null)
                        {
                            friend.TurnBackIntoDoll(OccultImaginaryFriend.Destination.Owner);

                            return(null);
                        }
                    }
                }
                else if (simDesc.IsBonehilda)
                {
                    foreach (BonehildaCoffin coffin in Sims3.Gameplay.Queries.GetObjects <BonehildaCoffin>())
                    {
                        if (coffin.mBonehilda == simDesc)
                        {
                            coffin.mBonehildaSim = null;
                            break;
                        }
                    }
                }

                if (fadeOut)
                {
                    sim.Destroy();
                }

                return(null);
            }
            catch (Exception exception)
            {
                Common.Exception(sim, exception);
                return(sim);
            }
        }
예제 #11
0
        public override void Apply()
        {
            string msg = "Apply" + Common.NewLine;

            try
            {
                try
                {
                    sbMovingCurrentlyInProgress = true;
                    ProgressDialog.Show(Common.LocalizeEAString("Ui/Caption/Global:Processing"), false);

                    Household sourceHousehold = mSourceHousehold;

                    Lot sourceLot = sourceHousehold.LotHome;

                    mTempHousehold.ClearSilent();
                    mTempHousehold.Destroy();
                    mTempHousehold = null;

                    msg += "A";

                    ParentsLeavingTownSituation situation = ParentsLeavingTownSituation.FindParentsGoneSituationForHousehold(sourceHousehold);
                    if ((situation != null) && (ParentsLeavingTownSituation.Adults != null))
                    {
                        bool freeVacation = false;
                        foreach (ISimDescription targetSim in mTargetSimList.Keys)
                        {
                            if (ParentsLeavingTownSituation.Adults.Contains(targetSim.SimDescriptionId))
                            {
                                freeVacation = true;
                                break;
                            }
                        }

                        if (!freeVacation)
                        {
                            bool flag3 = false;
                            foreach (ISimDescription iSourceSim in mSourceSimList.Keys)
                            {
                                if (iSourceSim.TeenOrAbove && !ParentsLeavingTownSituation.Adults.Contains(iSourceSim.SimDescriptionId))
                                {
                                    SimDescription sourceSim = iSourceSim as SimDescription;
                                    if ((sourceSim != null) && (sourceSim.CreatedSim != null))
                                    {
                                        flag3 = true;
                                        break;
                                    }
                                }
                            }
                            freeVacation = !flag3;
                        }

                        if (freeVacation)
                        {
                            situation.BringParentsBack();
                        }
                    }

                    msg += "B";

                    Household targetHousehold = mPreselectedHousehold;

                    // Must be ahead of check mSourceSimList
                    Lot targetLot = null;
                    if (targetHousehold != null)
                    {
                        targetLot = targetHousehold.LotHome;
                    }

                    if (targetHousehold == null)
                    {
                        if (mSourceSimList.Count == 0)
                        {
                            targetHousehold = sourceHousehold;
                        }
                    }

                    if (targetLot == null)
                    {
                        targetLot = mTargetLot;
                    }

                    if ((mMoveOut) && (targetLot == null))
                    {
                        msg += "B1";

                        List<Lot> allChoices = new List<Lot>();
                        List<Lot> affordable = new List<Lot>();
                        foreach (Lot lot in LotManager.AllLots)
                        {
                            if (!string.IsNullOrEmpty(Households.IsValidResidentialLot(lot))) continue;

                            Lot.LotMetrics metrics = new Lot.LotMetrics();
                            lot.GetLotMetrics(ref metrics);

                            if (metrics.FridgeCount == 0) continue;

                            allChoices.Add(lot);

                            if (Mover.GetLotCost(lot) < mNewTargetFunds)
                            {
                                affordable.Add(lot);
                            }
                        }

                        if (affordable.Count > 0)
                        {
                            affordable.Sort(new Comparison<Lot>(Households.SortByCost));

                            targetLot = affordable[0];
                        }
                        else if (allChoices.Count > 0)
                        {
                            if ((!Mover.Settings.mFreeRealEstate) && (!AcceptCancelDialog.Show(Common.Localize("NoAffordable:Prompt"))))
                            {
                                return;
                            }

                            allChoices.Sort(new Comparison<Lot>(Households.SortByCost));

                            targetLot = allChoices[0];
                        }

                        if (targetLot == null)
                        {
                            if (!AcceptCancelDialog.Show(Common.Localize("Homeless:Prompt")))
                            {
                                return;
                            }
                        }
                        else
                        {
                            mNewTargetFunds -= Mover.GetLotCost(targetLot);

                            if (mNewTargetFunds < 0)
                            {
                                mNewTargetFunds = 0;
                            }
                        }
                    }

                    msg += "C";

                    if (targetHousehold == null)
                    {
                        targetHousehold = Household.Create();
                    }

                    Household activeHouse = targetHousehold;
                    Household saleHouse = sourceHousehold;
                    if (mSourceHouseholdActive)
                    {
                        msg += "C1";

                        activeHouse = sourceHousehold;
                        saleHouse = targetHousehold;
                    }

                    Lot saleLot = saleHouse.LotHome;

                    Dictionary<ObjectGuid, ObjectGuid> originalsToClones = null;

                    if (mSellHome)
                    {
                        msg += "C2";

                        if ((mPackFurniture) && (saleHouse != Household.NpcHousehold))
                        {
                            PackFurnitureEx(saleHouse.LotHome, activeHouse, ref originalsToClones);
                        }

                        saleHouse.MoveOut();
                    }

                    if (targetHousehold != null)
                    {
                        msg += "C3";

                        if ((targetLot != null) && (targetHousehold.LotHome != targetLot))
                        {
                            targetHousehold.MoveOut();

                            // Perform this preior to MoveIn() to inform StoryProgresion that it does not need to adjust lot funds
                            Mover.PresetStoryProgressionLotHome(targetLot, targetHousehold);
                            targetLot.MoveIn(targetHousehold);

                            targetHousehold.AddGreetedLotToHousehold(targetLot, ObjectGuid.InvalidObjectGuid);
                        }

                        if (mTargetSimList.Count > 0)
                        {
                            if (targetHousehold != sourceHousehold)
                            {
                                targetHousehold.BioText = mTargetHouseholdDescription;
                                targetHousehold.Name = mTargetHouseholdName;
                            }

                            targetHousehold.SetFamilyFunds(mNewTargetFunds);
                        }
                    }

                    msg += "D";

                    if (sourceHousehold != null)
                    {
                        msg += "D1";

                        if ((sourceHousehold != Household.NpcHousehold) && (mSourceSimList.Count > 0))
                        {
                            msg += "D2";

                            sourceHousehold.SetFamilyFunds(mNewSourceFunds);
                            sourceHousehold.BioText = mSourceHouseholdDescription;
                            sourceHousehold.Name = mSourceHouseholdName;
                        }
                    }

                    if (mSellHome)
                    {
                        msg += "E";

                        List<SimDescription> otherSims = new List<SimDescription>();

                        List<Sim> movingSims = new List<Sim>();
                        foreach (SimDescription simDesc in Households.All(saleHouse))
                        {
                            Sim sim = simDesc.CreatedSim;
                            if (sim != null)
                            {
                                movingSims.Add(sim);

                                EventTracker.SendEvent(EventTypeId.kMovedHouses, sim);
                            }
                            else
                            {
                                otherSims.Add(simDesc);
                            }

                            MidlifeCrisisManager.OnMoved(simDesc);
                        }

                        if (saleHouse != activeHouse)
                        {
                            Households.TransferData(activeHouse, saleHouse);
                        }

                        foreach (SimDescription simDesc in otherSims)
                        {
                            if (simDesc.Household != null)
                            {
                                simDesc.Household.Remove(simDesc, false);
                            }

                            activeHouse.Add(simDesc);
                        }

                        HouseholdEx.AddSims(activeHouse, movingSims, saleHouse, (saleHouse != activeHouse), true, Mover.Settings.mDreamCatcher);

                        UpdateAttributesForNewSimsEx(true, movingSims);

                        Sim tokenSim = null;

                        for (int i = movingSims.Count - 1; i >= 0; i--)
                        {
                            Sim sim = movingSims[i];

                            if ((sim.CurrentInteraction is ICountsAsWorking) || (sim.GetSituationOfType<HostedSituation>() != null))
                            {
                                if (tokenSim == null)
                                {
                                    tokenSim = movingSims[i];
                                }

                                movingSims.RemoveAt(i);
                            }
                        }

                        if ((movingSims.Count == 0) && (tokenSim != null))
                        {
                            movingSims.Add(tokenSim);
                        }

                        if (movingSims.Count > 0)
                        {
                            MovingSituation.MoveAllActiveSimsToActiveLot(saleLot, activeHouse.LotHome, movingSims, mPackFurniture, originalsToClones);
                        }
                    }
                    else
                    {
                        msg += "F";

                        List<SimDescription> previousTarget = new List<SimDescription>(Households.All(targetHousehold));
                        List<SimDescription> previousSource = new List<SimDescription>(Households.All(sourceHousehold));

                        if (mSourceHouseholdActive)
                        {
                            msg += "F1";

                            if (mTargetSimList.Count == 0)
                            {
                                Households.TransferData(sourceHousehold, targetHousehold);
                            }
                            else if ((targetHousehold.RealEstateManager.AllProperties.Count > 0) &&
                                (Mover.Settings.mPromptTransferRealEstate) &&
                                (AcceptCancelDialog.Show(Common.Localize("TransferRealEstate:Prompt"))))
                            {
                                Households.TransferRealEstate(sourceHousehold, targetHousehold);
                            }

                            TransferSims(targetHousehold, sourceHousehold, false, (mSourceSimList.Count == 0), mTargetSimList);
                            TransferSims(sourceHousehold, targetHousehold, true, (mTargetSimList.Count == 0), mSourceSimList);
                        }
                        else
                        {
                            msg += "F2";

                            if (mSourceSimList.Count == 0)
                            {
                                Households.TransferData(targetHousehold, sourceHousehold);
                            }
                            else if ((sourceHousehold.RealEstateManager.AllProperties.Count > 0) &&
                                (Mover.Settings.mPromptTransferRealEstate) &&
                                (AcceptCancelDialog.Show(Common.Localize("TransferRealEstate:Prompt"))))
                            {
                                Households.TransferRealEstate(targetHousehold, sourceHousehold);
                            }

                            TransferSims(sourceHousehold, targetHousehold, false, (mTargetSimList.Count == 0), mSourceSimList);
                            TransferSims(targetHousehold, sourceHousehold, true, (mSourceSimList.Count == 0), mTargetSimList);
                        }

                        msg += "G";

                        if (targetHousehold.NumMembers == 0)
                        {
                            msg += "G1";

                            targetHousehold.HandleLastSimsDeath();
                        }

                        ThumbnailManager.GenerateHouseholdThumbnail(targetHousehold.HouseholdId, targetHousehold.HouseholdId, ThumbnailSizeMask.Large | ThumbnailSizeMask.Medium);

                        if (sourceHousehold.NumMembers == 0)
                        {
                            msg += "G2";

                            sourceHousehold.HandleLastSimsDeath();
                        }

                        ThumbnailManager.GenerateHouseholdThumbnail(sourceHousehold.HouseholdId, sourceHousehold.HouseholdId, ThumbnailSizeMask.Large | ThumbnailSizeMask.Medium);

                        if (GameStates.IsOnVacation)
                        {
                            using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(activeHouse, true))
                            {
                                PlumbBob.ForceSelectActor(activeHouse.GetRandomNonRoommateSim());
                            }
                        }
                        else
                        {
                            DreamCatcher.Select(activeHouse.GetRandomNonRoommateSim(), true, Mover.Settings.mDreamCatcher, true);
                        }

                        msg += "H";

                        if ((saleHouse != null) && (saleHouse != activeHouse))
                        {
                            using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore((Household)null, Mover.Settings.mDreamCatcher))
                            {
                                foreach (Sim sim in Households.AllSims(saleHouse))
                                {
                                    msg += "H2";

                                    sim.OnBecameUnselectable();
                                }
                            }
                        }

                        foreach (Sim sim in Households.AllSims(activeHouse))
                        {
                            msg += "I2";

                            sim.ResetMapTagManager();
                        }

                        msg += "K";

                        List<Sim> sourceNewSims = new List<Sim>();
                        List<Sim> sourceMovingSims = new List<Sim>();
                        PostTransfer(sourceHousehold, targetHousehold, targetLot, previousSource, sourceMovingSims, sourceNewSims);

                        List<Sim> targetNewSims = new List<Sim>();
                        List<Sim> targetMovingSims = new List<Sim>();
                        PostTransfer(targetHousehold, sourceHousehold, sourceLot, previousTarget, targetMovingSims, targetNewSims);

                        msg += Common.NewLine + " Target Moving";
                        foreach (Sim sim in targetMovingSims)
                        {
                            msg += Common.NewLine + " " + sim.FullName;
                        }

                        msg += Common.NewLine + " Source Moving";
                        foreach (Sim sim in sourceMovingSims)
                        {
                            msg += Common.NewLine + " " + sim.FullName;
                        }

                        msg += "L";

                        if (targetHousehold == Household.ActiveHousehold)
                        {
                            msg += "L1";

                            if (targetMovingSims.Count > 0x0)
                            {
                                MovingSituation.MoveNPCsToActiveHousehold(targetHousehold.LotHome, targetMovingSims, targetNewSims);
                            }
                            else if (sourceMovingSims.Count > 0)
                            {
                                MovingSituation.MoveActiveSimsToNPCLot(sourceHousehold.LotHome, sourceMovingSims, sourceNewSims, false);
                            }
                        }
                        else
                        {
                            msg += "L2";

                            if (targetMovingSims.Count > 0x0)
                            {
                                MovingSituation.MoveActiveSimsToNPCLot(targetHousehold.LotHome, targetMovingSims, targetNewSims, false);
                            }
                            else if (sourceMovingSims.Count > 0)
                            {
                                MovingSituation.MoveNPCsToActiveHousehold(sourceHousehold.LotHome, sourceMovingSims, sourceNewSims);
                            }
                        }

                        msg += "M";

                        sbMovingCurrentlyInProgress = false;
                        TombRoomManager.OnChangeHousehold(Household.ActiveHousehold);
                    }

                    msg += "N";

                    CleanUpTempTravelHoushold();
                    CleanUpSourceTempHousehold(true);

                    mSourceSimList.Clear();
                    mTargetSimList.Clear();

                    mSourceHousehold = null;
                    mPreselectedHousehold = null;
                    if (mPreviousHouseholdSims != null)
                    {
                        mPreviousHouseholdSims.Clear();
                        mPreviousHouseholdSims = null;
                    }

                    GameEntryMovingModel.TriggerSplitMergeHouseholdsCompleteCallback();
                }
                catch (Exception e)
                {
                    Common.Exception(msg, e);
                }
                finally
                {
                    Common.DebugNotify(msg);

                    sbMovingCurrentlyInProgress = false;
                    ProgressDialog.Close();
                }
            }
            catch (ExecutionEngineException)
            { }
        }
예제 #12
0
        public override void Apply()
        {
            try
            {
                List<SimDescription> allSims = new List<SimDescription>();
                if (mSourceSimList != null)
                {
                    foreach (KeyValuePair<ISimDescription, bool> pair in mSourceSimList)
                    {
                        SimDescription sim = pair.Key as SimDescription;
                        if (sim == null) continue;

                        allSims.Add(sim);
                    }
                }

                if (mTargetSimList != null)
                {
                    foreach (KeyValuePair<ISimDescription, bool> pair in mTargetSimList)
                    {
                        SimDescription sim = pair.Key as SimDescription;
                        if (sim == null) continue;

                        allSims.Add(sim);
                    }
                }

                using (DreamCatcher.HouseholdStore store = new DreamCatcher.HouseholdStore(allSims, Mover.Settings.mDreamCatcher))
                {
                    try
                    {
                        SplitMergeHouseholds += OnMerge;

                        base.Apply();
                    }
                    catch (Exception e)
                    {
                        Common.Exception("Apply", e);
                    }
                    finally
                    {
                        SplitMergeHouseholds -= OnMerge;

                        ProgressDialog.Close();
                    }
                }
            }
            catch (ExecutionEngineException)
            { }
        }