diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/main.rs | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 4528ede..a599efa 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -20,11 +20,15 @@ use anyhow::Result; use clap::Parser; use log::{debug, warn}; use network::ServerNetwork; -use std::net::{IpAddr, SocketAddr}; +use std::{ + collections::HashSet, + marker::PhantomData, + net::{IpAddr, SocketAddr}, +}; use weareshared::{ - packets::{Data, Packet}, - resources::PrefabIndex, - store::ResourceStore, + packets::{Data, Packet, Resource}, + resources::{Prefab, PrefabIndex}, + store::{ResourceStore, sha256}, tree::SceneTree, }; @@ -40,6 +44,8 @@ struct State { store: ResourceStore, tree: SceneTree, prefab_index: PrefabIndex, + prefab_index_pending: HashSet<Resource<Prefab>>, + prefab_index_have: HashSet<Resource<Prefab>>, } fn main() -> Result<()> { @@ -66,6 +72,8 @@ impl State { )?, tree: SceneTree::default(), prefab_index: PrefabIndex::default(), + prefab_index_pending: HashSet::new(), + prefab_index_have: HashSet::new(), }) } pub fn prime_client(&self, conn: u128, net: &ServerNetwork) -> Result<()> { @@ -95,8 +103,24 @@ impl State { } } Packet::RespondResource(data) => { - self.store.set_raw(&data.0)?; + let resource = self.store.set_raw(&data.0)?; net.broadcast(Packet::RespondResource(data), true); + + if self + .prefab_index_pending + .remove(&Resource(resource.0, PhantomData)) + { + let resource = Resource(resource.0, PhantomData::<Prefab>); + if let Some(prefab) = self.store.get(resource.clone())? { + if let Some(name) = prefab.name { + self.prefab_index.0.insert(name, resource); + net.broadcast( + Packet::PrefabIndex(self.store.set(&self.prefab_index)?), + true, + ); + } + } + } } Packet::Add(object, resource) => { net.broadcast(Packet::Add(object, resource), true); @@ -120,14 +144,12 @@ impl State { // ok } Packet::AnnouncePrefab(resource) => { - if let Some(prefab) = self.store.get(resource.clone())? { - if let Some(name) = prefab.name { - self.prefab_index.0.insert(name, resource); - net.broadcast( - Packet::PrefabIndex(self.store.set(&self.prefab_index)?), - true, - ); - } + if self.prefab_index_have.insert(resource.clone()) { + self.prefab_index_pending.insert(resource.clone()); + net.broadcast( + Packet::RequestResource(Resource(resource.0, PhantomData)), + true, + ); } } } |