Merge branch 'ev2-1-texturePools'

master
HimbeerserverDE 2022-05-01 17:13:09 +02:00
commit dc0a2e5516
No known key found for this signature in database
GPG Key ID: A3D3E205DA0B0401
7 changed files with 114 additions and 69 deletions

View File

@ -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")

View File

@ -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 {

View File

@ -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)
}
}

View File

@ -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

View File

@ -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])
}
}

View File

@ -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 {

View File

@ -29,6 +29,8 @@ type ServerConn struct {
salt, srpA, a, srpK []byte
}
mediaPool string
inv mt.Inv
detachedInvs []string