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()); }
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); }
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); }
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 })); }
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); }
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); }
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); } } }
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); } }