diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-20 16:22:34 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:24:32 +0200 |
commit | 20556b7f754ff40860cc69bb3cd67b42581509a3 (patch) | |
tree | 86f61e78a6b2dab0493c24d3b72e724bf675067e /server/src/interaction.rs | |
parent | eb446e1f786cbfe9af7f2ececca02f53d46d1ee4 (diff) | |
download | hurrycurry-20556b7f754ff40860cc69bb3cd67b42581509a3.tar hurrycurry-20556b7f754ff40860cc69bb3cd67b42581509a3.tar.bz2 hurrycurry-20556b7f754ff40860cc69bb3cd67b42581509a3.tar.zst |
add server-side collision and interable list
Diffstat (limited to 'server/src/interaction.rs')
-rw-r--r-- | server/src/interaction.rs | 100 |
1 files changed, 51 insertions, 49 deletions
diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 93f54b2d..7f694ad8 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -87,7 +87,8 @@ pub fn interact( tile: &mut Tile, player: &mut Player, ) -> Option<InteractEffect> { - if player.item.is_none() { + let interactable = data.is_tile_interactable(tile.kind); + if interactable && player.item.is_none() { if let Some(item) = &mut tile.item { if let Some(active) = &mut item.active { let recipe = &data.recipe(active.recipe); @@ -111,66 +112,67 @@ pub fn interact( if !edge { return None; } - - for (ri, recipe) in data.recipes() { - if !recipe.supports_tile(tile.kind) { - continue; - } - match recipe { - Recipe::Active { input, .. } => { - if player.item.is_none() { - if let Some(item) = &mut tile.item { - if item.kind == *input { - if item.active.is_none() { - info!("start active recipe {ri:?}"); - item.active = Some(Involvement { - recipe: ri, - working: 1, - progress: 0., - }); + if interactable { + for (ri, recipe) in data.recipes() { + if !recipe.supports_tile(tile.kind) { + continue; + } + match recipe { + Recipe::Active { input, .. } => { + if player.item.is_none() { + if let Some(item) = &mut tile.item { + if item.kind == *input { + if item.active.is_none() { + info!("start active recipe {ri:?}"); + item.active = Some(Involvement { + recipe: ri, + working: 1, + progress: 0., + }); + } } } } - } - if tile.item.is_none() { - if let Some(item) = &player.item { - if item.kind == *input { - let mut item = player.item.take().unwrap(); - if let Some(active) = &mut item.active { - active.working += 1; - } else { - info!("start active recipe {ri:?}"); - item.active = Some(Involvement { - recipe: ri, - working: 1, - progress: 0., - }); + if tile.item.is_none() { + if let Some(item) = &player.item { + if item.kind == *input { + let mut item = player.item.take().unwrap(); + if let Some(active) = &mut item.active { + active.working += 1; + } else { + info!("start active recipe {ri:?}"); + item.active = Some(Involvement { + recipe: ri, + working: 1, + progress: 0., + }); + } + tile.item = Some(item); + return Some(InteractEffect::Put); } - tile.item = Some(item); - return Some(InteractEffect::Put); } } } - } - Recipe::Instant { - inputs, outputs, .. - } => { - let on_tile = tile.item.as_ref().map(|i| i.kind); - let in_hand = player.item.as_ref().map(|i| i.kind); - let ok = (inputs[0] == on_tile && inputs[1] == in_hand) - || (inputs[1] == on_tile && inputs[0] == in_hand); - if ok { - info!("instant recipe {ri:?}"); - player.item = outputs[0].map(|kind| Item { kind, active: None }); - tile.item = outputs[1].map(|kind| Item { kind, active: None }); - return Some(InteractEffect::Produce); + Recipe::Instant { + inputs, outputs, .. + } => { + let on_tile = tile.item.as_ref().map(|i| i.kind); + let in_hand = player.item.as_ref().map(|i| i.kind); + let ok = (inputs[0] == on_tile && inputs[1] == in_hand) + || (inputs[1] == on_tile && inputs[0] == in_hand); + if ok { + info!("instant recipe {ri:?}"); + player.item = outputs[0].map(|kind| Item { kind, active: None }); + tile.item = outputs[1].map(|kind| Item { kind, active: None }); + return Some(InteractEffect::Produce); + } } + _ => (), } - _ => (), } } - if tile.item.is_none() { + if interactable && tile.item.is_none() { if let Some(item) = player.item.take() { tile.item = Some(item); return Some(InteractEffect::Put); |