summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/main.rs48
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,
+ );
}
}
}