Fix panic on disconnect by adding mutex
This commit is contained in:
		
							
								
								
									
										8
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								main.go
									
									
									
									
									
								
							| @ -27,6 +27,7 @@ var ( | |||||||
| 	players     = make(map[int]*Player) | 	players     = make(map[int]*Player) | ||||||
| 	actionQueue = make(map[int][]*pb.Action) // Queue to store actions for each player | 	actionQueue = make(map[int][]*pb.Action) // Queue to store actions for each player | ||||||
| 	playerConns = make(map[int]net.Conn)     // Map to store player connections | 	playerConns = make(map[int]net.Conn)     // Map to store player connections | ||||||
|  | 	mu          sync.RWMutex                 // Add mutex for protecting shared maps | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| @ -60,11 +61,12 @@ func main() { | |||||||
| func handleConnection(conn net.Conn) { | func handleConnection(conn net.Conn) { | ||||||
| 	defer conn.Close() | 	defer conn.Close() | ||||||
|  |  | ||||||
| 	// Assign a new player ID and add the player to the game state | 	mu.Lock() | ||||||
| 	playerID := len(players) + 1 | 	playerID := len(players) + 1 | ||||||
| 	newPlayer := &Player{ID: playerID, X: 5, Y: 5} | 	newPlayer := &Player{ID: playerID, X: 5, Y: 5} | ||||||
| 	players[playerID] = newPlayer | 	players[playerID] = newPlayer | ||||||
| 	playerConns[playerID] = conn | 	playerConns[playerID] = conn | ||||||
|  | 	mu.Unlock() | ||||||
| 	fmt.Printf("Player %d connected\n", playerID) | 	fmt.Printf("Player %d connected\n", playerID) | ||||||
|  |  | ||||||
| 	// Send player ID to the client | 	// Send player ID to the client | ||||||
| @ -90,6 +92,7 @@ func handleConnection(conn net.Conn) { | |||||||
| 			log.Printf("Error reading from player %d: %v", playerID, err) | 			log.Printf("Error reading from player %d: %v", playerID, err) | ||||||
| 			delete(players, playerID) | 			delete(players, playerID) | ||||||
| 			delete(playerConns, playerID) | 			delete(playerConns, playerID) | ||||||
|  | 			delete(actionQueue, playerID) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @ -107,6 +110,9 @@ func handleConnection(conn net.Conn) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func processActions() { | func processActions() { | ||||||
|  | 	mu.Lock() | ||||||
|  | 	defer mu.Unlock() | ||||||
|  |  | ||||||
| 	// Update players based on queued actions | 	// Update players based on queued actions | ||||||
| 	for playerID, actions := range actionQueue { | 	for playerID, actions := range actionQueue { | ||||||
| 		player := players[playerID] | 		player := players[playerID] | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user