Exemple #1
0
        public void ChangeAnimation(string animation)
        {
            if (!animationTarget.Animator.TryGetAnimationData(animation, out animationData))
            {
                return;
            }

            animationTask = animationTarget.Animator.PlayAnimation(animationData);

            if (animationData.options.duration.HasValue)
            {
                duration = animationData.options.duration.Value.AsMilliseconds;
            }
            else
            {
                duration = 1000;
            }

            if (animationData.options.delay.HasValue)
            {
                delay = animationData.options.delay.Value.AsMilliseconds;
            }
            else
            {
                delay = 0;
            }

            iterations     = animationData.options.iterations ?? 1;
            timingFunction = animationData.options.timingFunction ?? EasingFunction.Linear;
            direction      = animationData.options.direction ?? AnimationDirection.Forward;
        }
    private void Awake()
    {
        var sequence = CreateAnimation();
        var task     = new AnimationTask(sequence);

        _taskHandle.AddTask(task, TaskHandle.PRIORITY_SCENE_LOADED);
    }
Exemple #3
0
        private void OnStateChange(object sender, StateChangeArgs args)
        {
            switch (args.To)
            {
            case State.Intro:
                break;

            case State.Idle:
                if (Administrant.IsLocalPlayer)
                {
                    Game.DisplayHelp("Press " + System.Windows.Forms.Keys.Space + " to pump their chest.", 2000);
                }
                adminTask   = Administrant.Tasks.PlayAnimation("mini@cpr@char_a@cpr_def", "cpr_pumpchest_idle", -1, 4.0f, -8.0f, 0, AnimationFlags.Loop);
                patientTask = Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_def", "cpr_pumpchest_idle", -1, 4.0f, -8.0f, 0, AnimationFlags.Loop);
                break;

            case State.Pump:
                adminTask   = Administrant.Tasks.PlayAnimation("mini@cpr@char_a@cpr_str", "cpr_pumpchest", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                patientTask = Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_str", "cpr_pumpchest", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                Pumps++;
                break;

            case State.Success:
                adminTask   = Administrant.Tasks.PlayAnimation("mini@cpr@char_a@cpr_str", "cpr_success", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                patientTask = Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_str", "cpr_success", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                NativeFunction.Natives.ClearFacialIdleAnimOverride(Patient);
                NativeFunction.Natives.SetFacialIdleAnimOverride(Patient, "mood_Happy_1", 0);
                break;

            case State.Failure:
                adminTask   = Administrant.Tasks.PlayAnimation("mini@cpr@char_a@cpr_str", "cpr_fail", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                patientTask = Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_str", "cpr_fail", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                break;
            }
        }
Exemple #4
0
        public static void CreateStingersFromPlayer(int num)
        {
            isCreatingStingersFromPlayer = true;

            if (Settings.EnableAnimations)
            {
                GameFiber.StartNew(() =>
                {
                    Vector3 playerPos            = Game.LocalPlayer.Character.Position;
                    Vector3 playerForwardVect    = Game.LocalPlayer.Character.ForwardVector;
                    float playerYaw              = Game.LocalPlayer.Character.Rotation.Yaw;
                    Stinger prevStinger          = null;
                    createStingersPlayerAnimTask = Game.LocalPlayer.Character.Tasks.PlayAnimation("mp_weapons_deal_sting", "crackhead_bag_loop", -1, 0.925f, 0.825f, 0.0f, AnimationFlags.Loop);
                    for (int i = 0; i < num; i++)
                    {
                        Stinger s = new Stinger(playerPos + playerForwardVect * (SeparationFromPlayer + (SeparationBetweenStingers * i)), playerYaw);
                        if (i != 0)
                        {
                            s.Position = new Vector3(s.Position.X, s.Position.Y, prevStinger.Position.Z + 0.5f);
                        }
                        Logger.LogDebug("CreateStingers(" + num + ")", "Created Stinger #" + Stingers.Count);
                        Stingers.Add(s);
                        DateTime timeout = DateTime.UtcNow.AddSeconds(15.0f);
                        while (s != null && s.Exists() && s.AnimState != Stinger.StingerAnimState.Deployed && DateTime.UtcNow < timeout)
                        {
                            GameFiber.Sleep(25);
                        }

                        if (s == null || !s.Exists())
                        {
                            break;
                        }
                        else
                        {
                            prevStinger = s;
                        }
                    }
                    Game.LocalPlayer.Character.Tasks.Clear();
                    createStingersPlayerAnimTask = null;
                    isCreatingStingersFromPlayer = false;
                    Logger.LogDebug("CreateStingers(" + num + ")", "Current Total Stingers " + Stingers.Count);
                });
            }
            else
            {
                Vector3 playerPos         = Game.LocalPlayer.Character.Position;
                Vector3 playerForwardVect = Game.LocalPlayer.Character.ForwardVector;
                float   playerYaw         = Game.LocalPlayer.Character.Rotation.Yaw;
                for (int i = 0; i < num; i++)
                {
                    Stinger s = new Stinger(playerPos + playerForwardVect * (SeparationFromPlayer + (SeparationBetweenStingers * i)), playerYaw);
                    Logger.LogDebug("CreateStingers(" + num + ")", "Created Stinger #" + Stingers.Count);
                    Stingers.Add(s);
                }
                Logger.LogDebug("CreateStingers(" + num + ")", "Current Total Stingers " + Stingers.Count);
                isCreatingStingersFromPlayer = false;
            }
        }
Exemple #5
0
        public void RunAnimationAgain()
        {
            animationData.options.duration       = new UITimeMeasurement(duration);
            animationData.options.delay          = new UITimeMeasurement(delay);
            animationData.options.iterations     = iterations;
            animationData.options.timingFunction = timingFunction;
            animationData.options.direction      = direction;

            animationTask = animationTarget.Animator.PlayAnimation(animationData);
        }
Exemple #6
0
        public static void DeleteAllStingers()
        {
            if (createStingersPlayerAnimTask != null && createStingersPlayerAnimTask.IsPlaying)
            {
                Game.LocalPlayer.Character.Tasks.Clear();
                createStingersPlayerAnimTask = null;
            }

            for (int i = 0; i < Stingers.Count; i++)
            {
                Stingers[i].Delete();
                Logger.LogDebug("DeleteStingers()", "Deleted Stinger #" + i);
            }
            Stingers.Clear();
        }
        public void LookAtRandomSpace(string nextPanel, UIElement element)
        {
            if (nextPanel == currentActivePanel)
            {
                return;
            }

            currentActivePanel = nextPanel;
            Quaternion rotation = lookCameraTransform.rotation;

            float targetX = (20 + 160f * Random.value) - 90;
            float targetY = (20 + 160f * Random.value) - 90;

            // I salvage the element for the animator
            UIElement rootElement = element.View.RootElement;

            if (animation?.state == UITaskState.Running)
            {
                rootElement.Animator.StopAnimation(animation.animationData);
            }

            animation = rootElement.Animator.PlayAnimation(new AnimationData()
            {
                options = new AnimationOptions()
                {
                    timingFunction = EasingFunction.QuadraticEaseInOut,
                    duration       = new UITimeMeasurement(1500)
                },
                onTick = evt => {
                    float t = Mathf.Clamp01(Easing.Interpolate(MathUtil.PercentOfRange(evt.state.iterationProgress, 0, 1), evt.options.timingFunction.Value));

                    float lerpedX                = Mathf.Lerp(rotation.x, targetX, t);
                    float lerpedY                = Mathf.Lerp(rotation.y, targetY, t);
                    Quaternion quaternion        = Quaternion.Lerp(rotation, Quaternion.Euler(lerpedX, lerpedY, rotation.normalized.z), t);
                    lookCameraTransform.rotation = quaternion;
                },
                onCompleted = evt => { lookCameraTransform.rotation = Quaternion.Euler(targetX, targetY, rotation.normalized.z); }
            });
        }
Exemple #8
0
        /// <summary>
        /// 使用动画改变内外经
        /// </summary>
        /// <param name="outerDiameter"></param>
        /// <param name="innerDiameter"></param>
        /// <param name="milliseconds"></param>
        private void SizeAnimation(double outerDiameter, double innerDiameter, double milliseconds)
        {
            Storyboard story    = new Storyboard();
            Duration   duration = new Duration(TimeSpan.FromMilliseconds(milliseconds));

            DoubleAnimation outerWidthAnimation =
                new DoubleAnimation(outerDiameter, duration, FillBehavior.Stop);
            DoubleAnimation outerHeightAnimation =
                new DoubleAnimation(outerDiameter, duration, FillBehavior.Stop);
            DoubleAnimation innerWidthAnimation =
                new DoubleAnimation(innerDiameter, duration, FillBehavior.Stop);
            DoubleAnimation innerHeightAnimation =
                new DoubleAnimation(innerDiameter, duration, FillBehavior.Stop);

            double xTranslate = (outerDiameter + innerDiameter) / 4.0;

            if (outerDiameter <= 0 || innerDiameter <= 0)
            {
                xTranslate = xTranslate * 2;
            }
            DoubleAnimation xTransAnimation =
                new DoubleAnimation(xTranslate, duration, FillBehavior.Stop);

            story.Children.Add(outerWidthAnimation);
            story.Children.Add(outerHeightAnimation);
            story.Children.Add(innerWidthAnimation);
            story.Children.Add(innerHeightAnimation);
            story.Children.Add(xTransAnimation);

            Storyboard.SetTarget(outerWidthAnimation, outerElipse);
            Storyboard.SetTarget(outerHeightAnimation, outerElipse);
            Storyboard.SetTarget(innerWidthAnimation, InnerImage);
            Storyboard.SetTarget(innerHeightAnimation, InnerImage);
            Storyboard.SetTarget(xTransAnimation, tbDelta);

            Storyboard.SetTargetProperty(outerWidthAnimation,
                                         new PropertyPath(FrameworkElement.WidthProperty));
            Storyboard.SetTargetProperty(outerHeightAnimation,
                                         new PropertyPath(FrameworkElement.HeightProperty));
            Storyboard.SetTargetProperty(innerWidthAnimation,
                                         new PropertyPath(FrameworkElement.WidthProperty));
            Storyboard.SetTargetProperty(innerHeightAnimation,
                                         new PropertyPath(FrameworkElement.HeightProperty));
            Storyboard.SetTargetProperty(xTransAnimation,
                                         new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"));

            story.Completed += new EventHandler(delegate(object s1, EventArgs e1)
            {
                outerElipse.Width = outerElipse.Height = outerDiameter;
                InnerImage.Width  = InnerImage.Height = innerDiameter;
                (tbDelta.RenderTransform as TranslateTransform).X = xTranslate;

                AnimationTask animationTask = null;
                lock (this)
                {
                    if (animationTasks.Count > 0)
                    {
                        animationTasks[0] = null;
                        animationTasks.RemoveAt(0);
                    }
                    if (animationTasks.Count > 0)
                    {
                        animationTask = animationTasks[0];
                    }
                }
                if (animationTask != null)
                {
                    SetEillpseDiameter0(animationTask);
                }
            });
            story.Begin();
        }
Exemple #9
0
 private void SetEillpseDiameter0(AnimationTask animationTask)
 {
     SetEillpseDiameter0(animationTask.OuterValue, animationTask.InnerValue,
                         animationTask.Duration);
 }
Exemple #10
0
 private bool animationAlmostFinished(AnimationTask t)
 {
     return(t != null && t.CurrentTimeRatio > 0.95f);
 }
Exemple #11
0
        public void Update()
        {
            if (halting || IsFinished)
            {
                return;
            }

            if (IsPerforming)
            {
                goto perform;
            }

            if (!Patient || !Administrant)
            {
                return;
            }

            Patient.IsPositionFrozen            = true;
            Patient.BlockPermanentEvents        = true;
            Patient.CanPlayAmbientAnimations    = false;
            Patient.CanPlayGestureAnimations    = false;
            Patient.CanPlayVisemeAnimations     = false;
            Patient.CollisionIgnoredEntity      = Administrant;
            Administrant.CollisionIgnoredEntity = Patient;

            NativeFunction.Natives.SetFacialIdleAnimOverride(Patient, "dead_1", 0); // close the eyes of the victim
            NativeFunction.Natives.StopPedSpeaking(Patient, true);

            DeathManager.Instance.GetCause(Patient); // get the cause of death before resurrecting the ped, otherwise the death report always shows "unknown"

            Patient.Resurrect();
            Patient.Tasks.ClearImmediately();

            Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_str", "cpr_pumpchest_idle", -1, 4.0f, -8.0f, 0, AnimationFlags.Loop);

            patientSide    = Patient.GetOffsetPosition(new Vector3(-0.99f, -0.01f, 0f));
            patientHeading = Patient.Heading;

            Pumps = 0;
            state = State.Intro;
perform:
            switch (state)
            {
            case State.Intro:
                if (adminGoingToPatientTask == null)
                {
                    adminGoingToPatientTask = Administrant.Tasks.GoStraightToPosition(patientSide, 1.0f, patientSide.GetHeadingTowards(Patient), 0.1225f, -1);
                }
                else if (adminGoingToPatientTask.IsActive)
                {
                    // sometimes the victim gets up while the player is completing the task, this makes him play the anim again
                    if (!NativeFunction.Natives.IsEntityPlayingAnim <bool>(Patient, "mini@cpr@char_b@cpr_str", "cpr_pumpchest_idle", 3))
                    {
                        Patient.Heading = patientHeading; // set the victim's heading to the original heading in case he turned around
                        Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_str", "cpr_pumpchest_idle", -1, 4.0f, -8.0f, 0, AnimationFlags.Loop);
                    }
                }
                else if (adminTask == null || patientTask == null)
                {
                    patientTask = Patient.Tasks.PlayAnimation("mini@cpr@char_b@cpr_def", "cpr_intro", -1, 4.0f, -8.0f, 0, AnimationFlags.None);
                    adminTask   = Administrant.Tasks.PlayAnimation("mini@cpr@char_a@cpr_def", "cpr_intro", -1, 4.0f, -8.0f, 0, AnimationFlags.None);

                    if (Administrant.IsLocalPlayer)
                    {
                        Game.DisplayHelp("Press " + System.Windows.Forms.Keys.J + " to delare victim dead.", 2000);
                    }
                }


                if (animationAlmostFinished(adminTask))
                {
                    state = State.Idle;
                }
                break;

            case State.Idle:
                if (Administrant.IsLocalPlayer)
                {
                    if (Game.IsKeyDown(System.Windows.Forms.Keys.Space))
                    {
                        state = State.Pump;
                    }
                    if (Game.IsKeyDown(System.Windows.Forms.Keys.J))
                    {
                        state = State.Failure;
                    }
                    break;
                }
                if (Pumps >= MaxPumps)
                {
                    state = State.Failure;
                    break;
                }
                state = State.Pump;
                break;

            case State.Pump:
                if (animationAlmostFinished(adminTask))
                {
                    if (RequiredPumps > 0 && Pumps >= RequiredPumps)
                    {
                        state = State.Success;
                        goto case State.Success;
                    }
                    state = State.Idle;
                }
                break;

            case State.Success:
            case State.Failure:
                if (animationAlmostFinished(adminTask))
                {
                    Administrant.Tasks.Clear();
                    if (Patient)
                    {
                        NativeFunction.Natives.SetEntityNoCollisionEntity(Patient, Administrant, true);
                        NativeFunction.Natives.SetEntityNoCollisionEntity(Administrant, Patient, true);
                        NativeFunction.Natives.StopPedSpeaking(Patient, false);
                        NativeFunction.Natives.ClearFacialIdleAnimOverride(Patient);
                        Patient.IsPositionFrozen   = false;
                        Patient.IsCollisionEnabled = true; // request collision, otherwise the ped falls through the ground
                        Patient.NeedsCollision     = true;
                        Patient.Tasks.Clear();

                        if (state == State.Failure)
                        {
                            Patient.Kill();
                        }
                    }

                    Pumps      = 0;
                    IsFinished = true;
                }
                break;
            }
        }