Add a lot of assets, add player model somewhat

This commit is contained in:
Sofia 2026-07-19 20:41:14 +03:00
parent eb20849844
commit 1bb646b3c2
43 changed files with 1500 additions and 38 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
godot/assets/Gear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c7epv5p0qau02"
path.s3tc="res://.godot/imported/Gear.png-4a33d7121b716ce6c6e8a5c001bd6bc4.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/Gear.png"
dest_files=["res://.godot/imported/Gear.png-4a33d7121b716ce6c6e8a5c001bd6bc4.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=0

BIN
godot/assets/Hit.mp3 Normal file

Binary file not shown.

View File

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bfg31e3s4jv8c"
path="res://.godot/imported/Hit.mp3-1e43ad11df7f4d135dfebfbf61e21305.mp3str"
[deps]
source_file="res://assets/Hit.mp3"
dest_files=["res://.godot/imported/Hit.mp3-1e43ad11df7f4d135dfebfbf61e21305.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
godot/assets/LaserFast.mp3 Normal file

Binary file not shown.

View File

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://dw5vleoexlhwx"
path="res://.godot/imported/LaserFast.mp3-7950076d801cb865e24808499aec09df.mp3str"
[deps]
source_file="res://assets/LaserFast.mp3"
dest_files=["res://.godot/imported/LaserFast.mp3-7950076d801cb865e24808499aec09df.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
godot/assets/LaserShot.ogg Normal file

Binary file not shown.

View File

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://dlsto2l7tudif"
path="res://.godot/imported/LaserShot.ogg-6aac68be79c568543c2853d102341790.oggvorbisstr"
[deps]
source_file="res://assets/LaserShot.ogg"
dest_files=["res://.godot/imported/LaserShot.ogg-6aac68be79c568543c2853d102341790.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

View File

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://cqboecwvt1cp8"
path="res://.godot/imported/LaserWithRecovery.mp3-10fbe4c1e5d75ceb94f91b483f19f811.mp3str"
[deps]
source_file="res://assets/LaserWithRecovery.mp3"
dest_files=["res://.godot/imported/LaserWithRecovery.mp3-10fbe4c1e5d75ceb94f91b483f19f811.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

View File

@ -0,0 +1,19 @@
[remap]
importer="oggvorbisstr"
type="AudioStreamOggVorbis"
uid="uid://xxpkjhaovyd"
path="res://.godot/imported/LaserWithRecoveryEdited.ogg-7b52758d22998fcb799b2fc8da1b30b1.oggvorbisstr"
[deps]
source_file="res://assets/LaserWithRecoveryEdited.ogg"
dest_files=["res://.godot/imported/LaserWithRecoveryEdited.ogg-7b52758d22998fcb799b2fc8da1b30b1.oggvorbisstr"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
godot/assets/Raygun.fbx Normal file

Binary file not shown.

View File

@ -0,0 +1,46 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://ckl63r2rgqra7"
path="res://.godot/imported/Raygun.fbx-2973e1d298710d4aade91960a0085ed7.scn"
[deps]
source_file="res://assets/Raygun.fbx"
dest_files=["res://.godot/imported/Raygun.fbx-2973e1d298710d4aade91960a0085ed7.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
mesh_library/use_node_names_as_mesh_names=false
array_mesh/deduplicate_surfaces=true
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=true
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
fbx/importer=0
fbx/allow_geometry_helper_nodes=false
fbx/embedded_image_handling=1
fbx/naming_version=2

BIN
godot/assets/Soldier.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbvxh8xp8ilac"
path="res://.godot/imported/Soldier.png-df8ce7c3aef599e55e465baf8a8fb940.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/Soldier.png"
dest_files=["res://.godot/imported/Soldier.png-df8ce7c3aef599e55e465baf8a8fb940.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=0

BIN
godot/assets/SoldierF.fbx Normal file

Binary file not shown.

View File

@ -0,0 +1,46 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://hoh8hhdo2epf"
path="res://.godot/imported/SoldierF.fbx-a9563c4d0e146b777cf04292b446b71b.scn"
[deps]
source_file="res://assets/SoldierF.fbx"
dest_files=["res://.godot/imported/SoldierF.fbx-a9563c4d0e146b777cf04292b446b71b.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
mesh_library/use_node_names_as_mesh_names=false
array_mesh/deduplicate_surfaces=true
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=true
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
fbx/importer=0
fbx/allow_geometry_helper_nodes=false
fbx/embedded_image_handling=1
fbx/naming_version=2

BIN
godot/assets/SoldierM.fbx Normal file

Binary file not shown.

View File

@ -0,0 +1,46 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dk6l25ooah3ap"
path="res://.godot/imported/SoldierM.fbx-337e6d55347223adba2f34b068add0bd.scn"
[deps]
source_file="res://assets/SoldierM.fbx"
dest_files=["res://.godot/imported/SoldierM.fbx-337e6d55347223adba2f34b068add0bd.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
mesh_library/use_node_names_as_mesh_names=false
array_mesh/deduplicate_surfaces=true
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=true
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
fbx/importer=0
fbx/allow_geometry_helper_nodes=false
fbx/embedded_image_handling=1
fbx/naming_version=2

View File

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://d3rjo75pb7dvx"]
[ext_resource type="Texture2D" uid="uid://c7epv5p0qau02" path="res://assets/Gear.png" id="1_qr2ym"]
[resource]
albedo_texture = ExtResource("1_qr2ym")
texture_filter = 0

View File

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://ynnhfjaijwf2"]
[ext_resource type="Texture2D" uid="uid://cbvxh8xp8ilac" path="res://assets/Soldier.png" id="1_1r3w7"]
[resource]
albedo_texture = ExtResource("1_1r3w7")
texture_filter = 0

9
godot/mesh/raygun.tscn Normal file
View File

@ -0,0 +1,9 @@
[gd_scene format=3 uid="uid://cg81784ct8gf5"]
[ext_resource type="PackedScene" uid="uid://ckl63r2rgqra7" path="res://assets/Raygun.fbx" id="1_njit6"]
[ext_resource type="Material" uid="uid://d3rjo75pb7dvx" path="res://mesh/materials/gear.tres" id="2_81k8r"]
[node name="Raygun" unique_id=1928455392 instance=ExtResource("1_njit6")]
[node name="Sniper_Rifle" parent="." index="0" unique_id=1373814885]
surface_material_override/0 = ExtResource("2_81k8r")

View File

@ -0,0 +1,9 @@
[gd_scene format=3 uid="uid://c5es36uh06m3s"]
[ext_resource type="PackedScene" uid="uid://hoh8hhdo2epf" path="res://assets/SoldierF.fbx" id="1_22b8v"]
[ext_resource type="Material" uid="uid://ynnhfjaijwf2" path="res://mesh/materials/soldier_material.tres" id="2_eabro"]
[node name="SoldierF" unique_id=686733085 instance=ExtResource("1_22b8v")]
[node name="Soldier_Female_Mesh" parent="Soldier_Female/Skeleton3D" parent_id_path=PackedInt32Array(210736176) index="0" unique_id=1355420912]
surface_material_override/0 = ExtResource("2_eabro")

33
godot/mesh/soldier_m.tscn Normal file
View File

@ -0,0 +1,33 @@
[gd_scene format=3 uid="uid://ncxcmgdit2j1"]
[ext_resource type="PackedScene" uid="uid://dk6l25ooah3ap" path="res://assets/SoldierM.fbx" id="1_bn1bx"]
[ext_resource type="Texture2D" uid="uid://cbvxh8xp8ilac" path="res://assets/Soldier.png" id="2_n4j5p"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_n4j5p"]
albedo_texture = ExtResource("2_n4j5p")
texture_filter = 0
[node name="SoldierM" unique_id=1868587353 instance=ExtResource("1_bn1bx")]
[node name="Male_IK_HAND_R" parent="Aim_Control" parent_id_path=PackedInt32Array(1488925479) index="1" unique_id=1011336848]
transform = Transform3D(0.005883459, -0.29583848, 0.4030446, -0.40563864, 0.23280492, 0.17680238, -0.29227144, -0.3290613, -0.23726773, 0.005743145, 1.1526048e-05, -0.001571659)
[node name="Skeleton3D" parent="Soldier" parent_id_path=PackedInt32Array(1731022909) index="0" unique_id=1317624294]
bones/2/rotation = Quaternion(0.95160115, 2.0944638e-08, 2.3653786e-08, -0.30733573)
bones/3/rotation = Quaternion(-0.35209325, 4.091232e-08, 1.5390487e-08, 0.93596494)
bones/4/rotation = Quaternion(0.7398268, -2.6881363e-08, 7.0005823e-09, 0.6727974)
bones/6/rotation = Quaternion(0.99905884, 1.7840092e-08, 1.8974825e-08, 0.043377537)
bones/7/rotation = Quaternion(-0.21973659, 4.264305e-08, 9.6049915e-09, 0.9755593)
bones/8/rotation = Quaternion(0.86758906, -7.8677225e-09, 3.0368508e-08, 0.49728197)
bones/10/rotation = Quaternion(-0.17222604, -0.13130432, 0.022178583, 0.9760151)
bones/11/rotation = Quaternion(-7.566992e-10, 4.6566073e-10, -9.313229e-10, 1)
bones/14/rotation = Quaternion(0.88124394, 0.03244469, 0.43789235, -0.17494844)
bones/15/rotation = Quaternion(-1.1794475e-08, 6.1331285e-08, 0.9187617, 0.39481288)
bones/16/rotation = Quaternion(0.029948184, -0.036407195, -0.18585202, 0.9814462)
bones/18/rotation = Quaternion(0.6445215, 0.21459225, -0.094257906, -0.72777593)
bones/19/rotation = Quaternion(-1.332124e-08, -2.4520514e-08, -0.15752357, 0.98751533)
bones/20/rotation = Quaternion(-0.14214668, -0.45634764, -0.17772992, 0.86020535)
bones/22/position = Vector3(0.012593047, -0.0085772155, 0.0021641199)
[node name="Soldier_Male_Mesh" parent="Soldier/Skeleton3D" index="0" unique_id=1081951616]
surface_material_override/0 = SubResource("StandardMaterial3D_n4j5p")

View File

@ -35,6 +35,10 @@ project/assembly_name="QuakeBall"
naming/node_name_casing=2 naming/node_name_casing=2
[filesystem]
import/blender/enabled=false
[input] [input]
toggle_cli={ toggle_cli={

View File

@ -1,21 +0,0 @@
[gd_scene format=3 uid="uid://ct70bpbca8one"]
[sub_resource type="CapsuleMesh" id="CapsuleMesh_1cgct"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera")]
look_sensitivity = 1.5
camera = NodePath("camera_3d")
move_speed = 5.0
collision_mask = 2
[node name="mesh_instance_3d" type="MeshInstance3D" parent="." unique_id=700336478]
mesh = SubResource("CapsuleMesh_1cgct")
[node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=1110995513]
shape = SubResource("CapsuleShape3D_1cgct")
[node name="camera_3d" type="Camera3D" parent="." unique_id=1773137418]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5391109, 0)
current = true

View File

@ -1,7 +1,7 @@
[gd_scene format=3 uid="uid://7iooamjot1tg"] [gd_scene format=3 uid="uid://7iooamjot1tg"]
[ext_resource type="PackedScene" uid="uid://ct70bpbca8one" path="res://scenes/local_player.tscn" id="1_yjvui"] [ext_resource type="PackedScene" uid="uid://ct70bpbca8one" path="res://scenes/player/local_player.tscn" id="1_yjvui"]
[ext_resource type="PackedScene" uid="uid://kfxc0migw80o" path="res://scenes/remote_player.tscn" id="2_kcncr"] [ext_resource type="PackedScene" uid="uid://kfxc0migw80o" path="res://scenes/player/remote_player.tscn" id="2_kcncr"]
[sub_resource type="ImageTexture" id="ImageTexture_3vyb7"] [sub_resource type="ImageTexture" id="ImageTexture_3vyb7"]

View File

@ -0,0 +1,23 @@
[gd_scene format=3 uid="uid://ct70bpbca8one"]
[ext_resource type="PackedScene" uid="uid://bod6b3befmyt5" path="res://scenes/player/soldier_m.tscn" id="1_jd651"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_oh8vq"]
[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh")]
look_sensitivity = 1.5
camera = NodePath("camera_3d")
move_speed = 5.0
soldier_mesh = NodePath("soldier_m")
collision_mask = 2
[node name="camera_3d" type="Camera3D" parent="." unique_id=1773137418]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8724979, -0.2644562)
current = true
[node name="soldier_m" parent="." unique_id=281995630 instance=ExtResource("1_jd651")]
transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5, 0, 0, 0)
[node name="collision_shape_3d2" type="CollisionShape3D" parent="." unique_id=442150782]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0310049, 0)
shape = SubResource("CapsuleShape3D_oh8vq")

View File

@ -0,0 +1,7 @@
[gd_scene format=3 uid="uid://cw7duhhjebypt"]
[ext_resource type="PackedScene" uid="uid://cg81784ct8gf5" path="res://mesh/raygun.tscn" id="1_ckadf"]
[node name="raygun" type="Node3D" unique_id=255606277]
[node name="Raygun" parent="." unique_id=1928455392 instance=ExtResource("1_ckadf")]

View File

@ -0,0 +1,17 @@
[gd_scene format=3 uid="uid://kfxc0migw80o"]
[ext_resource type="PackedScene" uid="uid://bod6b3befmyt5" path="res://scenes/player/soldier_m.tscn" id="1_e2ekk"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh")]
move_speed = 5.0
soldier_mesh = NodePath("soldier_m")
collision_mask = 2
[node name="soldier_m" parent="." unique_id=281995630 instance=ExtResource("1_e2ekk")]
transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5, 0, 0, 0)
[node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=1110995513]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0310049, 0)
shape = SubResource("CapsuleShape3D_1cgct")

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +0,0 @@
[gd_scene format=3 uid="uid://kfxc0migw80o"]
[sub_resource type="CapsuleMesh" id="CapsuleMesh_1cgct"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
[node name="player" type="RemotePlayer" unique_id=845968872]
move_speed = 5.0
collision_mask = 2
[node name="mesh_instance_3d" type="MeshInstance3D" parent="." unique_id=700336478]
mesh = SubResource("CapsuleMesh_1cgct")
[node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=1110995513]
shape = SubResource("CapsuleShape3D_1cgct")

View File

@ -7,6 +7,7 @@ pub mod map;
pub mod map_resource; pub mod map_resource;
pub mod net; pub mod net;
pub mod player; pub mod player;
pub mod soldier_mesh;
pub mod ui; pub mod ui;
struct MyExtension; struct MyExtension;

View File

@ -15,6 +15,7 @@ use crate::{
network_manager::{NetworkManager, Package::Jump, PeerKind}, network_manager::{NetworkManager, Package::Jump, PeerKind},
util::NetVector3, util::NetVector3,
}, },
soldier_mesh::SoldierMesh,
ui::cli::CommandLinePanel, ui::cli::CommandLinePanel,
}; };
@ -70,6 +71,8 @@ pub struct LocalPlayer {
camera: Option<Gd<Camera3D>>, camera: Option<Gd<Camera3D>>,
#[export] #[export]
move_speed: f32, move_speed: f32,
#[export]
soldier_mesh: Option<Gd<SoldierMesh>>,
pub player_id: Option<u16>, pub player_id: Option<u16>,
@ -151,6 +154,10 @@ impl ICharacterBody3D for LocalPlayer {
.connect_other(self, |s| { .connect_other(self, |s| {
s.set_lock(true); s.set_lock(true);
}); });
if let Some(mesh) = &mut self.soldier_mesh {
mesh.bind_mut().spawn_raygun();
}
} }
fn process(&mut self, delta: f64) { fn process(&mut self, delta: f64) {
@ -209,6 +216,8 @@ impl LocalPlayer {
pub struct RemotePlayer { pub struct RemotePlayer {
#[export] #[export]
move_speed: f32, move_speed: f32,
#[export]
soldier_mesh: Option<Gd<SoldierMesh>>,
pub player_id: Option<u16>, pub player_id: Option<u16>,
@ -269,7 +278,18 @@ impl IPlayer for RemotePlayer {
#[godot_api] #[godot_api]
impl ICharacterBody3D for RemotePlayer { impl ICharacterBody3D for RemotePlayer {
fn ready(&mut self) {
if let Some(mesh) = &mut self.soldier_mesh {
mesh.bind_mut().spawn_raygun();
}
}
fn process(&mut self, delta: f64) { fn process(&mut self, delta: f64) {
self.player_update(delta); self.player_update(delta);
if let Some(mesh) = &mut self.soldier_mesh {
mesh.bind_mut()
.update_movement(Vector2::new(self.movement_dir.x, -self.movement_dir.z));
}
} }
} }

38
rust/src/soldier_mesh.rs Normal file
View File

@ -0,0 +1,38 @@
use godot::{
classes::{AnimationPlayer, AnimationTree},
prelude::*,
};
#[derive(GodotClass)]
#[class(base=Node3D, init)]
pub struct SoldierMesh {
#[export]
hand_attachment: Option<Gd<Node3D>>,
#[export]
animation_tree: Option<Gd<AnimationTree>>,
#[export]
raygun: Option<Gd<PackedScene>>,
base: Base<Node3D>,
}
impl SoldierMesh {
pub fn update_movement(&mut self, movement: Vector2) {
if let Some(tree) = &mut self.animation_tree {
tree.set("parameters/Movement/blend_position", &movement.to_variant());
}
}
pub fn spawn_raygun(&mut self) {
if let Some(raygun) = &self.raygun {
let node = raygun.instantiate_as::<Node3D>();
self.spawn_weapon(node);
}
}
fn spawn_weapon(&mut self, node: Gd<Node3D>) {
if let Some(hand) = &mut self.hand_attachment {
hand.add_child(&node);
}
}
}