aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/plugins/respawn.rs
diff options
context:
space:
mode:
Diffstat (limited to 'azalea-client/src/plugins/respawn.rs')
-rw-r--r--azalea-client/src/plugins/respawn.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/azalea-client/src/plugins/respawn.rs b/azalea-client/src/plugins/respawn.rs
new file mode 100644
index 00000000..5797406b
--- /dev/null
+++ b/azalea-client/src/plugins/respawn.rs
@@ -0,0 +1,35 @@
+use azalea_protocol::packets::game::s_client_command::{self, ServerboundClientCommand};
+use bevy_app::{App, Plugin, Update};
+use bevy_ecs::prelude::*;
+
+use super::packet::game::handle_outgoing_packets;
+use crate::packet::game::SendPacketEvent;
+
+/// Tell the server that we're respawning.
+#[derive(Event, Debug, Clone)]
+pub struct PerformRespawnEvent {
+ pub entity: Entity,
+}
+
+/// A plugin that makes [`PerformRespawnEvent`] send the packet to respawn.
+pub struct RespawnPlugin;
+impl Plugin for RespawnPlugin {
+ fn build(&self, app: &mut App) {
+ app.add_event::<PerformRespawnEvent>()
+ .add_systems(Update, perform_respawn.before(handle_outgoing_packets));
+ }
+}
+
+pub fn perform_respawn(
+ mut events: EventReader<PerformRespawnEvent>,
+ mut send_packets: EventWriter<SendPacketEvent>,
+) {
+ for event in events.read() {
+ send_packets.send(SendPacketEvent::new(
+ event.entity,
+ ServerboundClientCommand {
+ action: s_client_command::Action::PerformRespawn,
+ },
+ ));
+ }
+}