@@ -20,7 +20,7 @@ type WebSocketConnection struct {
20
20
ID string
21
21
}
22
22
23
- var connections = make (map [string ]WebSocketConnection , 0 )
23
+ var connections = make (map [string ]* WebSocketConnection , 0 )
24
24
25
25
func Handle (c * websocket.Conn ) {
26
26
id , err := session .Generate (8 )
@@ -34,7 +34,7 @@ func Handle(c *websocket.Conn) {
34
34
Conn : c ,
35
35
ID : sid ,
36
36
}
37
- connections [sid ] = ws
37
+ connections [sid ] = & ws
38
38
39
39
for {
40
40
var msg AnyMessage
@@ -72,14 +72,14 @@ func handleHello(c *WebSocketConnection, d *AnyMessage) {
72
72
}
73
73
74
74
if len (r .Players ) >= room .PlayerLimit {
75
- c .Kick (r , RoomFullKick , "Too many players online" )
75
+ c .Kick (RoomFullKick , "Too many players online" )
76
76
return
77
77
}
78
78
79
79
if r .Mode == room .EliminationMode &&
80
80
r .State != room .CountdownState &&
81
81
r .State != room .WaitingState {
82
- c .Kick (r , RoomIngameKick , "Room is already in-game" )
82
+ c .Kick (RoomIngameKick , "Room is already in-game" )
83
83
return
84
84
}
85
85
@@ -112,22 +112,43 @@ func handleHello(c *WebSocketConnection, d *AnyMessage) {
112
112
113
113
r .Players = append (r .Players , & p )
114
114
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
+
116
147
c .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 ,
129
151
})
130
- // TODO: check if room is elimination room and if it meets requirements for room start
131
152
}
132
153
133
154
func handleHeartbeat (c * WebSocketConnection , d * AnyMessage ) {
@@ -167,6 +188,12 @@ func handleEvent(c *WebSocketConnection, d *AnyMessage) {
167
188
func handleClose (c * WebSocketConnection ) {
168
189
c .Conn .Close ()
169
190
delete (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
+ }
170
197
}
171
198
172
199
func (c * WebSocketConnection ) Send (d AnyMessage ) error {
@@ -175,7 +202,7 @@ func (c *WebSocketConnection) Send(d AnyMessage) error {
175
202
return c .Conn .WriteJSON (d )
176
203
}
177
204
178
- func (c * WebSocketConnection ) Kick (r * room. Room , kickType uint8 , reason string ) error {
205
+ func (c * WebSocketConnection ) Kick (kickType uint8 , reason string ) error {
179
206
fmt .Println (AnyMessage {
180
207
Op : OpClose ,
181
208
T : PlayerKickEvent ,
@@ -196,21 +223,30 @@ func (c *WebSocketConnection) Kick(r *room.Room, kickType uint8, reason string)
196
223
return err
197
224
}
198
225
199
- r .RemovePlayer (r .GetPlayerIndexByWebSocketID (c .ID ))
200
-
201
226
handleClose (c )
202
227
return nil
203
228
}
204
229
205
230
// HandleAntiCheatFlags checks whether the user has reached the flag limit and kicks them
206
231
func (c * WebSocketConnection ) HandleAntiCheatFlags (r * room.Room , flags int ) bool {
207
232
if flags > utils .FlagLimit {
208
- c .Kick (r , FlagLimitKick , "Too many flags" )
233
+ c .Kick (FlagLimitKick , "Too many flags" )
209
234
return true
210
235
}
211
236
return false
212
237
}
213
238
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
+
214
250
func WatchRoom (r * room.Room ) {
215
251
for {
216
252
for _ , p := range r .Players {
@@ -219,6 +255,8 @@ func WatchRoom(r *room.Room) {
219
255
continue
220
256
}
221
257
258
+ // TODO: check p.LastPing
259
+
222
260
conn .Send (AnyMessage {
223
261
Op : OpEvent ,
224
262
T : CoordinateChangeEvent ,
@@ -228,6 +266,23 @@ func WatchRoom(r *room.Room) {
228
266
})
229
267
}
230
268
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
+
231
275
time .Sleep (time .Millisecond * 25 )
232
276
}
233
277
}
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