Merge branch 'ev2-1-texturePools'
commit
dc0a2e5516
36
config.go
36
config.go
|
@ -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")
|
||||
|
|
27
connect.go
27
connect.go
|
@ -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 {
|
||||
|
|
60
content.go
60
content.go
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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])
|
||||
}
|
||||
}
|
||||
|
||||
|
|
49
process.go
49
process.go
|
@ -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 {
|
||||
|
|
|
@ -29,6 +29,8 @@ type ServerConn struct {
|
|||
salt, srpA, a, srpK []byte
|
||||
}
|
||||
|
||||
mediaPool string
|
||||
|
||||
inv mt.Inv
|
||||
detachedInvs []string
|
||||
|
||||
|
|
Loading…
Reference in New Issue