aboutsummaryrefslogtreecommitdiff
path: root/server/src/interaction.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-20 16:22:34 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-23 19:24:32 +0200
commit20556b7f754ff40860cc69bb3cd67b42581509a3 (patch)
tree86f61e78a6b2dab0493c24d3b72e724bf675067e /server/src/interaction.rs
parenteb446e1f786cbfe9af7f2ececca02f53d46d1ee4 (diff)
downloadhurrycurry-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.rs100
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);