From 2df18557a06050ce4e0c040a4b436a6eb95be75e Mon Sep 17 00:00:00 2001 From: Zicklag Date: Wed, 23 Nov 2022 10:32:47 -0600 Subject: [PATCH 1/2] Don't Allow Item Stealing --- src/player/state/states/idle.rs | 13 ++++++++----- src/player/state/states/midair.rs | 14 ++++++++------ src/player/state/states/walk.rs | 13 ++++++++----- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/player/state/states/idle.rs b/src/player/state/states/idle.rs index 86691d79f8..aa2e71c822 100644 --- a/src/player/state/states/idle.rs +++ b/src/player/state/states/idle.rs @@ -26,7 +26,7 @@ pub fn player_state_transition( pub fn handle_player_state( mut commands: Commands, player_inputs: Res, - items: Query, With>, + items: Query<(Option<&Parent>, &KinematicBody), (With, Without)>, mut players: Query<( Entity, &PlayerState, @@ -51,7 +51,7 @@ pub fn handle_player_state( // Check for item in player inventory let mut has_item = false; - 'items: for item_parent in &items { + 'items: for (item_parent, ..) in &items { if item_parent.filter(|x| x.get() == player_ent).is_some() { has_item = true; break 'items; @@ -65,9 +65,12 @@ pub fn handle_player_state( // For each actor colliding with the player 'colliders: for collider in collision_world.actor_collisions(player_ent) { // If this is an item - if items.contains(collider) { - commands.add(PlayerSetInventoryCommand::new(player_ent, Some(collider))); - break 'colliders; + if let Ok((.., item_body)) = items.get(collider) { + if !item_body.is_deactivated { + commands + .add(PlayerSetInventoryCommand::new(player_ent, Some(collider))); + break 'colliders; + } } } diff --git a/src/player/state/states/midair.rs b/src/player/state/states/midair.rs index b2adec2d3f..f633a141b1 100644 --- a/src/player/state/states/midair.rs +++ b/src/player/state/states/midair.rs @@ -19,7 +19,7 @@ pub fn player_state_transition(mut players: Query<(&mut PlayerState, &KinematicB pub fn handle_player_state( mut commands: Commands, player_inputs: Res, - items: Query, With>, + items: Query<(Option<&Parent>, &KinematicBody), (With, Without)>, mut players: Query<( Entity, &PlayerState, @@ -44,7 +44,7 @@ pub fn handle_player_state( // Check for item in player inventory let mut has_item = false; - 'items: for item_parent in &items { + 'items: for (item_parent, ..) in &items { if item_parent.filter(|x| x.get() == player_ent).is_some() { has_item = true; break 'items; @@ -57,10 +57,12 @@ pub fn handle_player_state( if !has_item { // For each actor colliding with the player 'colliders: for collider in collision_world.actor_collisions(player_ent) { - // If this is an item - if items.contains(collider) { - commands.add(PlayerSetInventoryCommand::new(player_ent, Some(collider))); - break 'colliders; + if let Ok((.., item_body)) = items.get(collider) { + if !item_body.is_deactivated { + commands + .add(PlayerSetInventoryCommand::new(player_ent, Some(collider))); + break 'colliders; + } } } diff --git a/src/player/state/states/walk.rs b/src/player/state/states/walk.rs index e31f7c8bf3..20a0627f80 100644 --- a/src/player/state/states/walk.rs +++ b/src/player/state/states/walk.rs @@ -27,7 +27,7 @@ pub fn player_state_transition( pub fn handle_player_state( mut commands: Commands, player_inputs: Res, - items: Query, With>, + items: Query<(Option<&Parent>, &KinematicBody), (With, Without)>, mut players: Query<( Entity, &PlayerState, @@ -52,7 +52,7 @@ pub fn handle_player_state( // Check for item in player inventory let mut has_item = false; - 'items: for item_parent in &items { + 'items: for (item_parent, ..) in &items { if item_parent.filter(|x| x.get() == player_ent).is_some() { has_item = true; break 'items; @@ -66,9 +66,12 @@ pub fn handle_player_state( // For each actor colliding with the player 'colliders: for collider in collision_world.actor_collisions(player_ent) { // If this is an item - if items.contains(collider) { - commands.add(PlayerSetInventoryCommand::new(player_ent, Some(collider))); - break 'colliders; + if let Ok((.., item_body)) = items.get(collider) { + if !item_body.is_deactivated { + commands + .add(PlayerSetInventoryCommand::new(player_ent, Some(collider))); + break 'colliders; + } } } From 65f1707b16c548be1d47149bcf18a5da9dfd459e Mon Sep 17 00:00:00 2001 From: Zicklag Date: Wed, 23 Nov 2022 10:33:11 -0600 Subject: [PATCH 2/2] Fix Subtraction Overflow Panic in Sword --- src/map/elements/sword.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/elements/sword.rs b/src/map/elements/sword.rs index a2a764547a..8702a03027 100644 --- a/src/map/elements/sword.rs +++ b/src/map/elements/sword.rs @@ -155,7 +155,7 @@ fn update_in_game( SwordState::Idle => (), SwordState::Swinging { frame } => { // If we're at the end of the swinging animation - if sprite.index >= sprite.end - sprite.start - 1 { + if sprite.index >= sprite.end.saturating_sub(sprite.start).saturating_sub(1) { // Go to cooldown frames next_state = Some(SwordState::Cooldown { frame: 0 });