public override bool RouteNearEntranceAndIntoBuilding(bool canUseCar, Route.RouteMetaType routeMetaType) { Definition interactionDefinition = InteractionDefinition as Definition; if ((interactionDefinition != null) && (interactionDefinition.PlayerChosenVehicle != null)) { Actor.SetReservedVehicle(interactionDefinition.PlayerChosenVehicle); } return(base.RouteNearEntranceAndIntoBuilding(canUseCar, routeMetaType)); }
public override bool RouteNearEntranceAndIntoBuilding(bool canUseCar, Route.RouteMetaType routeMetaType) { try { GoToSchoolInRabbitHoleHelper.PreRouteNearEntranceAndIntoBuilding(this, canUseCar, routeMetaType, OnChangeOutfit); return(Target.RouteNearEntranceAndEnterRabbitHole(Actor, this, BeforeEnteringRabbitHole, canUseCar, routeMetaType, true)); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
// LoganDownUnder_Aussomedays_END public override bool RouteNearEntranceAndIntoBuilding(bool canUseCar, Route.RouteMetaType routeMetaType) { try { GoToSchoolInRabbitHoleHelper.PreRouteNearEntranceAndIntoBuilding(this, canUseCar, routeMetaType, OnChangeOutfit); //LoganDownUnder_03Mar2017 -- only branch to slot reassignment if target is actual school rabbithole if (Target is ISchoolRabbitHole) { return(RouteNearEntranceAndEnterRabbitHole(Actor, this, BeforeEnteringRabbitHole, canUseCar, routeMetaType, true)); } // otherwise use original method return(Target.RouteNearEntranceAndEnterRabbitHole(Actor, this, BeforeEnteringRabbitHole, canUseCar, routeMetaType, true)); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
// replaces the method from RabbitHole class - identical except for new slot reassignment code public bool RouteNearEntranceAndEnterRabbitHole(Sim a, RabbitHole.IRabbitHoleFollowers inst, RabbitHole.BeforeEnteringRabbitHoleDelegate beforeEntering, bool canUseCar, Route.RouteMetaType routeMetaType, bool playRouteFailure) { if ((Target.RabbitHoleProxy.EnterSlots.Count == 0) || (Target.RabbitHoleProxy.ExitSlots.Count == 0)) { return(false); } if (a.IsInRidingPosture && ((Target.RabbitHoleProxy.MountedEnterSlots.Count == 0) || (Target.RabbitHoleProxy.MountedExitSlots.Count == 0))) { return(false); } List <Sim> list = new List <Sim>(); CarryingChildPosture posture = a.Posture as CarryingChildPosture; if (posture != null) { list.Add(posture.Child); } if (inst != null) { if (inst.SimFollowers != null) { foreach (Sim sim in inst.SimFollowers) { posture = sim.Posture as CarryingChildPosture; if (posture != null) { list.Add(posture.Child); } } foreach (Sim sim2 in list) { inst.AddFollower(sim2); } } else if (list.Count > 0) { inst.AddFollower(list[0]); } } bool flag = false; Route item = null; Sim parent = null; if (a.IsInRidingPosture) { if (a.Parent is Sim) { parent = a.Parent as Sim; } item = parent.CreateRoute(); item.ExecutionFromNonSimTaskIsSafe = true; } else { item = a.CreateRoute(); } bool flag2 = false; int kRouteAttemptsToEnterRabbitHole = RabbitHole.kRouteAttemptsToEnterRabbitHole; Slot slotToUse = Slot.None; while ((kRouteAttemptsToEnterRabbitHole > 0) && !flag2) { kRouteAttemptsToEnterRabbitHole--; try { Target.RabbitHoleProxy.ActiveEntryRoutes.Add(item); if (playRouteFailure) { item.DoRouteFail = kRouteAttemptsToEnterRabbitHole == 0; } item.SetOption(Route.RouteOption.EnablePlanningAsCar, canUseCar); if (Target.mGuid == RabbitHoleType.Subway) { item.SetOption(Route.RouteOption.EnableSubwayPlanning, false); } if (Target.mGuid == RabbitHoleType.HoverTrainStation) { item.SetOption2(Route.RouteOption2.EnableHoverTrainPlanning, false); } item.SetRouteMetaType(routeMetaType); foreach (Slot slot2 in Target.RabbitHoleProxy.EnterSlots) { item.AddObjectToIgnoreForRoute(Target.RabbitHoleProxy.SlotToSlotInfo[slot2].Footprint.ObjectId); } foreach (Slot slot3 in Target.RabbitHoleProxy.MountedEnterSlots) { item.AddObjectToIgnoreForRoute(Target.RabbitHoleProxy.SlotToSlotInfo[slot3].Footprint.ObjectId); } item.PlanToSlot(Target.RabbitHoleProxy, (a.IsInRidingPosture ? Target.RabbitHoleProxy.MountedEnterSlots : Target.RabbitHoleProxy.EnterSlots).ToArray()); if (!item.PlanResult.Succeeded()) { item.DoRouteFail = playRouteFailure; if (a.IsInRidingPosture) { return(parent.DoRoute(item)); } return(a.DoRoute(item)); } slotToUse = (Slot)item.PlanResult.mDestSlotNameHash; // Slot Reassignment if ((Target.RabbitHoleProxy.EnterSlots.Count > 1) && (Target.RabbitHoleProxy.EnterSlots.Count <= 5)) { slotToUse = ReassignSlot(Target.RabbitHoleProxy.EnterSlots.Count); } List <Sim> followers = (inst == null) ? null : inst.SimFollowers; if ((!flag && (followers != null)) && ((followers.Count > 1) || ((followers.Count == 1) && (followers[0].Posture.Container != a)))) { //if (RouteOutside(a, followers, this.RabbitHoleProxy.EnterSlots[0x0], false, true, true, false)) if (Target.RouteOutside(a, followers, Target.RabbitHoleProxy.EnterSlots[0], false, true, true, false)) { flag = true; flag2 = true; } } else { //flag2 = RouteOutside(a, followers, none, false, true, false, false); flag2 = Target.RouteOutside(a, followers, slotToUse, false, true, false, false); } if (!flag2 && (kRouteAttemptsToEnterRabbitHole > 0)) { if (IntroTutorial.TutorialSim == a) { break; } a.RemoveExitReason(ExitReason.RouteFailed); if (a.HasExitReason(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached))) { break; } a.LoopIdle(); Simulator.Sleep((uint)SimClock.ConvertToTicks(RandomUtil.GetFloat(RabbitHole.kMinSimMinutesToSleepOnFailedRouteAttempt, RabbitHole.kMaxSimMinutesToSleepOnFailedRouteAttempt), TimeUnit.Minutes)); } continue; } finally { Target.RabbitHoleProxy.ActiveEntryRoutes.Remove(item); } } item = null; if (((a.ExitReason & ExitReason.HigherPriorityNext) == ExitReason.None) && ((a.ExitReason & ExitReason.UserCanceled) == ExitReason.None)) { if (flag2) { RabbitHole.NumSuccess++; } else { RabbitHole.NumFail++; } } if (!flag2) { return(flag2); } if ((beforeEntering != null) && !beforeEntering()) { List <Sim> simFollowers = null; if (inst != null) { simFollowers = inst.SimFollowers; } //RouteOutside(a, simFollowers, RandomUtil.GetRandomObjectFromList<Slot>(a.IsInRidingPosture ? this.RabbitHoleProxy.MountedEnterSlots : this.RabbitHoleProxy.EnterSlots), false, false, true, true); Target.RouteOutside(a, simFollowers, RandomUtil.GetRandomObjectFromList <Slot>(a.IsInRidingPosture ? Target.RabbitHoleProxy.MountedEnterSlots : Target.RabbitHoleProxy.EnterSlots), false, false, true, true); return(false); } LeadingHorsePosture posture2 = a.Posture as LeadingHorsePosture; if (posture2 != null) { Sim container = posture2.Container as Sim; LeadingHorsePosture.ReleaseHorseFromLeadingPosture(a, container, false); Target.AnimateEnterRabbitHole(a, slotToUse, true, routeMetaType); Target.AnimateEnterRabbitHole(container, slotToUse, true, routeMetaType); return(flag2); } return(Target.AnimateEnterRabbitHole(a, slotToUse, true, routeMetaType)); }
public static bool PreRouteNearEntranceAndIntoBuilding(GoToSchoolInRabbitHole ths, bool canUseCar, Route.RouteMetaType routeMetaType, OnChangeOutfit changedOutfitFunc) { try { // From GoToSchoolInRabbitHole GoToSchoolInRabbitHole.Definition interactionDefinition = ths.InteractionDefinition as GoToSchoolInRabbitHole.Definition; if ((interactionDefinition != null) && (interactionDefinition.PlayerChosenVehicle != null)) { ths.Actor.SetReservedVehicle(interactionDefinition.PlayerChosenVehicle); } bool success = false; School school = ths.Actor.School; if (school != null) { SimOutfit outfit; if (school.TryGetUniformForCurrentLevel(out outfit)) { if (ApplyOccupationUniform(ths.Actor.SimDescription, outfit)) { success = true; } } } if ((!success) && (changedOutfitFunc != null)) { changedOutfitFunc(); } VisitSituation.OnSimLeavingLot(ths.Actor); // From RabbitHoleInteraction<TActor, TRabbitHole> return(true); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(ths.Actor, ths.Target, e); return(false); } }