veloren/common/src/event.rs

96 lines
1.9 KiB
Rust
Raw Normal View History

use crate::comp;
2019-08-15 22:19:54 +00:00
use parking_lot::Mutex;
2019-08-07 15:39:16 +00:00
use specs::Entity as EcsEntity;
2019-09-21 12:43:24 +00:00
use sphynx::Uid;
2019-08-15 22:19:54 +00:00
use std::{collections::VecDeque, ops::DerefMut};
2019-08-07 15:39:16 +00:00
use vek::*;
pub enum LocalEvent {
Jump(EcsEntity),
WallLeap {
entity: EcsEntity,
wall_dir: Vec3<f32>,
},
Boost {
entity: EcsEntity,
vel: Vec3<f32>,
},
}
pub enum ServerEvent {
Explosion {
pos: Vec3<f32>,
radius: f32,
},
2019-09-21 12:43:24 +00:00
Damage {
uid: Uid,
2019-09-25 21:31:25 +00:00
dmg: u32,
2019-09-21 12:43:24 +00:00
cause: comp::HealthSource,
},
2019-09-17 12:43:19 +00:00
Destroy {
entity: EcsEntity,
cause: comp::HealthSource,
},
Respawn(EcsEntity),
2019-09-28 19:35:28 +00:00
Shoot {
entity: EcsEntity,
dir: Vec3<f32>,
2019-10-11 04:30:34 +00:00
body: comp::Body,
light: Option<comp::LightEmitter>,
2019-09-28 19:35:28 +00:00
projectile: comp::Projectile,
},
LandOnGround {
entity: EcsEntity,
vel: Vec3<f32>,
},
Mount(EcsEntity, EcsEntity),
Unmount(EcsEntity),
2019-10-11 04:30:34 +00:00
Possess(Uid, Uid),
2019-08-07 15:39:16 +00:00
}
pub struct EventBus<E> {
queue: Mutex<VecDeque<E>>,
}
impl<E> Default for EventBus<E> {
fn default() -> Self {
Self {
queue: Mutex::new(VecDeque::new()),
}
}
2019-08-07 15:39:16 +00:00
}
impl<E> EventBus<E> {
pub fn emitter(&self) -> Emitter<E> {
2019-08-07 15:39:16 +00:00
Emitter {
bus: self,
events: VecDeque::new(),
}
}
pub fn emit(&self, event: E) {
2019-08-15 22:19:54 +00:00
self.queue.lock().push_front(event);
2019-08-07 17:17:04 +00:00
}
pub fn recv_all(&self) -> impl ExactSizeIterator<Item = E> {
2019-08-15 22:19:54 +00:00
std::mem::replace(self.queue.lock().deref_mut(), VecDeque::new()).into_iter()
2019-08-07 15:39:16 +00:00
}
}
pub struct Emitter<'a, E> {
bus: &'a EventBus<E>,
events: VecDeque<E>,
2019-08-07 15:39:16 +00:00
}
impl<'a, E> Emitter<'a, E> {
pub fn emit(&mut self, event: E) {
2019-08-07 15:39:16 +00:00
self.events.push_front(event);
}
}
impl<'a, E> Drop for Emitter<'a, E> {
2019-08-07 15:39:16 +00:00
fn drop(&mut self) {
2019-08-15 22:19:54 +00:00
self.bus.queue.lock().append(&mut self.events);
2019-08-07 15:39:16 +00:00
}
}