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); }
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; } }
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; } }
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); }
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); } }); }
/// <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(); }
private void SetEillpseDiameter0(AnimationTask animationTask) { SetEillpseDiameter0(animationTask.OuterValue, animationTask.InnerValue, animationTask.Duration); }
private bool animationAlmostFinished(AnimationTask t) { return(t != null && t.CurrentTimeRatio > 0.95f); }
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; } }