Currently I do this:
public partial class PhysicalAttackState : PlayerState {
private void AnimationTreeOnAnimationFinished(StringName animName) {
GD.Print(animName);
switch (animName) {
case "sword_attack":
AnimationTree.Set("parameters/conditions/attack_finished",true);
AnimationTree.Set("parameters/conditions/is_attacking", false);
EmitSignalRequestStateChange("Move");
break;
}
}
public override async Task Enter() {
GD.Print("Fooooooooooo");
var speed = Player.Combatant.StatProvider.AnimationMultiplier;
GD.Print("Speed: " + speed);
AnimationTree.Set("parameters/Attack/attack_speed/scale", speed);
AnimationTree.Set("parameters/conditions/is_attacking", true);
AnimationTree.Set("parameters/conditions/attack_finished", false);
AnimationTree.Connect(AnimationMixer.SignalName.AnimationFinished, new Callable(this, MethodName.AnimationTreeOnAnimationFinished),(uint)ConnectFlags.OneShot);
}
public override void _PhysicsProcess(double delta) {
Player.Velocity = Player.Velocity.MoveToward(Vector3.Zero, Player.Deceleration * (float)delta);
Player.MoveAndSlide();
}
public override async Task Exit() {
await Task.CompletedTask;
}
}