diff --git a/godot/scenes/player/local_player.tscn b/godot/scenes/player/local_player.tscn index dbb2933..49ce4f0 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")] +[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh", "collider", "splorch", "dead_cam_target", "respawn_label", "ball_origin")] look_sensitivity = 1.5 camera = NodePath("camera_3d") move_speed = 5.0 @@ -17,6 +17,7 @@ collider = NodePath("collision_shape_3d2") splorch = NodePath("splorch") dead_cam_target = NodePath("dead_camera_target") respawn_label = NodePath("respawn_label") +ball_origin = NodePath("camera_3d") health = 100 collision_mask = 4 diff --git a/godot/scenes/player/remote_player.tscn b/godot/scenes/player/remote_player.tscn index 258ad3f..39a7b45 100644 --- a/godot/scenes/player/remote_player.tscn +++ b/godot/scenes/player/remote_player.tscn @@ -30,3 +30,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7611488, 0) [node name="spectate_camera" type="Camera3D" parent="spectate_root" unique_id=1408688016] transform = Transform3D(1, 0, 0, 0, 0.89379096, 0.44848388, 0, -0.44848388, 0.89379096, 0, 0.6601318, 1.0407685) + +[node name="ball_origin" type="Node3D" parent="." unique_id=1445680156] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8724979, -0.2644562) diff --git a/rust/src/player.rs b/rust/src/player.rs index 2981c89..118474f 100644 --- a/rust/src/player.rs +++ b/rust/src/player.rs @@ -52,10 +52,12 @@ pub trait IPlayer { fn swap_weapon(&mut self, weapon: WeaponType); fn get_weapon(&self) -> Option>; fn drop_ball(&mut self, with_velocity: bool) -> bool; + fn get_ball_origin(&self) -> Option>; } pub trait PlayerMovement { fn player_update(&mut self, delta: f64); + fn drop_ball_common(&mut self, with_velocity: bool) -> bool; } impl PlayerMovement for T { @@ -80,6 +82,35 @@ impl PlayerMovement for T { self.base_mut().move_and_slide(); } } + + fn drop_ball_common(&mut self, with_velocity: bool) -> bool { + if let Some(weapon) = self.get_weapon() + && let Ok(_) = weapon.try_cast::() + { + self.run_deferred(|s| { + if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer + && let PeerKind::Server(peer, _) = peer + { + s.swap_weapon(WeaponType::Raygun); + peer.broadcast_reliable(Package::SwapWeapon( + s.get_player_id().unwrap_or(0), + WeaponType::Raygun, + )); + if let Some(mut game) = Game::singleton() { + if let Some(ball_origin) = &s.get_ball_origin() { + game.bind_mut().spawn_ball(Some(NetTransform { + location: ball_origin.get_global_position().into(), + rotation: ball_origin.get_global_rotation().into(), + })); + } + } + } + }); + true + } else { + false + } + } } #[derive(GodotClass)] @@ -102,6 +133,8 @@ pub struct LocalPlayer { #[export] respawn_label: Option>, #[export] + ball_origin: Option>, + #[export] health: i32, pub player_id: Option, @@ -253,27 +286,11 @@ impl IPlayer for LocalPlayer { } fn drop_ball(&mut self, with_velocity: bool) -> bool { - if let Some(weapon) = self.get_weapon() - && let Ok(_) = weapon.try_cast::() - { - self.run_deferred(|s| { - if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer - && let PeerKind::Server(peer, _) = peer - { - s.swap_weapon(WeaponType::Raygun); - peer.broadcast_reliable(Package::SwapWeapon( - s.player_id.unwrap_or(0), - WeaponType::Raygun, - )); - if let Some(mut game) = Game::singleton() { - game.bind_mut().spawn_ball(None); - } - } - }); - true - } else { - false - } + self.drop_ball_common(with_velocity) + } + + fn get_ball_origin(&self) -> Option> { + self.ball_origin.clone() } } @@ -468,6 +485,8 @@ pub struct RemotePlayer { health: i32, #[export] spectator_camera: Option>, + #[export] + ball_origin: Option>, pub player_id: Option, @@ -612,27 +631,11 @@ impl IPlayer for RemotePlayer { } fn drop_ball(&mut self, with_velocity: bool) -> bool { - if let Some(weapon) = self.get_weapon() - && let Ok(_) = weapon.try_cast::() - { - self.run_deferred(|s| { - if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer - && let PeerKind::Server(peer, _) = peer - { - s.swap_weapon(WeaponType::Raygun); - peer.broadcast_reliable(Package::SwapWeapon( - s.player_id.unwrap_or(0), - WeaponType::Raygun, - )); - if let Some(mut game) = Game::singleton() { - game.bind_mut().spawn_ball(None); - } - } - }); - true - } else { - false - } + self.drop_ball_common(with_velocity) + } + + fn get_ball_origin(&self) -> Option> { + self.ball_origin.clone() } }