diff options
-rw-r--r-- | config.go | 36 | ||||
-rw-r--r-- | connect.go | 27 | ||||
-rw-r--r-- | content.go | 60 | ||||
-rw-r--r-- | doc/config.md | 7 | ||||
-rw-r--r-- | formspec.go | 2 | ||||
-rw-r--r-- | process.go | 49 | ||||
-rw-r--r-- | server_conn.go | 2 |
7 files changed, 114 insertions, 69 deletions
@@ -24,10 +24,12 @@ var configMu sync.RWMutex var loadConfigOnce sync.Once type Server struct { - Name string - Addr string - Fallbacks []string - dynamic bool + Name string + Addr string + TexturePool string + Fallbacks []string + + dynamic bool } // A Config contains information from the configuration file @@ -89,6 +91,26 @@ func Conf() Config { return config } +// UniquePoolServers returns a []Server where each +// TexturePool is only represented once. +func UniquePoolServers() []Server { + var srvs []Server + conf := Conf() + +AppendLoop: + for _, srv := range conf.Servers { + for _, s := range srvs { + if srv.TexturePool == s.TexturePool { + continue AppendLoop + } + } + + srvs = append(srvs, srv) + } + + return srvs +} + // AddServer dynamically configures a new Server at runtime. // Servers added in this way are ephemeral and will be lost // when the proxy shuts down. @@ -227,13 +249,17 @@ DynLoop: } } - for _, srv := range config.Servers { + for i, srv := range config.Servers { for _, s := range config.Servers { if srv.Name == s.Name { config = oldConf return fmt.Errorf("duplicate server %s", s.Name) } } + + if srv.TexturePool == "" { + config.Servers[i].TexturePool = srv.Name + } } log.Print("load config") @@ -17,13 +17,21 @@ func connect(conn net.Conn, name string, cc *ClientConn) *ServerConn { } cc.mu.RUnlock() - prefix := fmt.Sprintf("[server %s] ", name) + var mediaPool string + for _, srv := range Conf().Servers { + if srv.Name == name { + mediaPool = 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, + mediaPool: mediaPool, aos: make(map[mt.AOID]struct{}), particleSpawners: make(map[mt.ParticleSpawnerID]struct{}), sounds: make(map[mt.SoundID]struct{}), @@ -40,14 +48,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, mediaPool string) (*contentConn, error) { + logPrefix := fmt.Sprintf("[content %s] ", name) cc := &contentConn{ - Peer: mt.Connect(conn), - logger: log.New(logWriter, prefix, log.LstdFlags|log.Lmsgprefix), - doneCh: make(chan struct{}), - name: name, - userName: userName, + Peer: mt.Connect(conn), + logger: log.New(logWriter, logPrefix, log.LstdFlags|log.Lmsgprefix), + doneCh: make(chan struct{}), + name: name, + userName: userName, + mediaPool: mediaPool, } if err := cc.addDefaultTextures(); err != nil { @@ -45,6 +45,8 @@ type contentConn struct { salt, srpA, a, srpK []byte } + mediaPool string + itemDefs []mt.ItemDef aliases []struct{ Alias, Orig 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.mediaPool, &def.Name) + prependTexture(cc.mediaPool, &def.InvImg) + prependTexture(cc.mediaPool, &def.WieldImg) + prepend(cc.mediaPool, &def.PlacePredict) + prepend(cc.mediaPool, &def.PlaceSnd.Name) + prepend(cc.mediaPool, &def.PlaceFailSnd.Name) + prependTexture(cc.mediaPool, &def.Palette) + prependTexture(cc.mediaPool, &def.InvOverlay) + prependTexture(cc.mediaPool, &def.WieldOverlay) itemDefs = append(itemDefs, def) } for _, alias := range cc.aliases { - prepend(cc.name, &alias.Alias) - prepend(cc.name, &alias.Orig) + prepend(cc.mediaPool, &alias.Alias) + prepend(cc.mediaPool, &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.mediaPool, &def.Name) + prepend(cc.mediaPool, &def.Mesh) for i := range def.Tiles { - prependTexture(cc.name, &def.Tiles[i].Texture) + prependTexture(cc.mediaPool, &def.Tiles[i].Texture) } for i := range def.OverlayTiles { - prependTexture(cc.name, &def.OverlayTiles[i].Texture) + prependTexture(cc.mediaPool, &def.OverlayTiles[i].Texture) } for i := range def.SpecialTiles { - prependTexture(cc.name, &def.SpecialTiles[i].Texture) + prependTexture(cc.mediaPool, &def.SpecialTiles[i].Texture) } - prependTexture(cc.name, &def.Palette) + prependTexture(cc.mediaPool, &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.mediaPool, &def.FootstepSnd.Name) + prepend(cc.mediaPool, &def.DiggingSnd.Name) + prepend(cc.mediaPool, &def.DugSnd.Name) + prepend(cc.mediaPool, &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.mediaPool, &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 { @@ -508,7 +510,7 @@ func muxContent(userName string) (itemDefs []mt.ItemDef, aliases []struct{ Alias } var cc *contentConn - cc, err = connectContent(conn, srv.Name, userName) + cc, err = connectContent(conn, srv.Name, userName, srv.TexturePool) if err != nil { return } @@ -594,7 +596,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.mediaPool, &inv[k].InvList.Stacks[i].Name) } } } @@ -603,28 +605,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.mediaPool, &cmd.Text2) fallthrough case mt.ImgHUD: fallthrough case mt.ImgWaypointHUD: fallthrough case mt.ImgWaypointHUD + 1: - prepend(sc.name, &cmd.Text) + prepend(sc.mediaPool, &cmd.Text) } } pc := func(cmd *mt.ToCltChangeHUD) { switch t { case mt.StatbarHUD: - prepend(sc.name, &cmd.Text2) + prepend(sc.mediaPool, &cmd.Text2) fallthrough case mt.ImgHUD: fallthrough case mt.ImgWaypointHUD: fallthrough case mt.ImgWaypointHUD + 1: - prepend(sc.name, &cmd.Text) + prepend(sc.mediaPool, &cmd.Text) } } diff --git a/doc/config.md b/doc/config.md index a7d9ba3..7bc0b5f 100644 --- a/doc/config.md +++ b/doc/config.md @@ -117,6 +117,13 @@ Default: "" Description: The network address and port of an internal server. ``` +> `Server.TexturePool` +``` +Type: string +Default: Server.Name +Description: The texture pool the server will be mapped to. +``` + > `Server.Fallback` ``` Type: []string diff --git a/formspec.go b/formspec.go index a8a1ea2..3ffa7ac 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.mediaPool, &subs[i]) } } @@ -14,6 +14,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 @@ -438,12 +447,7 @@ func (cc *ClientConn) process(pkt mt.Pkt) { go func(done chan<- struct{}) { result, isCmd := onChatMsg(cc, cmd) if !isCmd { - if srv == nil { - cc.Log("->", "no server") - return - } - - srv.Send(pkt) + forward(pkt) } else if result != "" { cc.SendChatMsg(result) } @@ -463,12 +467,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) { @@ -631,7 +630,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) { handStack := mt.Stack{ Item: mt.Item{ - Name: sc.name + "_hand", + Name: sc.mediaPool + "_hand", }, Count: 1, } @@ -749,7 +748,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) { break } - prepend(sc.name, &cmd.Filename) + prepend(sc.mediaPool, &cmd.Filename) if cmd.ShouldCache { cacheMedia(mediaFile{ name: cmd.Filename, @@ -759,17 +758,17 @@ func (sc *ServerConn) process(pkt mt.Pkt) { } case *mt.ToCltSkyParams: for i := range cmd.Textures { - prependTexture(sc.name, &cmd.Textures[i]) + prependTexture(sc.mediaPool, &cmd.Textures[i]) } case *mt.ToCltSunParams: - prependTexture(sc.name, &cmd.Texture) - prependTexture(sc.name, &cmd.ToneMap) - prependTexture(sc.name, &cmd.Rise) + prependTexture(sc.mediaPool, &cmd.Texture) + prependTexture(sc.mediaPool, &cmd.ToneMap) + prependTexture(sc.mediaPool, &cmd.Rise) case *mt.ToCltMoonParams: - prependTexture(sc.name, &cmd.Texture) - prependTexture(sc.name, &cmd.ToneMap) + prependTexture(sc.mediaPool, &cmd.Texture) + prependTexture(sc.mediaPool, &cmd.ToneMap) case *mt.ToCltSetHotbarParam: - prependTexture(sc.name, &cmd.Img) + prependTexture(sc.mediaPool, &cmd.Img) case *mt.ToCltUpdatePlayerList: if !clt.playerListInit { clt.playerListInit = true @@ -787,7 +786,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) { } } case *mt.ToCltSpawnParticle: - prependTexture(sc.name, &cmd.Texture) + prependTexture(sc.mediaPool, &cmd.Texture) sc.globalParam0(&cmd.NodeParam0) case *mt.ToCltBlkData: for i := range cmd.Blk.Param0 { @@ -806,14 +805,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.mediaPool, &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.mediaPool, &cmd.Name) sc.swapAOID(&cmd.SrcAOID) if cmd.Loop { sc.sounds[cmd.ID] = struct{}{} @@ -838,7 +837,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.mediaPool, &cmd.Modes[i].Texture) } case *mt.ToCltNodeMetasChanged: for k := range cmd.Changed { diff --git a/server_conn.go b/server_conn.go index 53c7f1a..ba229d1 100644 --- a/server_conn.go +++ b/server_conn.go @@ -29,6 +29,8 @@ type ServerConn struct { salt, srpA, a, srpK []byte } + mediaPool string + inv mt.Inv detachedInvs []string |