public void motive_motive_distress(Sim sim, CommodityKind commodity) { if (commodity == (CommodityKind)0x44440444) { return; } SimDescription simd = sim.SimDescription; BuffManager buffManager = sim.BuffManager; Motives moves = sim.Motives; switch (commodity) { case CommodityKind.Bladder: { bool flag = true; InteractionDefinition interactionDefinition; switch (simd.Species) { case CASAgeGenderFlags.Horse: interactionDefinition = Sim.HorsePee.Singleton; break; case CASAgeGenderFlags.Dog: case CASAgeGenderFlags.LittleDog: interactionDefinition = (InteractionDefinition)Sim.DogPeeStart.Singleton; break; case CASAgeGenderFlags.Cat: interactionDefinition = (InteractionDefinition)Sim.CatPeeStart.Singleton; break; default: interactionDefinition = Sim.BladderFailure.Singleton; break; } foreach (InteractionInstance interaction in sim.InteractionQueue.InteractionList) { if (interaction is Sim.DogPee || interaction is Sim.CatPee || interaction.InteractionDefinition == interactionDefinition) { flag = false; break; } } if (flag) { SwimmingInPool swimmingInPool = sim.Posture as SwimmingInPool; if (swimmingInPool == null) { InteractionInstance interactionInstance = interactionDefinition.CreateInstance(sim, sim, new InteractionPriority(InteractionPriorityLevel.High), false, false); Sim.DogPeeStart dogPeeStart = interactionInstance as Sim.DogPeeStart; if (dogPeeStart != null) { dogPeeStart.DoNotRoute = true; } else { Sim.CatPeeStart catPeeStart = interactionInstance as Sim.CatPeeStart; if (catPeeStart != null) { catPeeStart.DoNotRoute = true; } } if (sim.InteractionQueue.AddNext(interactionInstance) && simd.IsRaccoon) { sim.AddExitReason(ExitReason.BuffFailureState); } else { BuffInstance buffOfSolveCommodity = buffManager.GetBuffOfSolveCommodity(commodity); if (buffOfSolveCommodity != null && buffOfSolveCommodity.EffectValue <= 0) { ThoughtBalloonManager.BalloonData balloonData = new ThoughtBalloonManager.BalloonData(buffOfSolveCommodity.ThumbString); if (balloonData.IsValid) { balloonData.BalloonType = ThoughtBalloonTypes.kScreamBalloon; balloonData.mCoolDown = ThoughtBalloonCooldown.None; sim.ThoughtBalloonManager.ShowBalloon(balloonData); } } moves.SetMax(CommodityKind.Bladder); if (!simd.IsPet) { PuddleManager.AddPuddle(sim.Position); moves.SetValue(CommodityKind.Hygiene, -100f); if (GlobalFunctions.AreOtherSimsNearby(sim, BuffEmbarrassed.DistanceForEmbarrassedBuff)) { buffManager.AddElement(BuffNames.Embarrassed, Origin.FromPeeingSelf); } ActiveTopic.AddToSim(sim, "Embarrassment"); } else { MetaAutonomyVenueType metaAutonomyVenueType = sim.LotCurrent.GetMetaAutonomyVenueType(); if ((!simd.IsADogSpecies || metaAutonomyVenueType != MetaAutonomyVenueType.DogPark) && World.GetTerrainType(sim.Position) == TerrainType.LotFloor) { PuddleManager.AddPuddle(sim.Position); } } EventTracker.SendEvent(EventTypeId.kBladderFailure, sim); } Motive motive = moves.GetMotive(CommodityKind.Bladder); if (motive != null) { motive.PotionBladderDecayOverride = false; } } else { swimmingInPool.ContainerPool.PeeInPool(sim); } } break; } case CommodityKind.Hunger: case CommodityKind.VampireThirst: if (simd.IsFrankenstein) { OccultFrankenstein.PushFrankensteinShortOut(sim); } else if (!simd.IsGhost && !simd.IsDead && !IsCheckKillSimInteraction(sim)) { if (sim.Posture.Satisfies(CommodityKind.ScubaDiving, null) && !simd.IsMermaid) { sim.Kill(SimDescription.DeathType.ScubaDrown); } else if (sim.Posture.Satisfies(CommodityKind.SwimmingInPool, null) && !simd.IsMermaid) { sim.Kill(SimDescription.DeathType.Drown); } else if (SimTemperature.HasFrozenSolidInteraction(sim)) { sim.Kill(SimDescription.DeathType.Freeze, null, false); } else if (OccultMermaid.IsDehydrated(sim)) { sim.Kill(SimDescription.DeathType.MermaidDehydrated, null, false); } else { sim.Kill(sim.SimDescription.IsVampire ? SimDescription.DeathType.Thirst : SimDescription.DeathType.Starve); } } break; case CommodityKind.Temperature: { float value = moves.GetValue(CommodityKind.Temperature); if (value > 0f) { SimTemperature.PushSpontaneouslyCombustInteraction(sim); } else { SimTemperature.PushFreezeInteraction(sim); } break; } case CommodityKind.MermaidDermalHydration: OccultMermaid.CollapseFromDehydration(sim); break; } }
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); } }