/
players_registry.go
68 lines (59 loc) · 1.44 KB
/
players_registry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package typhoon
import "sync"
type PlayerRegistry struct {
playersCount int
players map[int]*Player
playersMutex *sync.RWMutex
}
func newPlayerRegistry() *PlayerRegistry {
return &PlayerRegistry{
playersCount: 0,
players: make(map[int]*Player),
playersMutex: &sync.RWMutex{},
}
}
func (player *Player) register() {
reg := player.core.playerRegistry
reg.playersMutex.Lock()
reg.players[player.id] = player
reg.playersCount++
reg.playersMutex.Unlock()
}
func (player *Player) unregister() {
reg := player.core.playerRegistry
reg.playersMutex.Lock()
if _, ok := reg.players[player.id]; ok {
reg.playersCount--
}
delete(reg.players, player.id)
reg.playersMutex.Unlock()
}
func (registry *PlayerRegistry) ForEachPlayer(fn func(player *Player)) {
registry.playersMutex.Lock()
for _, player := range registry.players {
fn(player)
}
registry.playersMutex.Unlock()
}
func (registry *PlayerRegistry) ForEachPlayerAsync(fn func(player *Player)) {
for _, player := range registry.players {
go fn(player)
}
}
func (registry *PlayerRegistry) GetPlayerCount() int {
registry.playersMutex.RLock()
i := registry.playersCount
registry.playersMutex.RUnlock()
return i
}
func (registry *PlayerRegistry) GetPlayers() []*Player {
registry.playersMutex.RLock()
players := make([]*Player, len(registry.players))
i := 0
for _, pl := range registry.players {
players[i] = pl
i++
}
registry.playersMutex.RUnlock()
return players
}