diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-11 16:55:39 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-11 16:55:39 +0200 |
commit | 2537e764a359328870c3eabb16ee5238becd3c73 (patch) | |
tree | 07b731da36fd795399dbb62446e8a36ae3318f0b /server/src/entity/conveyor.rs | |
parent | 51f3c580fcfac8d37e5e345031cadda141f0340f (diff) | |
download | hurrycurry-2537e764a359328870c3eabb16ee5238becd3c73.tar hurrycurry-2537e764a359328870c3eabb16ee5238becd3c73.tar.bz2 hurrycurry-2537e764a359328870c3eabb16ee5238becd3c73.tar.zst |
add conveyor filters
Diffstat (limited to 'server/src/entity/conveyor.rs')
-rw-r--r-- | server/src/entity/conveyor.rs | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/server/src/entity/conveyor.rs b/server/src/entity/conveyor.rs index 4d11ffe1..2d56c144 100644 --- a/server/src/entity/conveyor.rs +++ b/server/src/entity/conveyor.rs @@ -21,13 +21,15 @@ use crate::{ game::{interact_effect, Tile}, }; use anyhow::{anyhow, Result}; -use hurrycurry_protocol::{glam::IVec2, ItemLocation, PacketC}; +use hurrycurry_protocol::{glam::IVec2, ItemIndex, ItemLocation, PacketC}; use std::collections::{HashMap, VecDeque}; -#[derive(Debug, Default, Clone)] +#[derive(Debug, Clone)] pub struct Conveyor { pub(super) from: IVec2, pub(super) to: IVec2, + pub(super) filter_tile: Option<IVec2>, + pub(super) filter_item: Option<ItemIndex>, pub(super) cooldown: f32, pub(super) max_cooldown: f32, } @@ -41,17 +43,36 @@ impl EntityT for Conveyor { tiles: &mut HashMap<IVec2, Tile>, dt: f32, ) -> Result<()> { - let [from, to] = tiles - .get_many_mut([&self.from, &self.to]) - .ok_or(anyhow!("conveyor does ends in itself"))?; + let from = tiles + .get(&self.from) + .ok_or(anyhow!("conveyor from missing"))?; + + if let Some(from_item) = from.item.as_ref() { + let filter = if let Some(t) = &self.filter_tile { + let filter_tile = tiles.get(t).ok_or(anyhow!("conveyor filter missing"))?; + filter_tile.item.as_ref().map(|e| e.kind) + } else if let Some(i) = &self.filter_item { + Some(*i) + } else { + None + }; + + if let Some(filter) = filter { + if from_item.kind != filter { + return Ok(()); + } + } - if from.item.is_some() { self.cooldown += dt; if self.cooldown < self.max_cooldown { return Ok(()); } self.cooldown = 0.; + let [from, to] = tiles + .get_many_mut([&self.from, &self.to]) + .ok_or(anyhow!("conveyor does ends in itself"))?; + interact_effect( data, true, |