diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-26 19:32:46 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-26 19:32:46 +0100 |
commit | f195ae4a1059270f14163b62e7860c3630ee5895 (patch) | |
tree | dc1a1f0f0ed08340423ea3f921173633561a923f /server/src/main.rs | |
parent | 55ef91b95decf829ac988fd9e86624b488959956 (diff) | |
download | weareserver-f195ae4a1059270f14163b62e7860c3630ee5895.tar weareserver-f195ae4a1059270f14163b62e7860c3630ee5895.tar.bz2 weareserver-f195ae4a1059270f14163b62e7860c3630ee5895.tar.zst |
reparenting checks and conn owned objects
Diffstat (limited to 'server/src/main.rs')
-rw-r--r-- | server/src/main.rs | 35 |
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(()) } |