veloren/server/src/events/mod.rs

140 lines
4.9 KiB
Rust
Raw Normal View History

use crate::{state_ext::StateExt, Server};
2020-08-29 06:39:16 +00:00
use common::{
event::{EventBus, ServerEvent},
span,
};
2020-02-16 20:04:06 +00:00
use entity_creation::{
handle_create_npc, handle_create_waypoint, handle_initialize_character,
handle_loaded_character_data, handle_shoot,
2020-02-16 20:04:06 +00:00
};
use entity_manipulation::{
2020-06-01 09:21:33 +00:00
handle_damage, handle_destroy, handle_explosion, handle_land_on_ground, handle_level_up,
handle_respawn,
2020-02-16 20:04:06 +00:00
};
use group_manip::handle_group;
use interaction::{handle_lantern, handle_mount, handle_possess, handle_unmount};
2020-02-16 20:04:06 +00:00
use inventory_manip::handle_inventory;
use player::{handle_client_disconnect, handle_exit_ingame};
use specs::{Entity as EcsEntity, WorldExt};
mod entity_creation;
mod entity_manipulation;
mod group_manip;
2020-02-16 20:04:06 +00:00
mod interaction;
mod inventory_manip;
mod player;
pub enum Event {
ClientConnected {
entity: EcsEntity,
},
ClientDisconnected {
entity: EcsEntity,
},
Chat {
entity: Option<EcsEntity>,
msg: String,
},
2020-02-16 20:04:06 +00:00
}
impl Server {
pub fn handle_events(&mut self) -> Vec<Event> {
2020-08-29 06:39:16 +00:00
span!(_guard, "Server::handle_events");
2020-02-16 20:04:06 +00:00
let mut frontend_events = Vec::new();
let mut requested_chunks = Vec::new();
let mut chat_commands = Vec::new();
let mut chat_messages = Vec::new();
2020-02-16 20:04:06 +00:00
let events = self
.state
.ecs()
.read_resource::<EventBus<ServerEvent>>()
.recv_all();
for event in events {
match event {
ServerEvent::Explosion {
pos,
power,
owner,
friendly_damage,
2020-08-11 14:05:34 +00:00
reagent,
} => handle_explosion(&self, pos, power, owner, friendly_damage, reagent),
2020-02-16 20:04:06 +00:00
ServerEvent::Shoot {
entity,
dir,
body,
light,
projectile,
gravity,
} => handle_shoot(self, entity, dir, body, light, projectile, gravity),
ServerEvent::Damage { uid, change } => handle_damage(&self, uid, change),
ServerEvent::Destroy { entity, cause } => handle_destroy(self, entity, cause),
ServerEvent::InventoryManip(entity, manip) => handle_inventory(self, entity, manip),
ServerEvent::GroupManip(entity, manip) => handle_group(self, entity, manip),
2020-02-16 20:04:06 +00:00
ServerEvent::Respawn(entity) => handle_respawn(&self, entity),
ServerEvent::LandOnGround { entity, vel } => {
handle_land_on_ground(&self, entity, vel)
},
ServerEvent::ToggleLantern(entity) => handle_lantern(self, entity),
2020-02-16 20:04:06 +00:00
ServerEvent::Mount(mounter, mountee) => handle_mount(self, mounter, mountee),
ServerEvent::Unmount(mounter) => handle_unmount(self, mounter),
ServerEvent::Possess(possessor_uid, possesse_uid) => {
handle_possess(&self, possessor_uid, possesse_uid)
},
ServerEvent::InitCharacterData {
2020-02-16 20:04:06 +00:00
entity,
character_id,
} => handle_initialize_character(self, entity, character_id),
ServerEvent::UpdateCharacterData { entity, components } => {
handle_loaded_character_data(self, entity, components);
},
2020-06-01 09:21:33 +00:00
ServerEvent::LevelUp(entity, new_level) => handle_level_up(self, entity, new_level),
2020-02-16 20:04:06 +00:00
ServerEvent::ExitIngame { entity } => handle_exit_ingame(self, entity),
ServerEvent::CreateNpc {
pos,
stats,
loadout,
2020-02-16 20:04:06 +00:00
body,
agent,
alignment,
scale,
drop_item,
} => handle_create_npc(
self, pos, stats, loadout, body, agent, alignment, scale, drop_item,
),
2020-02-16 20:04:06 +00:00
ServerEvent::CreateWaypoint(pos) => handle_create_waypoint(self, pos),
ServerEvent::ClientDisconnect(entity) => {
frontend_events.push(handle_client_disconnect(self, entity))
},
ServerEvent::ChunkRequest(entity, key) => {
requested_chunks.push((entity, key));
},
ServerEvent::ChatCmd(entity, cmd) => {
chat_commands.push((entity, cmd));
},
ServerEvent::Chat(msg) => {
chat_messages.push(msg);
},
2020-02-16 20:04:06 +00:00
}
}
// Generate requested chunks.
for (entity, key) in requested_chunks {
self.generate_chunk(entity, key);
}
for (entity, cmd) in chat_commands {
self.process_chat_cmd(entity, cmd);
}
for msg in chat_messages {
self.state.send_chat(msg);
}
2020-02-16 20:04:06 +00:00
frontend_events
}
}