use super::Entity; use crate::{ data::Gamedata, game::{interact_effect, Tile}, protocol::{ItemLocation, PacketC}, }; use anyhow::{anyhow, Result}; use glam::IVec2; use std::collections::{HashMap, VecDeque}; #[derive(Debug, Default)] pub struct Conveyor { pub(super) from: IVec2, pub(super) to: IVec2, pub(super) cooldown: f32, pub(super) max_cooldown: f32, } impl Entity for Conveyor { fn tick( &mut self, data: &Gamedata, points: &mut i64, packet_out: &mut VecDeque, tiles: &mut HashMap, dt: f32, ) -> Result<()> { let [from, to] = tiles .get_many_mut([&self.from, &self.to]) .ok_or(anyhow!("conveyor does ends in itself"))?; if from.item.is_some() { self.cooldown += dt; if self.cooldown < self.max_cooldown { return Ok(()); } self.cooldown = 0.; interact_effect( data, true, &mut to.item, ItemLocation::Tile(self.to), &mut from.item, ItemLocation::Tile(self.from), Some(to.kind), packet_out, points, ); } Ok(()) } }