1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 06:16:04 +00:00

sequence number

This commit is contained in:
mat 2023-03-08 20:20:55 +00:00
parent 67f3a0aaee
commit c5237daf51
2 changed files with 17 additions and 4 deletions

View file

@ -2,6 +2,7 @@ use crate::{
chat::ChatPlugin,
disconnect::{DisconnectEvent, DisconnectPlugin},
events::{Event, EventPlugin, LocalPlayerEvents},
interact::CurrentSequenceNumber,
inventory::{InventoryComponent, InventoryPlugin},
local_player::{
death_event, handle_send_packet_event, update_in_loaded_chunk, GameProfileComponent,
@ -251,6 +252,7 @@ impl Client {
inventory: InventoryComponent::default(),
client_information: ClientInformation::default(),
tab_list: TabList::default(),
current_sequence_number: CurrentSequenceNumber::default(),
_local: Local,
});
@ -493,6 +495,7 @@ pub struct JoinedClientBundle {
pub inventory: InventoryComponent,
pub client_information: ClientInformation,
pub tab_list: TabList,
pub current_sequence_number: CurrentSequenceNumber,
pub _local: Local,
}

View file

@ -4,7 +4,8 @@ use azalea_protocol::packets::game::{
serverbound_use_item_on_packet::{BlockHitResult, ServerboundUseItemOnPacket},
};
use bevy_app::{App, Plugin};
use bevy_ecs::{entity::Entity, event::EventReader, system::Query};
use bevy_ecs::{component::Component, entity::Entity, event::EventReader, system::Query};
use derive_more::{Deref, DerefMut};
use log::warn;
use crate::{Client, LocalPlayer};
@ -43,18 +44,27 @@ pub struct BlockInteractEvent {
pub position: BlockPos,
}
/// The number of changes this client has made to blocks.
#[derive(Component, Copy, Clone, Debug, Default, Deref, DerefMut)]
pub struct CurrentSequenceNumber(u32);
fn handle_block_interact_event(
mut events: EventReader<BlockInteractEvent>,
query: Query<&LocalPlayer>,
mut query: Query<(&LocalPlayer, &mut CurrentSequenceNumber)>,
) {
for event in events.iter() {
let Ok( local_player) = query.get(event.entity) else {
let Ok((local_player, mut sequence_number)) = query.get_mut(event.entity) else {
warn!("Sent BlockInteractEvent for entity that isn't LocalPlayer");
continue;
};
// TODO: check to make sure we're within the world border
**sequence_number += 1;
// minecraft also does the interaction client-side (so it looks like clicking a
// button is instant) but we don't really need that
local_player.write_packet(
ServerboundUseItemOnPacket {
hand: InteractionHand::MainHand,
@ -64,7 +74,7 @@ fn handle_block_interact_event(
location: event.position.center(),
inside: false,
},
sequence: 0,
sequence: sequence_number.0,
}
.get(),
)