From 8e6326c0db4ceec909b7b949418fbf909d23af29 Mon Sep 17 00:00:00 2001 From: raven Date: Sun, 22 Mar 2026 16:32:00 -0500 Subject: use ExtPlayerList --- server/server.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) (limited to 'server/server.go') 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) -- cgit v1.2.3