Example #1
0
        public override bool Run()
        {
            try
            {
                Definition interactionDefinition = base.InteractionDefinition as Definition;
                if ((interactionDefinition != null) && (interactionDefinition.EatingType == Restaurant.EatType.Review))
                {
                    GroupingSituation situationOfType = base.Actor.GetSituationOfType <GroupingSituation>();
                    if ((situationOfType != null) && !situationOfType.ConfirmLeaveGroup(base.Actor))
                    {
                        return(false);
                    }
                }
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
            }

            return(base.Run());
        }
Example #2
0
        protected static ListenerAction OnGroupingWithSim(Event e)
        {
            try
            {
                Sim actor = e.Actor as Sim;
                if (actor != null)
                {
                    if (GoHere.Settings.DisallowAutoGroup(actor))
                    {
                        GroupingSituation situation = actor.GetSituationOfType <GroupingSituation>();
                        if (situation != null)
                        {
                            sTracer.Perform();

                            if (sTracer.mAllow)
                            {
                                if (!GoHere.Settings.mIgnoreLogs)
                                {
                                    Common.DebugStackLog(actor.FullName);
                                }

                                situation.Exit();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Common.Exception(e.Actor, e.TargetObject, ex);
            }

            return(ListenerAction.Keep);
        }
Example #3
0
        public static bool GetSimToSimHome(SimDescription simDesc, Sim requester, Callback success)
        {
            Sim createdSim = simDesc.CreatedSim;

            if (createdSim == null)
            {
                createdSim = Instantiation.Perform(simDesc, null);
            }
            if (createdSim != null && createdSim.InteractionQueue != null)
            {
                createdSim.InteractionQueue.CancelAllInteractions();

                bool flag = false;
                if (createdSim.Household == requester.Household)
                {
                    GoToLot entry = GoToLot.Singleton.CreateInstanceWithCallbacks(requester.LotHome, createdSim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true, null, success, null) as GoToLot;
                    flag = createdSim.InteractionQueue.Add(entry);
                }
                else
                {
                    createdSim.SocialComponent.SetInvitedOver(requester.LotHome);
                    if (!requester.LotHome.IsBaseCampLotType)
                    {
                        Sims3.Gameplay.Core.VisitLot lot2 = Sims3.Gameplay.Core.VisitLot.Singleton.CreateInstanceWithCallbacks(requester.LotHome, createdSim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true, null, success, null) as Sims3.Gameplay.Core.VisitLot;
                        flag = createdSim.InteractionQueue.Add(lot2);
                    }
                    else
                    {
                        GoToLot lot3 = GoToLot.Singleton.CreateInstanceWithCallbacks(requester.LotHome, createdSim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true, null, success, null) as GoToLot;
                        flag = createdSim.InteractionQueue.Add(lot3);
                    }
                }
                if (flag)
                {
                    GroupingSituation situationOfType = createdSim.GetSituationOfType <GroupingSituation>();
                    if (situationOfType != null)
                    {
                        Sim leader = situationOfType.Leader;
                        if ((leader == null) || leader.IsNPC)
                        {
                            situationOfType.LeaveGroup(createdSim);
                        }
                    }
                    EventTracker.SendEvent(EventTypeId.kInvitedSimOver, requester, createdSim);

                    return(true);
                }
            }
            else
            {
                AcceptCancelDialog.Show(Common.LocalizeEAString("Gameplay/Objects/Electronics/Phone/Call/InviteOver:TestFailed"));
                //AcceptCancelDialog.Show(Woohooer.Localize("InviteOverForWoohooFail:Prompt"));
            }
            return(false);
        }
Example #4
0
        public static IEnumerable <InteractionObjectPair> GetAllInteractionsForPieMenu(SocialComponent ths, Sim actor)
        {
            Sim          mSim = ths.mSim;
            Relationship r    = Relationship.Get(mSim, actor, false);

            if ((r == null) || (r.LTR.CurrentLTR == LongTermRelationshipTypes.Stranger))
            {
                sMsg += Common.NewLine + "NewConversation2";

                return(SocialsForNewConversation(ths, actor, mSim, false));
            }
            if (ths.mSim.NeedsToBeGreeted(actor))
            {
                sMsg += Common.NewLine + "Greeting2";

                return(ths.SocialsForGreeting(actor, ths.mSim));
            }
            LTRData           data            = LTRData.Get(r.LTR.CurrentLTR);
            bool              flag            = false;
            GroupingSituation situationOfType = actor.GetSituationOfType <GroupingSituation>();

            if (situationOfType != null)
            {
                flag = situationOfType.IsSimInGroup(mSim);
            }
            DateAndTime whenLastTalked = Relationship.GetWhenLastTalked(actor, mSim);

            if (((!flag && (actor.Conversation == null)) && ((actor.Household != mSim.Household) && (data.HowWellWeKnowEachOther <= 0x1))) && (SimClock.ElapsedTime(TimeUnit.Hours, whenLastTalked) > 24f))
            {
                sMsg += Common.NewLine + "NewConversation3";

                return(SocialsForNewConversation(ths, actor, mSim, false));
            }
            if (!CelebrityManager.CanSocialize(actor, mSim))
            {
                sMsg += Common.NewLine + "Impress";

                return(SocialComponent.SocialsForImpressCelebrity(actor, mSim));
            }

            sMsg += Common.NewLine + "All";

            return(GetUnfilteredSocials(ths, actor, mSim, r));
        }
            public override string GetInteractionName(Sim actor, RabbitHole target, InteractionObjectPair iop)
            {
                string text  = this.InteractionName;
                bool   flag  = false;
                bool   flag2 = false;

                actor.IsInGroupOrPackSituation(out flag2);
                int groupCost = EiffelTower.TakeElevatorToTop.kElevatorPricePerPerson;
                GroupingSituation situationOfType = actor.GetSituationOfType <GroupingSituation> ();

                if (situationOfType != null)
                {
                    IEnumerable <Sim> participants = situationOfType.Participants;
                    foreach (Sim current in participants)
                    {
                        if (current != actor && actor.Household == current.Household)
                        {
                            groupCost += EiffelTower.TakeElevatorToTop.kElevatorPricePerPerson;
                        }
                    }
                }
                if (actor.IsInGroupOrDateSituation(out flag))
                {
                    if (flag)
                    {
                        text += "_Date";
                    }
                    else
                    {
                        if (flag2)
                        {
                            text += "_Pack";
                        }
                        else
                        {
                            text += "_Group";
                        }
                    }
                }
                return(Localization.LocalizeString(actor.IsFemale, text, new object[] { groupCost }));
            }
Example #6
0
        public new Phone.Call.AcceptanceTestResult CustomAcceptanceTest(SimDescription simDescription)
        {
            if (!RentScheduler.IsAllowedOnLotNow(simDescription, base.Actor.LotCurrent) && !RentScheduler.InviteToLotNow(base.Actor, simDescription, base.Actor.LotCurrent))
            {
                return(Phone.Call.AcceptanceTestResult.ForceReject);
            }

            Sim createdSim = simDescription.CreatedSim;

            if ((createdSim != null) && (GroupingSituation.ShouldSoftReject(base.Actor, createdSim) || GroupingSituation.ShouldHardReject(base.Actor, createdSim)))
            {
                return(Phone.Call.AcceptanceTestResult.ForceReject);
            }

            GreyedOutTooltipCallback greyedOutTooltipCallback = null;
            ActiveTopic topic = null;

            if (!SimWoohoo.PublicTest(base.Actor, createdSim, topic, base.Autonomous, ref greyedOutTooltipCallback))
            {
                return(Phone.Call.AcceptanceTestResult.ForceReject);
            }

            return(Phone.Call.AcceptanceTestResult.DontCare);
        }
Example #7
0
        public override bool Run()
        {
            VisitSituation.OnSimLeavingLot(this.Actor);
            Lot lot = this.Actor.SimDescription.VirtualLotHome;

            if (lot == null)
            {
                List <Lot> list = new List <Lot>();
                foreach (object obj in LotManager.AllLotsWithoutCommonExceptions)
                {
                    Lot lot2 = (Lot)obj;
                    if (lot2 != this.Actor.LotCurrent && lot2.LotId != 18446744073709551615UL)
                    {
                        list.Add(lot2);
                    }
                }
                if (list.Count > 0)
                {
                    lot = RandomUtil.GetRandomObjectFromList <Lot>(list);
                }
            }
            GroupingSituation.RemoveSimFromGroupSituation(this.Actor);
            if (this.Actor.LotCurrent.CommercialLotSubType == CommercialLotSubType.kEP10_Resort && this.Actor.IsHuman && this.Actor.SimDescription.ChildOrAbove && (this.Actor.SimDescription.AssignedRole == null || this.Actor.SimDescription.AssignedRole.Type != Role.RoleType.Paparazzi))
            {
                IResortTower[] objects = this.Actor.LotCurrent.GetObjects <IResortTower>();
                if (objects.Length > 0)
                {
                    IResortTower        randomObjectFromList = RandomUtil.GetRandomObjectFromList <IResortTower>(objects);
                    InteractionInstance instance             = randomObjectFromList.GetEnterTowerDefinition().CreateInstance(randomObjectFromList, this.Actor, new InteractionPriority(InteractionPriorityLevel.UserDirected), base.Autonomous, false);
                    if (this.Actor.InteractionQueue.PushAsContinuation(instance, false))
                    {
                        return(true);
                    }
                }
            }
            InteractionInstance interactionInstance = null;

            if (lot != null)
            {
                DGSGoToVirtualHomeInternal goToVirtualHomeInternal;
                if (this.SuccessCallbackForSequence != null || this.FailureCallbackForSequence != null)
                {
                    goToVirtualHomeInternal = (DGSGoToVirtualHomeInternal.Singleton.CreateInstanceWithCallbacks(lot, this.Actor, this.Actor.InheritedPriority(), base.Autonomous, base.CancellableByPlayer, null, this.SuccessCallbackForSequence, this.FailureCallbackForSequence) as DGSGoToVirtualHomeInternal);
                }
                else
                {
                    goToVirtualHomeInternal = (DGSGoToVirtualHomeInternal.Singleton.CreateInstance(lot, this.Actor, this.Actor.InheritedPriority(), base.Autonomous, base.CancellableByPlayer) as DGSGoToVirtualHomeInternal);
                }
                goToVirtualHomeInternal.SimWalkStyle = this.SimWalkStyle;
                if (base.TryPushAsContinuation(goToVirtualHomeInternal))
                {
                    interactionInstance = goToVirtualHomeInternal;
                }
            }
            if (lot == null || interactionInstance == null || !this.Actor.InteractionQueue.HasInteraction(interactionInstance))
            {
                SimDescription simDescription = this.Actor.SimDescription;
                if (simDescription.Household != null && simDescription.Household.IsTouristHousehold)
                {
                    Sim.GoToVirtualHome.SendTouristHome(simDescription);
                }
                else
                {
                    if (DGSCommon.IsExtKillSimNiecAndYLevel(Actor))
                    {
                        return(true);
                    }
                    this.Actor.FadeOut(true, true);
                }
                Simulator.Sleep(uint.MaxValue);
            }
            return(true);
        }
Example #8
0
        public override void OnDelayedWorldLoadFinished()
        {
            Overwatch.Log("CleanupSituations");

            Dictionary <Situation, bool> existing = new Dictionary <Situation, bool>();

            List <Situation> removed = new List <Situation>();

            for (int i = Situation.sAllSituations.Count - 1; i >= 0; i--)
            {
                Situation situation = Situation.sAllSituations[i];

                bool remove = false;

                GroupingSituation grouping = situation as GroupingSituation;
                if (grouping != null)
                {
                    if ((grouping.mLeader == null) || (grouping.mLeader.HasBeenDestroyed))
                    {
                        remove = true;
                    }
                    else if (grouping.Participants != null)
                    {
                        foreach (Sim sim in grouping.Participants)
                        {
                            if (sim == null)
                            {
                                grouping.mParticipants.Clear();
                                remove = true;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    HostedSituation hosted = situation as HostedSituation;
                    if (hosted != null)
                    {
                        if ((hosted.Host == null) || (hosted.Host.HasBeenDestroyed))
                        {
                            remove = true;
                        }
                    }
                }

                if (remove)
                {
                    removed.Add(situation);

                    Situation.sAllSituations.RemoveAt(i);

                    Overwatch.Log("Removed Broken Situation: " + situation.GetType());
                }
                else
                {
                    existing[situation] = true;
                }
            }

            foreach (Situation situation in removed)
            {
                try
                {
                    situation.Exit();
                }
                catch (Exception e)
                {
                    Common.DebugException(situation.GetType().ToString(), e);
                }
            }

            foreach (Sim sim in LotManager.Actors)
            {
                if (sim.Autonomy == null)
                {
                    continue;
                }

                if (sim.Autonomy.SituationComponent == null)
                {
                    continue;
                }

                List <Situation> situations = sim.Autonomy.SituationComponent.Situations;
                if (situations == null)
                {
                    continue;
                }

                for (int i = situations.Count - 1; i >= 0; i--)
                {
                    if (existing.ContainsKey(situations[i]))
                    {
                        continue;
                    }

                    Overwatch.Log("Dropped Broken Situation: " + sim.FullName);

                    situations.RemoveAt(i);
                }
            }
        }
Example #9
0
        public override bool Run()
        {
            try
            {
                Definition interactionDefinition = InteractionDefinition as Definition;
                if (interactionDefinition != null)
                {
                    mLookForAutonomousActionsUponArrival = interactionDefinition.mLookForAutonomousActionsUponArrival;
                }
                else
                {
                    mLookForAutonomousActionsUponArrival = true;
                }

                if ((Target.CommercialLotSubType == CommercialLotSubType.kEP10_Resort) &&
                    (Actor.IsHuman) &&
                    (Actor.SimDescription.ChildOrAbove) &&
                    (Actor.LotHome == null) &&
                    (Autonomous) &&
                    (NumFollowers == 0) &&
                    (Actor.GetSituationOfType <Situation>() == null) &&
                    (!Actor.SimDescription.HasActiveRole) &&
                    (Actor.Service == null))
                {
                    IResortTower[] objects = Target.GetObjects <IResortTower>();
                    if (objects.Length > 0)
                    {
                        IResortTower        randomObjectFromList = RandomUtil.GetRandomObjectFromList <IResortTower>(objects);
                        InteractionInstance instance             = randomObjectFromList.GetExitTowerDefinition().CreateInstance(randomObjectFromList, Actor, new InteractionPriority(InteractionPriorityLevel.Autonomous), Autonomous, false);
                        if (Actor.InteractionQueue.PushAsContinuation(instance, false))
                        {
                            if (!Actor.Household.IsServiceNpcHousehold)
                            {
                                foreach (SimDescription description in Actor.Household.SimDescriptions)
                                {
                                    if ((description.IsHuman && description.ChildOrAbove) && (description.CreatedSim == null))
                                    {
                                        Sim actor = description.InstantiateOffScreen(Target);
                                        InteractionInstance entry = randomObjectFromList.GetExitTowerDefinition().CreateInstance(randomObjectFromList, actor, new InteractionPriority(InteractionPriorityLevel.Autonomous), Autonomous, false);
                                        actor.InteractionQueue.Add(entry);
                                    }
                                }
                            }
                            return(true);
                        }
                    }
                }

                if ((Target.CommercialLotSubType == CommercialLotSubType.kEP10_Diving) && Actor.SimDescription.Child)
                {
                    return(false);
                }

                if (!CarpoolManager.WaitForCarpool(Actor))
                {
                    return(false);
                }

                if (ShouldReenqueueWithStandingPrecondition())
                {
                    ChildUtils.SetPosturePrecondition(this, CommodityKind.Standing, new CommodityKind[0x0]);
                    return(Actor.InteractionQueue.PushAsContinuation(this, false));
                }

                if (mFollowers == null)
                {
                    if (InteractionDefinition is DateDefinition)
                    {
                        mFollowers = new List <Sim>();
                    }
                    else
                    {
                        mFollowers = GetFollowers(Actor);
                        if (Actor.IsNPC)
                        {
                            if (mFollowers.Count == 0)
                            {
                                Sim sim;
                                if (HorseManager.NpcShouldRideHorse(Actor, out sim))
                                {
                                    mFollowers.Add(sim);
                                }
                            }
                            else if ((Autonomous && RandomUtil.RandomChance01(Sim.GoForWalkWithDog.kChanceOfAutonomousDogWalk)) && sAcceptableCommercialLotSubTypes.Contains(Target.CommercialLotSubType))
                            {
                                foreach (Sim sim2 in new List <Sim>(mFollowers))
                                {
                                    if (Sim.GoForWalkWithDog.ActorCanWalkTarget(Actor, sim2))
                                    {
                                        InteractionInstance entry = Sim.GoForWalkWithDog.Singleton.CreateInstance(sim2, Actor, GetPriority(), true, false);
                                        (entry as Sim.GoForWalkWithDog).TargetLot = Target;
                                        Actor.InteractionQueue.AddNext(entry);
                                        return(true);
                                    }
                                }
                            }

                            foreach (Sim sim3 in new List <Sim>(mFollowers))
                            {
                                GroupingSituation.StartGroupingSituation(Actor, sim3, false);
                            }
                        }
                        else
                        {
                            GroupingSituation situationOfType = Actor.GetSituationOfType <GroupingSituation>();
                            if ((situationOfType != null) && !situationOfType.ConfirmLeaveGroup(Actor, "Gameplay/Situations/GroupingSituation:ContinueVisitAloneInteraction"))
                            {
                                return(false);
                            }
                        }
                    }
                }

                if (Sim.SwitchToFormalOutfitIfCocktail(Actor, Target))
                {
                    foreach (Sim sim in new List <Sim> (mFollowers))
                    {
                        sim.OutfitCategoryToUseForRoutingOffLot = OutfitCategories.Formalwear;
                    }
                }

                Occupation occupation = Actor.Occupation;
                if (((occupation != null) && (occupation.ActiveCareerLotID == Target.LotId)) && occupation.IsAllowedToWork())
                {
                    Actor.Occupation.EnsureSimHasOccupationOutfit();
                    if (Actor.Posture == Actor.Standing)
                    {
                        Actor.SwitchToOutfitWithSpin(Sim.ClothesChangeReason.GoingToWork);
                    }
                    else
                    {
                        OutfitCategories categories;
                        Actor.GetOutfitForClothingChange(Sim.ClothesChangeReason.GoingToWork, out categories);
                        Actor.OutfitCategoryToUseForRoutingOffLot = categories;
                    }
                }

                bool flag2 = false;

                MetaAutonomyVenueType metaAutonomyVenueType = Target.LotCurrent.GetMetaAutonomyVenueType();

                // Custom
                if ((mFollowers.Count == 0) && (GoHereEx.Teleport.Perform(Actor, Target, true)))
                {
                    flag2 = true;
                }
                else
                {
                    Door door = Target.FindFrontDoor();
                    if (door != null)
                    {
                        bool wantToBeOutside = true;
                        if (Target.IsOpenVenue())
                        {
                            wantToBeOutside = false;
                        }

                        Route r = null;
                        Target.RouteToFrontDoor(Actor, Sim.MinDistanceFromDoorWhenVisiting, Sim.MaxDistanceFromDoorWhenGoingInside, ref door, wantToBeOutside, ref r, false);
                        if (r != null)
                        {
                            r.DoRouteFail = false;
                            flag2         = GoHereSpace.Helpers.SimRoutingComponentEx.DoRouteWithFollowers(Actor.SimRoutingComponent, r, mFollowers);
                            Lot.ValidateFollowers(mFollowers);
                        }
                    }
                }

                if (!flag2)
                {
                    Actor.RemoveExitReason(ExitReason.RouteFailed);
                    Route route = Actor.CreateRoute();
                    if (Autonomous && mLookForAutonomousActionsUponArrival)
                    {
                        bool flag4 = RandomUtil.RandomChance(Lot.ChanceOfGoingToCommunityLotByCar);
                        if (!flag4)
                        {
                            route.SetOption(Route.RouteOption.EnablePlanningAsCar, flag4);
                        }
                    }
                    route.SetRouteMetaType(Route.RouteMetaType.GoCommunityLot);

                    if ((metaAutonomyVenueType == MetaAutonomyVenueType.Diving) && Actor.SimDescription.IsMermaid)
                    {
                        Lot lotCurrent = Actor.LotCurrent;
                        if ((lotCurrent != null) && lotCurrent.IsHouseboatLot())
                        {
                            route.SetOption2(Sims3.SimIFace.Route.RouteOption2.EnablePlanningAsBoat, true);
                        }
                    }

                    Target.PlanToLotEx(route);
                    if (!route.PlanResult.Succeeded())
                    {
                        foreach (Shell shell in Target.GetObjects <Shell>())
                        {
                            route = shell.GetRouteToShell(Actor);
                            if (route.PlanResult.Succeeded())
                            {
                                break;
                            }
                        }
                    }

                    // Custom Function
                    flag2 = GoHereSpace.Helpers.SimRoutingComponentEx.DoRouteWithFollowers(Actor.SimRoutingComponent, route, mFollowers);
                    Lot.ValidateFollowers(mFollowers);
                }

                if (flag2)
                {
                    NumSuccess++;
                    if (Autonomous)
                    {
                        Target.MakeSimDoSomethingAfterArrivingAtVenue(metaAutonomyVenueType, Actor);
                        if (mFollowers != null)
                        {
                            foreach (Sim sim3 in new List <Sim>(mFollowers))
                            {
                                Target.MakeSimDoSomethingAfterArrivingAtVenue(metaAutonomyVenueType, sim3);
                            }
                        }
                    }

                    // Custom check
                    if ((!GoHere.Settings.DisallowAutoGroup(Actor)) &&
                        (Actor.Household != null) &&
                        (!GroupingSituation.DoesGroupingSituationExistForFamily(Actor)))
                    {
                        bool selectable = false;

                        if (SimTypes.IsSelectable(Actor))
                        {
                            selectable = true;
                        }
                        else
                        {
                            foreach (Sim follower in new List <Sim>(mFollowers))
                            {
                                if (SimTypes.IsSelectable(follower))
                                {
                                    selectable = true;
                                    break;
                                }
                            }
                        }

                        // Stop the romantic prompt from appearing
                        GroupingSituation situation = Actor.GetSituationOfType <GroupingSituation>();
                        if (situation != null)
                        {
                            if (situation.Participants == null)
                            {
                                situation.Exit();
                            }

                            if (!selectable)
                            {
                                situation.RomanticGrouping = false;
                            }
                        }

                        GroupingSituation.StartGroupingSitatuationWithFollowers(Actor, mFollowers);
                    }
                    return(flag2);
                }

                if (((Actor.ExitReason & ExitReason.HigherPriorityNext) == ExitReason.None) && ((Actor.ExitReason & ExitReason.UserCanceled) == ExitReason.None))
                {
                    NumFail++;
                }
                return(flag2);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }