protected override void OnPerform() { if ((mSim.Posture != null) && (mSim.Posture.Container != null)) { mParent = mSim.Posture.Container as GameObject; mSim.Posture = null; } TerrainInteraction instance = new Terrain.TeleportMeHere.Definition(false).CreateInstanceWithCallbacks(Terrain.Singleton, mSim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true, null, OnCompleted, OnFailed) as TerrainInteraction; Door frontDoor = mDestination.FindFrontDoor(); if (frontDoor != null) { Vector3 forward; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(frontDoor.Position); fglParams.BooleanConstraints |= FindGoodLocationBooleans.StayInRoom; fglParams.InitialSearchDirection = RandomUtil.GetInt(0x0, 0x7); if (GlobalFunctions.FindGoodLocation(mSim, fglParams, out instance.Destination, out forward)) { mSim.InteractionQueue.Add(instance); } } }
// Token: 0x06006FB0 RID: 28592 RVA: 0x0026C8F0 File Offset: 0x0026B8F0 public void PlaceGraveStone() { this.mGrave.SetOpacity(0f, 0f); SimDescription.DeathType deathStyle = this.Target.SimDescription.DeathStyle; World.FindGoodLocationParams fglParams; if (deathStyle == SimDescription.DeathType.Drown) { fglParams = new World.FindGoodLocationParams(this.Actor.Position); } else { fglParams = new World.FindGoodLocationParams(this.Target.Position); } fglParams.BooleanConstraints |= FindGoodLocationBooleans.StayInRoom; if (!GlobalFunctions.PlaceAtGoodLocation(this.mGrave, fglParams, false)) { fglParams.BooleanConstraints = FindGoodLocationBooleans.None; if (!GlobalFunctions.PlaceAtGoodLocation(this.mGrave, fglParams, false)) { this.mGrave.SetPosition(this.Target.Position); } } this.mGrave.OnHandToolMovement(); this.mGrave.FadeIn(false, 10f); this.mGrave.FogEffectStart(); }
// Token: 0x06006FB1 RID: 28593 RVA: 0x0026C9C0 File Offset: 0x0026B9C0 public Vector3 GetPositionForGhost(Sim ghost, Urnstone grave) { World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(grave.Position); fglParams.BooleanConstraints |= FindGoodLocationBooleans.StayInRoom; Vector3 position; Vector3 vector; if (!GlobalFunctions.FindGoodLocation(ghost, fglParams, out position, out vector)) { Simulator.Sleep(0u); fglParams.BooleanConstraints &= ~FindGoodLocationBooleans.StayInRoom; if (!GlobalFunctions.FindGoodLocation(ghost, fglParams, out position, out vector)) { Simulator.Sleep(0u); fglParams.BooleanConstraints &= ~FindGoodLocationBooleans.Routable; if (!GlobalFunctions.FindGoodLocation(ghost, fglParams, out position, out vector)) { Simulator.Sleep(0u); fglParams.BooleanConstraints = FindGoodLocationBooleans.None; if (!GlobalFunctions.FindGoodLocation(ghost, fglParams, out position, out vector)) { position = ghost.Position; } } } } return(position); }
public static Vector3 FindRoutableLocation(IGameObject ths, Vector3 startPoint, out Vector3 fwd) { Vector3 result = startPoint; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(startPoint); fglParams.BooleanConstraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles; if (!GlobalFunctions.FindGoodLocation(ths, fglParams, out result, out fwd)) { fglParams.BooleanConstraints = FindGoodLocationBooleans.None; GlobalFunctions.FindGoodLocation(ths, fglParams, out result, out fwd); } return(result); }
public static Vector3 FindRoutableLocation(IGameObject ths, Vector3 startPoint, out Vector3 fwd) { Vector3 result = startPoint; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(startPoint); fglParams.BooleanConstraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles; if (!GlobalFunctions.FindGoodLocation(ths, fglParams, out result, out fwd)) { fglParams.BooleanConstraints = FindGoodLocationBooleans.None; GlobalFunctions.FindGoodLocation(ths, fglParams, out result, out fwd); } return result; }
public MeteorControl(Sim actor, Sim target) : base(15, TimeUnit.Minutes) { mActor = actor; mTarget = target; Vector3 empty = Vector3.Empty; Vector3 fwd = Vector3.Empty; Jig jig = GlobalFunctions.CreateObject("MeteorImpactJig", ProductVersion.EP2, Vector3.OutOfWorld, 0x0, Vector3.UnitZ, "Sims3.Gameplay.Core.Jig", null) as Jig; FindGoodLocationBooleans booleans = FindGoodLocationBooleans.AllowOnBridges | FindGoodLocationBooleans.AllowOnSideWalks | FindGoodLocationBooleans.AllowOnStreets | FindGoodLocationBooleans.TemporaryPlacement; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(target.PositionOnFloor); fglParams.BooleanConstraints = booleans; fglParams.PlacementCheckFunc = Sims3.Gameplay.Objects.Miscellaneous.Meteor.IsValidMeteorPosition; if (GlobalFunctions.FindGoodLocation(jig, fglParams, out empty, out fwd)) { mMeteor = GlobalFunctions.CreateObject("MeteorImpactShadow", ProductVersion.EP2, empty, 0x0, fwd, "Sims3.Gameplay.Objects.Miscellaneous.Meteor", null) as Sims3.Gameplay.Objects.Miscellaneous.Meteor; mMeteor.SetHiddenFlags(HiddenFlags.Footprint); } jig.Destroy(); if ((actor != null) && (mMeteor != null)) { mTarget.InteractionQueue.AddNext(Sims3.Gameplay.Objects.Miscellaneous.Meteor.ReactToMeteor.Singleton.CreateInstance(mMeteor, mTarget, mTarget.InheritedPriority(), false, true)); mActor.InteractionQueue.CancelAllInteractions(); Vector3 position = actor.Position; Vector3 forwardVector = actor.ForwardVector; if (GlobalFunctions.FindGoodLocationNearby(actor, ref position, ref forwardVector, Sims3.Gameplay.Objects.Miscellaneous.Meteor.kMeteorBlastZoneRadius, GlobalFunctions.FindGoodLocationStrategies.All, FindGoodLocationBooleans.None)) { InteractionInstance interaction = Terrain.GoHere.GetSingleton(actor, position).CreateInstanceWithCallbacks(Terrain.Singleton, actor, new InteractionPriority(InteractionPriorityLevel.UserDirected), true, true, null, null, OnGoHereFailure); interaction.RequestWalkStyle(Sim.WalkStyle.Run); actor.InteractionQueue.AddNext(interaction); } else { mActor.InteractionQueue.AddNext(Sims3.Gameplay.Objects.Miscellaneous.Meteor.ReactToMeteor.Singleton.CreateInstance(mMeteor, mActor, mActor.InheritedPriority(), false, true)); } } }
protected bool Test(Sim sim, List<InteractionDefinition> interactions) { if (InteractionsEx.HasInteraction<ICountsAsWorking>(sim)) { IncStat("At Work"); return false; } else if (Situations.HasInteraction(sim, interactions, true)) { IncStat("At Work"); return false; } else { if (Situations.DebuggingLevel >= Common.DebugLevel.High) { if (sim.InteractionQueue == null) { IncStat("Interaction Queue = null"); } else { if (sim.InteractionQueue.Count == 0) { IncStat("Interaction Queue empty"); } else { foreach (InteractionInstance instance2 in sim.InteractionQueue.InteractionList) { IncStat("Interaction: " + instance2.ToString()); } } } } VisitSituation.AnnounceTimeToGoToWork(sim); if (SimTypes.IsSpecial(Sim)) { IncStat("Special Pushed to Work"); } else { IncStat("Pushed to Work"); } try { // Don't queue stomp on their birthday if (sim.SimDescription.YearsSinceLastAgeTransition != 0) { sim.InteractionQueue.CancelAllInteractions(); IncStat("Queue Stomped"); if ((!SimTypes.IsSelectable(sim.SimDescription)) && (sim.LotCurrent != null) && (sim.LotCurrent.CanSimTreatAsHome(sim))) { Callbox callbox = sim.LotHome.FindCallbox(); if (callbox != null) { Vector3 fwd = Vector3.Invalid; Vector3 pos = Vector3.Invalid; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(callbox.Position); fglParams.BooleanConstraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles; if (GlobalFunctions.FindGoodLocation(sim, fglParams, out pos, out fwd)) { sim.ResetBindPoseWithRotation(); sim.SetPosition(pos); sim.SetForward(fwd); sim.RemoveFromWorld(); sim.AddToWorld(); sim.SetHiddenFlags(HiddenFlags.Nothing); sim.SetOpacity(1f, 0f); IncStat("Bounce to Mailbox"); } } } } } catch (Exception e) { Common.DebugException(sim, e); IncStat("Cancel Fail"); } sim.InteractionQueue.RemoveGoHomeInteractions(true); return true; } }
private void OnGoHome(WindowBase sender, UIButtonClickEventArgs eventArgs) { try { Sim sim = (Skewer.Instance.mHudModel as Sims3.Gameplay.UI.HudModel).mSavedCurrentSim; bool success = false; if (PortraitPanel.Settings.mGoHomeTeleport) { if ((PortraitPanel.Settings.mGoHomeTeleportForAll) || (sim.SimDescription.IsVampire)) { TerrainInteraction instance = new Terrain.TeleportMeHere.Definition(false).CreateInstance(Terrain.Singleton, sim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true) as TerrainInteraction; Mailbox mailboxOnHomeLot = Mailbox.GetMailboxOnHomeLot(sim); if (mailboxOnHomeLot != null) { Vector3 vector2; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(mailboxOnHomeLot.Position); fglParams.BooleanConstraints |= FindGoodLocationBooleans.StayInRoom; fglParams.InitialSearchDirection = RandomUtil.GetInt(0x0, 0x7); if (GlobalFunctions.FindGoodLocation(sim, fglParams, out instance.Destination, out vector2)) { success = sim.InteractionQueue.Add(instance); } } } if (!success) { Phone phone = sim.Inventory.Find<Phone>(); if (phone != null) { success = sim.InteractionQueue.Add(Phone.TeleportHome.Singleton.CreateInstance(phone, sim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true)); } } } if (!success) { if ((sim.LotHome == sim.LotCurrent) && (!sim.IsInPublicResidentialRoom) && (sim.InteractionQueue.Count > 0) && (Common.AssemblyCheck.IsInstalled("NRaasGoHere"))) { sim.InteractionQueue.Add(GoHome.Singleton.CreateInstance(sim.LotHome, sim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true)); } else { Skewer.Instance.mHudModel.PushGoHome(); } } } catch (Exception exception) { Common.Exception("OnGoHome", exception); } }
public override bool Run() { try { Definition interactionDefinition = InteractionDefinition as Definition; if (interactionDefinition == null) { return(false); } if (Autonomous && (interactionDefinition.mUsageType == BusinessPlanning.None)) { interactionDefinition.mUsageType = (BusinessPlanning)RandomUtil.GetInt(0, 1); } IInteractionNameCanBeOverriden overriden = this; if (overriden != null) { overriden.SetInteractionName(interactionDefinition.GetAutonomousInteractionName()); UpdateCaption = true; } if (this.mRunFromInventory && Actor.Inventory.Contains(Target)) { Vector3 vector; Vector3 vector2; FindGoodLocationBooleans constraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(Actor.Position, constraints); if (!GlobalFunctions.FindGoodLocation(Target, fglParams, out vector, out vector2)) { return(false); } Actor.Inventory.TryToRemove(Target); Target.SetPosition(vector); Target.SetForward(vector2); Target.AddToWorld(); Target.SetOpacity(0f, 0f); } if (!Target.Line.WaitForTurn(this, SimQueue.WaitBehavior.Default, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), AcademicBusinessPlanner.kTimeToWaitInLine)) { Actor.Inventory.TryToAdd(Target); return(false); } if (!Actor.RouteToSlotAndCheckInUse(Target, Slot.RoutingSlot_0)) { Actor.Inventory.TryToAdd(Target); return(false); } StandardEntry(); Target.EnableFootprintAndPushSims(AcademicBusinessPlanner.sFootprintHash, Actor); if (this.mRunFromInventory) { Actor.PlaySoloAnimation("a2o_object_genericSwipe_x", true); Target.SetOpacityTransition(0f, 1f, 1f); } AcquireStateMachine("BusinessPlanner"); SetActor("x", Actor); SetActor("planner", Target); List <AcademicDegreeNames> namesNeeded = new List <AcademicDegreeNames>(); namesNeeded.Add(AcademicDegreeNames.Business); BeginCommodityUpdatesAccountingForAcademicPerformance(namesNeeded); Target.mCurrentBusinessPlanningType = interactionDefinition.mUsageType; mCurrentStateMachine.EnterState("x", "Enter"); if (!Target.PlannerIsOpen) { AnimateSim("Open"); Target.PlannerIsOpen = true; } float kXPIncreasePerWorking = 0f; ReactionBroadcaster broadcaster = null; if (interactionDefinition.mUsageType == BusinessPlanning.WorkOnBusinessPlan) { AnimateSim("Work"); this.mWaitTime = RandomUtil.GetFloat(kMinWorkLength, kMaxWorkLength); kXPIncreasePerWorking = AcademicBusinessPlanner.UseBusinessPlanner.kXPIncreasePerWorking; } else { AnimateSim("Practice"); this.mWaitTime = RandomUtil.GetFloat(kMinPresentationLength, kMaxPresentationLength); kXPIncreasePerWorking = kXPIncreasePerPresentation; broadcaster = new ReactionBroadcaster(Target, kPresentationBroadcastParams, new ReactionBroadcaster.BroadcastCallback(this.BroadcastCallback)); } DoTimedLoop(this.mWaitTime, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached)); bool flag2 = false; foreach (InteractionInstance instance in Actor.InteractionQueue.InteractionList) { if ((instance != this) && (instance is AcademicBusinessPlanner.UseBusinessPlanner)) { flag2 = true; break; } } if (!flag2 && Target.PlannerIsOpen) { AnimateSim("Close"); Target.PlannerIsOpen = false; } AnimateSim("Exit"); Target.DisableFootprint(AcademicBusinessPlanner.sFootprintHash); EndCommodityUpdates(true); StandardExit(); if (!Actor.HasExitReason(ExitReason.Canceled)) { if (interactionDefinition.mUsageType == BusinessPlanning.PresentBusinessPlan) { EventTracker.SendEvent(EventTypeId.kPresentedBusinessPlan, Actor, Target.LotCurrent); } else if (interactionDefinition.mUsageType == BusinessPlanning.WorkOnBusinessPlan) { EventTracker.SendEvent(EventTypeId.kWorkedOnBusinessPlan, Actor, Target.LotCurrent); } } if (broadcaster != null) { broadcaster.EndBroadcast(); broadcaster.Dispose(); broadcaster = null; } // Custom, removed IsUniversityWorld() check Business occupationAsCareer = Actor.OccupationAsCareer as Business; if (occupationAsCareer != null) { occupationAsCareer.UpdatePerformanceOrExperience(kXPIncreasePerWorking); } AcademicCareer occupationAsAcademicCareer = Actor.OccupationAsAcademicCareer; if (((occupationAsAcademicCareer != null) && (occupationAsAcademicCareer.DegreeInformation != null)) && (occupationAsAcademicCareer.DegreeInformation.AcademicDegreeName == AcademicDegreeNames.Business)) { occupationAsAcademicCareer.UpdatePerformanceOrExperience(kXPIncreasePerWorking); } if (!Target.PlannerIsOpen) { Actor.WaitForExitReason(2f, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached)); if (!Actor.Inventory.Contains(Target)) { Actor.PlaySoloAnimation("a2o_object_genericSwipe_x", true); Actor.Inventory.TryToAdd(Target); } } return(true); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
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) || !SimEx.IsPointInLotSafelyRoutable(Actor, Target, Actor.Position))) { Actor.AttemptToPutInSafeLocation(true); } } Sim destObj = null; float negativeInfinity = float.NegativeInfinity; foreach (Sim sim2 in Actor.Household.Sims) { if ((sim2.IsHuman && sim2.IsAtHome) && !sim2.IsSleeping) { Relationship relationship = Relationship.Get(Actor, sim2, false); if ((relationship != null) && (relationship.LTR.Liking > negativeInfinity)) { destObj = sim2; negativeInfinity = relationship.LTR.Liking; } } } if (destObj != null) { Actor.RouteToDynamicObjectRadius(destObj, kRouteToHighRelSimRange[0x0], kRouteToHighRelSimRange[0x1], null, new Route.RouteOption[] { Route.RouteOption.DoLineOfSightCheckUserOverride }); } string instanceName = null; switch (Actor.SimDescription.Species) { case CASAgeGenderFlags.Dog: instanceName = "dogPregnantJig"; break; case CASAgeGenderFlags.LittleDog: instanceName = "smallDogPregnantJig"; break; case CASAgeGenderFlags.Horse: instanceName = "horsePregnantJig"; break; case CASAgeGenderFlags.Cat: instanceName = "catPregnantJig"; break; } if (instanceName != null) { mPetPregnancyJig = GlobalFunctions.CreateObjectOutOfWorld(instanceName, ProductVersion.EP5) as SocialJigOnePerson; if (mPetPregnancyJig != null) { mPetPregnancyJig.RegisterParticipants(Actor, null); Vector3 position = Actor.Position; Vector3 forwardVector = Actor.ForwardVector; if (GlobalFunctions.FindGoodLocationNearby(mPetPregnancyJig, ref position, ref forwardVector)) { mPetPregnancyJig.SetPosition(position); mPetPregnancyJig.SetForward(forwardVector); mPetPregnancyJig.AddToWorld(); Route r = mPetPregnancyJig.RouteToJigA(Actor); if (!Actor.DoRoute(r)) { mPetPregnancyJig.Destroy(); mPetPregnancyJig = null; } } else { mPetPregnancyJig.Destroy(); mPetPregnancyJig = null; } } } StandardEntry(); BeginCommodityUpdates(); EnterStateMachine("GiveBirth", "Enter", "x"); AnimateSim("LieDown"); if (Actor.IsSelectable) { try { Sims3.Gameplay.Gameflow.Singleton.DisableSave(this, "Gameplay/ActorSystems/PetPregnancy:DisableSave"); // Custom HaveBabyHomeEx.EnsureForeignFather(Actor.SimDescription.Pregnancy); mOffspring = new Proxies.PetPregnancyProxy(Actor.SimDescription.Pregnancy).CreateNewborns(0f, true, true); int num2 = 0x0; foreach (Sim sim3 in mOffspring) { sim3.SimDescription.IsNeverSelectable = true; if (mPetPregnancyJig != null) { Slot slotName = kPregnancyJigContainmentSlots[num2++]; sim3.SetPosition(mPetPregnancyJig.GetPositionOfSlot(slotName)); sim3.SetForward(mPetPregnancyJig.GetForwardOfSlot(slotName)); InteractionInstance entry = Pregnancy.BabyPetLieDown.Singleton.CreateInstance(sim3, sim3, new InteractionPriority(InteractionPriorityLevel.Autonomous), true, true); entry.Hidden = true; sim3.InteractionQueue.AddNext(entry); } else { World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(Actor.Position); fglParams.RequiredRoomID = Actor.RoomId; if ((!GlobalFunctions.PlaceAtGoodLocation(sim3, fglParams, false) || !sim3.IsPointInLotSafelyRoutable(sim3.LotCurrent, sim3.Position)) && !sim3.AttemptToPutInSafeLocation(true)) { sim3.SetPosition(Actor.Position); } } } } finally { Sims3.Gameplay.Gameflow.Singleton.EnableSave(this); } } // Custom call bool flag = DoLoop(ExitReason.Finished, GiveBirthLoopFunc, mCurrentStateMachine); AnimateSim("Exit"); StandardExit(); return flag; } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return false; } }
protected static void ResetStuckSim(Sim sim, Vector3 destination, string suffix, bool deep = false) { if (sim != null && !sim.HasBeenDestroyed && sim.SimDescription != null) { //Alive.WriteLog("sim_is_stuck:reset_sim_in_progress:sim:"+sim.Name+";destination:"+destination); Lot lot = null; if (sim.SimDescription.IsBonehilda) { lot = BonehildaCoffin.FindBonehildaCoffin(sim)?.LotCurrent; if (lot == null) { lot = sim.LotHome; } } else { lot = sim.LotHome; } if (lot == null) { lot = sim.VirtualLotHome; } if (lot == null) { lot = Sim.ActiveActor?.LotHome; } bool addToWorld = (true); Vector3 resetRawDest = destination; StuckSims.TryGetValue(sim.SimDescription.SimDescriptionId, out StuckSimData stuckSim); if (stuckSim != null) { //------------------------- if (stuckSim.Detections <= 2) { Daycare daycare; if ((sim.Household == null || (!sim.Household.InWorld && !sim.Household.IsSpecialHousehold)) && (!Passport.IsHostedPassportSim(sim) && sim.SimDescription.AssignedRole == null) && (LunarCycleManager.sFullMoonZombies == null || !LunarCycleManager.sFullMoonZombies.Contains(sim.SimDescription)) && ((daycare = sim.SimDescription.Occupation as Daycare) == null || !daycare.IsDaycareChild(sim.SimDescription)) && !sim.SimDescription.IsBonehilda && sim.Service == null) { addToWorld = (false); } if (destination != Vector3.Invalid) { goto DestSet; } } //------------------------- if (stuckSim.Detections <= 3) { if (lot == null) { lot = RandomUtil.GetRandomObjectFromList(Sims3.Gameplay.Queries.GetObjects <Lot>()); } if (lot != null) { resetRawDest = lot.EntryPoint(); goto DestSet; } } //------------------------- if (stuckSim.Detections <= 4) { if (lot == null) { lot = RandomUtil.GetRandomObjectFromList(Sims3.Gameplay.Queries.GetObjects <Lot>()); } if (lot != null) { Mailbox mailbox = lot.FindMailbox(); if (mailbox != null) { resetRawDest = mailbox.Position; goto DestSet; } } } //------------------------- if (stuckSim.Detections <= 5 || sim.SimDescription.IsBonehilda) { if (lot == null) { lot = RandomUtil.GetRandomObjectFromList(Sims3.Gameplay.Queries.GetObjects <Lot>()); } if (lot != null) { Door frontDoor = lot.FindFrontDoor(); if (frontDoor != null) { int roomId = frontDoor.GetRoomIdOfDoorSide(CommonDoor.tSide.Front); if (roomId != 0) { roomId = frontDoor.GetRoomIdOfDoorSide(CommonDoor.tSide.Back); } if (roomId == 0) { List <GameObject> objects = lot.GetObjectsInRoom <GameObject>(roomId); if (objects.Count > 0) { resetRawDest = RandomUtil.GetRandomObjectFromList(objects).Position; goto DestSet; } } } } } //------------------------- if (stuckSim.Detections <= 6) { lot = RandomUtil.GetRandomObjectFromList(Sims3.Gameplay.Queries.GetObjects <Lot>()); if (lot != null) { resetRawDest = lot.EntryPoint(); goto DestSet; } } //------------------------- if (stuckSim.Detections <= 7) { lot = RandomUtil.GetRandomObjectFromList(Sims3.Gameplay.Queries.GetObjects <Lot>()); if (lot != null) { Mailbox mailbox = lot.FindMailbox(); if (mailbox != null) { resetRawDest = mailbox.Position; goto DestSet; } } } //------------------------- if (stuckSim.Detections <= 8) { lot = RandomUtil.GetRandomObjectFromList(Sims3.Gameplay.Queries.GetObjects <Lot>()); if (lot != null) { Door frontDoor = lot.FindFrontDoor(); if (frontDoor != null) { int roomId = frontDoor.GetRoomIdOfDoorSide(CommonDoor.tSide.Front); if (roomId != 0) { roomId = frontDoor.GetRoomIdOfDoorSide(CommonDoor.tSide.Back); } if (roomId == 0) { List <GameObject> objects = lot.GetObjectsInRoom <GameObject>(roomId); if (objects.Count > 0) { resetRawDest = RandomUtil.GetRandomObjectFromList(objects).Position; goto DestSet; } } } } } //------------------------- if (stuckSim.Detections <= 9) { resetRawDest = Sim.ActiveActor.Position; stuckSim.Detections = (1); goto DestSet; } //------------------------- DestSet : {} } Vector3 resetValidatedDest; Vector3 forward = sim.ForwardVector; if (sim.SimDescription.IsHorse) { FindGoodLocationBooleans fglBooleans = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles | FindGoodLocationBooleans.AllowOnSlopes | //FindGoodLocationBooleans.AllowIntersectionWithPlatformWalls| //FindGoodLocationBooleans.AllowInFrontOfDoors | //FindGoodLocationBooleans.AllowOnStairTopAndBottomTiles| FindGoodLocationBooleans.AllowOffLot | FindGoodLocationBooleans.AllowOnStreets | FindGoodLocationBooleans.AllowOnBridges | FindGoodLocationBooleans.AllowOnSideWalks; if (stuckSim != null) { if (stuckSim.Detections <= 5) { if (!GlobalFunctions.FindGoodLocationNearbyOnLevel(sim, sim.Level, ref resetRawDest, ref forward, fglBooleans)) { GlobalFunctions.FindGoodLocationNearbyOnLevel(sim, sim.Level, ref resetRawDest, ref forward, FindGoodLocationBooleans.None); } } } World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(resetRawDest); fglParams.BooleanConstraints = fglBooleans; if (!GlobalFunctions.FindGoodLocation(sim, fglParams, out resetValidatedDest, out forward)) { fglParams.BooleanConstraints = FindGoodLocationBooleans.None; GlobalFunctions.FindGoodLocation(sim, fglParams, out resetValidatedDest, out forward); } } else { World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(resetRawDest); fglParams.BooleanConstraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles | FindGoodLocationBooleans.AllowOnSlopes | FindGoodLocationBooleans.AllowIntersectionWithPlatformWalls | FindGoodLocationBooleans.AllowInFrontOfDoors | FindGoodLocationBooleans.AllowOnStairTopAndBottomTiles | FindGoodLocationBooleans.AllowOffLot | FindGoodLocationBooleans.AllowOnStreets | FindGoodLocationBooleans.AllowOnBridges | FindGoodLocationBooleans.AllowOnSideWalks; if (!GlobalFunctions.FindGoodLocation(sim, fglParams, out resetValidatedDest, out forward)) { fglParams.BooleanConstraints = FindGoodLocationBooleans.None; GlobalFunctions.FindGoodLocation(sim, fglParams, out resetValidatedDest, out forward); } } if (!deep) { if (sim.InteractionQueue != null && sim.InteractionQueue.mInteractionList != null) { InteractionInstance currentInteraction; if ((currentInteraction = sim.InteractionQueue.GetCurrentInteraction()) != null) { // sim.InteractionQueue.CancelInteraction(currentInteraction.Id, ExitReason.CanceledByScript); } } } sim.SetPosition(resetValidatedDest); sim.SetForward(forward); sim.RemoveFromWorld(); if (addToWorld || deep) { if (!deep) { try{ sim.Posture?.CancelPosture(sim); }catch (Exception exception) { Alive.WriteLog(exception.Message + "\n\n" + exception.StackTrace + "\n\n" + exception.Source); } } sim.AddToWorld(); sim.SetHiddenFlags(HiddenFlags.Nothing); sim.SetOpacity(1f, 0f); } else { sim.SetHiddenFlags(HiddenFlags.Everything); sim.SetOpacity(0f, 0f); } sim.SimRoutingComponent?.ForceUpdateDynamicFootprint(); if (stuckSim != null) { stuckSim.Resetting = (false); // Pode detectar novos eventos Stuck } } }
// Token: 0x06009AEB RID: 39659 RVA: 0x00350290 File Offset: 0x0034E490 public override bool Run() { try { /* * this.mSituation = (ServiceSituation.FindServiceSituationInvolving(this.Actor) as GrimReaperSituation); * //this.mSituation.AddRelationshipWithEverySimInHousehold(); * this.Actor.SetPosition(this.mSituation.Lot.Position); * this.mSituation.ScaredReactionBroadcaster = new ReactionBroadcaster(this.Actor, GrimReaperSituation.ScaredParams, new ReactionBroadcaster.BroadcastCallback(GrimReaperSituation.ScaredDelegate)); * try * { * Sim sim = Target; * if (sim != null) * { * Matrix44 transform = sim.Transform; * Matrix44 invalid = Matrix44.Invalid; * Vector3 position = Actor.Position; * float num = (this.Actor.Position - sim.Position).LengthSqr(); * if (num < 0.25f || num > 4f) * { * double @double = RandomUtil.GetDouble(6.2831853071795862); * position = sim.Position + new Vector3((float)Math.Sin(@double), 0f, (float)Math.Cos(@double)); * } * this.Actor.SetForward(sim.PositionOnFloor - this.Actor.PositionOnFloor); * this.Actor.SetForward(new Vector3(this.Actor.ForwardVector.x, 0f, this.Actor.ForwardVector.z)); * SimDescription.DeathType deathStyle = sim.SimDescription.DeathStyle; * } * } * catch (Exception exception) * { * NiecException.PrintMessage("1a" + exception.Message + NiecException.NewLine + exception.StackTrace); * } * * this.Actor.GreetSimOnLot(this.mSituation.Worker.LotCurrent); * try * { * this.mSituation.SMCDeath = StateMachineClient.Acquire(this.Actor, "Death"); * this.mSituation.SMCDeath.SetActor("x", this.Actor); * this.mSituation.SMCDeath.EnterState("x", "Enter"); * this.mSituation.SMCDeath.AddOneShotScriptEventHandler(666u, new SacsEventHandler(this.EventCallbackFadeInReaper)); * this.mSituation.StartGrimReaperSmoke(); * this.mSituation.SMCDeath.RequestState("x", "Float"); * this.Actor.Posture = new SimCarryingObjectPosture(this.Actor, null); * this.mWasMemberOfActiveHousehold = (this.Target.Household == Household.ActiveHousehold); * if (this.Target.DeathReactionBroadcast == null) * { * Urnstone.CreateDeathReactionBroadcaster(this.Target); * } * } * catch (Exception exception) * { * NiecException.PrintMessage("2" + exception.Message + NiecException.NewLine + exception.StackTrace); * } * try * { * this.Actor.SynchronizationLevel = Sim.SyncLevel.NotStarted; * this.Target.SynchronizationLevel = Sim.SyncLevel.NotStarted; * this.mDeadSimsHousehold = this.Target.Household; * this.mSMCDeath = this.mSituation.SMCDeath; * ThoughtBalloonManager.BalloonData balloonData = new ThoughtBalloonManager.DoubleBalloonData("moodlet_mourning", this.Target.GetThoughtBalloonThumbnailKey()); * balloonData.BalloonType = ThoughtBalloonTypes.kSpeechBalloon; * balloonData.mPriority = ThoughtBalloonPriority.High; * this.Actor.ThoughtBalloonManager.ShowBalloon(balloonData); * } * catch (Exception exception) * { * NiecException.PrintMessage("3" + exception.Message + NiecException.NewLine + exception.StackTrace); * } * try * { * var killSim = this.Target.CurrentInteraction as ExtKillSimNiec; * if (killSim != null) * { * killSim.StartDeathEffect(); * } * Audio.StartSound("sting_death", this.Actor.Position); * this.mSMCDeath.RequestState("x", "take_sim"); * this.mSMCDeath.RequestState("x", "Exit"); * this.Target.FadeOut(); * this.FinalizeDeath(); * this.GrimReaperPostSequenceCleanup(); * this.Target.StartOneShotFunction(new Sims3.Gameplay.Function(this.ReapSoulCallback), GameObject.OneShotFunctionDisposeFlag.OnDispose); * } * catch (Exception exception) * { * NiecException.PrintMessage("4" + exception.Message + NiecException.NewLine + exception.StackTrace); * } * return true; */ //var grimReaperSituation = ServiceSituation.FindServiceSituationInvolving as ; //grimReaperSituation.AddRelationshipWithEverySimInHousehold(); //grimReaperSituation.ScaredReactionBroadcaster = new ReactionBroadcaster(this.Actor, GrimReaperSituation.ScaredParams, new ReactionBroadcaster.BroadcastCallback(GrimReaperSituation.ScaredDelegate)); this.Actor.SetPosition(Actor.Position); SimDescription.DeathType deathType = SimDescription.DeathType.Drown; try { Sim sim = FindClosestDeadSim(); if (sim != null) { Vector3 position = Vector3.Invalid; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(sim.Position); Vector3 vector; if (!GlobalFunctions.FindGoodLocation(this.Actor, fglParams, out position, out vector)) { position = fglParams.StartPosition; } this.Actor.SetPosition(position); this.Actor.RouteTurnToFace(sim.Position); deathType = sim.SimDescription.DeathStyle; } } catch (Exception exception) { NiecException.PrintMessage("SAE" + exception.Message + NiecException.NewLine + exception.StackTrace); } //this.Actor.GreetSimOnLot(grimReaperSituation.Worker.LotCurrent); SMCDeath = StateMachineClient.Acquire(this.Actor, "DeathSequence"); SMCDeath.SetActor("x", this.Actor); SMCDeath.EnterState("x", "Enter"); Urnstone.FogEffectTurnAllOn(Actor.LotCurrent); VisualEffect visualEffect = Urnstone.ReaperApperEffect(this.Actor, deathType); visualEffect.Start(); //grimReaperSituation.StartGrimReaperSmoke(); VisualEffect.FireOneShotEffect("reaperSmokeConstant", Actor, Sim.FXJoints.Pelvis, VisualEffect.TransitionType.HardTransition); SMCDeath.AddOneShotScriptEventHandler(666u, new SacsEventHandler(this.EventCallbackFadeInReaper)); SMCDeath.RequestState("x", "ReaperBrushingHimself"); visualEffect.Stop(); ReaperLoop = new ObjectSound(this.Actor.ObjectId, "death_reaper_lp"); ReaperLoop.Start(true); this.Actor.Posture = new SimCarryingObjectPosture(this.Actor, null); return(true); } catch (Exception exception) { NiecException.PrintMessage("ASF" + exception.Message + NiecException.NewLine + exception.StackTrace); return(true); } }
protected bool Test(Sim sim, List <InteractionDefinition> interactions) { if (InteractionsEx.HasInteraction <ICountsAsWorking>(sim)) { IncStat("At Work"); return(false); } else if (Situations.HasInteraction(sim, interactions, true)) { IncStat("At Work"); return(false); } else { if (Situations.DebuggingLevel >= Common.DebugLevel.High) { if (sim.InteractionQueue == null) { IncStat("Interaction Queue = null"); } else { if (sim.InteractionQueue.Count == 0) { IncStat("Interaction Queue empty"); } else { foreach (InteractionInstance instance2 in sim.InteractionQueue.InteractionList) { IncStat("Interaction: " + instance2.ToString()); } } } } VisitSituation.AnnounceTimeToGoToWork(sim); if (SimTypes.IsSpecial(Sim)) { IncStat("Special Pushed to Work"); } else { IncStat("Pushed to Work"); } try { // Don't queue stomp on their birthday if (sim.SimDescription.YearsSinceLastAgeTransition != 0) { sim.InteractionQueue.CancelAllInteractions(); IncStat("Queue Stomped"); if ((!SimTypes.IsSelectable(sim.SimDescription)) && (sim.LotCurrent != null) && (sim.LotCurrent.CanSimTreatAsHome(sim))) { Callbox callbox = sim.LotHome.FindCallbox(); if (callbox != null) { Vector3 fwd = Vector3.Invalid; Vector3 pos = Vector3.Invalid; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(callbox.Position); fglParams.BooleanConstraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles; if (GlobalFunctions.FindGoodLocation(sim, fglParams, out pos, out fwd)) { sim.ResetBindPoseWithRotation(); sim.SetPosition(pos); sim.SetForward(fwd); sim.RemoveFromWorld(); sim.AddToWorld(); sim.SetHiddenFlags(HiddenFlags.Nothing); sim.SetOpacity(1f, 0f); IncStat("Bounce to Mailbox"); } } } } } catch (Exception e) { Common.DebugException(sim, e); IncStat("Cancel Fail"); } sim.InteractionQueue.RemoveGoHomeInteractions(true); return(true); } }
public override bool Run() { Common.StringBuilder msg = new Common.StringBuilder("Tantraport:Run"); try { SimDescription choice = GetChoices(Actor, Common.Localize("Tantraport:MenuName", Target.IsFemale)); if (choice == null) { return(false); } TerrainInteraction instance = Terrain.TeleportMeHere.Singleton.CreateInstance(Terrain.Singleton, Target, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true) as TerrainInteraction; Vector3 frontDoorPosition = Vector3.Invalid; Door frontDoor = choice.CreatedSim.LotCurrent.FindFrontDoor(); if (frontDoor != null) { frontDoorPosition = frontDoor.Position; msg += "A"; } Lot lot = choice.CreatedSim.LotCurrent; Vector3[] vectorArray = new Vector3[] { choice.CreatedSim.Position, frontDoorPosition, lot.Position, (lot.Corners[Corner.Origin] + lot.Corners[Corner.XAxis]) / 2f, (lot.Corners[Corner.XAxis] + lot.Corners[Corner.Extent]) / 2f, (lot.Corners[Corner.YAxis] + lot.Corners[Corner.Extent]) / 2f, (lot.Corners[Corner.Origin] + lot.Corners[Corner.YAxis]) / 2f }; for (int i = 0x0; i < vectorArray.Length; i++) { if (vectorArray[i] == Vector3.Invalid) { continue; } Vector3 forward; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(vectorArray[i]); if (GlobalFunctions.FindGoodLocation(Target, fglParams, out instance.Destination, out forward)) { msg += "B"; Target.InteractionQueue.PushAsContinuation(instance, true); return(true); } } return(true); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, msg, e); return(false); } finally { Common.DebugNotify(msg); } }
public override bool Run() { try { if (!Actor.Inventory.Contains(Target)) { if (!Actor.RouteToObjectRadiusAndCheckInUse(Target, 0.7f)) { return false; } StandardEntry(); BeginCommodityUpdates(); Actor.PlaySoloAnimation("a2o_object_genericSwipe_x", true); if (!Actor.Inventory.TryToAdd(Target)) { EndCommodityUpdates(false); StandardExit(); return false; } } else { StandardEntry(); BeginCommodityUpdates(); } SocialJigTwoPerson person = GlobalFunctions.CreateObjectOutOfWorld(SocialJig.SocialJigMedatorNames.SocialJigTwoPerson.ToString()) as SocialJigTwoPerson; person.RegisterParticipants(Actor, null); Sim createdSim = null; try { World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(Actor.Position); fglParams.BooleanConstraints |= FindGoodLocationBooleans.Routable; if (GlobalFunctions.PlaceAtGoodLocation(person, fglParams, true)) { Route r = Actor.CreateRoute(); r.PlanToSlot(person, person.GetSlotForActor(Actor, true)); r.DoRouteFail = true; if (Actor.DoRoute(r)) { bool paramValue = false; mSummonGenieBroadcast = new ReactionBroadcaster(Actor, kSummonGenieBroadcastParams, SummonGenieBroadcastCallback); Sims3.Gameplay.Gameflow.SetGameSpeed(Sims3.Gameplay.Gameflow.GameSpeed.Normal, Sims3.Gameplay.Gameflow.SetGameSpeedContext.Gameplay); if (Target.mGenieDescription == null) { Target.mGenieDescription = OccultGenie.CreateGenie(Actor, Target); createdSim = Target.mGenieDescription.CreatedSim; EventTracker.SendEvent(EventTypeId.kCleanLamp, Actor, Target); paramValue = true; } else { createdSim = Target.mGenieDescription.Instantiate(Vector3.OutOfWorld, false); OccultGenie occultType = null; DateAndTime previousDateAndTime = SimClock.CurrentTime(); do { SpeedTrap.Sleep(0xa); occultType = createdSim.OccultManager.GetOccultType(OccultTypes.None | OccultTypes.Genie) as OccultGenie; } while ((occultType == null) && (SimClock.ElapsedTime(TimeUnit.Minutes, previousDateAndTime) < 120f)); if (occultType != null) { occultType.SetGenieLampRelations(Actor, createdSim, Target); } else { createdSim.Destroy(); createdSim = null; } } if (createdSim != null) { createdSim.FadeOut(false, false, 0f); createdSim.GreetSimOnLot(Actor.LotCurrent); createdSim.AddToWorld(); Slot slotForActor = person.GetSlotForActor(createdSim, false); createdSim.SetPosition(person.GetSlotPosition(slotForActor)); createdSim.SetForward(person.GetForwardOfSlot(slotForActor)); IGameObject actor = GlobalFunctions.CreateObject("GenieLamp", ProductVersion.EP6, Vector3.OutOfWorld, 0x0, Vector3.UnitZ, null, null); if (!actor.IsActorUsingMe(Actor)) { actor.AddToUseList(Actor); } EnterStateMachine("GenieLampSummon", "Enter", "x"); SetActor("lamp", actor); SetParameter("isFirstTime", paramValue); AnimateSim("Exit"); actor.Destroy(); createdSim.FadeIn(); VisualEffect effect = VisualEffect.Create("ep6GenieAppearSmoke_main"); effect.SetPosAndOrient(createdSim.Position, Vector3.UnitX, Vector3.UnitZ); effect.SubmitOneShotEffect(VisualEffect.TransitionType.SoftTransition); OpportunityManager opportunityManager = Actor.OpportunityManager; if ((opportunityManager != null) && opportunityManager.HasOpportunity(OpportunityNames.EP6_ReleaseGenie_SummonGenie)) { OccultGenie genie2 = createdSim.OccultManager.GetOccultType(OccultTypes.Genie) as OccultGenie; if (genie2 == null) { createdSim.Destroy(); createdSim = null; } else { OccultGenieEx.OnFreedFromLamp(genie2, Actor, createdSim, true); if (opportunityManager.GetLastOpportunity(OpportunityCategory.Special) == OpportunityNames.EP6_ReleaseGenie_SummonGenie) { opportunityManager.ClearLastOpportunity(OpportunityCategory.Special); } EventTracker.SendEvent(EventTypeId.kGrantedWishToFreeGenie, Actor, Target); if (Target.InInventory) { Actor.Inventory.RemoveByForce(Target); if (Target.IsOnHandTool) { Target.RemoveFromWorld(); } } else { Target.RemoveFromWorld(); } EnterStateMachine("FreeTheGenie", "Enter", "x"); SetActor("x", createdSim); AnimateSim("Exit"); } } else { Target.mGenieSocializingEvent = EventTracker.AddListener(EventTypeId.kSocialInteraction, OnSocialization); Target.CheckGenieReturnToLamp = createdSim.AddAlarmRepeating(1f, TimeUnit.Minutes, Target.CheckGenieReturnToLampCallback, "Genie Check to return to lamp", AlarmType.AlwaysPersisted); Target.mTimeSinceLastSocialWithGenie = SimClock.CurrentTime(); } } } } } finally { person.Destroy(); } EndCommodityUpdates(true); StandardExit(createdSim == null, createdSim == null); return true; } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return false; } }
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) || !SimEx.IsPointInLotSafelyRoutable(Actor, Target, Actor.Position))) { Actor.AttemptToPutInSafeLocation(true); } } Sim destObj = null; float negativeInfinity = float.NegativeInfinity; foreach (Sim sim2 in Actor.Household.Sims) { if ((sim2.IsHuman && sim2.IsAtHome) && !sim2.IsSleeping) { Relationship relationship = Relationship.Get(Actor, sim2, false); if ((relationship != null) && (relationship.LTR.Liking > negativeInfinity)) { destObj = sim2; negativeInfinity = relationship.LTR.Liking; } } } if (destObj != null) { Actor.RouteToDynamicObjectRadius(destObj, kRouteToHighRelSimRange[0x0], kRouteToHighRelSimRange[0x1], null, new Route.RouteOption[] { Route.RouteOption.DoLineOfSightCheckUserOverride }); } string instanceName = null; switch (Actor.SimDescription.Species) { case CASAgeGenderFlags.Dog: instanceName = "dogPregnantJig"; break; case CASAgeGenderFlags.LittleDog: instanceName = "smallDogPregnantJig"; break; case CASAgeGenderFlags.Horse: instanceName = "horsePregnantJig"; break; case CASAgeGenderFlags.Cat: instanceName = "catPregnantJig"; break; } if (instanceName != null) { mPetPregnancyJig = GlobalFunctions.CreateObjectOutOfWorld(instanceName, ProductVersion.EP5) as SocialJigOnePerson; if (mPetPregnancyJig != null) { mPetPregnancyJig.RegisterParticipants(Actor, null); Vector3 position = Actor.Position; Vector3 forwardVector = Actor.ForwardVector; if (GlobalFunctions.FindGoodLocationNearby(mPetPregnancyJig, ref position, ref forwardVector)) { mPetPregnancyJig.SetPosition(position); mPetPregnancyJig.SetForward(forwardVector); mPetPregnancyJig.AddToWorld(); Route r = mPetPregnancyJig.RouteToJigA(Actor); if (!Actor.DoRoute(r)) { mPetPregnancyJig.Destroy(); mPetPregnancyJig = null; } } else { mPetPregnancyJig.Destroy(); mPetPregnancyJig = null; } } } StandardEntry(); BeginCommodityUpdates(); EnterStateMachine("GiveBirth", "Enter", "x"); AnimateSim("LieDown"); if (Actor.IsSelectable) { try { Sims3.Gameplay.Gameflow.Singleton.DisableSave(this, "Gameplay/ActorSystems/PetPregnancy:DisableSave"); // Custom HaveBabyHomeEx.EnsureForeignFather(Actor.SimDescription.Pregnancy); mOffspring = new Proxies.PetPregnancyProxy(Actor.SimDescription.Pregnancy).CreateNewborns(0f, true, true); int num2 = 0x0; foreach (Sim sim3 in mOffspring) { sim3.SimDescription.IsNeverSelectable = true; if (mPetPregnancyJig != null) { Slot slotName = kPregnancyJigContainmentSlots[num2++]; sim3.SetPosition(mPetPregnancyJig.GetPositionOfSlot(slotName)); sim3.SetForward(mPetPregnancyJig.GetForwardOfSlot(slotName)); InteractionInstance entry = Pregnancy.BabyPetLieDown.Singleton.CreateInstance(sim3, sim3, new InteractionPriority(InteractionPriorityLevel.Autonomous), true, true); entry.Hidden = true; sim3.InteractionQueue.AddNext(entry); } else { World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(Actor.Position); fglParams.RequiredRoomID = Actor.RoomId; if ((!GlobalFunctions.PlaceAtGoodLocation(sim3, fglParams, false) || !sim3.IsPointInLotSafelyRoutable(sim3.LotCurrent, sim3.Position)) && !sim3.AttemptToPutInSafeLocation(true)) { sim3.SetPosition(Actor.Position); } } } } finally { Sims3.Gameplay.Gameflow.Singleton.EnableSave(this); } } // Custom call bool flag = DoLoop(ExitReason.Finished, GiveBirthLoopFunc, mCurrentStateMachine); AnimateSim("Exit"); StandardExit(); return(flag); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
public override bool Run() { try { if (!Actor.Inventory.Contains(Target)) { if (!Actor.RouteToObjectRadiusAndCheckInUse(Target, 0.7f)) { return(false); } StandardEntry(); BeginCommodityUpdates(); Actor.PlaySoloAnimation("a2o_object_genericSwipe_x", true); if (!Actor.Inventory.TryToAdd(Target)) { EndCommodityUpdates(false); StandardExit(); return(false); } } else { StandardEntry(); BeginCommodityUpdates(); } SocialJigTwoPerson person = GlobalFunctions.CreateObjectOutOfWorld(SocialJig.SocialJigMedatorNames.SocialJigTwoPerson.ToString()) as SocialJigTwoPerson; person.RegisterParticipants(Actor, null); Sim createdSim = null; try { World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(Actor.Position); fglParams.BooleanConstraints |= FindGoodLocationBooleans.Routable; if (GlobalFunctions.PlaceAtGoodLocation(person, fglParams, true)) { Route r = Actor.CreateRoute(); r.PlanToSlot(person, person.GetSlotForActor(Actor, true)); r.DoRouteFail = true; if (Actor.DoRoute(r)) { bool paramValue = false; mSummonGenieBroadcast = new ReactionBroadcaster(Actor, kSummonGenieBroadcastParams, SummonGenieBroadcastCallback); Sims3.Gameplay.Gameflow.SetGameSpeed(Sims3.Gameplay.Gameflow.GameSpeed.Normal, Sims3.Gameplay.Gameflow.SetGameSpeedContext.Gameplay); if (Target.mGenieDescription == null) { Target.mGenieDescription = OccultGenie.CreateGenie(Actor, Target); createdSim = Target.mGenieDescription.CreatedSim; EventTracker.SendEvent(EventTypeId.kCleanLamp, Actor, Target); paramValue = true; } else { createdSim = Target.mGenieDescription.Instantiate(Vector3.OutOfWorld, false); OccultGenie occultType = null; DateAndTime previousDateAndTime = SimClock.CurrentTime(); do { SpeedTrap.Sleep(0xa); occultType = createdSim.OccultManager.GetOccultType(OccultTypes.None | OccultTypes.Genie) as OccultGenie; }while ((occultType == null) && (SimClock.ElapsedTime(TimeUnit.Minutes, previousDateAndTime) < 120f)); if (occultType != null) { occultType.SetGenieLampRelations(Actor, createdSim, Target); } else { createdSim.Destroy(); createdSim = null; } } if (createdSim != null) { createdSim.FadeOut(false, false, 0f); createdSim.GreetSimOnLot(Actor.LotCurrent); createdSim.AddToWorld(); Slot slotForActor = person.GetSlotForActor(createdSim, false); createdSim.SetPosition(person.GetSlotPosition(slotForActor)); createdSim.SetForward(person.GetForwardOfSlot(slotForActor)); IGameObject actor = GlobalFunctions.CreateObject("GenieLamp", ProductVersion.EP6, Vector3.OutOfWorld, 0x0, Vector3.UnitZ, null, null); if (!actor.IsActorUsingMe(Actor)) { actor.AddToUseList(Actor); } EnterStateMachine("GenieLampSummon", "Enter", "x"); SetActor("lamp", actor); SetParameter("isFirstTime", paramValue); AnimateSim("Exit"); actor.Destroy(); createdSim.FadeIn(); VisualEffect effect = VisualEffect.Create("ep6GenieAppearSmoke_main"); effect.SetPosAndOrient(createdSim.Position, Vector3.UnitX, Vector3.UnitZ); effect.SubmitOneShotEffect(VisualEffect.TransitionType.SoftTransition); OpportunityManager opportunityManager = Actor.OpportunityManager; if ((opportunityManager != null) && opportunityManager.HasOpportunity(OpportunityNames.EP6_ReleaseGenie_SummonGenie)) { OccultGenie genie2 = createdSim.OccultManager.GetOccultType(OccultTypes.Genie) as OccultGenie; if (genie2 == null) { createdSim.Destroy(); createdSim = null; } else { OccultGenieEx.OnFreedFromLamp(genie2, Actor, createdSim, true); if (opportunityManager.GetLastOpportunity(OpportunityCategory.Special) == OpportunityNames.EP6_ReleaseGenie_SummonGenie) { opportunityManager.ClearLastOpportunity(OpportunityCategory.Special); } EventTracker.SendEvent(EventTypeId.kGrantedWishToFreeGenie, Actor, Target); if (Target.InInventory) { Actor.Inventory.RemoveByForce(Target); if (Target.IsOnHandTool) { Target.RemoveFromWorld(); } } else { Target.RemoveFromWorld(); } EnterStateMachine("FreeTheGenie", "Enter", "x"); SetActor("x", createdSim); AnimateSim("Exit"); } } else { Target.mGenieSocializingEvent = EventTracker.AddListener(EventTypeId.kSocialInteraction, OnSocialization); Target.CheckGenieReturnToLamp = createdSim.AddAlarmRepeating(1f, TimeUnit.Minutes, Target.CheckGenieReturnToLampCallback, "Genie Check to return to lamp", AlarmType.AlwaysPersisted); Target.mTimeSinceLastSocialWithGenie = SimClock.CurrentTime(); } } } } } finally { person.Destroy(); } EndCommodityUpdates(true); StandardExit(createdSim == null, createdSim == null); return(true); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
public override bool Run() { try { Definition interactionDefinition = InteractionDefinition as Definition; if (interactionDefinition == null) { return false; } if (Autonomous && (interactionDefinition.mUsageType == BusinessPlanning.None)) { interactionDefinition.mUsageType = (BusinessPlanning)RandomUtil.GetInt(0, 1); } IInteractionNameCanBeOverriden overriden = this; if (overriden != null) { overriden.SetInteractionName(interactionDefinition.GetAutonomousInteractionName()); UpdateCaption = true; } if (this.mRunFromInventory && Actor.Inventory.Contains(Target)) { Vector3 vector; Vector3 vector2; FindGoodLocationBooleans constraints = FindGoodLocationBooleans.Routable | FindGoodLocationBooleans.PreferEmptyTiles; World.FindGoodLocationParams fglParams = new World.FindGoodLocationParams(Actor.Position, constraints); if (!GlobalFunctions.FindGoodLocation(Target, fglParams, out vector, out vector2)) { return false; } Actor.Inventory.TryToRemove(Target); Target.SetPosition(vector); Target.SetForward(vector2); Target.AddToWorld(); Target.SetOpacity(0f, 0f); } if (!Target.Line.WaitForTurn(this, SimQueue.WaitBehavior.Default, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), AcademicBusinessPlanner.kTimeToWaitInLine)) { Actor.Inventory.TryToAdd(Target); return false; } if (!Actor.RouteToSlotAndCheckInUse(Target, Slot.RoutingSlot_0)) { Actor.Inventory.TryToAdd(Target); return false; } StandardEntry(); Target.EnableFootprintAndPushSims(AcademicBusinessPlanner.sFootprintHash, Actor); if (this.mRunFromInventory) { Actor.PlaySoloAnimation("a2o_object_genericSwipe_x", true); Target.SetOpacityTransition(0f, 1f, 1f); } AcquireStateMachine("BusinessPlanner"); SetActor("x", Actor); SetActor("planner", Target); List<AcademicDegreeNames> namesNeeded = new List<AcademicDegreeNames>(); namesNeeded.Add(AcademicDegreeNames.Business); BeginCommodityUpdatesAccountingForAcademicPerformance(namesNeeded); Target.mCurrentBusinessPlanningType = interactionDefinition.mUsageType; mCurrentStateMachine.EnterState("x", "Enter"); if (!Target.PlannerIsOpen) { AnimateSim("Open"); Target.PlannerIsOpen = true; } float kXPIncreasePerWorking = 0f; ReactionBroadcaster broadcaster = null; if (interactionDefinition.mUsageType == BusinessPlanning.WorkOnBusinessPlan) { AnimateSim("Work"); this.mWaitTime = RandomUtil.GetFloat(kMinWorkLength, kMaxWorkLength); kXPIncreasePerWorking = AcademicBusinessPlanner.UseBusinessPlanner.kXPIncreasePerWorking; } else { AnimateSim("Practice"); this.mWaitTime = RandomUtil.GetFloat(kMinPresentationLength, kMaxPresentationLength); kXPIncreasePerWorking = kXPIncreasePerPresentation; broadcaster = new ReactionBroadcaster(Target, kPresentationBroadcastParams, new ReactionBroadcaster.BroadcastCallback(this.BroadcastCallback)); } DoTimedLoop(this.mWaitTime, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached)); bool flag2 = false; foreach (InteractionInstance instance in Actor.InteractionQueue.InteractionList) { if ((instance != this) && (instance is AcademicBusinessPlanner.UseBusinessPlanner)) { flag2 = true; break; } } if (!flag2 && Target.PlannerIsOpen) { AnimateSim("Close"); Target.PlannerIsOpen = false; } AnimateSim("Exit"); Target.DisableFootprint(AcademicBusinessPlanner.sFootprintHash); EndCommodityUpdates(true); StandardExit(); if (!Actor.HasExitReason(ExitReason.Canceled)) { if (interactionDefinition.mUsageType == BusinessPlanning.PresentBusinessPlan) { EventTracker.SendEvent(EventTypeId.kPresentedBusinessPlan, Actor, Target.LotCurrent); } else if (interactionDefinition.mUsageType == BusinessPlanning.WorkOnBusinessPlan) { EventTracker.SendEvent(EventTypeId.kWorkedOnBusinessPlan, Actor, Target.LotCurrent); } } if (broadcaster != null) { broadcaster.EndBroadcast(); broadcaster.Dispose(); broadcaster = null; } // Custom, removed IsUniversityWorld() check Business occupationAsCareer = Actor.OccupationAsCareer as Business; if (occupationAsCareer != null) { occupationAsCareer.UpdatePerformanceOrExperience(kXPIncreasePerWorking); } AcademicCareer occupationAsAcademicCareer = Actor.OccupationAsAcademicCareer; if (((occupationAsAcademicCareer != null) && (occupationAsAcademicCareer.DegreeInformation != null)) && (occupationAsAcademicCareer.DegreeInformation.AcademicDegreeName == AcademicDegreeNames.Business)) { occupationAsAcademicCareer.UpdatePerformanceOrExperience(kXPIncreasePerWorking); } if (!Target.PlannerIsOpen) { Actor.WaitForExitReason(2f, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached)); if (!Actor.Inventory.Contains(Target)) { Actor.PlaySoloAnimation("a2o_object_genericSwipe_x", true); Actor.Inventory.TryToAdd(Target); } } return true; } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return false; } }