@@ -23,9 +23,13 @@ pub mod window;
2323use std:: {
2424 collections:: { HashMap , HashSet } ,
2525 sync:: Arc ,
26+ time:: Duration ,
2627} ;
2728
2829use color_eyre:: eyre:: Result ;
30+
31+ use tokio:: sync:: Mutex ;
32+
2933#[ cfg( feature = "timings" ) ]
3034use tokio:: time:: Instant ;
3135
@@ -34,6 +38,7 @@ use crate::{
3438 cache:: WorldCache ,
3539 player:: { SharedPlayer , TeleportError } ,
3640 } ,
41+ world:: { Container , World } ,
3742 CrawlState ,
3843} ;
3944
@@ -44,37 +49,45 @@ pub struct Server {
4449 pub ticker : Ticker ,
4550
4651 world_cache : Arc < WorldCache > ,
47- players : HashMap < u16 , SharedPlayer > ,
52+ players : Mutex < HashMap < u16 , SharedPlayer > > ,
4853
4954 crawlstate : CrawlState ,
5055}
5156
5257impl Server {
5358 #[ must_use]
54- pub fn new ( state : CrawlState , world_cache : WorldCache , tick_rate : u8 ) -> Self {
55- Server {
59+ pub fn new ( state : CrawlState , world_cache : WorldCache , tick_rate : u8 ) -> Arc < Self > {
60+ let server = Arc :: new ( Server {
5661 ticker : Ticker :: new ( tick_rate) ,
5762 world_cache : Arc :: new ( world_cache) ,
58- players : HashMap :: new ( ) ,
59- crawlstate : state,
60- }
63+ players : Mutex :: new ( HashMap :: new ( ) ) ,
64+ crawlstate : state. clone ( ) ,
65+ } ) ;
66+
67+ let state_server = server. clone ( ) ;
68+ tokio:: spawn ( async move {
69+ state. set_server ( state_server) . await ;
70+ } ) ;
71+
72+ server
6173 }
6274
63- async fn tick ( & mut self ) {
75+ async fn tick ( & self ) {
6476 #[ cfg( feature = "timings" ) ]
6577 let run_start = Instant :: now ( ) ;
6678
6779 let state = self . crawlstate . clone ( ) ;
6880 let mut player_recv = state. player_recv . lock ( ) . await ;
6981
82+ let mut players = self . players . lock ( ) . await ;
7083 while let Ok ( p) = player_recv. try_recv ( ) {
71- self . players . insert ( p. 0 . id , p. clone ( ) ) ;
84+ players. insert ( p. 0 . id , p. clone ( ) ) ;
7285 tokio:: spawn ( Self :: send_world_to ( p. clone ( ) , self . world_cache . clone ( ) ) ) ;
7386 }
7487
7588 let mut invalid_players: HashSet < u16 > = HashSet :: new ( ) ;
7689
77- for ( id, player) in & self . players {
90+ for ( id, player) in & * players {
7891 let _ = player. keepalive ( ) . await ;
7992
8093 match player. handle_all_packets ( ) . await {
@@ -103,13 +116,12 @@ impl Server {
103116
104117 for id in invalid_players {
105118 // TODO: kick player properly
106- self . players . remove ( & id) ;
119+ players. remove ( & id) ;
107120 }
108121
109122 #[ cfg( feature = "timings" ) ]
110123 {
111124 let run_end = Instant :: now ( ) ;
112- debug ! ( "Tick took {}ms" , ( run_start - run_end) . as_millis( ) ) ;
113125 debug ! ( "Tick took {}ms" , ( run_end - run_start) . as_millis( ) ) ;
114126 }
115127 }
@@ -121,4 +133,8 @@ impl Server {
121133
122134 Ok ( ( ) )
123135 }
136+
137+ pub fn get_container ( & self , x : i32 , y : i32 , z : i32 ) -> Option < Container > {
138+ self . world_cache . containers . get ( & ( x, y, z) ) . cloned ( )
139+ }
124140}
0 commit comments