aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client_conn.go13
-rw-r--r--config.go2
-rw-r--r--connect.go8
-rw-r--r--content.go82
-rw-r--r--doc/config.md3
-rw-r--r--main.go2
-rw-r--r--server_conn.go34
7 files changed, 105 insertions, 39 deletions
diff --git a/client_conn.go b/client_conn.go
index c1b62ad..77f1da9 100644
--- a/client_conn.go
+++ b/client_conn.go
@@ -37,6 +37,11 @@ type clientConn struct {
lang string
+ major, minor, patch uint8
+ reservedVer uint8
+ versionStr string
+ formspecVer uint16
+
itemDefs []mt.ItemDef
aliases []struct{ Alias, Orig string }
nodeDefs []mt.NodeDef
@@ -464,6 +469,14 @@ func handleClt(cc *clientConn) {
cc.sendMedia(cmd.Filenames)
case *mt.ToSrvCltReady:
cc.log("-->", "ready")
+
+ cc.major = cmd.Major
+ cc.minor = cmd.Minor
+ cc.patch = cmd.Patch
+ cc.reservedVer = cmd.Reserved
+ cc.versionStr = cmd.Version
+ cc.formspecVer = cmd.Formspec
+
cc.state++
close(cc.initCh)
}
diff --git a/config.go b/config.go
index a23b718..bca1654 100644
--- a/config.go
+++ b/config.go
@@ -63,7 +63,7 @@ func loadConfig() error {
defer f.Close()
if fi, _ := f.Stat(); fi.Size() == 0 {
- f.WriteString("{\n\n}\n")
+ f.WriteString("{\n\t\n}\n")
f.Seek(0, os.SEEK_SET)
}
diff --git a/connect.go b/connect.go
index 4be538a..93bb4e7 100644
--- a/connect.go
+++ b/connect.go
@@ -6,10 +6,12 @@ import (
"github.com/anon55555/mt"
)
-func connect(conn net.Conn, cc *clientConn) *serverConn {
+func connect(conn net.Conn, name string, cc *clientConn) *serverConn {
sc := &serverConn{
- Peer: mt.Connect(conn),
- clt: cc,
+ Peer: mt.Connect(conn),
+ initCh: make(chan struct{}),
+ clt: cc,
+ name: name,
}
sc.log("-->", "connect")
cc.srv = sc
diff --git a/content.go b/content.go
index af2d20f..39e49d5 100644
--- a/content.go
+++ b/content.go
@@ -268,23 +268,34 @@ func muxItemDefs(conns []*contentConn) ([]mt.ItemDef, []struct{ Alias, Orig stri
for _, cc := range conns {
wg.Add(1)
+
+ prepend := func(s *string) {
+ if *s != "" {
+ *s = cc.name + "_" + *s
+ }
+ }
+ prependTexture := func(s *mt.Texture) {
+ if *s != "" {
+ *s = mt.Texture(cc.name) + "_" + *s
+ }
+ }
+
go func() {
<-cc.done()
for _, def := range cc.itemDefs {
if def.Name == "" {
- def.Name = cc.name + "_hand"
- } else {
- def.Name = cc.name + "_" + def.Name
+ def.Name = "hand"
}
-
- def.InvImg = mt.Texture(cc.name) + "_" + def.InvImg
- def.WieldImg = mt.Texture(cc.name) + "_" + def.WieldImg
- def.PlacePredict = cc.name + "_" + def.PlacePredict
- def.PlaceSnd.Name = cc.name + "_" + def.PlaceSnd.Name
- def.PlaceFailSnd.Name = cc.name + "_" + def.PlaceFailSnd.Name
- def.Palette = mt.Texture(cc.name) + "_" + def.Palette
- def.InvOverlay = mt.Texture(cc.name) + "_" + def.InvOverlay
- def.WieldOverlay = mt.Texture(cc.name) + "_" + def.WieldOverlay
+ prepend(&def.Name)
+
+ prependTexture(&def.InvImg)
+ prependTexture(&def.WieldImg)
+ prepend(&def.PlacePredict)
+ prepend(&def.PlaceSnd.Name)
+ prepend(&def.PlaceFailSnd.Name)
+ prependTexture(&def.Palette)
+ prependTexture(&def.InvOverlay)
+ prependTexture(&def.WieldOverlay)
itemDefs = append(itemDefs, def)
}
@@ -312,6 +323,18 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map,
for _, cc := range conns {
wg.Add(1)
+
+ prepend := func(s *string) {
+ if *s != "" {
+ *s = cc.name + "_" + *s
+ }
+ }
+ prependTexture := func(s *mt.Texture) {
+ if *s != "" {
+ *s = mt.Texture(cc.name) + "_" + *s
+ }
+ }
+
go func() {
<-cc.done()
for _, def := range cc.nodeDefs {
@@ -329,25 +352,25 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map,
}
def.Param0 = param0
- def.Name = cc.name + "_" + def.Name
- def.Mesh = cc.name + "_" + def.Mesh
- for k, v := range def.Tiles {
- def.Tiles[k].Texture = mt.Texture(cc.name) + "_" + v.Texture
+ prepend(&def.Name)
+ prepend(&def.Mesh)
+ for i := range def.Tiles {
+ prependTexture(&def.Tiles[i].Texture)
}
- for k, v := range def.OverlayTiles {
- def.OverlayTiles[k].Texture = mt.Texture(cc.name) + "_" + v.Texture
+ for i := range def.OverlayTiles {
+ prependTexture(&def.OverlayTiles[i].Texture)
}
- for k, v := range def.SpecialTiles {
- def.SpecialTiles[k].Texture = mt.Texture(cc.name) + "_" + v.Texture
+ for i := range def.SpecialTiles {
+ prependTexture(&def.SpecialTiles[i].Texture)
}
- def.Palette = mt.Texture(cc.name) + "_" + def.Palette
+ prependTexture(&def.Palette)
for k, v := range def.ConnectTo {
def.ConnectTo[k] = p0Map[cc.name][v]
}
- def.FootstepSnd.Name = cc.name + "_" + def.FootstepSnd.Name
- def.DiggingSnd.Name = cc.name + "_" + def.DiggingSnd.Name
- def.DugSnd.Name = cc.name + "_" + def.DugSnd.Name
- def.DigPredict = cc.name + "_" + def.DigPredict
+ prepend(&def.FootstepSnd.Name)
+ prepend(&def.DiggingSnd.Name)
+ prepend(&def.DugSnd.Name)
+ prepend(&def.DigPredict)
nodeDefs = append(nodeDefs, def)
param0++
@@ -370,10 +393,17 @@ func muxMedia(conns []*contentConn) []mediaFile {
for _, cc := range conns {
wg.Add(1)
+
+ prepend := func(s *string) {
+ if *s != "" {
+ *s = cc.name + "_" + *s
+ }
+ }
+
go func() {
<-cc.done()
for _, f := range cc.media {
- f.name = cc.name + "_" + f.name
+ prepend(&f.name)
media = append(media, f)
}
diff --git a/doc/config.md b/doc/config.md
index 46d65e0..39164ed 100644
--- a/doc/config.md
+++ b/doc/config.md
@@ -46,6 +46,9 @@ Description: The proxy will listen for new clients on this address.
Type: []Server
Default: []Server{}
Description: The list of internal servers served by this proxy.
+The first server is the default server new clients are connected to.
+It also acts as a fallback server if a connection
+to another server fails or closes.
```
> `Server.Name`
diff --git a/main.go b/main.go
index bad9974..9fee88d 100644
--- a/main.go
+++ b/main.go
@@ -150,7 +150,7 @@ func main() {
return
}
- connect(conn, cc)
+ connect(conn, conf.Servers[0].Name, cc)
}()
}
diff --git a/server_conn.go b/server_conn.go
index 9a8e6f6..f50a079 100644
--- a/server_conn.go
+++ b/server_conn.go
@@ -31,7 +31,11 @@ func (sc *serverConn) client() *clientConn { return sc.clt }
func (sc *serverConn) init() <-chan struct{} { return sc.initCh }
func (sc *serverConn) log(dir, msg string) {
- log.Printf("{←|⇶} %s {%s} %s", dir, sc.name, msg)
+ if sc.client() != nil {
+ sc.client().log("", fmt.Sprintf("%s {%s} %s", dir, sc.name, msg))
+ } else {
+ log.Printf("{←|⇶} %s {%s} %s", dir, sc.name, msg)
+ }
}
func handleSrv(sc *serverConn) {
@@ -139,14 +143,12 @@ func handleSrv(sc *serverConn) {
})
case *mt.ToCltDisco:
sc.log("<--", fmt.Sprintf("deny access %+v", cmd))
- if sc.client() != nil {
- ack, _ := sc.client().SendCmd(cmd)
+ ack, _ := sc.client().SendCmd(cmd)
- select {
- case <-sc.client().Closed():
- case <-ack:
- sc.client().Close()
- }
+ select {
+ case <-sc.client().Closed():
+ case <-ack:
+ sc.client().Close()
}
case *mt.ToCltAcceptAuth:
sc.auth.method = 0
@@ -156,6 +158,22 @@ func handleSrv(sc *serverConn) {
case *mt.ToCltAcceptSudoMode:
sc.log("<--", "accept sudo")
sc.state++
+ case *mt.ToCltAnnounceMedia:
+ sc.SendCmd(&mt.ToSrvReqMedia{})
+ case *mt.ToCltMedia:
+ if sc.state == csInit && cmd.I == cmd.N-1 {
+ sc.SendCmd(&mt.ToSrvCltReady{
+ Major: sc.client().major,
+ Minor: sc.client().minor,
+ Patch: sc.client().patch,
+ Reserved: sc.client().reservedVer,
+ Version: sc.client().versionStr,
+ Formspec: sc.client().formspecVer,
+ })
+
+ sc.state++
+ close(sc.initCh)
+ }
}
}
}