From f750f2843c0b7c828a9fdcb9284d0f2fc72ea3b1 Mon Sep 17 00:00:00 2001 From: Sofia Date: Tue, 21 Jul 2026 23:31:28 +0300 Subject: [PATCH] Remove hands from local player, add proper gun_node --- godot/scenes/player/local_player.tscn | 6 +++- godot/scenes/player/soldier_m.tscn | 32 ++++++++++++--------- rust/src/lib.rs | 1 + rust/src/net/protocol.rs | 2 +- rust/src/player.rs | 41 ++++++++++++++++++++++----- rust/src/player_hand_remover.rs | 26 +++++++++++++++++ rust/src/soldier_mesh.rs | 11 +++++-- 7 files changed, 93 insertions(+), 26 deletions(-) create mode 100644 rust/src/player_hand_remover.rs diff --git a/godot/scenes/player/local_player.tscn b/godot/scenes/player/local_player.tscn index 49ce4f0..23879bd 100644 --- a/godot/scenes/player/local_player.tscn +++ b/godot/scenes/player/local_player.tscn @@ -8,7 +8,7 @@ glow_enabled = true [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_oh8vq"] -[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh", "collider", "splorch", "dead_cam_target", "respawn_label", "ball_origin")] +[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh", "collider", "splorch", "dead_cam_target", "respawn_label", "ball_origin", "weapon_node")] look_sensitivity = 1.5 camera = NodePath("camera_3d") move_speed = 5.0 @@ -18,6 +18,7 @@ splorch = NodePath("splorch") dead_cam_target = NodePath("dead_camera_target") respawn_label = NodePath("respawn_label") ball_origin = NodePath("camera_3d") +weapon_node = NodePath("camera_3d/weapon_node") health = 100 collision_mask = 4 @@ -27,6 +28,9 @@ environment = SubResource("Environment_3nx84") current = true fov = 90.0 +[node name="weapon_node" type="Node3D" parent="camera_3d" unique_id=919330414] +transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0.09660053, -0.1177212, -0.048912734) + [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.15878421, 0, 0.19227558) diff --git a/godot/scenes/player/soldier_m.tscn b/godot/scenes/player/soldier_m.tscn index 87b97c8..c289320 100644 --- a/godot/scenes/player/soldier_m.tscn +++ b/godot/scenes/player/soldier_m.tscn @@ -44,23 +44,24 @@ nodes/Movement/node = SubResource("AnimationNodeBlendSpace2D_tt88r") nodes/Movement/position = Vector2(350, 90) node_connections = [&"output", 0, &"Movement"] -[node name="soldier_m" type="SoldierMesh" unique_id=281995630 node_paths=PackedStringArray("hand_attachment", "animation_tree", "skeleton", "look_at")] +[node name="soldier_m" type="SoldierMesh" unique_id=281995630 node_paths=PackedStringArray("hand_attachment", "animation_tree", "skeleton", "look_at", "hand_remover")] hand_attachment = NodePath("bone_attachment_3d/hand") animation_tree = NodePath("animation_tree") skeleton = NodePath("SoldierM/Soldier/Skeleton3D") raygun = ExtResource("1_a50o4") ball = ExtResource("2_jbny0") look_at = NodePath("look_at_root") +hand_remover = NodePath("SoldierM/Soldier/Skeleton3D/player_hand_remover") [node name="SoldierM" parent="." unique_id=1868587353 instance=ExtResource("1_sxefq")] [node name="Skeleton3D" parent="SoldierM/Soldier" parent_id_path=PackedInt32Array(1868587353, 803584260) index="0" unique_id=1574145981] bones/0/position = Vector3(0, 0, 0.00071418716) bones/1/position = Vector3(0, 0, -0.007) -bones/1/rotation = Quaternion(0.69402224, 0, 0, 0.7199537) +bones/1/rotation = Quaternion(0.6942035, 0, 0, 0.7197788) bones/1/scale = Vector3(1, 1, 1) bones/2/position = Vector3(0.002, 3.469447e-18, -1.4901118e-10) -bones/2/rotation = Quaternion(0.9458209, 2.1373747e-08, 2.3266757e-08, -0.3246889) +bones/2/rotation = Quaternion(0.9459847, 2.1362002e-08, 2.3277545e-08, -0.3242114) bones/2/scale = Vector3(1, 1, 1) bones/3/position = Vector3(0, 0.0069999984, 5.169879e-25) bones/3/scale = Vector3(1, 0.99999994, 1) @@ -68,7 +69,7 @@ bones/4/position = Vector3(-2.39752e-11, 0.010049875, -1.4156722e-10) bones/4/rotation = Quaternion(0.73982674, -2.6881349e-08, 7.0005948e-09, 0.67279744) bones/4/scale = Vector3(1, 0.99999994, 0.99999994) bones/6/position = Vector3(-0.002, 3.469447e-18, -1.4901205e-10) -bones/6/rotation = Quaternion(0.9996778, 1.8178714e-08, 1.8650622e-08, 0.025387304) +bones/6/rotation = Quaternion(0.9995959, 1.81219e-08, 1.8705832e-08, 0.02842787) bones/6/scale = Vector3(1, 1, 1) bones/7/position = Vector3(0, 0.0069999984, -5.169879e-25) bones/7/rotation = Quaternion(-0.21973656, 4.264305e-08, 9.604991e-09, 0.9755593) @@ -77,33 +78,33 @@ bones/8/position = Vector3(-2.3975525e-11, 0.010049875, -4.6138777e-11) bones/8/rotation = Quaternion(0.86758894, -7.867721e-09, 3.036851e-08, 0.4972821) bones/8/scale = Vector3(1, 0.99999994, 0.99999994) bones/10/position = Vector3(0, 0.009, 0) -bones/10/rotation = Quaternion(-0.15427561, -0.13167602, 0.019766005, 0.97901475) +bones/10/rotation = Quaternion(-0.1543622, -0.13157132, 0.01979417, 0.97901464) bones/10/scale = Vector3(1, 1, 1) bones/11/position = Vector3(6.8186457e-17, 0.008, 0.001) -bones/11/rotation = Quaternion(0.058245, 0.0001169397, -0.01593934, 0.99817514) +bones/11/rotation = Quaternion(0.058568474, 0.00011758354, -0.016027864, 0.9981548) bones/11/scale = Vector3(1, 1, 1) bones/12/position = Vector3(-2.2285185e-16, 0.0035, 0.0015000002) bones/12/rotation = Quaternion(-0.70710677, 0, 0, 0.70710677) bones/12/scale = Vector3(1, 1, 1) bones/14/position = Vector3(0.005, 0.005, -1.7336413e-21) -bones/14/rotation = Quaternion(0.8948131, 0.033457648, 0.43200484, -0.10752621) +bones/14/rotation = Quaternion(0.8948624, 0.033474486, 0.43199828, -0.10713685) bones/14/scale = Vector3(1, 0.99999994, 1) bones/15/position = Vector3(-1.3005262e-15, 0.0050000004, -6.938894e-18) -bones/15/rotation = Quaternion(1.035401e-08, -6.774687e-09, 0.93067807, 0.3658392) +bones/15/rotation = Quaternion(1.0353366e-08, -6.775671e-09, 0.9306435, 0.3659275) bones/15/scale = Vector3(1, 1, 1) bones/16/position = Vector3(7.632945e-11, 0.007071071, 6.938894e-18) -bones/16/rotation = Quaternion(0.0062737567, -0.0943689, -0.18486792, 0.978202) +bones/16/rotation = Quaternion(0.0061545833, -0.0946999, -0.18472542, 0.9781977) bones/16/scale = Vector3(0.99999994, 0.9999999, 1) bones/18/position = Vector3(-0.005, 0.005, -1.7303326e-21) -bones/18/rotation = Quaternion(0.6564217, 0.1684678, -0.13023898, -0.7237176) +bones/18/rotation = Quaternion(0.6569365, 0.16839267, -0.13031884, -0.72325325) bones/18/scale = Vector3(1, 0.99999994, 1) bones/19/position = Vector3(-1.3005262e-15, 0.0050000004, -6.938894e-18) -bones/19/rotation = Quaternion(-2.1246766e-08, -3.5550773e-08, -0.26809898, 0.9633914) +bones/19/rotation = Quaternion(-2.1264423e-08, -3.5540214e-08, -0.2685776, 0.9632581) bones/19/scale = Vector3(1, 1, 1) bones/20/position = Vector3(-2.2286711e-10, 0.007071072, 0) -bones/20/rotation = Quaternion(-0.112210214, -0.47133064, -0.13382514, 0.8644924) +bones/20/rotation = Quaternion(-0.11203431, -0.4710411, -0.13362855, 0.8647035) bones/20/scale = Vector3(1, 0.9999999, 1) -bones/22/position = Vector3(0.011061782, -0.0085772155, 0.0025831666) +bones/22/position = Vector3(0.01127276, -0.0085772155, 0.0025254297) bones/22/rotation = Quaternion(3.090862e-08, 0.70710677, 0.70710677, 3.090862e-08) bones/22/scale = Vector3(1, 1, 1) bones/24/position = Vector3(-0.011000002, 0.0050000013, 0.0070000007) @@ -151,8 +152,11 @@ relative = true origin_from = 2 origin_external_node = NodePath("../../../../look_at_root") +[node name="player_hand_remover" type="PlayerHandRemover" parent="SoldierM/Soldier/Skeleton3D" index="4" unique_id=2077460571] +transform = Transform3D(1, -2.2737368e-13, 0, 2.2737368e-13, 1, 0, -1.3552527e-20, 0, 1, 0, 0, 0) + [node name="bone_attachment_3d" type="BoneAttachment3D" parent="." unique_id=1964353847] -transform = Transform3D(-35.07064, 3.824201, -93.57043, -83.59483, 43.760143, 33.120216, 42.213154, 89.83552, -12.150139, -0.47213513, 3.3899364, 0.7408379) +transform = Transform3D(-35.09831, 3.8198574, -93.56024, -83.58222, 43.767776, 33.14208, 42.21521, 89.832, -12.169015, -0.47216344, 3.3898914, 0.7404115) bone_name = "HAND.R_end" bone_idx = 17 use_external_skeleton = true diff --git a/rust/src/lib.rs b/rust/src/lib.rs index bbc4953..cdef4b2 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -7,6 +7,7 @@ pub mod map; pub mod map_resource; pub mod net; pub mod player; +pub mod player_hand_remover; pub mod soldier_mesh; pub mod ui; pub mod weapon; diff --git a/rust/src/net/protocol.rs b/rust/src/net/protocol.rs index 1e1ea73..bd27ef3 100644 --- a/rust/src/net/protocol.rs +++ b/rust/src/net/protocol.rs @@ -1,6 +1,6 @@ use std::net::SocketAddr; -use teanet::{Peer, PeerMessage}; +use teanet::PeerMessage; use crate::{ game_manager::{Game, GameManager}, diff --git a/rust/src/player.rs b/rust/src/player.rs index 155d926..26826c6 100644 --- a/rust/src/player.rs +++ b/rust/src/player.rs @@ -20,9 +20,10 @@ use crate::{ }, util::{NetVector3, cast_ray}, }, + player_hand_remover::PlayerHandRemover, soldier_mesh::SoldierMesh, ui::cli::CommandLinePanel, - weapon::{BallWeapon, Weapon, WeaponType}, + weapon::{BallWeapon, Raygun, Weapon, WeaponType}, }; #[derive(Debug, Clone, Copy, Serialize, Deserialize)] @@ -154,10 +155,14 @@ pub struct LocalPlayer { #[export] ball_origin: Option>, #[export] + weapon_node: Option>, + #[export] health: i32, pub player_id: Option, + pub weapon: Option>, + movement_dir: Vector3, y_speed: f32, look_up: f32, @@ -292,18 +297,24 @@ impl IPlayer for LocalPlayer { } fn swap_weapon(&mut self, weapon: WeaponType) { - if let Some(mesh) = &mut self.soldier_mesh { + if let Some(mesh) = self.soldier_mesh.clone() { match weapon { - WeaponType::Raygun => mesh.bind_mut().spawn_raygun(), - WeaponType::Ball => mesh.bind_mut().spawn_ball(), + WeaponType::Raygun => { + if let Some(raygun) = &mesh.bind().raygun { + self.spawn_weapon(raygun.instantiate_as::().into_dyn().upcast()); + } + } + WeaponType::Ball => { + if let Some(ball) = &mesh.bind().ball { + self.spawn_weapon(ball.instantiate_as::().into_dyn().upcast()); + } + } }; } } fn get_weapon(&self) -> Option> { - self.soldier_mesh - .as_ref() - .and_then(|m| m.bind().get_weapon()) + self.weapon.clone() } fn drop_ball(&mut self, with_velocity: bool) -> bool { @@ -338,6 +349,12 @@ impl ICharacterBody3D for LocalPlayer { if let Some(camera) = &mut self.camera { camera.set_current(true); } + + if let Some(mesh) = &mut self.soldier_mesh + && let Some(remover) = &mut mesh.bind_mut().hand_remover + { + remover.bind_mut().active = true; + } } fn process(&mut self, delta: f64) { @@ -489,6 +506,16 @@ impl LocalPlayer { Input::singleton().set_mouse_mode(MouseMode::VISIBLE); } } + + fn spawn_weapon(&mut self, weapon: DynGd) { + if let Some(mut weapon) = self.weapon.take() { + weapon.queue_free(); + } + if let Some(weapon_node) = &mut self.weapon_node { + weapon_node.add_child(&weapon); + self.weapon = Some(weapon); + } + } } #[derive(GodotClass)] diff --git a/rust/src/player_hand_remover.rs b/rust/src/player_hand_remover.rs new file mode 100644 index 0000000..769e1e0 --- /dev/null +++ b/rust/src/player_hand_remover.rs @@ -0,0 +1,26 @@ +use godot::{ + classes::{ISkeletonModifier3D, SkeletonModifier3D}, + prelude::*, +}; + +#[derive(GodotClass)] +#[class(base=SkeletonModifier3D, init)] +pub struct PlayerHandRemover { + pub active: bool, + + base: Base, +} + +#[godot_api] +impl ISkeletonModifier3D for PlayerHandRemover { + fn process_modification_with_delta(&mut self, delta: f64) { + if self.active { + if let Some(mut skeleton) = self.base_mut().get_skeleton() { + let uar = skeleton.find_bone("UA.R"); + let ual = skeleton.find_bone("UA.L"); + skeleton.set_bone_pose_scale(uar, Vector3::ZERO); + skeleton.set_bone_pose_scale(ual, Vector3::ZERO); + } + } + } +} diff --git a/rust/src/soldier_mesh.rs b/rust/src/soldier_mesh.rs index 45131be..ea681dd 100644 --- a/rust/src/soldier_mesh.rs +++ b/rust/src/soldier_mesh.rs @@ -3,7 +3,10 @@ use godot::{ prelude::*, }; -use crate::weapon::{BallWeapon, Raygun, Weapon}; +use crate::{ + player_hand_remover::PlayerHandRemover, + weapon::{BallWeapon, Raygun, Weapon}, +}; #[derive(GodotClass)] #[class(base=Node3D, init)] @@ -15,11 +18,13 @@ pub struct SoldierMesh { #[export] skeleton: Option>, #[export] - raygun: Option>, + pub raygun: Option>, #[export] - ball: Option>, + pub ball: Option>, #[export] look_at: Option>, + #[export] + pub hand_remover: Option>, pub current_weapon: Option>,