aboutsummaryrefslogtreecommitdiff
path: root/azalea-client/src/local_player.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2023-05-03 20:57:27 -0500
committerGitHub <noreply@github.com>2023-05-03 20:57:27 -0500
commit634cb8d72c6608512aedba19e5cd669104bc35ea (patch)
treef8e76ce9eb43403d29cc0cbcf9a4f51522419dc2 /azalea-client/src/local_player.rs
parent1fb4418f2c9cbd004c64c2f23d2d0352ee12c0e5 (diff)
downloadazalea-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.rs39
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());
}
}