mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 23:44:38 +00:00
send ServerboundPlayerLoaded on join and respawn
This commit is contained in:
parent
415c0d873e
commit
f311ac27d4
5 changed files with 52 additions and 5 deletions
|
@ -10,7 +10,7 @@ use tracing::info;
|
||||||
|
|
||||||
use super::login::IsAuthenticated;
|
use super::login::IsAuthenticated;
|
||||||
use crate::{
|
use crate::{
|
||||||
chat_signing, client::JoinedClientBundle, connection::RawConnection,
|
chat_signing, client::JoinedClientBundle, connection::RawConnection, loading::HasClientLoaded,
|
||||||
local_player::InstanceHolder,
|
local_player::InstanceHolder,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -69,6 +69,8 @@ pub struct RemoveOnDisconnectBundle {
|
||||||
pub chat_signing_session: chat_signing::ChatSigningSession,
|
pub chat_signing_session: chat_signing::ChatSigningSession,
|
||||||
/// They're not authenticated anymore if they disconnected.
|
/// They're not authenticated anymore if they disconnected.
|
||||||
pub is_authenticated: IsAuthenticated,
|
pub is_authenticated: IsAuthenticated,
|
||||||
|
// send ServerboundPlayerLoaded next time we join
|
||||||
|
pub has_client_loaded: HasClientLoaded,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A system that removes the several components from our clients when they get
|
/// A system that removes the several components from our clients when they get
|
||||||
|
|
40
azalea-client/src/plugins/loading.rs
Normal file
40
azalea-client/src/plugins/loading.rs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
use azalea_core::tick::GameTick;
|
||||||
|
use azalea_entity::InLoadedChunk;
|
||||||
|
use azalea_physics::PhysicsSet;
|
||||||
|
use azalea_protocol::packets::game::ServerboundPlayerLoaded;
|
||||||
|
use bevy_app::{App, Plugin};
|
||||||
|
use bevy_ecs::prelude::*;
|
||||||
|
|
||||||
|
use crate::{mining::MiningSet, packet::game::SendPacketEvent};
|
||||||
|
|
||||||
|
pub struct PlayerLoadedPlugin;
|
||||||
|
impl Plugin for PlayerLoadedPlugin {
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
app.add_systems(
|
||||||
|
GameTick,
|
||||||
|
player_loaded_packet
|
||||||
|
.after(PhysicsSet)
|
||||||
|
.after(MiningSet)
|
||||||
|
.after(crate::movement::send_position),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this component is removed on respawn or disconnect
|
||||||
|
// (notably, it's not removed on login)
|
||||||
|
|
||||||
|
// mojmap interchangably calls it 'has client loaded' and 'has player loaded', i
|
||||||
|
// prefer the client one because it makes it clear that the component is only
|
||||||
|
// present on our own clients
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct HasClientLoaded;
|
||||||
|
pub fn player_loaded_packet(
|
||||||
|
mut commands: Commands,
|
||||||
|
query: Query<Entity, (With<InLoadedChunk>, Without<HasClientLoaded>)>,
|
||||||
|
) {
|
||||||
|
for entity in query.iter() {
|
||||||
|
commands.trigger(SendPacketEvent::new(entity, ServerboundPlayerLoaded));
|
||||||
|
commands.entity(entity).insert(HasClientLoaded);
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ pub mod events;
|
||||||
pub mod interact;
|
pub mod interact;
|
||||||
pub mod inventory;
|
pub mod inventory;
|
||||||
pub mod join;
|
pub mod join;
|
||||||
|
pub mod loading;
|
||||||
pub mod login;
|
pub mod login;
|
||||||
pub mod mining;
|
pub mod mining;
|
||||||
pub mod movement;
|
pub mod movement;
|
||||||
|
@ -48,6 +49,7 @@ impl PluginGroup for DefaultPlugins {
|
||||||
.add(attack::AttackPlugin)
|
.add(attack::AttackPlugin)
|
||||||
.add(chunks::ChunksPlugin)
|
.add(chunks::ChunksPlugin)
|
||||||
.add(tick_end::TickEndPlugin)
|
.add(tick_end::TickEndPlugin)
|
||||||
|
.add(loading::PlayerLoadedPlugin)
|
||||||
.add(brand::BrandPlugin)
|
.add(brand::BrandPlugin)
|
||||||
.add(tick_broadcast::TickBroadcastPlugin)
|
.add(tick_broadcast::TickBroadcastPlugin)
|
||||||
.add(pong::PongPlugin)
|
.add(pong::PongPlugin)
|
||||||
|
|
|
@ -57,7 +57,6 @@ pub fn handle_outgoing_packets_observer(
|
||||||
mut query: Query<(&mut RawConnection, Option<&InGameState>)>,
|
mut query: Query<(&mut RawConnection, Option<&InGameState>)>,
|
||||||
) {
|
) {
|
||||||
let event = trigger.event();
|
let event = trigger.event();
|
||||||
trace!("Sending game packet: {:?}", event.packet);
|
|
||||||
|
|
||||||
if let Ok((mut raw_connection, in_game_state)) = query.get_mut(event.sent_by) {
|
if let Ok((mut raw_connection, in_game_state)) = query.get_mut(event.sent_by) {
|
||||||
if in_game_state.is_none() {
|
if in_game_state.is_none() {
|
||||||
|
@ -68,10 +67,12 @@ pub fn handle_outgoing_packets_observer(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// debug!("Sending game packet: {:?}", event.packet);
|
trace!("Sending game packet: {:?}", event.packet);
|
||||||
if let Err(e) = raw_connection.write(event.packet.clone()) {
|
if let Err(e) = raw_connection.write(event.packet.clone()) {
|
||||||
error!("Failed to send packet: {e}");
|
error!("Failed to send packet: {e}");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
trace!("Not sending game packet: {:?}", event.packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ use crate::{
|
||||||
inventory::{
|
inventory::{
|
||||||
ClientSideCloseContainerEvent, Inventory, MenuOpenedEvent, SetContainerContentEvent,
|
ClientSideCloseContainerEvent, Inventory, MenuOpenedEvent, SetContainerContentEvent,
|
||||||
},
|
},
|
||||||
|
loading::HasClientLoaded,
|
||||||
local_player::{Hunger, InstanceHolder, LocalGameMode, PlayerAbilities, TabList},
|
local_player::{Hunger, InstanceHolder, LocalGameMode, PlayerAbilities, TabList},
|
||||||
movement::{KnockbackEvent, KnockbackType},
|
movement::{KnockbackEvent, KnockbackType},
|
||||||
packet::as_system,
|
packet::as_system,
|
||||||
|
@ -1490,8 +1491,9 @@ impl GamePacketHandler<'_> {
|
||||||
entity_bundle,
|
entity_bundle,
|
||||||
));
|
));
|
||||||
|
|
||||||
// Remove the Dead marker component from the player.
|
commands
|
||||||
commands.entity(self.player).remove::<Dead>();
|
.entity(self.player)
|
||||||
|
.remove::<(Dead, HasClientLoaded)>();
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue