From 4a32254bca2e7e8d21aba79b5a1f56961f26a190 Mon Sep 17 00:00:00 2001 From: Carson McManus Date: Thu, 27 Jul 2023 12:01:19 -0400 Subject: [PATCH] ctf: implement respawning --- examples/ctf.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/examples/ctf.rs b/examples/ctf.rs index 49c2064d3..80c5185c6 100644 --- a/examples/ctf.rs +++ b/examples/ctf.rs @@ -10,6 +10,7 @@ use valence::inventory::HeldItem; use valence::prelude::*; use valence_client::interact_block::InteractBlockEvent; use valence_client::message::SendMessage; +use valence_client::status::RequestRespawnEvent; use valence_entity::cow::CowEntityBundle; use valence_entity::entity::Flags; use valence_entity::living::Health; @@ -50,6 +51,7 @@ pub fn main() { // visualize_triggers, update_clones, teleport_oob_clients, + necromancy, ), ) .run(); @@ -881,3 +883,29 @@ fn teleport_oob_clients(mut clients: Query<(&mut Position, &Team), With> } } } + +/// Handles respawning dead players. +fn necromancy( + mut clients: Query<( + &mut VisibleChunkLayer, + &mut RespawnPosition, + &Team, + &mut Health, + )>, + mut events: EventReader, + layers: Query, With)>, +) { + for event in events.iter() { + if let Ok((mut visible_chunk_layer, mut respawn_pos, team, mut health)) = + clients.get_mut(event.client) + { + respawn_pos.pos = BlockPos::from_pos(team.spawn_pos()); + health.0 = 20.0; + + let main_layer = layers.single(); + + // this gets the client to get rid of the respawn screen + visible_chunk_layer.0 = main_layer; + } + } +}