diff options
author | Himbeer <himbeer@disroot.org> | 2024-08-23 11:46:19 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-08-23 11:46:19 +0200 |
commit | 53d8cfd7d042c45ccc78f82d3c4b3f2fc8272c7f (patch) | |
tree | 7f91b1a95c5e72d11aab978ee614d5e973674f63 | |
parent | efeceb162b2fd45994bf09023eea065519b6b89b (diff) |
Update to Minetest 5.9
Closes #148.
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | activeobject.go | 2 | ||||
-rw-r--r-- | content.go | 85 | ||||
-rw-r--r-- | formspec.go | 27 | ||||
-rw-r--r-- | go.mod | 2 | ||||
-rw-r--r-- | go.sum | 4 | ||||
-rw-r--r-- | process.go | 10 | ||||
-rw-r--r-- | proxy.go | 4 |
8 files changed, 81 insertions, 56 deletions
@@ -43,7 +43,8 @@ for all versions that were ever supported: * Minetest 5.5: [dd9e80d6a9a7031c97c64a1979e1e514c092a4cd](https://github.com/HimbeerserverDE/mt-multiserver-proxy/commit/dd9e80d6a9a7031c97c64a1979e1e514c092a4cd), chat command plugin: [fc27ae7c87be94a39bb9ccb15f2ad0b27fcac76c](https://github.com/HimbeerserverDE/mt-multiserver-chatcommands/commit/fc27ae7c87be94a39bb9ccb15f2ad0b27fcac76c) * Minetest 5.6: [04705a9129afe3e3f5414af1799667efcc57d3eb](https://github.com/HimbeerserverDE/mt-multiserver-proxy/commit/04705a9129afe3e3f5414af1799667efcc57d3eb), chat command plugin: [4020944da5bce99b878fae4c2d9709f610f4cf6a](https://github.com/HimbeerserverDE/mt-multiserver-chatcommands/commit/4020944da5bce99b878fae4c2d9709f610f4cf6a) * Minetest 5.7: [629d57a651b46539af3ffed36fb0649b3ea6d346](https://github.com/HimbeerserverDE/mt-multiserver-proxy/commit/629d57a651b46539af3ffed36fb0649b3ea6d346), chat command plugin: [718f8defad54adc04ac81f535b6d59c82a13298e](https://github.com/HimbeerserverDE/mt-multiserver-chatcommands/commit/718f8defad54adc04ac81f535b6d59c82a13298e) -* Minetest 5.8: latest +* Minetest 5.8: [efeceb162b2fd45994bf09023eea065519b6b89b](https://github.com/HimbeerserverDE/mt-multiserver-proxy/commit/15c56b8806030984c2cfdc04a5455a366eca44d4), chat command plugin: [15c56b8806030984c2cfdc04a5455a366eca44d4](https://github.com/HimbeerserverDE/mt-multiserver-chatcommands/commit/15c56b8806030984c2cfdc04a5455a366eca44d4) +* Minetest 5.9: latest The chat command plugin commit hashes are mainly specified for old proxy versions that didn't support automatic plugin building and version management diff --git a/activeobject.go b/activeobject.go index 6b61e5c..1915af7 100644 --- a/activeobject.go +++ b/activeobject.go @@ -18,7 +18,7 @@ func (sc *ServerConn) handleAOMsg(aoMsg mt.AOMsg) { sc.swapAOID(&msg.Attach.ParentID) case *mt.AOCmdProps: for j := range msg.Props.Textures { - prependTexture(sc.mediaPool, &msg.Props.Textures[j]) + prependTextureOrItem(sc.mediaPool, &msg.Props.Textures[j]) } prepend(sc.mediaPool, &msg.Props.Mesh) prepend(sc.mediaPool, &msg.Props.Itemstring) @@ -18,6 +18,7 @@ import ( ) var disallowedChars = regexp.MustCompile("[^a-zA-Z0-9-_.:]") +var itemstring = regexp.MustCompile("^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+$") var b64 = base64.StdEncoding @@ -590,12 +591,21 @@ func (cc *ClientConn) srvParam0(p0 *mt.Content) string { return "" } -func isDefaultNode(s string) bool { - list := []string{ - "", - "air", - "unknown", - "ignore", +func isDefaultNode(s string, isTexture bool) bool { + var list []string + if isTexture { + list = []string{ + "", + "sun.png", + "moon.png", + } + } else { + list = []string{ + "", + "air", + "unknown", + "ignore", + } } for _, s2 := range list { @@ -608,22 +618,13 @@ func isDefaultNode(s string) bool { } func prependRaw(prep string, s *string, isTexture bool) { - if !isDefaultNode(*s) { - subs := disallowedChars.Split(*s, -1) - seps := disallowedChars.FindAllString(*s, -1) - - for i, sub := range subs { - if !isTexture || strings.Contains(sub, ".") { - subs[i] = prep + "_" + sub - } - } - - *s = "" - for i, sub := range subs { - *s += sub - if i < len(seps) { - *s += seps[i] - } + if !isDefaultNode(*s, isTexture) { + if isTexture { + *s = ReplaceAllStringSubmatchFunc(textureName, *s, func(groups []string) string { + return prep + "_" + groups[1] + }) + } else { + *s = prep + "_" + *s } } } @@ -638,14 +639,50 @@ func prependTexture(prep string, t *mt.Texture) { *t = mt.Texture(s) } +func prependTextureOrItem(prep string, t *mt.Texture) { + s := string(*t) + if itemstring.MatchString(s) { + prependRaw(prep, &s, false) + } else { + prependRaw(prep, &s, true) + } + *t = mt.Texture(s) +} + func (sc *ServerConn) prependInv(inv mt.Inv) { for k, l := range inv { - for i := range l.Stacks { - prepend(sc.mediaPool, &inv[k].InvList.Stacks[i].Name) + for i, stack := range l.Stacks { + if stack.Name != "" { + prepend(sc.mediaPool, &inv[k].InvList.Stacks[i].Name) + } + } + } +} + +func (sc *ServerConn) prependInvKeep(inv, old mt.Inv) { + for k, l := range inv { + for i, stack := range l.Stacks { + if shouldPrepend(old, k, i, stack.Name) { + prepend(sc.mediaPool, &inv[k].InvList.Stacks[i].Name) + } } } } +func shouldPrepend(old mt.Inv, listIndex, stackIndex int, itemName string) bool { + if listIndex >= len(old) { + return true + } + list := old[listIndex].InvList + + if stackIndex >= len(list.Stacks) { + return true + } + stack := list.Stacks[stackIndex] + + return itemName != "" && itemName != stack.Name +} + func (sc *ServerConn) prependHUD(t mt.HUDType, cmdIface mt.ToCltCmd) { pa := func(cmd *mt.ToCltAddHUD) { switch t { diff --git a/formspec.go b/formspec.go index 08cfa38..a465143 100644 --- a/formspec.go +++ b/formspec.go @@ -2,31 +2,16 @@ package proxy import ( "regexp" - "strings" ) -var itemName = regexp.MustCompile("(item_image\\[[0-9.]+,[0-9.]+;[0-9.]+,[0-9]+;)([a-zA-Z0-9-_.: ]+)(\\])") -var itemButtonName = regexp.MustCompile("(item_image_button\\[[0-9.]+,[0-9.]+;[0-9.]+,[0-9.]+;)([a-zA-Z0-9-_.: ]+)(;[a-zA-Z0-9-_.: ]+;[^\\[\\]]*\\])") -var textureName = regexp.MustCompile("[a-zA-Z0-9-_.]*\\.[a-zA-Z-_.]+") +var itemName = regexp.MustCompile("(item_image\\[[0-9.-]+,[0-9.-]+;[0-9.-]+,[0-9.-]+;)([a-zA-Z0-9-_.: ]+)(\\])") +var itemButtonName = regexp.MustCompile("(item_image_button\\[[0-9.-]+,[0-9.-]+;[0-9.-]+,[0-9.-]+;)([a-zA-Z0-9-_.: ]+)(;[a-zA-Z0-9-_.: ]+;[^\\[\\]]*\\])") +var textureName = regexp.MustCompile("([a-zA-Z0-9-_.]+\\.[a-zA-Z-_.]+)") func (sc *ServerConn) prependFormspec(fs *string) { - subs := disallowedChars.Split(*fs, -1) - seps := disallowedChars.FindAllString(*fs, -1) - - for i, sub := range subs { - if textureName.MatchString(sub) && !strings.Contains(sub, " ") { - prepend(sc.mediaPool, &subs[i]) - } - } - - *fs = "" - for i, sub := range subs { - *fs += sub - if i < len(seps) { - *fs += seps[i] - } - } - + *fs = ReplaceAllStringSubmatchFunc(textureName, *fs, func(groups []string) string { + return sc.mediaPool + "_" + groups[1] + }) *fs = ReplaceAllStringSubmatchFunc(itemName, *fs, func(groups []string) string { return groups[1] + sc.name + "_" + groups[2] + groups[3] }) @@ -3,7 +3,7 @@ module github.com/HimbeerserverDE/mt-multiserver-proxy go 1.21 require ( - github.com/HimbeerserverDE/mt v0.0.0-20240605134513-f0c81db0341e + github.com/HimbeerserverDE/mt v0.0.0-20240823094226-df181fce5c15 github.com/HimbeerserverDE/srp v0.0.0 github.com/lib/pq v1.10.9 github.com/mattn/go-sqlite3 v1.14.22 @@ -1,5 +1,5 @@ -github.com/HimbeerserverDE/mt v0.0.0-20240605134513-f0c81db0341e h1:c7Q0A0Scc2GrhMvUilJ20OUmHlMQbjBNMPZcTlkt7Vg= -github.com/HimbeerserverDE/mt v0.0.0-20240605134513-f0c81db0341e/go.mod h1:RSf7NAuQ5zZC6CTPj5ey/uXPHOdu/oiIvHT8tH3fWK8= +github.com/HimbeerserverDE/mt v0.0.0-20240823094226-df181fce5c15 h1:86stIHwxjRe6LB0PJKSgFiM6/PpjgAjA7S/X1L22ub8= +github.com/HimbeerserverDE/mt v0.0.0-20240823094226-df181fce5c15/go.mod h1:RSf7NAuQ5zZC6CTPj5ey/uXPHOdu/oiIvHT8tH3fWK8= github.com/HimbeerserverDE/srp v0.0.0 h1:Iy2GIF7DJphXXO9NjncLEBO6VsZd8Yhrlxl/qTr09eE= github.com/HimbeerserverDE/srp v0.0.0/go.mod h1:pxNH8S2nh4n2DWE0ToX5GnnDr/uEAuaAhJsCpkDLIWw= github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= @@ -648,9 +648,11 @@ func (sc *ServerConn) process(pkt mt.Pkt) { return case *mt.ToCltInv: var oldInv mt.Inv - copy(oldInv, sc.inv) + oldB := &strings.Builder{} + sc.inv.Serialize(oldB) + oldInv.Deserialize(strings.NewReader(oldB.String())) sc.inv.Deserialize(strings.NewReader(cmd.Inv)) - sc.prependInv(sc.inv) + sc.prependInvKeep(sc.inv, oldInv) handStack := mt.Stack{ Item: mt.Item{ @@ -814,7 +816,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) { } } case *mt.ToCltSpawnParticle: - prependTexture(sc.mediaPool, &cmd.Texture) + prependTexture(sc.mediaPool, &cmd.TextureName) sc.globalParam0(&cmd.NodeParam0) case *mt.ToCltBlkData: for i := range cmd.Blk.Param0 { @@ -833,7 +835,7 @@ func (sc *ServerConn) process(pkt mt.Pkt) { case *mt.ToCltAddNode: sc.globalParam0(&cmd.Node.Param0) case *mt.ToCltAddParticleSpawner: - prependTexture(sc.mediaPool, &cmd.Texture) + prependTexture(sc.mediaPool, &cmd.TextureName) sc.swapAOID(&cmd.AttachedAOID) sc.globalParam0(&cmd.NodeParam0) sc.particleSpawners[cmd.ID] = struct{}{} @@ -17,8 +17,8 @@ import ( const ( serializeVer = 29 - protoVer = 43 - versionString = "5.8.0" + protoVer = 44 + versionString = "5.9.0" maxPlayerNameLen = 20 bytesPerMediaBunch = 5000 ) |