Exemplo n.º 1
0
            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);
                    }
                }
            }
Exemplo n.º 2
0
 // 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();
 }
Exemplo n.º 3
0
        // 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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
            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));
                    }
                }
            }
Exemplo n.º 7
0
        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;
            }
        }
Exemplo n.º 8
0
        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);
            }
        }
Exemplo n.º 9
0
        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);
            }
        }
Exemplo n.º 10
0
        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;
            }
        }
Exemplo n.º 11
0
 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
         }
     }
 }
Exemplo n.º 12
0
        // 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);
            }
        }
Exemplo n.º 13
0
        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);
            }
        }
Exemplo n.º 14
0
        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);
            }
        }
Exemplo n.º 15
0
        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;
            }
        }
Exemplo n.º 16
0
        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);
            }
        }
Exemplo n.º 17
0
        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);
            }
        }
Exemplo n.º 18
0
        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;
            }
        }