mirror of
https://github.com/italicsjenga/valence.git
synced 2024-12-23 14:31:30 +11:00
Fix player bugs (#318)
## Description - Make sure player list packets get sent before player entity spawn packets are sent to prevent invisible players. - Correctly update pose and hand swing. ## Test Plan Steps: 1. Load any example with two players. 2. See that players are visible. 3. See that crouching and hand swings are functioning.
This commit is contained in:
parent
d78627e478
commit
f2bf1d97dc
|
@ -4,6 +4,7 @@ use valence_protocol::packet::c2s::play::client_command::Action;
|
||||||
use valence_protocol::packet::c2s::play::ClientCommandC2s;
|
use valence_protocol::packet::c2s::play::ClientCommandC2s;
|
||||||
|
|
||||||
use crate::entity::entity::Flags;
|
use crate::entity::entity::Flags;
|
||||||
|
use crate::entity::{entity, Pose};
|
||||||
use crate::event_loop::{EventLoopSchedule, EventLoopSet, PacketEvent};
|
use crate::event_loop::{EventLoopSchedule, EventLoopSet, PacketEvent};
|
||||||
|
|
||||||
pub(super) fn build(app: &mut App) {
|
pub(super) fn build(app: &mut App) {
|
||||||
|
@ -64,7 +65,7 @@ pub struct LeaveBed {
|
||||||
|
|
||||||
fn handle_client_command(
|
fn handle_client_command(
|
||||||
mut packets: EventReader<PacketEvent>,
|
mut packets: EventReader<PacketEvent>,
|
||||||
mut clients: Query<&mut Flags>,
|
mut clients: Query<(&mut entity::Pose, &mut Flags)>,
|
||||||
mut sprinting_events: EventWriter<Sprinting>,
|
mut sprinting_events: EventWriter<Sprinting>,
|
||||||
mut sneaking_events: EventWriter<Sneaking>,
|
mut sneaking_events: EventWriter<Sneaking>,
|
||||||
mut jump_with_horse_events: EventWriter<JumpWithHorse>,
|
mut jump_with_horse_events: EventWriter<JumpWithHorse>,
|
||||||
|
@ -74,7 +75,8 @@ fn handle_client_command(
|
||||||
if let Some(pkt) = packet.decode::<ClientCommandC2s>() {
|
if let Some(pkt) = packet.decode::<ClientCommandC2s>() {
|
||||||
match pkt.action {
|
match pkt.action {
|
||||||
Action::StartSneaking => {
|
Action::StartSneaking => {
|
||||||
if let Ok(mut flags) = clients.get_mut(packet.client) {
|
if let Ok((mut pose, mut flags)) = clients.get_mut(packet.client) {
|
||||||
|
pose.0 = Pose::Sneaking;
|
||||||
flags.set_sneaking(true);
|
flags.set_sneaking(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,7 +86,8 @@ fn handle_client_command(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
Action::StopSneaking => {
|
Action::StopSneaking => {
|
||||||
if let Ok(mut flags) = clients.get_mut(packet.client) {
|
if let Ok((mut pose, mut flags)) = clients.get_mut(packet.client) {
|
||||||
|
pose.0 = Pose::Standing;
|
||||||
flags.set_sneaking(false);
|
flags.set_sneaking(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +100,7 @@ fn handle_client_command(
|
||||||
client: packet.client,
|
client: packet.client,
|
||||||
}),
|
}),
|
||||||
Action::StartSprinting => {
|
Action::StartSprinting => {
|
||||||
if let Ok(mut flags) = clients.get_mut(packet.client) {
|
if let Ok((_, mut flags)) = clients.get_mut(packet.client) {
|
||||||
flags.set_sprinting(true);
|
flags.set_sprinting(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +110,7 @@ fn handle_client_command(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Action::StopSprinting => {
|
Action::StopSprinting => {
|
||||||
if let Ok(mut flags) = clients.get_mut(packet.client) {
|
if let Ok((_, mut flags)) = clients.get_mut(packet.client) {
|
||||||
flags.set_sprinting(false);
|
flags.set_sprinting(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +130,13 @@ fn handle_client_command(
|
||||||
state: JumpWithHorseState::Stop,
|
state: JumpWithHorseState::Stop,
|
||||||
}),
|
}),
|
||||||
Action::OpenHorseInventory => {} // TODO
|
Action::OpenHorseInventory => {} // TODO
|
||||||
Action::StartFlyingWithElytra => {} // TODO
|
Action::StartFlyingWithElytra => {
|
||||||
|
if let Ok((mut pose, _)) = clients.get_mut(packet.client) {
|
||||||
|
pose.0 = Pose::FallFlying;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ use valence_protocol::packet::c2s::play::{
|
||||||
use valence_protocol::types::{Direction, Hand};
|
use valence_protocol::types::{Direction, Hand};
|
||||||
|
|
||||||
use super::action::ActionSequence;
|
use super::action::ActionSequence;
|
||||||
|
use crate::entity::{EntityAnimation, EntityAnimations};
|
||||||
use crate::event_loop::{EventLoopSchedule, EventLoopSet, PacketEvent};
|
use crate::event_loop::{EventLoopSchedule, EventLoopSet, PacketEvent};
|
||||||
|
|
||||||
pub(super) fn build(app: &mut App) {
|
pub(super) fn build(app: &mut App) {
|
||||||
|
@ -86,7 +87,7 @@ pub struct ResourcePackStatusChange {
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn handle_misc_packets(
|
fn handle_misc_packets(
|
||||||
mut packets: EventReader<PacketEvent>,
|
mut packets: EventReader<PacketEvent>,
|
||||||
mut clients: Query<&mut ActionSequence>,
|
mut clients: Query<(&mut ActionSequence, &mut EntityAnimations)>,
|
||||||
mut hand_swing_events: EventWriter<HandSwing>,
|
mut hand_swing_events: EventWriter<HandSwing>,
|
||||||
mut interact_block_events: EventWriter<InteractBlock>,
|
mut interact_block_events: EventWriter<InteractBlock>,
|
||||||
mut chat_message_events: EventWriter<ChatMessage>,
|
mut chat_message_events: EventWriter<ChatMessage>,
|
||||||
|
@ -96,12 +97,19 @@ fn handle_misc_packets(
|
||||||
) {
|
) {
|
||||||
for packet in packets.iter() {
|
for packet in packets.iter() {
|
||||||
if let Some(pkt) = packet.decode::<HandSwingC2s>() {
|
if let Some(pkt) = packet.decode::<HandSwingC2s>() {
|
||||||
|
if let Ok((_, mut animations)) = clients.get_mut(packet.client) {
|
||||||
|
animations.trigger(match pkt.hand {
|
||||||
|
Hand::Main => EntityAnimation::SwingMainHand,
|
||||||
|
Hand::Off => EntityAnimation::SwingOffHand,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
hand_swing_events.send(HandSwing {
|
hand_swing_events.send(HandSwing {
|
||||||
client: packet.client,
|
client: packet.client,
|
||||||
hand: pkt.hand,
|
hand: pkt.hand,
|
||||||
});
|
});
|
||||||
} else if let Some(pkt) = packet.decode::<PlayerInteractBlockC2s>() {
|
} else if let Some(pkt) = packet.decode::<PlayerInteractBlockC2s>() {
|
||||||
if let Ok(mut action_seq) = clients.get_mut(packet.client) {
|
if let Ok((mut action_seq, _)) = clients.get_mut(packet.client) {
|
||||||
action_seq.update(pkt.sequence.0);
|
action_seq.update(pkt.sequence.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +123,7 @@ fn handle_misc_packets(
|
||||||
sequence: pkt.sequence.0,
|
sequence: pkt.sequence.0,
|
||||||
});
|
});
|
||||||
} else if let Some(pkt) = packet.decode::<PlayerInteractItemC2s>() {
|
} else if let Some(pkt) = packet.decode::<PlayerInteractItemC2s>() {
|
||||||
if let Ok(mut action_seq) = clients.get_mut(packet.client) {
|
if let Ok((mut action_seq, _)) = clients.get_mut(packet.client) {
|
||||||
action_seq.update(pkt.sequence.0);
|
action_seq.update(pkt.sequence.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,9 @@ use valence_protocol::packet::s2c::play::player_list::{Actions, Entry, PlayerLis
|
||||||
use valence_protocol::packet::s2c::play::{PlayerListHeaderS2c, PlayerRemoveS2c};
|
use valence_protocol::packet::s2c::play::{PlayerListHeaderS2c, PlayerRemoveS2c};
|
||||||
use valence_protocol::text::Text;
|
use valence_protocol::text::Text;
|
||||||
|
|
||||||
use crate::client::{Client, FlushPacketsSet};
|
use crate::client::Client;
|
||||||
use crate::component::{Despawned, GameMode, Ping, Properties, UniqueId, Username};
|
use crate::component::{Despawned, GameMode, Ping, Properties, UniqueId, Username};
|
||||||
|
use crate::instance::WriteUpdatePacketsToInstancesSet;
|
||||||
use crate::packet::{PacketWriter, WritePacket};
|
use crate::packet::{PacketWriter, WritePacket};
|
||||||
use crate::server::Server;
|
use crate::server::Server;
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ impl Plugin for PlayerListPlugin {
|
||||||
write_player_list_changes,
|
write_player_list_changes,
|
||||||
)
|
)
|
||||||
.chain()
|
.chain()
|
||||||
.before(FlushPacketsSet)
|
.before(WriteUpdatePacketsToInstancesSet)
|
||||||
.in_base_set(CoreSet::PostUpdate),
|
.in_base_set(CoreSet::PostUpdate),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue