summaryrefslogtreecommitdiff
path: root/server/server.go
diff options
context:
space:
mode:
authorraven <citrons@mondecitronne.com>2026-03-22 16:32:00 -0500
committerraven <citrons@mondecitronne.com>2026-03-22 16:32:16 -0500
commit8e6326c0db4ceec909b7b949418fbf909d23af29 (patch)
tree918a6fd925a6439ff4359413faf98f7ea5ee326e /server/server.go
parent8afab135eabb570a07de8261b00524510fa5c1fc (diff)
use ExtPlayerList
Diffstat (limited to 'server/server.go')
-rw-r--r--server/server.go55
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)