diff options
| author | mat <27899617+mat-1@users.noreply.github.com> | 2023-05-03 20:57:27 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-03 20:57:27 -0500 |
| commit | 634cb8d72c6608512aedba19e5cd669104bc35ea (patch) | |
| tree | f8e76ce9eb43403d29cc0cbcf9a4f51522419dc2 /azalea-client/src/local_player.rs | |
| parent | 1fb4418f2c9cbd004c64c2f23d2d0352ee12c0e5 (diff) | |
| download | azalea-drasl-634cb8d72c6608512aedba19e5cd669104bc35ea.tar.xz | |
Inventory (#48)
* start adding azalea-inventory
* design more of how inventories are defined
* start working on az-inv-macros
* inventory macro works
* start adding inventory codegen
* update some deps
* add inventory codegen
* manually write inventory menus
* put the inventories in Client
* start on containersetcontent
* inventory menu should hopefully work
* checks in containersetcontent
* format a comment
* move some variant matches
* inventory.rs
* inventory stuff
* more inventory stuff
* inventory/container tracking works
* start adding interact function
* sequence number
* start adding HitResultComponent
* implement traverse_blocks
* start adding clip
* add clip function
* update_hit_result_component
* start trying to fix
* fix
* make some stuff simpler
* clippy
* lever
* chest
* container handle
* fix ambiguity
* fix some doc tests
* move some container stuff from az-client to azalea
* clicking container
* start implementing simulate_click
* keep working on simulate click
* implement more of simulate_click
this is really boring
* inventory fixes
* start implementing shift clicking
* fix panic in azalea-chat i hope
* shift clicking implemented
* more inventory stuff
* fix items not showing in containers sometimes
* fix test
* fix all warnings
* remove a println
---------
Co-authored-by: mat <git@matdoes.dev>
Diffstat (limited to 'azalea-client/src/local_player.rs')
| -rw-r--r-- | azalea-client/src/local_player.rs | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/azalea-client/src/local_player.rs b/azalea-client/src/local_player.rs index 540ef3b4..423b4308 100644 --- a/azalea-client/src/local_player.rs +++ b/azalea-client/src/local_player.rs @@ -1,14 +1,18 @@ use std::{io, sync::Arc}; use azalea_auth::game_profile::GameProfile; -use azalea_core::ChunkPos; +use azalea_core::{ChunkPos, GameMode}; use azalea_protocol::packets::game::ServerboundGamePacket; use azalea_world::{ - entity::{self, Dead}, - Instance, PartialInstance, + entity::{self, Dead, WorldName}, + Instance, InstanceContainer, PartialInstance, }; use bevy_ecs::{ - component::Component, entity::Entity, event::EventReader, query::Added, system::Query, + component::Component, + entity::Entity, + event::EventReader, + query::Added, + system::{Query, Res}, }; use derive_more::{Deref, DerefMut}; use parking_lot::RwLock; @@ -75,9 +79,17 @@ pub struct GameProfileComponent(pub GameProfile); /// Marks a [`LocalPlayer`] that's in a loaded chunk. This is updated at the /// beginning of every tick. -#[derive(Component)] +#[derive(Component, Clone, Debug, Copy)] pub struct LocalPlayerInLoadedChunk; +/// The gamemode of a local player. For a non-local player, you can look up the +/// player in the [`TabList`]. +#[derive(Component, Clone, Debug, Copy)] +pub struct LocalGameMode { + pub current: GameMode, + pub previous: Option<GameMode>, +} + impl LocalPlayer { /// Create a new `LocalPlayer`. pub fn new( @@ -104,7 +116,7 @@ impl LocalPlayer { } /// Write a packet directly to the server. - pub fn write_packet(&mut self, packet: ServerboundGamePacket) { + pub fn write_packet(&self, packet: ServerboundGamePacket) { self.packet_writer .send(packet) .expect("write_packet shouldn't be able to be called if the connection is closed"); @@ -122,16 +134,15 @@ impl Drop for LocalPlayer { /// Update the [`LocalPlayerInLoadedChunk`] component for all [`LocalPlayer`]s. pub fn update_in_loaded_chunk( mut commands: bevy_ecs::system::Commands, - query: Query<(Entity, &LocalPlayer, &entity::Position)>, + query: Query<(Entity, &WorldName, &entity::Position)>, + instance_container: Res<InstanceContainer>, ) { for (entity, local_player, position) in &query { let player_chunk_pos = ChunkPos::from(position); - let in_loaded_chunk = local_player - .world - .read() - .chunks - .get(&player_chunk_pos) - .is_some(); + let instance_lock = instance_container + .get(local_player) + .expect("local player should always be in an instance"); + let in_loaded_chunk = instance_lock.read().chunks.get(&player_chunk_pos).is_some(); if in_loaded_chunk { commands.entity(entity).insert(LocalPlayerInLoadedChunk); } else { @@ -176,7 +187,7 @@ pub fn handle_send_packet_event( mut query: Query<&mut LocalPlayer>, ) { for event in send_packet_events.iter() { - if let Ok(mut local_player) = query.get_mut(event.entity) { + if let Ok(local_player) = query.get_mut(event.entity) { local_player.write_packet(event.packet.clone()); } } |
