From b4a6dadc433742cbe3e3ffea29f3bec9f476627f Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Sun, 27 Jul 2025 12:32:18 +0300 Subject: [PATCH 1/2] Weapon draw and holster --- .../guns/gangstaholder/gangstaholder.tres | 105 +++++++++++++++++- .../sprites/guns/gangstaholder/holster1.png | Bin 0 -> 411 bytes .../guns/gangstaholder/holster1.png.import | 34 ++++++ .../sprites/guns/gangstaholder/holster2.png | Bin 0 -> 271 bytes .../guns/gangstaholder/holster2.png.import | 34 ++++++ .../sprites/guns/gangstaholder/holster3.png | Bin 0 -> 179 bytes .../guns/gangstaholder/holster3.png.import | 34 ++++++ .../sprites/guns/placeholder/holster1.png | Bin 0 -> 379 bytes .../guns/placeholder/holster1.png.import | 34 ++++++ .../sprites/guns/placeholder/holster2.png | Bin 0 -> 275 bytes .../guns/placeholder/holster2.png.import | 34 ++++++ .../sprites/guns/placeholder/holster3.png | Bin 0 -> 181 bytes .../guns/placeholder/holster3.png.import | 34 ++++++ .../sprites/guns/placeholder/placeholder.tres | 105 +++++++++++++++++- base/scenes/player.tscn | 2 +- base/scripts/player/command_queue.gd | 2 +- base/scripts/player/player.gd | 17 ++- base/scripts/weapons/weapon_base.gd | 2 +- 18 files changed, 428 insertions(+), 9 deletions(-) create mode 100644 base/assets/sprites/guns/gangstaholder/holster1.png create mode 100644 base/assets/sprites/guns/gangstaholder/holster1.png.import create mode 100644 base/assets/sprites/guns/gangstaholder/holster2.png create mode 100644 base/assets/sprites/guns/gangstaholder/holster2.png.import create mode 100644 base/assets/sprites/guns/gangstaholder/holster3.png create mode 100644 base/assets/sprites/guns/gangstaholder/holster3.png.import create mode 100644 base/assets/sprites/guns/placeholder/holster1.png create mode 100644 base/assets/sprites/guns/placeholder/holster1.png.import create mode 100644 base/assets/sprites/guns/placeholder/holster2.png create mode 100644 base/assets/sprites/guns/placeholder/holster2.png.import create mode 100644 base/assets/sprites/guns/placeholder/holster3.png create mode 100644 base/assets/sprites/guns/placeholder/holster3.png.import diff --git a/base/assets/sprites/guns/gangstaholder/gangstaholder.tres b/base/assets/sprites/guns/gangstaholder/gangstaholder.tres index 2af4c99..bf6652c 100644 --- a/base/assets/sprites/guns/gangstaholder/gangstaholder.tres +++ b/base/assets/sprites/guns/gangstaholder/gangstaholder.tres @@ -1,4 +1,4 @@ -[gd_resource type="AnimationLibrary" load_steps=16 format=3 uid="uid://57ng8lwnt2k4"] +[gd_resource type="AnimationLibrary" load_steps=21 format=3 uid="uid://57ng8lwnt2k4"] [ext_resource type="Texture2D" uid="uid://cy3ija8ratxjq" path="res://base/assets/sprites/guns/gangstaholder/shoot1.png" id="1_rooin"] [ext_resource type="Texture2D" uid="uid://cd4m4g44rmwrc" path="res://base/assets/sprites/guns/gangstaholder/shoot2.png" id="2_57rwx"] @@ -11,6 +11,9 @@ [ext_resource type="Texture2D" uid="uid://cvw7h7fsfdjln" path="res://base/assets/sprites/guns/gangstaholder/reload6.png" id="9_y5ueg"] [ext_resource type="Texture2D" uid="uid://ditbn0dkyjj6e" path="res://base/assets/sprites/guns/gangstaholder/reload7.png" id="10_tf0tm"] [ext_resource type="Texture2D" uid="uid://dftqlo1lltx5f" path="res://base/assets/sprites/guns/gangstaholder/static.png" id="11_fahg7"] +[ext_resource type="Texture2D" uid="uid://dooqsempiufkq" path="res://base/assets/sprites/guns/gangstaholder/holster1.png" id="12_vwudn"] +[ext_resource type="Texture2D" uid="uid://pwe72f0xx10w" path="res://base/assets/sprites/guns/gangstaholder/holster2.png" id="13_p7jc5"] +[ext_resource type="Texture2D" uid="uid://rbxq3ro5l2ec" path="res://base/assets/sprites/guns/gangstaholder/holster3.png" id="14_t6dve"] [sub_resource type="Animation" id="Animation_i1xqq"] length = 0.001 @@ -26,6 +29,18 @@ tracks/0/keys = { "update": 1, "values": [null] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} [sub_resource type="Animation" id="Animation_8sdfx"] resource_name = "shoot" @@ -106,10 +121,98 @@ tracks/0/keys = { "values": [ExtResource("11_fahg7")] } +[sub_resource type="Animation" id="Animation_5sdma"] +resource_name = "holster" +length = 0.40001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(-7.45058e-09, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("12_vwudn"), ExtResource("13_p7jc5"), ExtResource("14_t6dve")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(-7.45058e-09, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, true, false] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.4), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + +[sub_resource type="Animation" id="Animation_vwudn"] +resource_name = "draw" +length = 0.30001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("14_t6dve"), ExtResource("13_p7jc5"), ExtResource("12_vwudn")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.3), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + [resource] _data = { &"RESET": SubResource("Animation_i1xqq"), +&"draw": SubResource("Animation_vwudn"), &"fire": SubResource("Animation_8sdfx"), +&"holster": SubResource("Animation_5sdma"), &"reload": SubResource("Animation_08xoc"), &"static": SubResource("Animation_ma1q3") } diff --git a/base/assets/sprites/guns/gangstaholder/holster1.png b/base/assets/sprites/guns/gangstaholder/holster1.png new file mode 100644 index 0000000000000000000000000000000000000000..d1394f0deeea09eccacc9e21962fc027a409efe0 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O{!3HGlTK@_GDaPU;cPEB*=VV?2*`b~;jv*Cu z-rh9yJM199dZG1{t~tY{3rZIiE*6RM9SzNxm@y$EvuOv*q}>6Mjs-r4-}SuxuBCld z>+{$0M^l)9#$kXX)?Ic7g67VTd)xMW`}gNt?ib%`K6~@~L;g)|4=jE$WE+Zg@vtmd z*rVtX>FsS``o`yaBijm<%M+HLc{HK8Yz5~g7L}ul)AWitVi+5ZbXp&B#&oaoUdZO5 zu!+;e!MUE-Y7wW&fm4|c$2M(kV9Ut4T$*~h^y2X!ix`>i#NB!0rI~vByS<%!)5j0L zZsh1mDRiy~6KG&jTF=7BQIa7qv93dmMd82=+5P+Zw{SHwu-yLkcl|^DckA?5w>vO2 zZMpMhIfp~h)@TJ+uIqUf))w0Y=FP2{66CeBzG|hBHtz(7C-)CZDa>4XYW+nfrU?P3 v1vngn);cAy&sg~XPpSfg=ha)kzSlDCsfq~{`ugD+C~Q1k{an^LB{Ts50VAfK literal 0 HcmV?d00001 diff --git a/base/assets/sprites/guns/gangstaholder/holster1.png.import b/base/assets/sprites/guns/gangstaholder/holster1.png.import new file mode 100644 index 0000000..f14be4f --- /dev/null +++ b/base/assets/sprites/guns/gangstaholder/holster1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dooqsempiufkq" +path="res://.godot/imported/holster1.png-ed894e9f91eb85e44cb846add92792c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://base/assets/sprites/guns/gangstaholder/holster1.png" +dest_files=["res://.godot/imported/holster1.png-ed894e9f91eb85e44cb846add92792c6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/base/assets/sprites/guns/gangstaholder/holster2.png b/base/assets/sprites/guns/gangstaholder/holster2.png new file mode 100644 index 0000000000000000000000000000000000000000..724d1fe2b216b42e1513d9417074128df0552f37 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O{!3HGlTK@_GDaPU;cPEB*=VV?2IVU|`978JR zyuG=Rx5+`GEpbBYnL+L$dGCF)8?>ZxUc&Evx>^~!jpR+^1ZMEYQql9 zE-hCNxS3f0>&)ZpzvUvkV;?R1qgOYHp-b37Imn-dQAEAr5lg@v5WkQq!{d>!14Hjk zD<;O4C3b)Rfy6ZY7#trPELpD5Fy-{eH~9&nYjx_>8`eBG(S2MfF)jPF1B*aG?VVqF srEDJaSXl(7*>P|wWZYxA7JcyAzMwMMr8Nr`pMsp`>FVdQ&MBb@0A>DMFaQ7m literal 0 HcmV?d00001 diff --git a/base/assets/sprites/guns/gangstaholder/holster2.png.import b/base/assets/sprites/guns/gangstaholder/holster2.png.import new file mode 100644 index 0000000..c32d6c1 --- /dev/null +++ b/base/assets/sprites/guns/gangstaholder/holster2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pwe72f0xx10w" +path="res://.godot/imported/holster2.png-af3825befe4ad6e7b2592f029e180b38.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://base/assets/sprites/guns/gangstaholder/holster2.png" +dest_files=["res://.godot/imported/holster2.png-af3825befe4ad6e7b2592f029e180b38.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/base/assets/sprites/guns/gangstaholder/holster3.png b/base/assets/sprites/guns/gangstaholder/holster3.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cd56a00c53fbd5d9dcb51bf6aae219a3020211 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O{!3HGlTK@_GDaPU;cPEB*=VV?2Ik}!Ljv*Cu z-d@?r+2A1Ha`Cd)5ve!(nX(0}FNXN=y3P2$sry@ky){TXUNGP1CI6PF>2Is{^%wWQ wN%G^#{T^30iQyFI1NESAM~0^?0e%cm^Ug0|`@!DTPO-D2CH$bSCmjaYfprtUk;6Q(nW z`7sE0{&LW0n7HWO*W(-sPJ-c#j4CrOYbi9e3LiMcnUHjG9y7~^0w#}u@UwNX)71O_ zzjR0!a9EUk{i$4{5R=D+cV?@DwH;KZ?_}@DiJkV>t3bkKcIL8;EE66)e75iYoxJ-cW8!OTtiOHv^=%R5<(!&67su}{`qSp70`=ek2R44% z%)VpNs+?s%tL?WOtiONzCUeZuqL0an4a`RcS{a1Y8;)=)6f$|le7HVk#vki1tu?Y+ zm{t53I)xATCGGh9UkNCmz#e+jr!;Vm?J+H;8=mHU>HQnJ7|Jg2=jO3{-1z*j;}gRS z&V=1RAMG!1+@)dX|AJ-1!B6MkAN!bn(YgNtYn+|Tni{StCqXXsboFyt=akR{0Kn>I AE&u=k literal 0 HcmV?d00001 diff --git a/base/assets/sprites/guns/placeholder/holster2.png.import b/base/assets/sprites/guns/placeholder/holster2.png.import new file mode 100644 index 0000000..b6a463c --- /dev/null +++ b/base/assets/sprites/guns/placeholder/holster2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5b28gs37bo7a" +path="res://.godot/imported/holster2.png-dc76912fc373334c61a5388a89263a42.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://base/assets/sprites/guns/placeholder/holster2.png" +dest_files=["res://.godot/imported/holster2.png-dc76912fc373334c61a5388a89263a42.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/base/assets/sprites/guns/placeholder/holster3.png b/base/assets/sprites/guns/placeholder/holster3.png new file mode 100644 index 0000000000000000000000000000000000000000..e69bcbdce28a97068dd9dd75f81a6c3091648d43 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O{!3HGlTK@_GDaPU;cPEB*=VV?2Ir*M0jv*Cu z-d@_s+hD-sdT@fLfboX^EHfE5a)x+xOgqGOzx3t4IoG9tO7VjAJ{Ot)WzD?)_}{&6 z6F*(kbg#Yp`Ln*H@{5bi9jXnFSOVrSbO}2Ys(;ht;9V2GE)Qgwr>mdKI;Vst08lkH Au>b%7 literal 0 HcmV?d00001 diff --git a/base/assets/sprites/guns/placeholder/holster3.png.import b/base/assets/sprites/guns/placeholder/holster3.png.import new file mode 100644 index 0000000..803937e --- /dev/null +++ b/base/assets/sprites/guns/placeholder/holster3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxmu14ucuokfl" +path="res://.godot/imported/holster3.png-909df3f4424bd631b47bb34bfa0145a6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://base/assets/sprites/guns/placeholder/holster3.png" +dest_files=["res://.godot/imported/holster3.png-909df3f4424bd631b47bb34bfa0145a6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/base/assets/sprites/guns/placeholder/placeholder.tres b/base/assets/sprites/guns/placeholder/placeholder.tres index 8bb08dc..a5f5dc7 100644 --- a/base/assets/sprites/guns/placeholder/placeholder.tres +++ b/base/assets/sprites/guns/placeholder/placeholder.tres @@ -1,4 +1,4 @@ -[gd_resource type="AnimationLibrary" load_steps=16 format=3 uid="uid://cw8bt4hqxpk55"] +[gd_resource type="AnimationLibrary" load_steps=21 format=3 uid="uid://cw8bt4hqxpk55"] [ext_resource type="Texture2D" uid="uid://cf7avgppv4kfk" path="res://base/assets/sprites/guns/placeholder/static.png" id="1_yheqn"] [ext_resource type="Texture2D" uid="uid://ij02cx0xdckw" path="res://base/assets/sprites/guns/placeholder/reload1.png" id="5_ve5jf"] @@ -11,6 +11,9 @@ [ext_resource type="Texture2D" uid="uid://b55h6w4km2c3u" path="res://base/assets/sprites/guns/placeholder/reload6.png" id="10_x8exi"] [ext_resource type="Texture2D" uid="uid://bp1frp3sm8bic" path="res://base/assets/sprites/guns/placeholder/shoot3.png" id="11_0d256"] [ext_resource type="Texture2D" uid="uid://b4fp0oo8qcino" path="res://base/assets/sprites/guns/placeholder/reload7.png" id="11_bkso5"] +[ext_resource type="Texture2D" uid="uid://3icyo6ynxk20" path="res://base/assets/sprites/guns/placeholder/holster1.png" id="12_y82fu"] +[ext_resource type="Texture2D" uid="uid://5b28gs37bo7a" path="res://base/assets/sprites/guns/placeholder/holster2.png" id="13_7aydm"] +[ext_resource type="Texture2D" uid="uid://dxmu14ucuokfl" path="res://base/assets/sprites/guns/placeholder/holster3.png" id="14_x8exi"] [sub_resource type="Animation" id="Animation_i1xqq"] length = 0.001 @@ -26,6 +29,18 @@ tracks/0/keys = { "update": 1, "values": [null] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} [sub_resource type="Animation" id="Animation_8sdfx"] resource_name = "shoot" @@ -106,10 +121,98 @@ tracks/0/keys = { "values": [ExtResource("1_yheqn")] } +[sub_resource type="Animation" id="Animation_bkso5"] +resource_name = "holster" +length = 0.40001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(7.45058e-09, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("12_y82fu"), ExtResource("13_7aydm"), ExtResource("14_x8exi")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(7.45058e-09, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, true, false] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.4), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + +[sub_resource type="Animation" id="Animation_y82fu"] +resource_name = "draw" +length = 0.30001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("14_x8exi"), ExtResource("13_7aydm"), ExtResource("12_y82fu")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.3), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + [resource] _data = { &"RESET": SubResource("Animation_i1xqq"), +&"draw": SubResource("Animation_y82fu"), &"fire": SubResource("Animation_8sdfx"), +&"holster": SubResource("Animation_bkso5"), &"reload": SubResource("Animation_08xoc"), &"static": SubResource("Animation_ma1q3") } diff --git a/base/scenes/player.tscn b/base/scenes/player.tscn index ade45d6..422d60b 100644 --- a/base/scenes/player.tscn +++ b/base/scenes/player.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=8 format=3 uid="uid://dwx5tcatj35gu"] [ext_resource type="Script" uid="uid://dts8lbivkgsmj" path="res://base/scripts/player/player.gd" id="1_1w3ab"] -[ext_resource type="Texture2D" uid="uid://cy3ija8ratxjq" path="res://base/assets/sprites/guns/gangstaholder/shoot1.png" id="2_gt0rj"] +[ext_resource type="Texture2D" uid="uid://dxmu14ucuokfl" path="res://base/assets/sprites/guns/placeholder/holster3.png" id="2_gt0rj"] [ext_resource type="PackedScene" uid="uid://bb6ovrbusyxpi" path="res://base/scenes/weapons/weapon_base.tscn" id="2_ma1q3"] [ext_resource type="Script" uid="uid://byhp4pklbjltn" path="res://base/scripts/player/weapon_container.gd" id="3_1w3ab"] [ext_resource type="Script" uid="uid://diu6eno2ag6ga" path="res://base/scripts/player/weapon_slot.gd" id="4_gt0rj"] diff --git a/base/scripts/player/command_queue.gd b/base/scripts/player/command_queue.gd index ef12870..78ecb96 100644 --- a/base/scripts/player/command_queue.gd +++ b/base/scripts/player/command_queue.gd @@ -6,10 +6,10 @@ class_name CommandQueue ## Commands that can be pushed to queue enum Command { NONE, - TAKE_WEAPON, FIRE, STOP_FIRING, RELOAD, + DRAW_WEAPON, HOLSTER_WEAPON, TAKE_ZAZA, LIGHT_ZAZA, diff --git a/base/scripts/player/player.gd b/base/scripts/player/player.gd index beeac61..8585a53 100644 --- a/base/scripts/player/player.gd +++ b/base/scripts/player/player.gd @@ -6,6 +6,7 @@ extends CharacterBody3D @export var horizontal_sensivity = 0.005 var queue: CommandQueue = CommandQueue.new() +var queue_data: Dictionary = {} @onready var camera: Camera3D = $"Camera" @onready var weapon_player: AnimationPlayer = $"HUD/Weapon/AnimationPlayer" @@ -49,13 +50,12 @@ func _process(_delta: float) -> void: # Slot changing logic var slot_action = false - var slot_id = 0 for slot in slot_actions.size(): if Input.is_action_just_pressed(slot_actions[slot]): slot_action = true - slot_id = slot + queue_data['slot_id'] = slot if slot_action: - weapons.select_slot(slot_id) + push_copied_command(CommandQueue.Command.HOLSTER_WEAPON, weapon_sides) # Stop firing logic if not current_weapon.fire_mode is SingleFireMode: @@ -109,7 +109,8 @@ func on_weapon_slot_selected(): current_weapon.fire_allowed.connect(finish_task) weapon_player.add_animation_library("current", current_weapon.animation_library) - weapon_player.play("current/static") + + push_copied_command(CommandQueue.Command.DRAW_WEAPON, current_weapon.uses_hands) update_ammo_label() @@ -192,6 +193,10 @@ func handle_ended_right_command(command: CommandQueue.Command): weapon_player.play('current/static') current_weapon.reload() update_ammo_label() + CommandQueue.Command.HOLSTER_WEAPON: + weapons.select_slot(queue_data['slot_id']) + CommandQueue.Command.DRAW_WEAPON: + weapon_player.play('current/static') func handle_started_left_command(command: CommandQueue.Command): match command: @@ -203,6 +208,10 @@ func handle_started_right_command(command: CommandQueue.Command): current_weapon.request_fire() CommandQueue.Command.STOP_FIRING: queue.pop() + CommandQueue.Command.DRAW_WEAPON: + weapon_player.play('current/draw') + CommandQueue.Command.HOLSTER_WEAPON: + weapon_player.play('current/holster') func handle_current_left_command(command: CommandQueue.Command): match command: diff --git a/base/scripts/weapons/weapon_base.gd b/base/scripts/weapons/weapon_base.gd index 263e23e..226ef40 100644 --- a/base/scripts/weapons/weapon_base.gd +++ b/base/scripts/weapons/weapon_base.gd @@ -15,7 +15,7 @@ var ammo: int @export var fire_mode: BaseFireMode -## Weapon animation library. Should contain "static", "fire", "reload" animations +## Weapon animation library. Should contain "static", "fire", "reload", "holster", "draw" animations @export var animation_library: AnimationLibrary var is_firing: bool = false From ab7885a3e65751b3304d16a3b420b67e71762a48 Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Sun, 27 Jul 2025 13:25:03 +0300 Subject: [PATCH 2/2] Movement animation --- .../guns/gangstaholder/gangstaholder.tres | 172 +++++++++--------- .../sprites/guns/placeholder/placeholder.tres | 172 +++++++++--------- base/scenes/player.tscn | 66 ++++++- base/scripts/player/player.gd | 18 +- 4 files changed, 251 insertions(+), 177 deletions(-) diff --git a/base/assets/sprites/guns/gangstaholder/gangstaholder.tres b/base/assets/sprites/guns/gangstaholder/gangstaholder.tres index bf6652c..d4c2296 100644 --- a/base/assets/sprites/guns/gangstaholder/gangstaholder.tres +++ b/base/assets/sprites/guns/gangstaholder/gangstaholder.tres @@ -42,6 +42,49 @@ tracks/1/keys = { "values": [true] } +[sub_resource type="Animation" id="Animation_vwudn"] +resource_name = "draw" +length = 0.30001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("14_t6dve"), ExtResource("13_p7jc5"), ExtResource("12_vwudn")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.3), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + [sub_resource type="Animation" id="Animation_8sdfx"] resource_name = "shoot" length = 0.30001 @@ -73,6 +116,49 @@ tracks/1/keys = { }] } +[sub_resource type="Animation" id="Animation_5sdma"] +resource_name = "holster" +length = 0.40001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(-7.45058e-09, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("12_vwudn"), ExtResource("13_p7jc5"), ExtResource("14_t6dve")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(-7.45058e-09, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, true, false] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.4), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + [sub_resource type="Animation" id="Animation_08xoc"] resource_name = "reload" length = 1.10001 @@ -121,92 +207,6 @@ tracks/0/keys = { "values": [ExtResource("11_fahg7")] } -[sub_resource type="Animation" id="Animation_5sdma"] -resource_name = "holster" -length = 0.40001 -step = 0.1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(-7.45058e-09, 0.1, 0.2), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 1, -"values": [ExtResource("12_vwudn"), ExtResource("13_p7jc5"), ExtResource("14_t6dve")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:visible") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(-7.45058e-09, 0.2, 0.3), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 1, -"values": [true, true, false] -} -tracks/2/type = "method" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("../..") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0.4), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"finish_task" -}] -} - -[sub_resource type="Animation" id="Animation_vwudn"] -resource_name = "draw" -length = 0.30001 -step = 0.1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 1, -"values": [ExtResource("14_t6dve"), ExtResource("13_p7jc5"), ExtResource("12_vwudn")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:visible") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} -tracks/2/type = "method" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("../..") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0.3), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"finish_task" -}] -} - [resource] _data = { &"RESET": SubResource("Animation_i1xqq"), diff --git a/base/assets/sprites/guns/placeholder/placeholder.tres b/base/assets/sprites/guns/placeholder/placeholder.tres index a5f5dc7..5c1328f 100644 --- a/base/assets/sprites/guns/placeholder/placeholder.tres +++ b/base/assets/sprites/guns/placeholder/placeholder.tres @@ -42,6 +42,49 @@ tracks/1/keys = { "values": [false] } +[sub_resource type="Animation" id="Animation_y82fu"] +resource_name = "draw" +length = 0.30001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("14_x8exi"), ExtResource("13_7aydm"), ExtResource("12_y82fu")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.3), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + [sub_resource type="Animation" id="Animation_8sdfx"] resource_name = "shoot" length = 0.30001 @@ -73,6 +116,49 @@ tracks/1/keys = { }] } +[sub_resource type="Animation" id="Animation_bkso5"] +resource_name = "holster" +length = 0.40001 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(7.45058e-09, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [ExtResource("12_y82fu"), ExtResource("13_7aydm"), ExtResource("14_x8exi")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(7.45058e-09, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, true, false] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("../..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.4), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"finish_task" +}] +} + [sub_resource type="Animation" id="Animation_08xoc"] resource_name = "reload" length = 1.10001 @@ -121,92 +207,6 @@ tracks/0/keys = { "values": [ExtResource("1_yheqn")] } -[sub_resource type="Animation" id="Animation_bkso5"] -resource_name = "holster" -length = 0.40001 -step = 0.1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(7.45058e-09, 0.1, 0.2), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 1, -"values": [ExtResource("12_y82fu"), ExtResource("13_7aydm"), ExtResource("14_x8exi")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:visible") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(7.45058e-09, 0.2, 0.3), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 1, -"values": [true, true, false] -} -tracks/2/type = "method" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("../..") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0.4), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"finish_task" -}] -} - -[sub_resource type="Animation" id="Animation_y82fu"] -resource_name = "draw" -length = 0.30001 -step = 0.1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 1, -"values": [ExtResource("14_x8exi"), ExtResource("13_7aydm"), ExtResource("12_y82fu")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:visible") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} -tracks/2/type = "method" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("../..") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0.3), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"finish_task" -}] -} - [resource] _data = { &"RESET": SubResource("Animation_i1xqq"), diff --git a/base/scenes/player.tscn b/base/scenes/player.tscn index 422d60b..17c253d 100644 --- a/base/scenes/player.tscn +++ b/base/scenes/player.tscn @@ -1,7 +1,7 @@ -[gd_scene load_steps=8 format=3 uid="uid://dwx5tcatj35gu"] +[gd_scene load_steps=12 format=3 uid="uid://dwx5tcatj35gu"] [ext_resource type="Script" uid="uid://dts8lbivkgsmj" path="res://base/scripts/player/player.gd" id="1_1w3ab"] -[ext_resource type="Texture2D" uid="uid://dxmu14ucuokfl" path="res://base/assets/sprites/guns/placeholder/holster3.png" id="2_gt0rj"] +[ext_resource type="Texture2D" uid="uid://cf7avgppv4kfk" path="res://base/assets/sprites/guns/placeholder/static.png" id="2_gt0rj"] [ext_resource type="PackedScene" uid="uid://bb6ovrbusyxpi" path="res://base/scenes/weapons/weapon_base.tscn" id="2_ma1q3"] [ext_resource type="Script" uid="uid://byhp4pklbjltn" path="res://base/scripts/player/weapon_container.gd" id="3_1w3ab"] [ext_resource type="Script" uid="uid://diu6eno2ag6ga" path="res://base/scripts/player/weapon_slot.gd" id="4_gt0rj"] @@ -9,6 +9,62 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jjqxs"] +[sub_resource type="Animation" id="Animation_8sdfx"] +resource_name = "default" +length = 1.33334 +loop_mode = 1 +step = 0.0166667 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("HUD/Weapon:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.333333, 0.666667, 1, 1.33333), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(16, 32), Vector2(0, 0), Vector2(32, 32), Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_gt0rj"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("HUD/Weapon:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_juj2l"] +resource_name = "static" +step = 0.0 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("HUD/Weapon:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0.00466507), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_juj2l"] +_data = { +&"RESET": SubResource("Animation_gt0rj"), +&"default": SubResource("Animation_8sdfx"), +&"static": SubResource("Animation_juj2l") +} + [node name="Player" type="CharacterBody3D"] collision_layer = 2 collision_mask = 3 @@ -69,3 +125,9 @@ metadata/_custom_type_script = "uid://diu6eno2ag6ga" [node name="Tertiary" type="Node3D" parent="WeaponContainer"] script = ExtResource("4_gt0rj") metadata/_custom_type_script = "uid://diu6eno2ag6ga" + +[node name="MovementPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_juj2l") +} +blend_times = [&"goto_static", &"static", 0.5] diff --git a/base/scripts/player/player.gd b/base/scripts/player/player.gd index 8585a53..5364d73 100644 --- a/base/scripts/player/player.gd +++ b/base/scripts/player/player.gd @@ -10,16 +10,19 @@ var queue_data: Dictionary = {} @onready var camera: Camera3D = $"Camera" @onready var weapon_player: AnimationPlayer = $"HUD/Weapon/AnimationPlayer" +@onready var movement_player: AnimationPlayer = $"MovementPlayer" @onready var weapons: WeaponContainer = $"WeaponContainer" # Placeholder UI @onready var ammo_label: Label = $"HUD/Ammo" -var current_weapon:Weapon +var current_weapon: Weapon var slot_actions: Array[StringName] = [ "slot_primary", "slot_secondary", "slot_tertiary" ] func _ready() -> void: + movement_player.play('static') + queue.command_pushed.connect(on_queue_command_pushed) queue.command_popped.connect(on_queue_command_popped) queue.command_started.connect(on_queue_command_started) @@ -50,11 +53,14 @@ func _process(_delta: float) -> void: # Slot changing logic var slot_action = false + var slot_id = 0 for slot in slot_actions.size(): if Input.is_action_just_pressed(slot_actions[slot]): slot_action = true - queue_data['slot_id'] = slot - if slot_action: + slot_id = slot + if slot_action and weapons.slots[slot_id].has_weapon \ + and weapons.current_slot != weapons.slots[slot_id]: + queue_data['slot_id'] = slot_id push_copied_command(CommandQueue.Command.HOLSTER_WEAPON, weapon_sides) # Stop firing logic @@ -82,6 +88,12 @@ func _physics_process(delta: float) -> void: target_velocity.y -= fall_acceleration * delta velocity = target_velocity + + if velocity == Vector3.ZERO and movement_player.current_animation == 'default': + movement_player.play('static') + elif movement_player.current_animation == 'static': + movement_player.play('default') + move_and_slide() func _input(event):