diff options
| author | raven <citrons@mondecitronne.com> | 2026-03-22 16:32:00 -0500 |
|---|---|---|
| committer | raven <citrons@mondecitronne.com> | 2026-03-22 16:32:16 -0500 |
| commit | 8e6326c0db4ceec909b7b949418fbf909d23af29 (patch) | |
| tree | 918a6fd925a6439ff4359413faf98f7ea5ee326e /server/server.go | |
| parent | 8afab135eabb570a07de8261b00524510fa5c1fc (diff) | |
use ExtPlayerList
Diffstat (limited to 'server/server.go')
| -rw-r--r-- | server/server.go | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/server/server.go b/server/server.go index 29aa66f..213bd64 100644 --- a/server/server.go +++ b/server/server.go @@ -21,11 +21,13 @@ var supportedExtensions = []string { "LongerMessages", "FullCP437", "CustomBlocks", + "ExtPlayerList.2", } var requiredExtensions = []string { "ExtEntityPositions", "EnvMapAspect.2", "CustomBlocks", + "ExtPlayerList.2", } type ServerInfo struct { @@ -40,11 +42,14 @@ type Server struct { info ServerInfo clients map[*client]bool players map[string]*player + listIds map[listId]string + playerList map[string]listEntry levels map[levelId]*level listener net.Listener stopping bool stopped chan struct{} } + type worldState struct { LastId levelId SpawnLevel levelId @@ -52,11 +57,21 @@ type worldState struct { Banned map[string]string } +type listId int16 +type listEntry struct { + id listId + playerName string + listName string + player *player +} + func NewServer(info ServerInfo) *Server { s := &Server { info: info, clients: make(map[*client]bool), players: make(map[string]*player), + listIds: make(map[listId]string), + playerList: make(map[string]listEntry), levels: make(map[levelId]*level), stopped: make(chan struct{}), } @@ -202,10 +217,13 @@ func (s *Server) OnDisconnect(cl *client) { } func (s *Server) OnLeave(pl *player, username string) { - s.Broadcast(nil, fmt.Sprintf("&e%s has left", username)) - if s.players[username] == pl { - delete(s.players, username) - } + s.Act(pl, func() { + s.Broadcast(nil, fmt.Sprintf("&e%s has left", username)) + if s.players[username] == pl { + delete(s.players, username) + s.removeListEntry(username) + } + }) } func (s *Server) OnPlayerMessage(from *player, name string, message string) { @@ -248,6 +266,9 @@ func (s *Server) newPlayer( cl *client, name string, ext map[string]bool) *player { pl := newPlayer(s, cl, name, ext) s.players[name] = pl + for _, entry := range s.playerList { + pl.OnAddListEntry(s, entry) + } return pl } @@ -320,9 +341,35 @@ func (s *Server) NewPlayer( s.newPlayer(cl, name, ext) s.GetPlayer(from, name, reply) } + s.addListEntry(name) }) } +func (s *Server) addListEntry(name string) { + var id listId + for s.listIds[id] != "" { + id++ + } + s.listIds[id] = name + s.playerList[name] = listEntry { + id: id, + playerName: name, + listName: name, + } + for _, player := range s.players { + player.OnAddListEntry(s, s.playerList[name]) + } +} + +func (s *Server) removeListEntry(name string) { + id := s.playerList[name].id + delete(s.playerList, name) + delete(s.listIds, id) + for _, player := range s.players { + player.OnRemoveListEntry(s, id) + } +} + func (s *Server) getLevel(lvl levelId) *level { if s.levels[lvl] == nil { s.levels[lvl] = loadLevel(s, lvl, lvl == s.SpawnLevel) |
