aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2023-05-12 23:20:23 -0500
committermat <git@matdoes.dev>2023-05-12 23:20:23 -0500
commite977391b0413aaa62ea725a53e4a78c287844f4c (patch)
tree8ca64948b685610b81ae7f3f95153acf8a25c003
parent741a1f65d669c83710e8c33082b120c189b28f1d (diff)
downloadazalea-drasl-e977391b0413aaa62ea725a53e4a78c287844f4c.tar.xz
auto respawn
-rw-r--r--azalea-client/src/client.rs2
-rw-r--r--azalea-client/src/lib.rs1
-rw-r--r--azalea-client/src/respawn.rs38
-rw-r--r--azalea/examples/testbot.rs9
-rw-r--r--azalea/src/auto_respawn.rs24
-rw-r--r--azalea/src/bot.rs2
-rw-r--r--azalea/src/lib.rs1
7 files changed, 70 insertions, 7 deletions
diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs
index 7a4285e6..f2e91dfa 100644
--- a/azalea-client/src/client.rs
+++ b/azalea-client/src/client.rs
@@ -11,6 +11,7 @@ use crate::{
movement::{LastSentLookDirection, PlayerMovePlugin},
packet_handling::{self, PacketHandlerPlugin, PacketReceiver},
player::retroactively_add_game_profile_component,
+ respawn::RespawnPlugin,
task_pool::TaskPoolPlugin,
Account, PlayerInfo,
};
@@ -717,6 +718,7 @@ impl PluginGroup for DefaultPlugins {
.add(DisconnectPlugin)
.add(PlayerMovePlugin)
.add(InteractPlugin)
+ .add(RespawnPlugin)
.add(TickBroadcastPlugin)
}
}
diff --git a/azalea-client/src/lib.rs b/azalea-client/src/lib.rs
index c198ced3..2c08033b 100644
--- a/azalea-client/src/lib.rs
+++ b/azalea-client/src/lib.rs
@@ -25,6 +25,7 @@ mod movement;
pub mod packet_handling;
pub mod ping;
mod player;
+pub mod respawn;
pub mod task_pool;
pub use account::{Account, AccountOpts};
diff --git a/azalea-client/src/respawn.rs b/azalea-client/src/respawn.rs
new file mode 100644
index 00000000..4e42157c
--- /dev/null
+++ b/azalea-client/src/respawn.rs
@@ -0,0 +1,38 @@
+use azalea_protocol::packets::game::serverbound_client_command_packet::{
+ self, ServerboundClientCommandPacket,
+};
+use bevy_app::{App, Plugin};
+use bevy_ecs::prelude::*;
+
+use crate::LocalPlayer;
+
+/// Tell the server that we're respawning.
+#[derive(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_system(perform_respawn);
+ }
+}
+
+pub fn perform_respawn(
+ mut events: EventReader<PerformRespawnEvent>,
+ mut query: Query<&mut LocalPlayer>,
+) {
+ for event in events.iter() {
+ if let Ok(local_player) = query.get_mut(event.entity) {
+ local_player.write_packet(
+ ServerboundClientCommandPacket {
+ action: serverbound_client_command_packet::Action::PerformRespawn,
+ }
+ .get(),
+ );
+ }
+ }
+}
diff --git a/azalea/examples/testbot.rs b/azalea/examples/testbot.rs
index 3fe9253c..ae6d293b 100644
--- a/azalea/examples/testbot.rs
+++ b/azalea/examples/testbot.rs
@@ -8,10 +8,10 @@ use azalea::entity::{EyeHeight, Position};
use azalea::interact::HitResultComponent;
use azalea::inventory::ItemSlot;
use azalea::pathfinder::BlockPosGoal;
+use azalea::protocol::packets::game::serverbound_client_command_packet::ServerboundClientCommandPacket;
+use azalea::protocol::packets::game::ClientboundGamePacket;
use azalea::{prelude::*, swarm::prelude::*, BlockPos, GameProfileComponent, WalkDirection};
use azalea::{Account, Client, Event};
-use azalea_protocol::packets::game::serverbound_client_command_packet::ServerboundClientCommandPacket;
-use azalea_protocol::packets::game::ClientboundGamePacket;
use std::time::Duration;
#[derive(Default, Clone, Component)]
@@ -212,11 +212,6 @@ async fn handle(mut bot: Client, event: Event, _state: State) -> anyhow::Result<
}
}
}
- Event::Death(_) => {
- bot.write_packet(ServerboundClientCommandPacket {
- action: azalea_protocol::packets::game::serverbound_client_command_packet::Action::PerformRespawn,
- }.get());
- }
Event::Packet(packet) => match *packet {
ClientboundGamePacket::Login(_) => {
println!("login packet");
diff --git a/azalea/src/auto_respawn.rs b/azalea/src/auto_respawn.rs
new file mode 100644
index 00000000..c5dd12a4
--- /dev/null
+++ b/azalea/src/auto_respawn.rs
@@ -0,0 +1,24 @@
+use crate::app::{App, Plugin};
+use azalea_client::packet_handling::DeathEvent;
+use azalea_client::respawn::PerformRespawnEvent;
+use bevy_ecs::prelude::*;
+
+/// A plugin that makes [`DeathEvent`]s send [`PerformRespawnEvent`]s.
+#[derive(Clone, Default)]
+pub struct AutoRespawnPlugin;
+impl Plugin for AutoRespawnPlugin {
+ fn build(&self, app: &mut App) {
+ app.add_system(auto_respawn);
+ }
+}
+
+fn auto_respawn(
+ mut events: EventReader<DeathEvent>,
+ mut perform_respawn_events: EventWriter<PerformRespawnEvent>,
+) {
+ for event in events.iter() {
+ perform_respawn_events.send(PerformRespawnEvent {
+ entity: event.entity,
+ });
+ }
+}
diff --git a/azalea/src/bot.rs b/azalea/src/bot.rs
index e5ea4c28..13b33bb0 100644
--- a/azalea/src/bot.rs
+++ b/azalea/src/bot.rs
@@ -1,4 +1,5 @@
use crate::app::{App, CoreSchedule, IntoSystemAppConfig, Plugin, PluginGroup, PluginGroupBuilder};
+use crate::auto_respawn::AutoRespawnPlugin;
use crate::container::ContainerPlugin;
use crate::ecs::{
component::Component,
@@ -135,5 +136,6 @@ impl PluginGroup for DefaultBotPlugins {
.add(BotPlugin)
.add(PathfinderPlugin)
.add(ContainerPlugin)
+ .add(AutoRespawnPlugin)
}
}
diff --git a/azalea/src/lib.rs b/azalea/src/lib.rs
index bde94634..604961f4 100644
--- a/azalea/src/lib.rs
+++ b/azalea/src/lib.rs
@@ -3,6 +3,7 @@
#![allow(incomplete_features)]
#![feature(async_fn_in_trait)]
+mod auto_respawn;
mod bot;
mod container;
pub mod pathfinder;