diff options
author | tpart <tpart120@proton.me> | 2025-09-21 22:19:39 +0200 |
---|---|---|
committer | tpart <tpart120@proton.me> | 2025-09-21 22:19:44 +0200 |
commit | 483fba84229b42202157e9e9cc0ae2c394e48060 (patch) | |
tree | 2ccad6b215fdd809a5603c0eff95c650ba17b33c | |
parent | f8c0f3a15a80bbf01ac5f6586269b3b506d0c21a (diff) | |
download | hurrycurry-483fba84229b42202157e9e9cc0ae2c394e48060.tar hurrycurry-483fba84229b42202157e9e9cc0ae2c394e48060.tar.bz2 hurrycurry-483fba84229b42202157e9e9cc0ae2c394e48060.tar.zst |
Add rolling board model; Add rolling pin model; Add rolling pin animation (#393)
-rw-r--r-- | client/gui/menus/main/about.gd | 1 | ||||
-rw-r--r-- | client/map/tile_factory.gd | 1 | ||||
-rw-r--r-- | client/map/tiles/rolling_board.gd | 57 | ||||
-rw-r--r-- | client/map/tiles/rolling_board.gd.uid | 1 | ||||
-rw-r--r-- | client/map/tiles/rolling_board.tscn | 14 | ||||
-rw-r--r-- | client/map/tiles/rolling_pin.res | bin | 0 -> 28783 bytes | |||
-rw-r--r-- | client/map/tiles/rolling_pin.tscn | 10 | ||||
-rw-r--r-- | client/map/tiles/sounds/roll.ogg | bin | 0 -> 11722 bytes | |||
-rw-r--r-- | client/map/tiles/sounds/roll.ogg.import | 19 | ||||
-rw-r--r-- | client/player/character/character.gd | 7 | ||||
-rw-r--r-- | client/player/character/character.tscn | 220 |
11 files changed, 320 insertions, 10 deletions
diff --git a/client/gui/menus/main/about.gd b/client/gui/menus/main/about.gd index 1b8f47d1..56887203 100644 --- a/client/gui/menus/main/about.gd +++ b/client/gui/menus/main/about.gd @@ -46,6 +46,7 @@ var credits := [ ["Kay Lousberg", "Kitchen tiles", cc0], ["Poly by Google", "Strawberry", cc_by_3], ["Poly by Google", "Fish", cc_by_3], + ["Poly by Google", "Rolling pin", cc_by_3], ["jeremy", "Propeller hat", cc_by_3] ]], [tr("c.credits.sounds"), [ diff --git a/client/map/tile_factory.gd b/client/map/tile_factory.gd index 4049ea47..fb72fe77 100644 --- a/client/map/tile_factory.gd +++ b/client/map/tile_factory.gd @@ -54,6 +54,7 @@ func produce(tile_name: String, position: Vector2i, neighbors: Array) -> Tile: "lamp": return Lamp.new(ctx) "oven": return Oven.new(ctx) "path": return Path.new(ctx) + "rolling-board": return RollingBoard.new(ctx) "sink": return Sink.new(ctx) "stove": return Stove.new(ctx) "street": return Street.new(ctx) diff --git a/client/map/tiles/rolling_board.gd b/client/map/tiles/rolling_board.gd new file mode 100644 index 00000000..078897b1 --- /dev/null +++ b/client/map/tiles/rolling_board.gd @@ -0,0 +1,57 @@ +# Hurry Curry! - a game about cooking +# Copyright (C) 2025 Hurry Curry! contributors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License only. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +class_name RollingBoard +extends CounterBase + +var board = load("res://map/tiles/rolling_board.tscn").instantiate() +var rolling: AudioStreamPlayer3D = AudioStreamPlayer3D.new() +var acting_player + +func _init(ctx: TileFactory.TileCC): + super(ctx) + rolling.stream = preload("res://map/tiles/sounds/roll.ogg") + rolling.volume_db = -10 + add_child(rolling) + base.add_child(board) + +func progress(position_: float, speed: float, warn: bool, acting_player_): + super(position_, speed, warn, acting_player) + var pin: Node3D = board.get_node("RollingPin") + acting_player = acting_player_ + + if not rolling.playing and speed != 0.: + rolling.play() + if acting_player != null: + pin.visible = false + var acting_character: Character = acting_player.character + acting_character.rolling = true + elif speed == 0: + rolling.stop() + pin.visible = true + if acting_player != null: + var acting_character: Character = acting_player.character + acting_character.rolling = false + +func finish(): + super() + if is_instance_valid(acting_player): + var acting_character: Character = acting_player.character + acting_character.rolling = false + board.get_node("RollingPin").visible = true + rolling.stop() + +static func interact_target() -> Vector3: + return Vector3(0., 0.575, 0.) diff --git a/client/map/tiles/rolling_board.gd.uid b/client/map/tiles/rolling_board.gd.uid new file mode 100644 index 00000000..f394f40e --- /dev/null +++ b/client/map/tiles/rolling_board.gd.uid @@ -0,0 +1 @@ +uid://dqo2vciij8w47 diff --git a/client/map/tiles/rolling_board.tscn b/client/map/tiles/rolling_board.tscn new file mode 100644 index 00000000..ecf1c036 --- /dev/null +++ b/client/map/tiles/rolling_board.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=3 uid="uid://c15xsbx0bduqt"] + +[ext_resource type="ArrayMesh" uid="uid://dd4g04lgvsly5" path="res://map/tiles/cutting_board.res" id="1_cuxby"] +[ext_resource type="PackedScene" uid="uid://c8t04dfp45a86" path="res://map/tiles/rolling_pin.tscn" id="2_cuxby"] + +[node name="CuttingBoard" type="Node3D"] + +[node name="Mesh" type="MeshInstance3D" parent="."] +transform = Transform3D(0.4, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -0.075, 0.5, 0) +mesh = ExtResource("1_cuxby") +skeleton = NodePath("") + +[node name="RollingPin" parent="." instance=ExtResource("2_cuxby")] +transform = Transform3D(0.0979824, 0, -0.9951882, 0, 1, 0, 0.9951882, 0, 0.0979824, 0.3562666, 0.575, 0) diff --git a/client/map/tiles/rolling_pin.res b/client/map/tiles/rolling_pin.res Binary files differnew file mode 100644 index 00000000..29a31bc7 --- /dev/null +++ b/client/map/tiles/rolling_pin.res diff --git a/client/map/tiles/rolling_pin.tscn b/client/map/tiles/rolling_pin.tscn new file mode 100644 index 00000000..b25419cd --- /dev/null +++ b/client/map/tiles/rolling_pin.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://c8t04dfp45a86"] + +[ext_resource type="ArrayMesh" uid="uid://bijk6tpibbek3" path="res://map/tiles/rolling_pin.res" id="1_s0lm5"] + +[node name="RollingPin" type="Node3D"] + +[node name="Mesh" type="MeshInstance3D" parent="."] +transform = Transform3D(1.75, 0, 0, 0, 1.75, 0, 0, 0, 1.75, 0, 0, 0) +mesh = ExtResource("1_s0lm5") +skeleton = NodePath("") diff --git a/client/map/tiles/sounds/roll.ogg b/client/map/tiles/sounds/roll.ogg Binary files differnew file mode 100644 index 00000000..75eb8812 --- /dev/null +++ b/client/map/tiles/sounds/roll.ogg diff --git a/client/map/tiles/sounds/roll.ogg.import b/client/map/tiles/sounds/roll.ogg.import new file mode 100644 index 00000000..fb536ed1 --- /dev/null +++ b/client/map/tiles/sounds/roll.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://drck03qv37u3w" +path="res://.godot/imported/roll.ogg-777f87bf2da0dd0836179ee4fabb9c55.oggvorbisstr" + +[deps] + +source_file="res://map/tiles/sounds/roll.ogg" +dest_files=["res://.godot/imported/roll.ogg-777f87bf2da0dd0836179ee4fabb9c55.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/client/player/character/character.gd b/client/player/character/character.gd index c6401965..a6af254a 100644 --- a/client/player/character/character.gd +++ b/client/player/character/character.gd @@ -35,6 +35,7 @@ var walking := false var holding := false var boosting := false var cutting := false +var rolling := false var was_boosting := boosting var current_animation := "idle" @@ -57,7 +58,6 @@ var headwears: Array[PackedScene]= [ @onready var hand_animations = $HandAnimations @onready var main = $Main -@onready var tram = $Tram @onready var default_height = main.position.y @onready var main_height_target = default_height @onready var walking_particles = $Walking @@ -65,6 +65,7 @@ var headwears: Array[PackedScene]= [ @onready var username_tag = $Username @onready var tie = $Main/Tie @onready var knife = $Main/HandRight/Knife +@onready var rolling_pin = $Main/RollingPin @onready var head_default: MeshInstance3D = $Main/HeadDefault @onready var head_robot: MeshInstance3D = $Main/HeadRobot @@ -82,6 +83,7 @@ func _process(delta): var next_animation: String if holding: next_animation = "hold" elif cutting: next_animation = "cut" + elif rolling: next_animation = "roll" elif walking: next_animation = "walk" else: next_animation = "idle" @@ -106,8 +108,6 @@ func set_style(style: Dictionary, character_class: String): tie.visible = character_class != "customer" head_robot.visible = character_class == "bot" head_default.visible = is_human - main.visible = character_class != "tram" - tram.visible = character_class == "tram" # Hairstyle hair_mesh.mesh = hairstyles[hairstyle_idx] @@ -131,6 +131,7 @@ func play_animation(name_: String): else: step_sounds.stop_autoplay() knife.visible = name_ == "cut" + rolling_pin.visible = name_ == "roll" func _on_hand_animations_animation_finished(_name): hand_animations.play(current_animation) diff --git a/client/player/character/character.tscn b/client/player/character/character.tscn index ccf987b9..748cdaed 100644 --- a/client/player/character/character.tscn +++ b/client/player/character/character.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=26 format=3 uid="uid://b3hhir2fvnunu"] +[gd_scene load_steps=27 format=3 uid="uid://b3hhir2fvnunu"] [ext_resource type="Script" uid="uid://dwk3vd4nv2k65" path="res://player/character/character.gd" id="1_12lbh"] [ext_resource type="ArrayMesh" uid="uid://bnmm01yjwultj" path="res://player/character/default/main.res" id="2_uovyg"] [ext_resource type="ArrayMesh" uid="uid://46sp3fu3n6ls" path="res://player/character/default/hand_right.res" id="3_k28vh"] [ext_resource type="ArrayMesh" uid="uid://r52cylox4imf" path="res://player/character/default/hand_left.res" id="4_tcrm3"] [ext_resource type="PackedScene" uid="uid://cufype1bex3r3" path="res://map/tiles/knife.tscn" id="4_tjq3a"] +[ext_resource type="PackedScene" uid="uid://c8t04dfp45a86" path="res://map/tiles/rolling_pin.tscn" id="5_kl3lh"] [ext_resource type="ArrayMesh" uid="uid://csryncouqhwp1" path="res://player/character/default/head.res" id="5_n1vl0"] [ext_resource type="ArrayMesh" uid="uid://c2qnwt44x8ujl" path="res://player/character/default/tie.res" id="9_kgric"] [ext_resource type="AudioStream" uid="uid://bxiorkb4xb8t1" path="res://player/sounds/step1.ogg" id="10_qpd6x"] @@ -14,7 +15,6 @@ [ext_resource type="Script" uid="uid://n4jwod1jfuiv" path="res://audio/play_random.gd" id="14_3rb6x"] [ext_resource type="AudioStream" uid="uid://1jsqpnk3igj3" path="res://player/sounds/woosh1.ogg" id="14_ikcec"] [ext_resource type="AudioStream" uid="uid://cwme7eatip0jc" path="res://player/sounds/woosh2.ogg" id="15_iv4wu"] -[ext_resource type="PackedScene" uid="uid://xq5claqewtb3" path="res://player/character/tram/tram.tscn" id="18_8h5ka"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_7ojaw"] resource_local_to_scene = true @@ -155,6 +155,39 @@ tracks/11/keys = { "points": PackedFloat32Array(2.0944, -0.25, 0, 0.25, 0), "times": PackedFloat32Array(0) } +tracks/12/type = "bezier" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Main/RollingPin:position:x") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/13/type = "bezier" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Main/RollingPin:position:y") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/14/type = "bezier" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Main/RollingPin:position:z") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} [sub_resource type="Animation" id="Animation_557hk"] resource_name = "cut" @@ -706,12 +739,183 @@ tracks/11/keys = { "times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4) } +[sub_resource type="Animation" id="Animation_01ngc"] +resource_name = "roll" +loop_mode = 1 +step = 0.01 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Main/HandRight:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(-1, -0.125, 0, 0.125, 0, -1, -0.083333336, 0, 0, 0, -1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Main/HandRight:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Main/HandRight:position:z") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 2, -0.2, 0, 0.2, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Main/HandRight:rotation:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Main/HandRight:rotation:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(-2.0943952, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Main/HandRight:rotation:z") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(-3.1415927, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/6/type = "bezier" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Main/HandLeft:position:x") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"handle_modes": PackedInt32Array(0, 2, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/7/type = "bezier" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Main/HandLeft:position:y") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"handle_modes": PackedInt32Array(0, 2, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/8/type = "bezier" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Main/HandLeft:position:z") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"handle_modes": PackedInt32Array(0, 2, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 2, -0.2, 0, 0.2, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/9/type = "bezier" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Main/HandLeft:rotation:x") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/10/type = "bezier" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Main/HandLeft:rotation:y") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1.3962634, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/11/type = "bezier" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Main/HandLeft:rotation:z") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(-3.1415927, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0) +} +tracks/12/type = "bezier" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Main/RollingPin:position:x") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"handle_modes": PackedInt32Array(0, 2, 0), +"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0, 0, -0.083333336, 0, 0, 0, 0, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/13/type = "bezier" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Main/RollingPin:position:y") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"handle_modes": PackedInt32Array(0, 2, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} +tracks/14/type = "bezier" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Main/RollingPin:position:z") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"handle_modes": PackedInt32Array(0, 2, 0), +"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 2, -0.2, 0, 0.2, 0, 1, -0.125, 0, 0.125, 0), +"times": PackedFloat32Array(0, 0.5, 1) +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_xtrfe"] _data = { &"RESET": SubResource("Animation_tdhvg"), &"cut": SubResource("Animation_557hk"), &"hold": SubResource("Animation_cvcpd"), &"idle": SubResource("Animation_r1hej"), +&"roll": SubResource("Animation_01ngc"), &"walk": SubResource("Animation_7kiho") } @@ -734,16 +938,21 @@ mesh = ExtResource("2_uovyg") skeleton = NodePath("") surface_material_override/0 = SubResource("StandardMaterial3D_7ojaw") +[node name="RollingPin" parent="Main" instance=ExtResource("5_kl3lh")] +transform = Transform3D(3.030303, -1.1268961e-05, -1.5955811e-05, 1.7894663e-05, 0.47404197, 2.992996, -8.746808e-06, -2.992996, 0.47404295, 0, 1, 1) +visible = false + [node name="HandRight" type="MeshInstance3D" parent="Main"] -transform = Transform3D(0.287144, 0.2864, -1.17785e-06, 0.402357, -0.133775, 0.337554, 0.292329, -0.0971941, -0.464603, -1.302, -0.17, 0) +transform = Transform3D(0.28714395, 0.28639996, -1.177853e-06, 0.40235722, -0.13377503, 0.33755422, 0.29232922, -0.09719407, -0.46460304, -1.302, -0.17, 0) mesh = ExtResource("3_k28vh") skeleton = NodePath("") [node name="Knife" parent="Main/HandRight" instance=ExtResource("4_tjq3a")] transform = Transform3D(3.69699, 2.68602, 2.63837, -3.70658, -2.69301, 7.93544, 3.10156, -4.26893, -1.08623e-05, -0.157983, 0.472216, -0.19819) +visible = false [node name="HandLeft" type="MeshInstance3D" parent="Main"] -transform = Transform3D(0.287143, -0.2864, 1.45591e-06, -0.497341, -0.165355, -2.37987e-16, 7.2796e-07, -7.26076e-07, -0.574281, 1.302, -0.17, 0) +transform = Transform3D(0.2871431, -0.28640002, 1.4559066e-06, -0.49734095, -0.16535497, -2.3798664e-16, 7.2796e-07, -7.2607605e-07, -0.574281, 1.302, -0.17, 0) mesh = ExtResource("4_tcrm3") skeleton = NodePath("") @@ -833,7 +1042,4 @@ billboard = 1 no_depth_test = true text = "Username" -[node name="Tram" parent="." instance=ExtResource("18_8h5ka")] -visible = false - [connection signal="animation_finished" from="HandAnimations" to="." method="_on_hand_animations_animation_finished"] |