public override bool Test(Sim a, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback) { try { if (a == target) { return(false); } if (!Woohooer.Settings.mAllowTeenSkinnyDip) { if (target.SimDescription.TeenOrBelow) { return(false); } } else { if (target.SimDescription.ChildOrBelow) { return(false); } } if (!CelebrityManager.CanSocialize(a, target)) { return(false); } if (target.SimDescription.IsVisuallyPregnant) { greyedOutTooltipCallback = InteractionInstance.CreateTooltipCallback(Localization.LocalizeString(target.IsFemale, "Gameplay/Actors/Sim:PregnantFailure", new object[0])); return(false); } SwimmingInPool posture = a.Posture as SwimmingInPool; SwimmingInPool pool2 = target.Posture as SwimmingInPool; if (posture == null) { return(false); } if ((pool2 != null) && (pool2.ContainerPool == posture.ContainerPool)) { return(false); } if (!Pool.SimOutfitSupportsSkinnyDipping(target, ref greyedOutTooltipCallback)) { return(false); } return(true); } catch (Exception e) { Common.Exception(a, target, e); return(false); } }
public override bool Test(Sim a, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback) { try { if (a == target) { return(false); } if (Woohooer.Settings.mAllowTeenSkinnyDip) { if (target.SimDescription.ChildOrBelow) { return(false); } } else { if (target.SimDescription.TeenOrBelow) { return(false); } } if (!CelebrityManager.CanSocialize(a, target)) { return(false); } SwimmingInPool posture = a.Posture as SwimmingInPool; SwimmingInPool pool2 = target.Posture as SwimmingInPool; if (posture == null) { return(false); } if ((pool2 != null) && (pool2.ContainerPool == posture.ContainerPool)) { return(false); } if (!Pool.SimOutfitSupportsSkinnyDipping(target, ref greyedOutTooltipCallback)) { return(false); } return(true); } catch (Exception e) { Common.Exception(a, target, e); return(false); } }
public static bool FishTestTerrain(ref InteractionInstanceParameters parameters) { Sim sim = parameters.Actor as Sim; GameObjectHit hit = parameters.Hit; SwimmingInPool swimmingInPool = sim.Posture as SwimmingInPool; GameObjectHitType mType = hit.mType; if ((int)mType != 1) { switch ((int)mType - 8) { case 1: return(true); case 0: if (PondManager.ArePondsLiquid()) { return(true); } return(false); case 2: return(false); // Cats cannot fish in swimming pools. So much human code about swimming pools. } } else { FishingSpot fishingSpot = GameObject.GetObject(new ObjectGuid(hit.mId)) as FishingSpot; if (fishingSpot != null) { if (PondManager.ArePondsLiquid()) { return(true); } return(false); } } return(false); }
protected override OptionResult Run(GameHitParameters <GameObject> parameters) { Common.StringBuilder msg = new Common.StringBuilder("Run"); try { Terrain terrain = parameters.mTarget as Terrain; if (terrain != null) { foreach (Sim sim in LotManager.Actors) { Common.TestSpan span = Common.TestSpan.CreateSimple(); Route r = null; uint simFlags = sim.SimDescription.SimFlags; try { r = Route.Create(sim.Proxy, simFlags); } finally { msg += Common.NewLine + sim.FullName; msg += Common.NewLine + " " + sim.SimDescription.mSimFlags; msg += Common.NewLine + " " + span.Duration; } SimDescription simDescription = sim.SimDescription; Posture previousPosture = sim.Posture; SimRoutingComponent routingComponent = sim.RoutingComponent as SimRoutingComponent; bool flag = false; span = Common.TestSpan.CreateSimple(); try { //routingComponent.SetRouteOptions(route, simFlags); if (!(sim.CurrentInteraction is IHasCustomRouteOptions)) { r.SetOption(Route.RouteOption.BeginAsCar, (sim.Parent is Vehicle) && !(sim.Parent is IBoat)); r.SetOption(Route.RouteOption.EnablePlanningAsCar, simDescription.ChildOrAbove); r.SetOption(Route.RouteOption.DisablePlanningAsPedestrian, false); r.SetOption(Route.RouteOption.PushSimsAtDestination, true); r.SetOption(Route.RouteOption.UseAutoSlotFootprintLocking, true); r.SetOption(Route.RouteOption.ReplanToFindObstacleWhenPathPlanFails, true); r.SetOption(Route.RouteOption.IgnoreParent, false); r.SetOption(Route.RouteOption.IgnoreChildren, false); r.SetOption(Route.RouteOption.CreateSubPaths, true); r.SetOption(Route.RouteOption.CheckForFootprintsNearGoals, true); r.SetOption(Route.RouteOption.PenalizeGoalsOnDifferentLevels, true); if (GameUtils.IsInstalled(ProductVersion.EP10)) { IBoat parent = sim.Parent as IBoat; if (parent != null) { flag = true; r.Follower = parent.Proxy; r.FollowerAgeGenderSpecies = (uint)parent.GetBoatSpecies(); r.SetOption2(Route.RouteOption2.EnablePlanningAsBoat, true); r.SetOption2(Route.RouteOption2.BeginAsBoat, true); r.SetOption2(Route.RouteOption2.UseFollowerStartOrientation, true); r.SetOption(Route.RouteOption.OffsetDestinationForLongAnimals, true); r.AddObjectToIgnoreForRoute(sim.ObjectId); } bool flag2 = OccultMermaid.IsEveryOneGroupedWithMeATeenOrAboveMermaid(sim); bool flag3 = false; if (!flag2) { flag3 = ((previousPosture is CarryingChildPosture) || (previousPosture is CarryingPetPosture)) || sim.Autonomy.SituationComponent.InSituationOfType(typeof(GoHereWithSituation)); } bool flag4 = simDescription.ChildOrAbove & !(previousPosture is ScubaDiving); flag4 &= !(sim.InteractionQueue.GetHeadInteraction() is Lifeguard.GiveCPR); flag4 &= !(sim.InteractionQueue.GetHeadInteraction() is Lifeguard.FakeInjury); flag4 &= !(simDescription.CreatedByService is GrimReaper); flag4 &= !flag2 || flag3; flag4 &= !(previousPosture is BeingRiddenPosture) && !(previousPosture is RidingPosture); bool flag5 = simDescription.ChildOrAbove && simDescription.IsHuman; flag5 &= !(previousPosture is CarryingChildPosture) && !(previousPosture is CarryingPetPosture); r.SetOption(Route.RouteOption.EnableWaterPlanning, flag5); r.SetOption2(Route.RouteOption2.DestinationMustBeOnLand, !flag5); r.SetOption2(Route.RouteOption2.EnablePlanningAsBoat, (parent != null) || flag4); if (flag2 && flag5) { r.SetOption2(Route.RouteOption2.RouteAsMermaid, true); } else { r.SetOption2(Route.RouteOption2.RouteAsLifeguard, Lifeguard.ShouldUseRescueSwimWade(sim)); } } // Cut if (GameUtils.IsInstalled(ProductVersion.Undefined | ProductVersion.EP3)) { r.SetOption(Route.RouteOption.EnableSubwayPlanning, true); } if (GameUtils.IsInstalled(ProductVersion.Undefined | ProductVersion.EP5) && ((sim.IsWildAnimal || sim.IsStray) || (sim.IsUnicorn || WildHorses.IsWildHorse(sim)))) { r.SetOption2(Route.RouteOption2.EnablePlanningAsBoat, false); r.SetOption2(Route.RouteOption2.DestinationMustBeOnLand, true); } if (routingComponent.SimSatisfiesSpecialConditions()) { r.SetOption(Route.RouteOption.PassThroughObjects, true); r.SetOption(Route.RouteOption.PassThroughWalls, true); } if (sim.HasGhostBuff && !flag) { r.SetOption(Route.RouteOption.RouteAsGhost, true); } if ((GameUtils.IsInstalled(ProductVersion.Undefined | ProductVersion.EP4) && (sim.CarryingChildPosture != null)) && (Stroller.GetStroller(sim, sim.LotCurrent) != null)) { r.SetOption(Route.RouteOption.PlanUsingStroller, true); } if (sim.IsHuman) { SwimmingInPool pool = previousPosture as SwimmingInPool; if (pool != null) { if (pool.ContainerIsOcean) { r.SetOption(Route.RouteOption.EnableWaterPlanning, true); } } else { Ocean.PondAndOceanRoutingPosture posture2 = previousPosture as Ocean.PondAndOceanRoutingPosture; if ((posture2 != null) && (posture2.WalkStyleToUse == Sim.WalkStyle.Wade)) { r.SetOption(Route.RouteOption.EnableWaterPlanning, true); } } } // Cut if (GameUtils.IsInstalled(ProductVersion.EP8)) { if (SimEx.GetOwnedAndUsableVehicle(sim, sim.LotHome, false, false, false, true) is CarUFO) { r.SetOption(Route.RouteOption.EnableUFOPlanning, true); } if ((sim.IsHuman && sim.SimDescription.ChildOrAbove) && PondManager.ArePondsFrozen()) { bool flag6 = true; while (previousPosture != null) { if (previousPosture.Satisfaction(CommodityKind.Standing, null) <= 0f) { flag6 = false; break; } previousPosture = previousPosture.PreviousPosture; } if (flag6) { r.SetOption(Route.RouteOption.EnablePondPlanning, true); } } } } } finally { msg += Common.NewLine + " B " + span.Duration; } span = Common.TestSpan.CreateSimple(); try { if (!(sim.CurrentInteraction is IHasCustomRouteOptions)) { r.ExitReasonsInterrupt = unchecked ((int)0xffa9bfff); if ((0x0 != (simFlags & 0x3)) && !sim.LotCurrent.IsWorldLot) { r.SetValidRooms(sim.LotCurrent.LotId, null); } if ((sim.IsHorse && sim.SimDescription.AdultOrAbove) && !sim.SimDescription.IsGhost) { r.SetOption(Route.RouteOption.RouteAsLargeAnimal, true); } if (((sim.IsHorse || sim.IsDeer) || (sim.IsFullSizeDog && sim.SimDescription.AdultOrAbove)) && !sim.SimDescription.IsGhost) { r.SetOption(Route.RouteOption.OffsetDestinationForLongAnimals, true); } if (sim.IsHorse && sim.IsInBeingRiddenPosture) { r.SetOption(Route.RouteOption.RouteWhileMounted, true); } if (previousPosture is LeadingHorsePosture) { r.SetOption(Route.RouteOption.EnablePlanningAsCar, false); r.SetOption(Route.RouteOption.RouteAsLargeAnimal, true); r.SetOption(Route.RouteOption.RouteAsSimLeadingHorse, true); } if (sim.IsPet && !sim.IsInBeingRiddenPosture) { r.SetOption(Route.RouteOption.IgnoreSidewalkAndLotRestrictions, true); } } //route = sim.CreateRoute(); } finally { msg += Common.NewLine + " C " + span.Duration; } } } AcademicTextBook book = parameters.mTarget as AcademicTextBook; if (book != null) { Sim a = parameters.mActor as Sim; GreyedOutTooltipCallback greyedOutTooltipCallback = null; if ((a.OccupationAsAcademicCareer != null) || !book.mRequireAcademics) { if (book.TestRockAndRead(a, false, ref greyedOutTooltipCallback)) { msg += Common.NewLine + "A"; } if (a.Inventory.Contains(parameters.mTarget) && !(a.Posture is Sim.StandingPosture)) { if (book.TestReadBook(a, false, ref greyedOutTooltipCallback)) { msg += Common.NewLine + "B"; } } if (a.GetObjectInRightHand() == parameters.mTarget) { if (book.TestReadBook(a, false, ref greyedOutTooltipCallback)) { msg += Common.NewLine + "C"; } } msg += Common.NewLine + "D"; } msg += Common.NewLine + "E"; } CommonDoor door = parameters.mTarget as CommonDoor; if (door != null) { if (door.mObjComponents != null) { msg += Common.NewLine + "Count: " + door.mObjComponents.Count; for (int i = 0x0; i < door.mObjComponents.Count; i++) { msg += Common.NewLine + door.mObjComponents[i].BaseType; if (door.mObjComponents[i].BaseType == typeof(PortalComponent)) { msg += Common.NewLine + " Found"; door.mObjComponents[i].Dispose(); door.mObjComponents.RemoveAt(i); break; } } if (door.mObjComponents.Count == 0x0) { door.mObjComponents = null; } } } HarvestPlant plant = parameters.mTarget as HarvestPlant; if (plant != null) { msg += Common.NewLine + "mBarren: " + plant.mBarren; msg += Common.NewLine + "mGrowthState: " + plant.mGrowthState; msg += Common.NewLine + "mDormant: " + plant.mDormant; msg += Common.NewLine + "mLeaflessState: " + plant.mLeaflessState; msg += Common.NewLine + "mLifetimeHarvestablesYielded: " + plant.mLifetimeHarvestablesYielded; msg += Common.NewLine + "NumLifetimeHarvestables: " + plant.PlantDef.NumLifetimeHarvestables; msg += Common.NewLine + "Yield: " + plant.GetYield(); } } catch (Exception e) { GameHitParameters <GameObject> .Exception(parameters, msg, e); } finally { Common.DebugWriteLog(msg); } return(OptionResult.SuccessClose); }
public override bool Run() { try { if (Actor.LotCurrent != Target) { Vector3 point = World.LotGetPtInside(Target.LotId); if (point == Vector3.Invalid) { return(false); } if (!Actor.RouteToPointRadius(point, 3f) && (!GlobalFunctions.PlaceAtGoodLocation(Actor, new World.FindGoodLocationParams(point), false) || Actor.IsPointInLotSafelyRoutable(Target, Actor.Position))) { Actor.AttemptToPutInSafeLocation(true); } } if (Actor.Posture is SwimmingInPool) { SwimmingInPool posture = Actor.Posture as SwimmingInPool; if (!posture.ContainerPool.RouteToEdge(Actor)) { if (Actor.BridgeOrigin != null) { Actor.BridgeOrigin.MakeRequest(); } Actor.PopPosture(); IGameObject reservedTile = null; Actor.FindRoutablePointInsideNearFrontDoor(Actor.Household.LotHome, out reservedTile); Vector3 position = reservedTile.Position; Terrain.TeleportMeHere here = Terrain.TeleportMeHere.Singleton.CreateInstance(Terrain.Singleton, Actor, new InteractionPriority(InteractionPriorityLevel.Pregnancy), false, false) as Terrain.TeleportMeHere; here.SetAndReserveDestination(reservedTile); try { here.RunInteractionWithoutCleanup(); } catch { Actor.SetPosition(position); } finally { here.Cleanup(); } Actor.LoopIdle(); } } Pregnancy pregnancy = Actor.SimDescription.Pregnancy; GetNewBorns(); AcquirePregnancyStateMachine(); mCurrentStateMachine.SetActor("x", Actor); for (int i = 0; i < mNewborns.Count; i++) { Sim baby = mNewborns[i]; Relationship.Get(Actor, baby, true).LTR.ForceChangeState(LongTermRelationshipTypes.Friend); if (baby.BridgeOrigin != null) { baby.BridgeOrigin.MakeRequest(); baby.BridgeOrigin = null; } InternalHaveAlienBabyHome instance = InternalHaveAlienBabyHome.Singleton.CreateInstance(baby, Actor, GetPriority(), Autonomous, CancellableByPlayer) as InternalHaveAlienBabyHome; instance.TotalCount = mNewborns.Count; instance.BabyIndex = i + 1; instance.mCurrentStateMachine = mCurrentStateMachine; Actor.InteractionQueue.PushAsContinuation(instance, true); } TryDeliverImaginaryFriend(); return(true); } catch (ResetException) { throw; } catch (Exception e) { Logger.WriteExceptionLog(e, this, "HaveAlienBabyHome.Run() Error"); return(false); } }
public static bool DoRoute(RoutingComponent ths, Route r) { Sim owner = ths.Owner as Sim; if ((!r.ExecutionFromNonSimTaskIsSafe && (owner != null)) && (Simulator.CurrentTask != ths.Owner.ObjectId)) { Simulator.CurrentTask.ObjectFromId <GameObject>(); return(false); } IBoat boat = ths.Owner as IBoat; if (ths.RoutingParent != null) { if (!(ths.RoutingParent is IBoat) || (r.GetOption2(Route.RouteOption2.EndAsBoat) && (!r.PlanResult.Succeeded() || !RoutingComponent.PlannedRouteHasNonBoatSubpath(r)))) { // Custom if (ths.RoutingParent.RoutingComponent is CarRoutingComponent) { return(CarRoutingComponentEx.DoRoute(ths.RoutingParent.RoutingComponent as CarRoutingComponent, r)); } else { return(ths.RoutingParent.RoutingComponent.DoRoute(r)); } } } else if (((boat != null) && r.PlanResult.Succeeded()) && (!r.GetOption2(Route.RouteOption2.EndAsBoat) || RoutingComponent.PlannedRouteHasNonBoatSubpath(r))) { Sim driver = boat.GetDriver(); if (driver != null) { return(driver.RoutingComponent.DoRoute(r)); } } Common.StringBuilder msg = new Common.StringBuilder("RoutingComponentEx:DoRoute" + Common.NewLine); if (owner != null) { msg += Common.NewLine + owner.FullName + Common.NewLine; } ths.mRouteActions.Clear(); bool routeSuccess = true; try { RouteAction.FailureExplanation explanation = RouteAction.FailureExplanation.None; RoutingComponent.mnNumDoRouteCalls += (ulong)0x1L; if (r.PlanResult.Succeeded()) { ths.OnAboutToStartFollowingRoute(r); if (r.PlanResult.Succeeded()) { ths.PushActionsForRoute(r, r); if (owner != null) { owner.PushBackpackPostureIfNecessary(); owner.PushCanePostureIfNecessary(); owner.PushJetpackPostureIfNecessary(); } } else { routeSuccess = false; } } else { routeSuccess = false; } msg.Append("A"); if (!routeSuccess) { explanation |= RouteAction.FailureExplanation.InitialPlanFailure; LogFailure(ths.Owner, RouteAction.FailureExplanation.InitialPlanFailure, r.PlanResult, "Initial Path Plan Failure (WILL NOT play route fail)"); r.SetRouteActionResult(0x2); return(false); } msg.Append("B"); int failures = 0; if ((ths.RoutingParent != null) && (ths.RoutingParent is IBoat)) { ths.UpdateDynamicFootprint(ths.RoutingParent as GameObject, false); } else { ths.UpdateDynamicFootprint(ths.Owner, false); } Vector3 originalPosition = ths.Owner.Position; int loops = 0; bool success = true; Route processedPath = r; bool isOutside = ths.Owner.IsOutside; ths.mNumWaterEntriesThisRoute = 0; while (ths.mRouteActions.Count != 0x0) { // Custom if (ths.Owner.Position == originalPosition) { loops++; } if ((loops > 30) || (ths.mRouteActions.Count > 30)) { success = false; ths.mRouteActions.Clear(); break; } if (ths.mRouteActions[0] is GetInBoatRouteAction) { ths.mNumWaterEntriesThisRoute++; if (ths.mNumWaterEntriesThisRoute > 10) { if (owner != null) { owner.SetToResetAndSendHome(); } else { ths.Owner.SetObjectToReset(); } return(false); } } if ((owner != null) && owner.IsOutside) { owner.PushHoverboardPostureIfNecessary(); } // Custom RouteAction routeAction = ths.mRouteActions[0x0]; msg.Append(Common.NewLine + routeAction.GetType()); RouteAction.ActionResult actionResult = RouteAction.ActionResult.Continue; //using (BuffsChangedProxy buffsProxy = new BuffsChangedProxy(owner)) { try { if (routeAction is ObstacleEncounteredRouteInterruptAction) { actionResult = ObstacleEncounteredRouteInterruptActionEx.PerformAction(routeAction as ObstacleEncounteredRouteInterruptAction); } else { actionResult = routeAction.PerformAction(); } } catch (ResetException) { throw; } catch (SacsErrorException e) { Common.DebugException(owner, null, msg, e); failures++; if (failures > 10) { actionResult = RouteAction.ActionResult.Terminate; } else { actionResult = RouteAction.ActionResult.ContinueAndPopPathAndReplan; } routeAction.OnReset(); } catch (Exception e) { Common.Exception(owner, null, msg.ToString(), e); string stackTrace = e.StackTrace.ToString(); if (stackTrace.Contains("OccultManager:DisallowClothesChange")) { OccultTypeHelper.ValidateOccult(owner.SimDescription, null); actionResult = RouteAction.ActionResult.Terminate; } else if (stackTrace.Contains("CommonDoor:IsAllowedThrough")) { Corrections.CleanupCommonDoors(null); actionResult = RouteAction.ActionResult.Terminate; } else if (stackTrace.Contains("SimRoutingComponent:RequestWalkStyle")) { actionResult = RouteAction.ActionResult.Terminate; } else { failures++; if (failures > 10) { actionResult = RouteAction.ActionResult.Terminate; } else { actionResult = RouteAction.ActionResult.ContinueAndPopPathAndReplan; } } routeAction.OnReset(); } } msg.Append(Common.NewLine + "C"); // Custom if ((ths.mRouteActions.Count > 0) && (ths.mRouteActions[0x0].ForciblyReplanned) && (actionResult == RouteAction.ActionResult.ContinueAndPopPath)) { actionResult = RouteAction.ActionResult.ContinueAndFollowPath; } msg.Append(Common.NewLine + actionResult + Common.NewLine); if (GoHere.Settings.mDetailedRouting) { if (Sim.ActiveActor == owner) { Common.DebugNotify(msg); } } if (ths.mRouteActions.Count == 0x0) { explanation |= RouteAction.FailureExplanation.InternalPlanFailure; success = false; break; } msg.Append("D"); ths.mPreviousRouteAction = ths.mRouteActions[0x0]; switch (actionResult) { case RouteAction.ActionResult.Continue: case RouteAction.ActionResult.ContinueAndPopPath: case RouteAction.ActionResult.ContinueAndPopPathAndReplan: case RouteAction.ActionResult.ContinueAndPopPathAndRestart: case RouteAction.ActionResult.ContinueAndFollowPath: msg.Append("E"); ths.mRouteActions.RemoveAt(0x0); bool flag3 = (processedPath.GetNumPaths() > 0x1) || (processedPath.IsLoop()); if (((actionResult == RouteAction.ActionResult.ContinueAndPopPath) && flag3) || ((actionResult == RouteAction.ActionResult.ContinueAndPopPathAndRestart) || (actionResult == RouteAction.ActionResult.ContinueAndPopPathAndReplan))) { if (flag3) { processedPath.PopPath(); } msg.Append("F"); if (actionResult == RouteAction.ActionResult.ContinueAndPopPathAndReplan) { Vector3 outPosition = new Vector3(); if ((ths.RoutingParent != null) && (ths.RoutingParent is IBoat)) { outPosition = ths.RoutingParent.PositionOnFloor; } else if (ths.Owner != null) { if ((owner != null) && (owner.Posture is SwimmingInPool)) { outPosition = ths.Owner.Position; } else { outPosition = ths.Owner.PositionOnFloor; } } else { processedPath.GetPathStartPoint(0x0, ref outPosition); } processedPath.ReplanFromPoint(outPosition); } msg.Append("G"); if (actionResult == RouteAction.ActionResult.ContinueAndPopPathAndRestart) { Vector3 positionOnFloor = new Vector3(); if (ths.Owner != null) { positionOnFloor = ths.Owner.PositionOnFloor; } else { processedPath.GetPathStartPoint(0x0, ref positionOnFloor); } processedPath.SetOption(Route.RouteOption.EnablePlanningAsCar, false); processedPath.SetOption(Route.RouteOption.EnableSubwayPlanning, false); processedPath.SetOption2(Route.RouteOption2.EnableHoverTrainPlanning, false); processedPath.ReplanFromPoint(positionOnFloor); explanation |= RouteAction.FailureExplanation.CancelledByScript; success = false; ths.mRouteActions.Clear(); } else if (processedPath.PlanResult.Succeeded()) { ths.PushActionsForRoute(r, processedPath); } else { explanation |= RouteAction.FailureExplanation.ReplanFailure; success = false; ths.mRouteActions.Clear(); } } else if ((actionResult == RouteAction.ActionResult.ContinueAndFollowPath) && (r.GetNumPaths() > 0x0)) { msg.Append("H"); if (r.PlanResult.Succeeded()) { ths.PushActionsForRoute(r, processedPath); } else { explanation |= RouteAction.FailureExplanation.InternalPlanFailure; success = false; ths.mRouteActions.Clear(); } } break; default: msg.Append("I"); explanation |= ths.mPreviousRouteAction.FailureExplanations; success = false; ths.mRouteActions.Clear(); break; } } msg.Append("J"); ths.mRouteActions.Clear(); r.SetRouteActionResult((uint)explanation); if (!success) { if (ths.mPreviousRouteAction == null) { LogFailure(ths.Owner, explanation, r.PlanResult, "(Null mPreviousRouteAction failure)"); } else { LogFailure(ths.Owner, explanation, r.PlanResult, "(failure in " + ths.mPreviousRouteAction.ToString() + ")"); } } msg.Append("K"); if ((ths.RoutingParent != null) && (ths.RoutingParent is IBoat)) { ths.UpdateDynamicFootprint(ths.RoutingParent as GameObject, true); } else { ths.UpdateDynamicFootprint(ths.Owner, true); } routeSuccess = (success && (processedPath == r)) && r.PlanResult.Succeeded(); ths.mPreviousRouteAction = null; if (ths.OnRouteActionsFinished != null) { ths.OnRouteActionsFinished(ths.Owner, routeSuccess); } if (((SeasonsManager.Enabled && routeSuccess) && (isOutside && (owner != null))) && ((owner.IsHuman && owner.SimDescription.ChildOrAbove) && (!owner.IsOutside && (owner.CurrentOutfitCategory == OutfitCategories.Outerwear)))) { owner.SwitchToOutfitWithSpin(Sim.ClothesChangeReason.RemovingOuterwear); } if (owner != null) { SwimmingInPool posture = owner.Posture as SwimmingInPool; if ((posture != null) && posture.UsedShortEntryAnimation) { posture.UsedShortEntryAnimation = false; if (owner.SimDescription.IsMatureMermaid) { OccultMermaid.PutOnTailWithSpin(owner.SimDescription); } } } } catch (ResetException) { routeSuccess = false; if (ths.mRouteActions.Count > 0x0) { RouteAction action = ths.mRouteActions[0x0]; if (action != null) { action.OnReset(); } } ths.mRouteActions.Clear(); throw; } catch (Exception e) { Common.Exception(owner, null, msg.ToString(), e); routeSuccess = false; if (ths.mRouteActions.Count > 0x0) { RouteAction action = ths.mRouteActions[0x0]; if (action != null) { action.OnReset(); } } ths.mRouteActions.Clear(); } finally { ths.mRouteActions.Clear(); if (owner != null) { owner.RestoreUsedHoverboard(); } if ((owner != null) && (owner.FirstName == "Roberto")) { Common.DebugStackLog(msg); } } return(routeSuccess); }
public static bool Run(Pregnancy.HaveBabyHome ths) { try { if (ths.Actor.LotCurrent != ths.Target) { Vector3 point = World.LotGetPtInside(ths.Target.LotId); if (point == Vector3.Invalid) { return(false); } if (!ths.Actor.RouteToPointRadius(point, 3f) && (!GlobalFunctions.PlaceAtGoodLocation(ths.Actor, new World.FindGoodLocationParams(point), false) || !SimEx.IsPointInLotSafelyRoutable(ths.Actor, ths.Target, ths.Actor.Position))) { ths.Actor.AttemptToPutInSafeLocation(true); } } if (ths.Actor.Posture is SwimmingInPool) { SwimmingInPool posture = ths.Actor.Posture as SwimmingInPool; if (!posture.ContainerPool.RouteToEdge(ths.Actor)) { if (ths.Actor.BridgeOrigin != null) { ths.Actor.BridgeOrigin.MakeRequest(); } ths.Actor.PopPosture(); IGameObject reservedTile = null; ths.Actor.FindRoutablePointInsideNearFrontDoor(ths.Actor.Household.LotHome, out reservedTile); Vector3 position = reservedTile.Position; Terrain.TeleportMeHere here = Terrain.TeleportMeHere.Singleton.CreateInstance(Terrain.Singleton, ths.Actor, new InteractionPriority(InteractionPriorityLevel.Pregnancy), false, false) as Terrain.TeleportMeHere; here.SetAndReserveDestination(reservedTile); try { here.RunInteractionWithoutCleanup(); } catch { ths.Actor.SetPosition(position); } finally { here.Cleanup(); } ths.Actor.LoopIdle(); } } Pregnancy pregnancy = ths.Actor.SimDescription.Pregnancy; if (pregnancy != null) { // Custom EnsureForeignFather(pregnancy); } ths.GetNewBorns(); ths.AcquirePregnancyStateMachine(); ths.mCurrentStateMachine.SetActor("x", ths.Actor); for (int i = 0x0; i < ths.mNewborns.Count; i++) { Sim sim = ths.mNewborns[i]; Relationship.Get(ths.Actor, sim, true).LTR.ForceChangeState(LongTermRelationshipTypes.Friend); if (sim.BridgeOrigin != null) { sim.BridgeOrigin.MakeRequest(); sim.BridgeOrigin = null; } Pregnancy.InternalHaveBabyHome instance = Pregnancy.InternalHaveBabyHome.Singleton.CreateInstance(sim, ths.Actor, ths.GetPriority(), ths.Autonomous, ths.CancellableByPlayer) as Pregnancy.InternalHaveBabyHome; instance.TotalCount = ths.mNewborns.Count; instance.BabyIndex = i + 0x1; instance.mCurrentStateMachine = ths.mCurrentStateMachine; ths.Actor.InteractionQueue.PushAsContinuation(instance, true); } ths.TryDeliverImaginaryFriend(); return(true); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(ths.Actor, ths.Target, e); return(false); } }
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; } }
/* * [Tunable] * [TunableComment("Range: Fun/Stress motive amount. Description: Amount of stress that a Sim gets when seeing another Sim die.")] * public static float kWitnessDeathStressPenalty = -50f; * * [Tunable] * [TunableComment("Range: Float multiplier. Description: Multiplier on additional stress when a family member of loved one sees a Sim die.")] * public static float kWitnessDeathRelationshipMultiplier = 1.5f; * * [TunableComment("Range: Fun/Stress motive amount. Description: Amount of fun that a Sim gets when seeing an enemy Sim die.")] * [Tunable] * public static float kWitnessEnemyDeathFunGain = 50f; * */ public override bool Run() { SwimmingInPool swimmingInPool = Actor.Posture as SwimmingInPool; if (swimmingInPool != null && !swimmingInPool.ContainerPool.RouteToEdge(Actor)) { return(false); } SwimmingInPool swimmingInPool2 = Target.Posture as SwimmingInPool; if (swimmingInPool2 != null) { if (!swimmingInPool2.ContainerPool.RouteToEdge(Actor)) { return(false); } Actor.RouteTurnToFace(Target.Position); } else if (!GlobalFunctions.ObjectsWithinRadiusOfEachOther(Actor, Target, 2f)) { if (Actor == null || Target == null || Target.LotCurrent == null) { return(false); } Route route = Actor.CreateRoute(); if (route == null) { return(false); } RequestWalkStyle(Sim.WalkStyle.Run); route.PlanToPointRadialRange(Target.Position, 2f, 6f, RouteDistancePreference.PreferNearestToRouteDestination, RouteOrientationPreference.TowardsObject, Target.LotCurrent.LotId, new int[1] { Target.RoomId }); if (Actor == null || !Actor.DoRoute(route)) { return(false); } UnrequestWalkStyle(Sim.WalkStyle.Run); } else { Actor.RouteTurnToFace(Target.Position); } if (Simulator.CheckYieldingContext(false)) { Simulator.Sleep(20); } if (Target.SimDescription == null || !Target.SimDescription.IsValidDescription) { return(true); } NFinalizeDeath.CheckYieldingContext(); StateMachineClient stateMachineClient = StateMachineClient.Acquire(Actor, "DeathReactions"); stateMachineClient.SetActor("x", Actor); stateMachineClient.EnterState("x", "Enter"); BeginCommodityUpdates(); bool flag = false; bool flag2 = false; //bool flag3 = false; LTRData.RelationshipClassification relationshipClassification = LTRData.RelationshipClassification.Low; Relationship relationship = Relationship.Get(Actor, Target, false); if (relationship != null) { relationshipClassification = LTRData.Get(relationship.LTR.CurrentLTR).RelationshipClass; } if (Actor == null || Target == null || Actor.Genealogy == null || Target.Genealogy == null) { return(true); } if (relationshipClassification == LTRData.RelationshipClassification.High || Actor.Genealogy.IsBloodRelated(Target.Genealogy)) { if (relationship != null && relationship.AreRomantic() && relationship.LTR.IsPositive) { flag2 = true; } else { flag = true; } //flag3 = true; } NFinalizeDeath.CheckYieldingContext(); switch (Actor.SimDescription.Species) { case CASAgeGenderFlags.None: case CASAgeGenderFlags.Human: if (!Actor.IsInActiveHousehold) { stateMachineClient.RequestState("x", "Shocked"); NFinalizeDeath.CheckYieldingContext(); if (RandomUtil.RandomChance(25)) { stateMachineClient.RequestState("x", "Evil"); } else { stateMachineClient.RequestState("x", "LovedOneLoop"); } flag = true; flag2 = true; //flag3 = true; } else { stateMachineClient.RequestState("x", "Shocked"); NFinalizeDeath.CheckYieldingContext(); Actor.Motives.ChangeValue(CommodityKind.Fun, kWitnessDeathStressPenalty); stateMachineClient.RequestState("x", "BasicLoop"); flag = false; flag2 = false; //flag3 = false; } break; case CASAgeGenderFlags.Dog: case CASAgeGenderFlags.LittleDog: stateMachineClient.RequestState("x", "Dog"); break; case CASAgeGenderFlags.Cat: stateMachineClient.RequestState("x", "Cat"); break; case CASAgeGenderFlags.Horse: stateMachineClient.RequestState("x", "Horse"); break; } EventTracker.SendEvent(EventTypeId.kSawSimDie, Actor, Target); DoLoop(ExitReason.Default, __LoopDel, stateMachineClient); EndCommodityUpdates(true); if (Actor.IsInActiveHousehold) { if (Actor.BuffManager == null) { return(false); } if (flag2 && Target.SimDescription.DeathStyle != 0) { Actor.BuffManager.AddElement(BuffNames.HeartBroken, Origin.FromWitnessingDeath); BuffHeartBroken.BuffInstanceHeartBroken buffInstanceHeartBroken = Actor.BuffManager.GetElement(BuffNames.HeartBroken) as BuffHeartBroken.BuffInstanceHeartBroken; if (buffInstanceHeartBroken != null) { buffInstanceHeartBroken.MissedSim = Target.SimDescription; } } else if (flag && Target.SimDescription.DeathStyle != 0) { Actor.BuffManager.AddElement(BuffNames.Mourning, Urnstone.CalculateMourningMoodStrength(Actor, Target.SimDescription), Origin.FromWitnessingDeath); BuffMourning.BuffInstanceMourning buffInstanceMourning = Actor.BuffManager.GetElement(BuffNames.Mourning) as BuffMourning.BuffInstanceMourning; if (buffInstanceMourning != null) { buffInstanceMourning.MissedSim = Target.SimDescription; } } } else { if (Actor.BuffManager == null) { return(false); } if (flag2) { Actor.BuffManager.AddElement(BuffNames.HeartBroken, Origin.FromWitnessingDeath); BuffHeartBroken.BuffInstanceHeartBroken buffInstanceHeartBroken = Actor.BuffManager.GetElement(BuffNames.HeartBroken) as BuffHeartBroken.BuffInstanceHeartBroken; if (buffInstanceHeartBroken != null) { buffInstanceHeartBroken.MissedSim = Target.SimDescription; } } else if (flag) { Actor.BuffManager.AddElement(BuffNames.Mourning, Urnstone.CalculateMourningMoodStrength(Actor, Target.SimDescription), Origin.FromWitnessingDeath); BuffMourning.BuffInstanceMourning buffInstanceMourning = Actor.BuffManager.GetElement(BuffNames.Mourning) as BuffMourning.BuffInstanceMourning; if (buffInstanceMourning != null) { buffInstanceMourning.MissedSim = Target.SimDescription; } } } NFinalizeDeath.CheckYieldingContext(); stateMachineClient.RequestState("x", "Exit"); stateMachineClient.Dispose(); //if (!NFinalizeDeath.IsAllActiveHousehold_SimObject(Actor) && // !NFinalizeDeath.IsAllActiveHousehold_SimObject(Target) && // !(Actor.SimDescription.Service is GrimReaper) && // !(Target.SimDescription.Service is GrimReaper) && // RandomUtil.RandomChance(70) //) //return NFinalizeDeath.ForceNHSReapSoul(Target, Actor); return(true); }
public static void SetRouteOptions(SimRoutingComponent ths, Route r, uint ageGenderFlags) { SimDescription simDescription = ths.OwnerSim.SimDescription; Posture previousPosture = ths.OwnerSim.Posture; if (!(ths.OwnerSim.CurrentInteraction is IHasCustomRouteOptions)) { r.SetOption(Route.RouteOption.BeginAsCar, (ths.OwnerSim.Parent is Vehicle) && !(ths.OwnerSim.Parent is IBoat)); r.SetOption(Route.RouteOption.EnablePlanningAsCar, simDescription.ChildOrAbove); r.SetOption(Route.RouteOption.DisablePlanningAsPedestrian, false); r.SetOption(Route.RouteOption.PushSimsAtDestination, true); r.SetOption(Route.RouteOption.UseAutoSlotFootprintLocking, true); r.SetOption(Route.RouteOption.ReplanToFindObstacleWhenPathPlanFails, true); r.SetOption(Route.RouteOption.IgnoreParent, false); r.SetOption(Route.RouteOption.IgnoreChildren, false); r.SetOption(Route.RouteOption.CreateSubPaths, true); r.SetOption(Route.RouteOption.CheckForFootprintsNearGoals, true); r.SetOption(Route.RouteOption.PenalizeGoalsOnDifferentLevels, true); bool flag = false; if (GameUtils.IsInstalled(ProductVersion.EP10)) { IBoat parent = ths.OwnerSim.Parent as IBoat; if (parent != null) { flag = true; r.Follower = parent.Proxy; r.FollowerAgeGenderSpecies = (uint)parent.GetBoatSpecies(); r.SetOption2(Route.RouteOption2.EnablePlanningAsBoat, true); r.SetOption2(Route.RouteOption2.BeginAsBoat, true); r.SetOption2(Route.RouteOption2.UseFollowerStartOrientation, true); r.SetOption(Route.RouteOption.OffsetDestinationForLongAnimals, true); r.AddObjectToIgnoreForRoute(ths.OwnerSim.ObjectId); } bool flag2 = OccultMermaid.IsEveryOneGroupedWithMeATeenOrAboveMermaid(ths.OwnerSim); bool flag3 = false; if (!flag2) { flag3 = ((previousPosture is CarryingChildPosture) || (previousPosture is CarryingPetPosture)) || ths.OwnerSim.Autonomy.SituationComponent.InSituationOfType(typeof(GoHereWithSituation)); } bool flag4 = simDescription.ChildOrAbove & !(previousPosture is ScubaDiving); flag4 &= !(ths.OwnerSim.InteractionQueue.GetHeadInteraction() is Lifeguard.GiveCPR); flag4 &= !(ths.OwnerSim.InteractionQueue.GetHeadInteraction() is Lifeguard.FakeInjury); flag4 &= !(simDescription.CreatedByService is GrimReaper); flag4 &= !flag2 || flag3; flag4 &= !(previousPosture is BeingRiddenPosture) && !(previousPosture is RidingPosture); bool flag5 = simDescription.ChildOrAbove && simDescription.IsHuman; flag5 &= !(previousPosture is CarryingChildPosture) && !(previousPosture is CarryingPetPosture); r.SetOption(Route.RouteOption.EnableWaterPlanning, flag5); r.SetOption2(Route.RouteOption2.DestinationMustBeOnLand, !flag5); r.SetOption2(Route.RouteOption2.EnablePlanningAsBoat, (parent != null) || flag4); if (flag2 && flag5) { r.SetOption2(Route.RouteOption2.RouteAsMermaid, true); } else { r.SetOption2(Route.RouteOption2.RouteAsLifeguard, Lifeguard.ShouldUseRescueSwimWade(ths.OwnerSim)); } } if (GameUtils.IsInstalled(ProductVersion.EP3)) { r.SetOption(Route.RouteOption.EnableSubwayPlanning, true); } if (GameUtils.IsInstalled(ProductVersion.EP11)) /*&& GameUtils.IsFutureWorld())*/ { r.SetOption2(Route.RouteOption2.EnableHoverTrainPlanning, true); } if (GameUtils.IsInstalled(ProductVersion.EP5) && ((ths.OwnerSim.IsWildAnimal || ths.OwnerSim.IsStray) || (ths.OwnerSim.IsUnicorn || WildHorses.IsWildHorse(ths.OwnerSim)))) { r.SetOption2(Route.RouteOption2.EnablePlanningAsBoat, false); r.SetOption2(Route.RouteOption2.DestinationMustBeOnLand, true); } if (ths.SimSatisfiesSpecialConditions()) { r.SetOption(Route.RouteOption.PassThroughObjects, true); r.SetOption(Route.RouteOption.PassThroughWalls, true); } if (ths.OwnerSim.HasGhostBuff && !flag) { r.SetOption(Route.RouteOption.RouteAsGhost, true); } if ((GameUtils.IsInstalled(ProductVersion.EP4) && (ths.OwnerSim.CarryingChildPosture != null)) && (Stroller.GetStroller(ths.OwnerSim, ths.OwnerSim.LotCurrent) != null)) { r.SetOption(Route.RouteOption.PlanUsingStroller, true); } if (ths.OwnerSim.IsHuman) { SwimmingInPool pool = previousPosture as SwimmingInPool; if (pool != null) { if (pool.ContainerIsOcean) { r.SetOption(Route.RouteOption.EnableWaterPlanning, true); } } else { Ocean.PondAndOceanRoutingPosture posture2 = previousPosture as Ocean.PondAndOceanRoutingPosture; if ((posture2 != null) && (posture2.WalkStyleToUse == Sim.WalkStyle.Wade)) { r.SetOption(Route.RouteOption.EnableWaterPlanning, true); } } } if (GameUtils.IsInstalled(ProductVersion.EP8)) { // Custom if (SimEx.GetOwnedAndUsableVehicle(ths.OwnerSim, ths.OwnerSim.LotHome, false, false, false, true) is CarUFO) //if (OwnerSim.GetOwnedAndUsableVehicle(OwnerSim.LotHome, false, false, false, true) is CarUFO) { r.SetOption(Route.RouteOption.EnableUFOPlanning, true); } if ((ths.OwnerSim.IsHuman && ths.OwnerSim.SimDescription.ChildOrAbove) && PondManager.ArePondsFrozen()) { bool flag6 = true; while (previousPosture != null) { if (previousPosture.Satisfaction(CommodityKind.Standing, null) <= 0f) { flag6 = false; break; } previousPosture = previousPosture.PreviousPosture; } if (flag6) { r.SetOption(Route.RouteOption.EnablePondPlanning, true); } } } r.ExitReasonsInterrupt = unchecked ((int)0xffa9bfff); if ((0x0 != (ageGenderFlags & 0x3)) && !ths.OwnerSim.LotCurrent.IsWorldLot) { r.SetValidRooms(ths.OwnerSim.LotCurrent.LotId, null); } if ((ths.OwnerSim.IsHorse && ths.OwnerSim.SimDescription.AdultOrAbove) && !ths.OwnerSim.SimDescription.IsGhost) { r.SetOption(Route.RouteOption.RouteAsLargeAnimal, true); } if (((ths.OwnerSim.IsHorse || ths.OwnerSim.IsDeer) || (ths.OwnerSim.IsFullSizeDog && ths.OwnerSim.SimDescription.AdultOrAbove)) && !ths.OwnerSim.SimDescription.IsGhost) { r.SetOption(Route.RouteOption.OffsetDestinationForLongAnimals, true); } if (ths.OwnerSim.IsHorse && ths.OwnerSim.IsInBeingRiddenPosture) { r.SetOption(Route.RouteOption.RouteWhileMounted, true); } if (previousPosture is LeadingHorsePosture) { r.SetOption(Route.RouteOption.EnablePlanningAsCar, false); r.SetOption(Route.RouteOption.RouteAsLargeAnimal, true); r.SetOption(Route.RouteOption.RouteAsSimLeadingHorse, true); } if (ths.OwnerSim.IsPet && !ths.OwnerSim.IsInBeingRiddenPosture) { r.SetOption(Route.RouteOption.IgnoreSidewalkAndLotRestrictions, true); } } }