aboutsummaryrefslogtreecommitdiff
path: root/server/src/entity/conveyor.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-11 16:55:39 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-11 16:55:39 +0200
commit2537e764a359328870c3eabb16ee5238becd3c73 (patch)
tree07b731da36fd795399dbb62446e8a36ae3318f0b /server/src/entity/conveyor.rs
parent51f3c580fcfac8d37e5e345031cadda141f0340f (diff)
downloadhurrycurry-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.rs33
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,