summaryrefslogtreecommitdiff
path: root/server/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/main.rs')
-rw-r--r--server/src/main.rs35
1 files changed, 30 insertions, 5 deletions
diff --git a/server/src/main.rs b/server/src/main.rs
index 09e6186..38238b3 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -18,15 +18,15 @@ pub mod network;
use anyhow::Result;
use clap::Parser;
-use log::{debug, warn};
+use log::{debug, info, warn};
use network::ServerNetwork;
use std::{
- collections::HashSet,
+ collections::{BTreeSet, HashMap, HashSet},
marker::PhantomData,
net::{IpAddr, SocketAddr},
};
use weareshared::{
- packets::{Data, Packet, Resource},
+ packets::{Data, Object, Packet, Resource},
resources::{Prefab, PrefabIndex},
store::ResourceStore,
tree::SceneTree,
@@ -46,6 +46,7 @@ struct State {
prefab_index: PrefabIndex,
prefab_index_pending: HashSet<Resource<Prefab>>,
prefab_index_have: HashSet<Resource<Prefab>>,
+ conn_object_ownership: HashMap<u128, BTreeSet<Object>>,
}
fn main() -> Result<()> {
@@ -72,6 +73,7 @@ impl State {
prefab_index: PrefabIndex::default(),
prefab_index_pending: HashSet::new(),
prefab_index_have: HashSet::new(),
+ conn_object_ownership: HashMap::new(),
})
}
pub fn prime_client(&self, conn: u128, net: &ServerNetwork) -> Result<()> {
@@ -85,12 +87,18 @@ impl State {
Ok(())
}
pub fn handle_packet(&mut self, conn: u128, packet: Packet, net: &ServerNetwork) -> Result<()> {
- self.tree.packet(&packet);
match packet {
Packet::Connect(_) => {
self.prime_client(conn, net)?;
}
- Packet::Disconnect => {}
+ Packet::Disconnect => {
+ if let Some(owned) = self.conn_object_ownership.remove(&conn) {
+ for o in owned {
+ debug!("removing conn owned object {o}");
+ self.tree.remove_recursive(o, &mut net.br());
+ }
+ }
+ }
Packet::RequestResource(resource) => {
if let Some(r) = self.store.get_raw(resource)? {
debug!("resource is cached");
@@ -121,18 +129,31 @@ impl State {
}
}
Packet::Add(object, resource) => {
+ self.conn_object_ownership
+ .entry(conn)
+ .or_default()
+ .insert(object);
+ self.tree.add(object, resource.clone());
net.broadcast(Packet::Add(object, resource), true);
}
Packet::Remove(object) => {
+ self.conn_object_ownership
+ .entry(conn)
+ .or_default()
+ .remove(&object);
+ self.tree.remove_reparent(object, &mut net.br());
net.broadcast(Packet::Remove(object), true);
}
Packet::Position(object, pos, rot) => {
+ self.tree.packet(&Packet::Position(object, pos, rot));
net.broadcast(Packet::Position(object, pos, rot), false);
}
Packet::Pose(object, vec) => {
+ self.tree.packet(&Packet::Pose(object, vec.clone()));
net.broadcast(Packet::Pose(object, vec), false);
}
Packet::Parent(parent, child) => {
+ self.tree.reparent(parent, child);
net.broadcast(Packet::Parent(parent, child), true);
}
Packet::Sound(object, vec) => {
@@ -150,6 +171,10 @@ impl State {
);
}
}
+ Packet::Chat(object, message) => {
+ info!("[CHAT] {}", message.0);
+ net.broadcast(Packet::Chat(object, message), true);
+ }
}
Ok(())
}