aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiley <riley@e926.de>2022-05-01 10:14:27 +0200
committerRiley <riley@e926.de>2022-05-01 10:14:27 +0200
commit01c26985b161c66aa230ea537549eda57a1360ad (patch)
treea76502eb4209953f5517b8aa648428af72a6f672
parentd0ec2ea653f9436054f47d0c398039f9596932b0 (diff)
texturePools!
-rw-r--r--config.go33
-rw-r--r--connect.go24
-rw-r--r--content.go68
-rw-r--r--formspec.go2
-rw-r--r--process.go42
-rw-r--r--server_conn.go2
6 files changed, 114 insertions, 57 deletions
diff --git a/config.go b/config.go
index 3b4a6ba..25319ad 100644
--- a/config.go
+++ b/config.go
@@ -23,9 +23,10 @@ var configMu sync.RWMutex
var loadConfigOnce sync.Once
type Server struct {
- Name string
- Addr string
- Fallbacks []string
+ Name string
+ Addr string
+ TexturePool string
+ Fallbacks []string
}
// A Config contains information from the configuration file
@@ -87,6 +88,32 @@ func Conf() Config {
return config
}
+// UniquePoolServers returns a []server where each Pool is only
+// represented once
+func UniquePoolServers() []Server {
+ var srvs []Server
+ conf := Conf()
+
+ for _, srv := range conf.Servers {
+ if len(srv.TexturePool) == 0 {
+ srv.TexturePool = srv.Name
+ }
+ }
+
+AddLoop:
+ for _, srv := range conf.Servers {
+ for _, srv2 := range srvs {
+ if srv.TexturePool == srv2.TexturePool {
+ continue AddLoop
+ }
+ }
+
+ srvs = append(srvs, srv)
+ }
+
+ return srvs
+}
+
// AddServer appends a server to the list of configured servers.
func AddServer(server Server) bool {
configMu.Lock()
diff --git a/connect.go b/connect.go
index 78f6184..32b892c 100644
--- a/connect.go
+++ b/connect.go
@@ -17,13 +17,26 @@ func connect(conn net.Conn, name string, cc *ClientConn) *ServerConn {
}
cc.mu.RUnlock()
- prefix := fmt.Sprintf("[server %s] ", name)
+ conf := Conf()
+ var prefix string
+ for _, srv := range conf.Servers {
+ if srv.Name == name {
+ if len(srv.TexturePool) == 0 {
+ prefix = srv.Name
+ } else {
+ prefix = srv.TexturePool
+ }
+ }
+ }
+
+ logPrefix := fmt.Sprintf("[server %s] ", name)
sc := &ServerConn{
Peer: mt.Connect(conn),
- logger: log.New(logWriter, prefix, log.LstdFlags|log.Lmsgprefix),
+ logger: log.New(logWriter, logPrefix, log.LstdFlags|log.Lmsgprefix),
initCh: make(chan struct{}),
clt: cc,
name: name,
+ prefix: prefix,
aos: make(map[mt.AOID]struct{}),
particleSpawners: make(map[mt.ParticleSpawnerID]struct{}),
sounds: make(map[mt.SoundID]struct{}),
@@ -40,14 +53,15 @@ func connect(conn net.Conn, name string, cc *ClientConn) *ServerConn {
return sc
}
-func connectContent(conn net.Conn, name, userName string) (*contentConn, error) {
- prefix := fmt.Sprintf("[content %s] ", name)
+func connectContent(conn net.Conn, name, userName, prefix string) (*contentConn, error) {
+ logPrefix := fmt.Sprintf("[content %s] ", name)
cc := &contentConn{
Peer: mt.Connect(conn),
- logger: log.New(logWriter, prefix, log.LstdFlags|log.Lmsgprefix),
+ logger: log.New(logWriter, logPrefix, log.LstdFlags|log.Lmsgprefix),
doneCh: make(chan struct{}),
name: name,
userName: userName,
+ prefix: prefix,
}
if err := cc.addDefaultTextures(); err != nil {
diff --git a/content.go b/content.go
index ed7a6ce..9696328 100644
--- a/content.go
+++ b/content.go
@@ -35,6 +35,8 @@ type contentConn struct {
logger *log.Logger
+ prefix string
+
cstate clientState
cstateMu sync.RWMutex
name, userName string
@@ -357,21 +359,21 @@ func muxItemDefs(conns []*contentConn) ([]mt.ItemDef, []struct{ Alias, Orig stri
def.Name = "hand"
}
- prepend(cc.name, &def.Name)
- prependTexture(cc.name, &def.InvImg)
- prependTexture(cc.name, &def.WieldImg)
- prepend(cc.name, &def.PlacePredict)
- prepend(cc.name, &def.PlaceSnd.Name)
- prepend(cc.name, &def.PlaceFailSnd.Name)
- prependTexture(cc.name, &def.Palette)
- prependTexture(cc.name, &def.InvOverlay)
- prependTexture(cc.name, &def.WieldOverlay)
+ prepend(cc.prefix, &def.Name)
+ prependTexture(cc.prefix, &def.InvImg)
+ prependTexture(cc.prefix, &def.WieldImg)
+ prepend(cc.prefix, &def.PlacePredict)
+ prepend(cc.prefix, &def.PlaceSnd.Name)
+ prepend(cc.prefix, &def.PlaceFailSnd.Name)
+ prependTexture(cc.prefix, &def.Palette)
+ prependTexture(cc.prefix, &def.InvOverlay)
+ prependTexture(cc.prefix, &def.WieldOverlay)
itemDefs = append(itemDefs, def)
}
for _, alias := range cc.aliases {
- prepend(cc.name, &alias.Alias)
- prepend(cc.name, &alias.Orig)
+ prepend(cc.prefix, &alias.Alias)
+ prepend(cc.prefix, &alias.Orig)
aliases = append(aliases, struct{ Alias, Orig string }{
Alias: alias.Alias,
@@ -429,25 +431,25 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map,
}
def.Param0 = param0
- prepend(cc.name, &def.Name)
- prepend(cc.name, &def.Mesh)
+ prepend(cc.prefix, &def.Name)
+ prepend(cc.prefix, &def.Mesh)
for i := range def.Tiles {
- prependTexture(cc.name, &def.Tiles[i].Texture)
+ prependTexture(cc.prefix, &def.Tiles[i].Texture)
}
for i := range def.OverlayTiles {
- prependTexture(cc.name, &def.OverlayTiles[i].Texture)
+ prependTexture(cc.prefix, &def.OverlayTiles[i].Texture)
}
for i := range def.SpecialTiles {
- prependTexture(cc.name, &def.SpecialTiles[i].Texture)
+ prependTexture(cc.prefix, &def.SpecialTiles[i].Texture)
}
- prependTexture(cc.name, &def.Palette)
+ prependTexture(cc.prefix, &def.Palette)
for k, v := range def.ConnectTo {
def.ConnectTo[k] = p0Map[cc.name][v]
}
- prepend(cc.name, &def.FootstepSnd.Name)
- prepend(cc.name, &def.DiggingSnd.Name)
- prepend(cc.name, &def.DugSnd.Name)
- prepend(cc.name, &def.DigPredict)
+ prepend(cc.prefix, &def.FootstepSnd.Name)
+ prepend(cc.prefix, &def.DiggingSnd.Name)
+ prepend(cc.prefix, &def.DugSnd.Name)
+ prepend(cc.prefix, &def.DigPredict)
nodeDefs = append(nodeDefs, def)
param0++
@@ -466,7 +468,7 @@ func muxMedia(conns []*contentConn) []mediaFile {
for _, cc := range conns {
<-cc.done()
for _, f := range cc.media {
- prepend(cc.name, &f.name)
+ prepend(cc.prefix, &f.name)
media = append(media, f)
}
}
@@ -494,7 +496,7 @@ func muxRemotes(conns []*contentConn) []string {
func muxContent(userName string) (itemDefs []mt.ItemDef, aliases []struct{ Alias, Orig string }, nodeDefs []mt.NodeDef, p0Map param0Map, p0SrvMap param0SrvMap, media []mediaFile, remotes []string, err error) {
var conns []*contentConn
- for _, srv := range Conf().Servers {
+ for _, srv := range UniquePoolServers() {
var addr *net.UDPAddr
addr, err = net.ResolveUDPAddr("udp", srv.Addr)
if err != nil {
@@ -507,8 +509,16 @@ func muxContent(userName string) (itemDefs []mt.ItemDef, aliases []struct{ Alias
return
}
+ // get prefix of server
+ var prefix string
+ if len(srv.TexturePool) == 0 {
+ prefix = srv.Name
+ } else {
+ prefix = srv.TexturePool
+ }
+
var cc *contentConn
- cc, err = connectContent(conn, srv.Name, userName)
+ cc, err = connectContent(conn, srv.Name, userName, prefix)
if err != nil {
return
}
@@ -594,7 +604,7 @@ func prependTexture(prep string, t *mt.Texture) {
func (sc *ServerConn) prependInv(inv mt.Inv) {
for k, l := range inv {
for i := range l.Stacks {
- prepend(sc.name, &inv[k].InvList.Stacks[i].Name)
+ prepend(sc.prefix, &inv[k].InvList.Stacks[i].Name)
}
}
}
@@ -603,28 +613,28 @@ func (sc *ServerConn) prependHUD(t mt.HUDType, cmdIface mt.ToCltCmd) {
pa := func(cmd *mt.ToCltAddHUD) {
switch t {
case mt.StatbarHUD:
- prepend(sc.name, &cmd.Text2)
+ prepend(sc.prefix, &cmd.Text2)
fallthrough
case mt.ImgHUD:
fallthrough
case mt.ImgWaypointHUD:
fallthrough
case mt.ImgWaypointHUD + 1:
- prepend(sc.name, &cmd.Text)
+ prepend(sc.prefix, &cmd.Text)
}
}
pc := func(cmd *mt.ToCltChangeHUD) {
switch t {
case mt.StatbarHUD:
- prepend(sc.name, &cmd.Text2)
+ prepend(sc.prefix, &cmd.Text2)
fallthrough
case mt.ImgHUD:
fallthrough
case mt.ImgWaypointHUD:
fallthrough
case mt.ImgWaypointHUD + 1:
- prepend(sc.name, &cmd.Text)
+ prepend(sc.prefix, &cmd.Text)
}
}
diff --git a/formspec.go b/formspec.go
index a8a1ea2..169d2f8 100644
--- a/formspec.go
+++ b/formspec.go
@@ -13,7 +13,7 @@ func (sc *ServerConn) prependFormspec(fs *string) {
for i, sub := range subs {
if textureName.MatchString(sub) && !strings.Contains(sub, " ") {
- prepend(sc.name, &subs[i])
+ prepend(sc.prefix, &subs[i])
}
}
diff --git a/process.go b/process.go
index 5208c97..9b46f05 100644
--- a/process.go
+++ b/process.go
@@ -13,6 +13,15 @@ import (
func (cc *ClientConn) process(pkt mt.Pkt) {
srv := cc.server()
+ forward := func(pkt mt.Pkt) {
+ if srv == nil {
+ cc.Log("->", "no server")
+ return
+ }
+
+ srv.Send(pkt)
+ }
+
switch cmd := pkt.Cmd.(type) {
case *mt.ToSrvNil:
return
@@ -442,12 +451,7 @@ func (cc *ClientConn) process(pkt mt.Pkt) {
return
}
- if srv == nil {
- cc.Log("->", "no server")
- return
- }
-
- srv.Send(pkt)
+ forward(pkt)
}
func (sc *ServerConn) process(pkt mt.Pkt) {
@@ -610,7 +614,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) {
handStack := mt.Stack{
Item: mt.Item{
- Name: sc.name + "_hand",
+ Name: sc.prefix + "_hand",
},
Count: 1,
}
@@ -728,7 +732,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) {
break
}
- prepend(sc.name, &cmd.Filename)
+ prepend(sc.prefix, &cmd.Filename)
if cmd.ShouldCache {
cacheMedia(mediaFile{
name: cmd.Filename,
@@ -738,17 +742,17 @@ func (sc *ServerConn) process(pkt mt.Pkt) {
}
case *mt.ToCltSkyParams:
for i := range cmd.Textures {
- prependTexture(sc.name, &cmd.Textures[i])
+ prependTexture(sc.prefix, &cmd.Textures[i])
}
case *mt.ToCltSunParams:
- prependTexture(sc.name, &cmd.Texture)
- prependTexture(sc.name, &cmd.ToneMap)
- prependTexture(sc.name, &cmd.Rise)
+ prependTexture(sc.prefix, &cmd.Texture)
+ prependTexture(sc.prefix, &cmd.ToneMap)
+ prependTexture(sc.prefix, &cmd.Rise)
case *mt.ToCltMoonParams:
- prependTexture(sc.name, &cmd.Texture)
- prependTexture(sc.name, &cmd.ToneMap)
+ prependTexture(sc.prefix, &cmd.Texture)
+ prependTexture(sc.prefix, &cmd.ToneMap)
case *mt.ToCltSetHotbarParam:
- prependTexture(sc.name, &cmd.Img)
+ prependTexture(sc.prefix, &cmd.Img)
case *mt.ToCltUpdatePlayerList:
if !clt.playerListInit {
clt.playerListInit = true
@@ -766,7 +770,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) {
}
}
case *mt.ToCltSpawnParticle:
- prependTexture(sc.name, &cmd.Texture)
+ prependTexture(sc.prefix, &cmd.Texture)
sc.globalParam0(&cmd.NodeParam0)
case *mt.ToCltBlkData:
for i := range cmd.Blk.Param0 {
@@ -785,14 +789,14 @@ func (sc *ServerConn) process(pkt mt.Pkt) {
case *mt.ToCltAddNode:
sc.globalParam0(&cmd.Node.Param0)
case *mt.ToCltAddParticleSpawner:
- prependTexture(sc.name, &cmd.Texture)
+ prependTexture(sc.prefix, &cmd.Texture)
sc.swapAOID(&cmd.AttachedAOID)
sc.globalParam0(&cmd.NodeParam0)
sc.particleSpawners[cmd.ID] = struct{}{}
case *mt.ToCltDelParticleSpawner:
delete(sc.particleSpawners, cmd.ID)
case *mt.ToCltPlaySound:
- prepend(sc.name, &cmd.Name)
+ prepend(sc.prefix, &cmd.Name)
sc.swapAOID(&cmd.SrcAOID)
if cmd.Loop {
sc.sounds[cmd.ID] = struct{}{}
@@ -817,7 +821,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) {
sc.prependFormspec(&cmd.Formspec)
case *mt.ToCltMinimapModes:
for i := range cmd.Modes {
- prependTexture(sc.name, &cmd.Modes[i].Texture)
+ prependTexture(sc.prefix, &cmd.Modes[i].Texture)
}
case *mt.ToCltNodeMetasChanged:
for k := range cmd.Changed {
diff --git a/server_conn.go b/server_conn.go
index 53c7f1a..10ca868 100644
--- a/server_conn.go
+++ b/server_conn.go
@@ -17,6 +17,8 @@ type ServerConn struct {
clt *ClientConn
mu sync.RWMutex
+ prefix string
+
logger *log.Logger
cstate clientState