aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-23 11:46:19 +0200
committerHimbeer <himbeer@disroot.org>2024-08-23 11:46:19 +0200
commit53d8cfd7d042c45ccc78f82d3c4b3f2fc8272c7f (patch)
tree7f91b1a95c5e72d11aab978ee614d5e973674f63
parentefeceb162b2fd45994bf09023eea065519b6b89b (diff)
Update to Minetest 5.9
Closes #148.
-rw-r--r--README.md3
-rw-r--r--activeobject.go2
-rw-r--r--content.go85
-rw-r--r--formspec.go27
-rw-r--r--go.mod2
-rw-r--r--go.sum4
-rw-r--r--process.go10
-rw-r--r--proxy.go4
8 files changed, 81 insertions, 56 deletions
diff --git a/README.md b/README.md
index 824670d..ea6ef71 100644
--- a/README.md
+++ b/README.md
@@ -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)
diff --git a/content.go b/content.go
index 65282ba..1ed3193 100644
--- a/content.go
+++ b/content.go
@@ -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]
})
diff --git a/go.mod b/go.mod
index 694c203..2771ac0 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index b0f596f..8de7e7e 100644
--- a/go.sum
+++ b/go.sum
@@ -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=
diff --git a/process.go b/process.go
index b381a54..8144062 100644
--- a/process.go
+++ b/process.go
@@ -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{}{}
diff --git a/proxy.go b/proxy.go
index d879fc5..34a4882 100644
--- a/proxy.go
+++ b/proxy.go
@@ -17,8 +17,8 @@ import (
const (
serializeVer = 29
- protoVer = 43
- versionString = "5.8.0"
+ protoVer = 44
+ versionString = "5.9.0"
maxPlayerNameLen = 20
bytesPerMediaBunch = 5000
)