diff --git a/godot/scenes/game_manager.tscn b/godot/scenes/game_manager.tscn index b10cf7b..b1c7fda 100644 --- a/godot/scenes/game_manager.tscn +++ b/godot/scenes/game_manager.tscn @@ -3,5 +3,5 @@ [ext_resource type="MapResource" uid="uid://c7n1tacc7a73t" path="res://maps/default_map.tres" id="1_glms7"] [node name="game_manager" type="GameManager" unique_id=1442044769] -respawn_timer = 5.0 +respawn_timer = 10.0 maps = Array[MapResource]([ExtResource("1_glms7")]) diff --git a/godot/scenes/player/remote_player.tscn b/godot/scenes/player/remote_player.tscn index f4846ae..258ad3f 100644 --- a/godot/scenes/player/remote_player.tscn +++ b/godot/scenes/player/remote_player.tscn @@ -5,12 +5,13 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] -[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "splorch")] +[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "splorch", "spectator_camera")] move_speed = 5.0 soldier_mesh = NodePath("soldier_m") collider = NodePath("collision_shape_3d") splorch = NodePath("gpu_particles_3d") health = 100 +spectator_camera = NodePath("spectate_root/spectate_camera") collision_layer = 2 collision_mask = 4 @@ -23,3 +24,9 @@ shape = SubResource("CapsuleShape3D_1cgct") [node name="gpu_particles_3d" parent="." unique_id=986677517 instance=ExtResource("2_orxjf")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4540546, 0) + +[node name="spectate_root" type="Node3D" parent="." unique_id=624336254] +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) diff --git a/rust/src/player.rs b/rust/src/player.rs index 40346a5..2be8dd5 100644 --- a/rust/src/player.rs +++ b/rust/src/player.rs @@ -113,6 +113,7 @@ pub struct LocalPlayer { is_dead: bool, dead_for: f64, + killer_id: Option, locked: bool, @@ -227,6 +228,7 @@ impl IPlayer for LocalPlayer { splorch.set_emitting(true); } self.is_dead = true; + self.killer_id = Some(source_player); } } @@ -251,6 +253,10 @@ impl ICharacterBody3D for LocalPlayer { if let Some(mesh) = &mut self.soldier_mesh { self.weapon = mesh.bind_mut().spawn_raygun(); } + + if let Some(camera) = &mut self.camera { + camera.set_current(true); + } } fn process(&mut self, delta: f64) { @@ -267,6 +273,25 @@ impl ICharacterBody3D for LocalPlayer { let time_remaining = respawn_timer - self.dead_for; label.set_text(&format!("Respawn in\n{:.2}", time_remaining)); } + + if let Some(camera) = &self.camera { + if camera.is_current() && self.dead_for > 3. { + if let Some(game) = Game::singleton() + && let Some(killer_id) = self.killer_id + { + let game = game.bind(); + let remote_player = game.find_player(killer_id); + if let Some(remote_player) = &remote_player + && let Some(remote_character) = remote_player.character.clone() + && let Ok(mut remote_character) = + remote_character.try_cast::() + && let Some(camera) = &mut remote_character.bind_mut().spectator_camera + { + camera.set_current(true); + } + } + } + } } self.shoot_cd -= delta; @@ -398,6 +423,8 @@ pub struct RemotePlayer { splorch: Option>, #[export] health: i32, + #[export] + spectator_camera: Option>, pub player_id: Option, pub weapon: Option>,