@@ -20,7 +20,7 @@ type WebSocketConnection struct {
2020ID  string 
2121}
2222
23- var  connections  =  make (map [string ]WebSocketConnection , 0 )
23+ var  connections  =  make (map [string ]* WebSocketConnection , 0 )
2424
2525func  Handle (c  * websocket.Conn ) {
2626id , err  :=  session .Generate (8 )
@@ -34,7 +34,7 @@ func Handle(c *websocket.Conn) {
3434Conn : c ,
3535ID : sid ,
3636}
37- connections [sid ] =  ws 
37+ connections [sid ] =  & ws 
3838
3939for  {
4040var  msg  AnyMessage 
@@ -72,14 +72,14 @@ func handleHello(c *WebSocketConnection, d *AnyMessage) {
7272}
7373
7474if  len (r .Players ) >=  room .PlayerLimit  {
75- c .Kick (r ,  RoomFullKick , "Too many players online" )
75+ c .Kick (RoomFullKick , "Too many players online" )
7676return 
7777}
7878
7979if  r .Mode  ==  room .EliminationMode  && 
8080r .State  !=  room .CountdownState  && 
8181r .State  !=  room .WaitingState  {
82- c .Kick (r ,  RoomIngameKick , "Room is already in-game" )
82+ c .Kick (RoomIngameKick , "Room is already in-game" )
8383return 
8484}
8585
@@ -112,22 +112,43 @@ func handleHello(c *WebSocketConnection, d *AnyMessage) {
112112
113113r .Players  =  append (r .Players , & p )
114114
115- fmt .Println (r )
115+ resData  :=  map [string ]interface {}{
116+ "user" : p ,
117+ "users" : r .Players ,
118+ "objects" : r .Map .Objects ,
119+ "interval" : PingInterval ,
120+ "items" : r .Items ,
121+ "roomCreatedAt" : r .CreatedAt ,
122+ }
123+ 
124+ fmt .Println (r .Mode , len (r .Players ), room .MinPlayerStartup , r .State , room .WaitingState )
125+ 
126+ if  r .Mode  ==  room .EliminationMode  {
127+ if  len (r .Players ) >=  room .MinPlayerStartup  &&  r .State  ==  room .WaitingState  {
128+ r .State  =  room .CountdownState 
129+ r .CountdownStarted  =  time .Now ().UnixNano () /  int64 (time .Millisecond )
130+ BroadcastMessage (r , AnyMessage {
131+ Op : OpEvent ,
132+ T : StateChangeEvent ,
133+ Data : map [string ]interface {}{
134+ "state" : r .State ,
135+ "countdownStarted" : r .CountdownStarted ,
136+ },
137+ })
138+ }
139+ 
140+ resData ["state" ] =  r .State 
141+ resData ["waitingTime" ] =  room .WaitingTime 
142+ resData ["countdownStarted" ] =  r .CountdownStarted 
143+ }
144+ 
145+ fmt .Println (resData )
146+ 
116147c .Send (AnyMessage {
117- Op : OpEvent ,
118- T : HeartbeatEvent ,
119- Data : map [string ]interface {}{
120- "user" : p ,
121- "users" : r .Players ,
122- "objects" : r .Map .Objects ,
123- "interval" : PingInterval ,
124- "items" : r .Items ,
125- "roomCreatedAt" : r .CreatedAt ,
126- "state" : r .State ,
127- "countdownStarted" : r .CountdownStarted ,
128- },
148+ Op : OpEvent ,
149+ T : HeartbeatEvent ,
150+ Data : resData ,
129151})
130- // TODO: check if room is elimination room and if it meets requirements for room start 
131152}
132153
133154func  handleHeartbeat (c  * WebSocketConnection , d  * AnyMessage ) {
@@ -167,6 +188,12 @@ func handleEvent(c *WebSocketConnection, d *AnyMessage) {
167188func  handleClose (c  * WebSocketConnection ) {
168189c .Conn .Close ()
169190delete (connections , c .ID )
191+ 
192+ // TODO: optimize this 
193+ r  :=  room .FindLobbyByWebsocketID (c .ID )
194+ if  r  !=  nil  {
195+ r .RemovePlayer (r .GetPlayerIndexByWebSocketID (c .ID ))
196+ }
170197}
171198
172199func  (c  * WebSocketConnection ) Send (d  AnyMessage ) error  {
@@ -175,7 +202,7 @@ func (c *WebSocketConnection) Send(d AnyMessage) error {
175202return  c .Conn .WriteJSON (d )
176203}
177204
178- func  (c  * WebSocketConnection ) Kick (r   * room. Room ,  kickType  uint8 , reason  string ) error  {
205+ func  (c  * WebSocketConnection ) Kick (kickType  uint8 , reason  string ) error  {
179206fmt .Println (AnyMessage {
180207Op : OpClose ,
181208T : PlayerKickEvent ,
@@ -196,21 +223,30 @@ func (c *WebSocketConnection) Kick(r *room.Room, kickType uint8, reason string)
196223return  err 
197224}
198225
199- r .RemovePlayer (r .GetPlayerIndexByWebSocketID (c .ID ))
200- 
201226handleClose (c )
202227return  nil 
203228}
204229
205230// HandleAntiCheatFlags checks whether the user has reached the flag limit and kicks them 
206231func  (c  * WebSocketConnection ) HandleAntiCheatFlags (r  * room.Room , flags  int ) bool  {
207232if  flags  >  utils .FlagLimit  {
208- c .Kick (r ,  FlagLimitKick , "Too many flags" )
233+ c .Kick (FlagLimitKick , "Too many flags" )
209234return  true 
210235}
211236return  false 
212237}
213238
239+ func  BroadcastMessage (r  * room.Room , d  AnyMessage ) {
240+ for  _ , p  :=  range  r .Players  {
241+ conn , ok  :=  connections [p .ID ]
242+ if  ! ok  {
243+ continue 
244+ }
245+ 
246+ conn .Send (d )
247+ }
248+ }
249+ 
214250func  WatchRoom (r  * room.Room ) {
215251for  {
216252for  _ , p  :=  range  r .Players  {
@@ -219,6 +255,8 @@ func WatchRoom(r *room.Room) {
219255continue 
220256}
221257
258+ // TODO: check p.LastPing 
259+ 
222260conn .Send (AnyMessage {
223261Op : OpEvent ,
224262T : CoordinateChangeEvent ,
@@ -228,6 +266,23 @@ func WatchRoom(r *room.Room) {
228266})
229267}
230268
269+ if  r .Mode  ==  room .EliminationMode  && 
270+ r .State  ==  room .CountdownState  && 
271+ (time .Now ().UnixNano ()/ int64 (time .Millisecond )) >=  r .StartsAt () {
272+ StartEliminationRoom (r )
273+ }
274+ 
231275time .Sleep (time .Millisecond  *  25 )
232276}
233277}
278+ 
279+ func  StartEliminationRoom (r  * room.Room ) {
280+ r .State  =  room .IngameState 
281+ BroadcastMessage (r , AnyMessage {
282+ Op : OpEvent ,
283+ T : StateChangeEvent ,
284+ Data : map [string ]interface {}{
285+ "state" : r .State ,
286+ },
287+ })
288+ }
0 commit comments