aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2025-03-20 03:30:57 +0000
committermat <git@matdoes.dev>2025-03-20 03:30:57 +0000
commit5c7332b4692986f8c0ca969d79a6eb39feca686a (patch)
treec488461f11ee16c6e002f2ee116046b823e2971c /azalea-client/src
parent13d5cbed1fed1695c28dc1bf1c11b24c68819970 (diff)
downloadazalea-drasl-5c7332b4692986f8c0ca969d79a6eb39feca686a.tar.xz
add Event::Spawn
Diffstat (limited to 'azalea-client/src')
-rw-r--r--azalea-client/src/plugins/events.rs41
-rw-r--r--azalea-client/src/plugins/packet/game/mod.rs2
2 files changed, 37 insertions, 6 deletions
diff --git a/azalea-client/src/plugins/events.rs b/azalea-client/src/plugins/events.rs
index 0e30118a..011fbc4a 100644
--- a/azalea-client/src/plugins/events.rs
+++ b/azalea-client/src/plugins/events.rs
@@ -5,7 +5,7 @@ use std::sync::Arc;
use azalea_chat::FormattedText;
use azalea_core::tick::GameTick;
-use azalea_entity::Dead;
+use azalea_entity::{Dead, InLoadedChunk};
use azalea_protocol::packets::game::{
ClientboundGamePacket, c_player_combat_kill::ClientboundPlayerCombatKill,
};
@@ -13,10 +13,11 @@ use azalea_world::{InstanceName, MinecraftEntityId};
use bevy_app::{App, Plugin, PreUpdate, Update};
use bevy_ecs::{
component::Component,
+ entity::Entity,
event::EventReader,
- query::{Added, With},
+ query::{Added, With, Without},
schedule::IntoSystemConfigs,
- system::Query,
+ system::{Commands, Query},
};
use derive_more::{Deref, DerefMut};
use tokio::sync::mpsc;
@@ -65,11 +66,23 @@ pub enum Event {
/// information with `Client::set_client_information`, so the packet
/// doesn't have to be sent twice.
///
- /// You may want to use [`Event::Login`] instead to wait for the bot to be
+ /// You may want to use [`Event::Spawn`] instead to wait for the bot to be
/// in the world.
Init,
- /// The client is now in the world. Fired when we receive a login packet.
+ /// Fired when we receive a login packet, which is after [`Event::Init`] but
+ /// before [`Event::Spawn`]. You usually want [`Event::Spawn`] instead.
+ ///
+ /// Your position will be [`Vec3::ZERO`] immediately after you receive this
+ /// packet, but it'll be ready by the time you get [`Event::Spawn`].
+ ///
+ /// [`Vec3::ZERO`]: azalea_core::position::Vec3::ZERO
Login,
+ /// Fired when the player fully spawns into the world and is ready to
+ /// interact with it.
+ ///
+ /// This is usually the event you should listen for when waiting for the bot
+ /// to be ready.
+ Spawn,
/// A chat message was sent in the game chat.
Chat(ChatPacket),
/// Happens 20 times per second, but only when the world is loaded.
@@ -125,6 +138,7 @@ impl Plugin for EventsPlugin {
(
chat_listener,
login_listener,
+ spawn_listener,
packet_listener,
add_player_listener,
update_player_listener,
@@ -156,6 +170,23 @@ pub fn login_listener(query: Query<&LocalPlayerEvents, Added<MinecraftEntityId>>
}
}
+/// A unit struct component that indicates that the entity has sent
+/// [`Event::Spawn`].
+///
+/// This is just used internally by the [`spawn_listener`] system to avoid
+/// sending the event twice for the same client.
+#[derive(Component)]
+pub struct SentSpawnEvent;
+pub fn spawn_listener(
+ query: Query<(Entity, &LocalPlayerEvents), (Added<InLoadedChunk>, Without<SentSpawnEvent>)>,
+ mut commands: Commands,
+) {
+ for (entity, local_player_events) in &query {
+ let _ = local_player_events.send(Event::Spawn);
+ commands.entity(entity).insert(SentSpawnEvent);
+ }
+}
+
pub fn chat_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader<ChatReceivedEvent>) {
for event in events.read() {
let local_player_events = query
diff --git a/azalea-client/src/plugins/packet/game/mod.rs b/azalea-client/src/plugins/packet/game/mod.rs
index 42aa0f9b..1e9232bf 100644
--- a/azalea-client/src/plugins/packet/game/mod.rs
+++ b/azalea-client/src/plugins/packet/game/mod.rs
@@ -1482,7 +1482,7 @@ impl GamePacketHandler<'_> {
// this resets a bunch of our components like physics and stuff
let entity_bundle = EntityBundle::new(
game_profile.uuid,
- Vec3::default(),
+ Vec3::ZERO,
azalea_registry::EntityKind::Player,
new_instance_name,
);