From d07eec224585598fedcc24562e133e36f4261fcf Mon Sep 17 00:00:00 2001 From: Edvin Bryntesson Date: Thu, 5 Sep 2024 23:34:11 +0200 Subject: [PATCH] fix so that it actually always updates both clients --- pumpkin-inventory/src/container_click.rs | 7 ++- pumpkin-inventory/src/open_container.rs | 1 - .../src/client/play/c_set_container_slot.rs | 8 ++-- pumpkin/src/client/container.rs | 43 +++++++++++++------ pumpkin/src/server/mod.rs | 1 + 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/pumpkin-inventory/src/container_click.rs b/pumpkin-inventory/src/container_click.rs index 779a85866..0c4897d30 100644 --- a/pumpkin-inventory/src/container_click.rs +++ b/pumpkin-inventory/src/container_click.rs @@ -32,7 +32,12 @@ impl Click { -999 => Slot::OutsideInventory, _ => { // TODO: Error here - Slot::Normal(slot.try_into().unwrap()) + let slot = slot.try_into(); + if let Ok(slot) = slot { + Slot::Normal(slot) + } else { + Slot::OutsideInventory + } } }; let button = match button { diff --git a/pumpkin-inventory/src/open_container.rs b/pumpkin-inventory/src/open_container.rs index 4591b48a2..456f2490a 100644 --- a/pumpkin-inventory/src/open_container.rs +++ b/pumpkin-inventory/src/open_container.rs @@ -66,7 +66,6 @@ impl Container for Chest { } fn all_slots(&mut self) -> Vec<&mut Option> { - dbg!(self.slots.iter().len()); self.slots.iter_mut().collect() } diff --git a/pumpkin-protocol/src/client/play/c_set_container_slot.rs b/pumpkin-protocol/src/client/play/c_set_container_slot.rs index e07d07d82..8fcd0c8b1 100644 --- a/pumpkin-protocol/src/client/play/c_set_container_slot.rs +++ b/pumpkin-protocol/src/client/play/c_set_container_slot.rs @@ -4,15 +4,15 @@ use pumpkin_macros::packet; use serde::Serialize; #[derive(Serialize)] #[packet(0x15)] -pub struct CSetContainerSlot<'a> { +pub struct CSetContainerSlot { window_id: i8, state_id: VarInt, slot: i16, - slot_data: &'a Slot, + slot_data: Slot, } -impl<'a> CSetContainerSlot<'a> { - pub fn new(window_id: i8, state_id: i32, slot: usize, slot_data: &'a Slot) -> Self { +impl CSetContainerSlot { + pub fn new(window_id: i8, state_id: i32, slot: usize, slot_data: Slot) -> Self { Self { window_id, state_id: state_id.into(), diff --git a/pumpkin/src/client/container.rs b/pumpkin/src/client/container.rs index 3cb36a8ba..b6df21528 100644 --- a/pumpkin/src/client/container.rs +++ b/pumpkin/src/client/container.rs @@ -119,6 +119,7 @@ impl Player { }; // This is just checking for regular desync, client hasn't done anything malicious if current_state_id != packet.state_id.0 { + dbg!(current_state_id, packet.state_id.0); self.set_container_content(opened_container.as_deref_mut()); return Ok(()); } @@ -328,36 +329,54 @@ impl Player { .into_iter() .filter(|player_id| *player_id != self.entity_id()) .collect_vec(); - let mut container = container.lock().or(Err(InventoryError::LockError))?; + dbg!(&player_ids); + let player_token = self.client.token; // TODO: Figure out better way to get only the players from player_ids // Also refactor out a better method to get individual advanced state ids let world = self.world.lock().await; + dbg!("here"); let players = world .current_players .iter() .filter_map(|(token, player)| { - if player_ids.contains(&(token.0 as i32)) { - Some(player.clone()) + dbg!(token); + if *token != player_token { + let entity_id = player.lock().unwrap().entity_id(); + if player_ids.contains(&entity_id) { + Some(player.clone()) + } else { + None + } } else { None } }) .collect_vec(); - std::mem::drop(world); + drop(world); for player in players { - dbg!("really shouldn't be here"); + dbg!("here"); let mut player = player.lock().unwrap(); - let mut container = - OptionallyCombinedContainer::new(&mut self.inventory, Some(container.deref_mut())); - let state_id = container.advance_state_id(); - let all_slots = container.all_slots_ref(); + dbg!(player.entity_id()); + let total_opened_containers = player.inventory.total_opened_containers; + let mut container = container.lock().or(Err(InventoryError::LockError))?; + let mut combined_container = OptionallyCombinedContainer::new( + &mut player.inventory, + Some(container.deref_mut()), + ); + let state_id = combined_container.advance_state_id(); + let all_slots = combined_container.all_slots_ref(); let slot = Slot::from(all_slots[slot_index]); - let packet = - CSetContainerSlot::new(*container.window_type() as i8, state_id, slot_index, &slot); - player.client.send_packet(&packet) + let packet = CSetContainerSlot::new( + dbg!(total_opened_containers) as i8, + state_id, + slot_index, + slot, + ); + player.client.send_packet(&packet); + drop(container) } Ok(()) diff --git a/pumpkin/src/server/mod.rs b/pumpkin/src/server/mod.rs index 8be4c6175..e0ab0ed8e 100644 --- a/pumpkin/src/server/mod.rs +++ b/pumpkin/src/server/mod.rs @@ -123,6 +123,7 @@ impl Server { // Basicly the default world // TODO: select default from config let world = self.worlds[0].clone(); + let player = Arc::new(Mutex::new(Player::new( client, world.clone(),