From a2c2948d31a825a9b10bbbac49c733db7cae483c Mon Sep 17 00:00:00 2001 From: "B. Stack" Date: Mon, 9 Mar 2026 09:21:15 -0400 Subject: [PATCH 1/2] fix #466, use loop to add current mineclonia signs --- mapobject/setup.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/mapobject/setup.go b/mapobject/setup.go index 6736fe46..34f1c483 100644 --- a/mapobject/setup.go +++ b/mapobject/setup.go @@ -190,6 +190,7 @@ func Setup(ctx *app.App) { if ctx.Config.MapObjects.Signs { l.AddMapObject("default:sign_wall_wood", &SignBlock{Material: "wood"}) l.AddMapObject("default:sign_wall_steel", &SignBlock{Material: "steel"}) + // Mineclonia legacy l.AddMapObject("mcl_signs:wall_sign", &SignBlock{Material: "wood"}) l.AddMapObject("mcl_signs:standing_sign", &SignBlock{Material: "wood"}) l.AddMapObject("mcl_signs:standing_sign22_5", &SignBlock{Material: "wood"}) @@ -245,6 +246,26 @@ func Setup(ctx *app.App) { l.AddMapObject("mcl_signs:standing_sign22_5_cherrywood", &SignBlock{Material: "wood"}) l.AddMapObject("mcl_signs:standing_sign45_cherrywood", &SignBlock{Material: "wood"}) l.AddMapObject("mcl_signs:standing_sign67_5_cherrywood", &SignBlock{Material: "wood"}) + // Mineclonia current + prefix := "mcl_signs:" + materials := []string{ + "acacia", "bamboo", "birch", "cherry_blossom", "crimson", + "dark_oak", "jungle", "mangrove", "oak", "pale_oak", + "spruce", "warped", + } + types := []string{ + "hanging_sign", + "hanging_sign_attached", + "hanging_sign_wall", + "standing_sign", + "wall_sign", + } + for _, t := range types { + for _, m := range materials { + blockName := prefix + t + "_" + m + l.AddMapObject(blockName, &SignBlock{Material: "wood"}) + } + } } //Phonograph From 3abcb23078f1a9e2fcb88abc3282acbb45344fe0 Mon Sep 17 00:00:00 2001 From: "B. Stack" Date: Wed, 26 Aug 2026 12:07:54 -0400 Subject: [PATCH 2/2] add mcl_sign for reading utext With assistance from duck.ai --- mapobject/mcl_sign.go | 49 ++++++++++++++++++ mapobject/setup.go | 112 +++++++++++++++++++++--------------------- 2 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 mapobject/mcl_sign.go diff --git a/mapobject/mcl_sign.go b/mapobject/mcl_sign.go new file mode 100644 index 00000000..7a80b23c --- /dev/null +++ b/mapobject/mcl_sign.go @@ -0,0 +1,49 @@ +package mapobject + +import ( + "regexp" + "strconv" + "strings" + "mapserver/mapobjectdb" + "mapserver/types" + + "github.com/minetest-go/mapparser" +) + +var utextNumberRE = regexp.MustCompile(`\d+`) +func decodeUText(value string) string { + // Extract all decimal numbers from: + // return {115,105,103,110,49,10,65,10,97} + matches := utextNumberRE.FindAllString(value, -1) + if len(matches) == 0 { + return "" + } + + var b strings.Builder + + for _, match := range matches { + n, err := strconv.Atoi(match) + if err != nil || n < 0 || n > 255 { + continue + } + + b.WriteByte(byte(n)) + } + + return b.String() +} + +type MclSignBlock struct { + Material string +} + +func (this *MclSignBlock) onMapObject(mbpos *types.MapBlockCoords, x, y, z int, block *mapparser.MapBlock) *mapobjectdb.MapObject { + md := block.Metadata.GetMetadata(x, y, z) + displayText := decodeUText(md["utext"]) + + o := mapobjectdb.NewMapObject(mbpos, x, y, z, "sign") + o.Attributes["display_text"] = displayText + o.Attributes["material"] = this.Material + + return o +} diff --git a/mapobject/setup.go b/mapobject/setup.go index 34f1c483..fcb9c338 100644 --- a/mapobject/setup.go +++ b/mapobject/setup.go @@ -191,61 +191,61 @@ func Setup(ctx *app.App) { l.AddMapObject("default:sign_wall_wood", &SignBlock{Material: "wood"}) l.AddMapObject("default:sign_wall_steel", &SignBlock{Material: "steel"}) // Mineclonia legacy - l.AddMapObject("mcl_signs:wall_sign", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_sprucewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_sprucewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_sprucewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_sprucewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_sprucewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_darkwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_darkwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_darkwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_darkwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_darkwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_junglewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_junglewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_junglewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_junglewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_junglewood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_acaciawood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_acaciawood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_acaciawood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_acaciawood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_acaciawood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_mangrove_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_mangrove_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_mangrove_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_mangrove_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_mangrove_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_warped_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_warped_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_warped_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_warped_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_warped_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_crimson_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_crimson_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_crimson_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_crimson_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_crimson_hyphae_wood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_bamboo", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_bamboo", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_bamboo", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_bamboo", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_bamboo", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_birchwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_birchwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_birchwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_birchwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_birchwood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:wall_sign_cherrywood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign_cherrywood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign22_5_cherrywood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign45_cherrywood", &SignBlock{Material: "wood"}) - l.AddMapObject("mcl_signs:standing_sign67_5_cherrywood", &SignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_sprucewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_sprucewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_sprucewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_sprucewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_sprucewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_darkwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_darkwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_darkwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_darkwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_darkwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_junglewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_junglewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_junglewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_junglewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_junglewood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_acaciawood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_acaciawood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_acaciawood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_acaciawood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_acaciawood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_mangrove_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_mangrove_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_mangrove_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_mangrove_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_mangrove_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_warped_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_warped_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_warped_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_warped_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_warped_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_crimson_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_crimson_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_crimson_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_crimson_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_crimson_hyphae_wood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_bamboo", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_bamboo", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_bamboo", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_bamboo", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_bamboo", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_birchwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_birchwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_birchwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_birchwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_birchwood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:wall_sign_cherrywood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign_cherrywood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign22_5_cherrywood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign45_cherrywood", &MclSignBlock{Material: "wood"}) + l.AddMapObject("mcl_signs:standing_sign67_5_cherrywood", &MclSignBlock{Material: "wood"}) // Mineclonia current prefix := "mcl_signs:" materials := []string{ @@ -263,7 +263,7 @@ func Setup(ctx *app.App) { for _, t := range types { for _, m := range materials { blockName := prefix + t + "_" + m - l.AddMapObject(blockName, &SignBlock{Material: "wood"}) + l.AddMapObject(blockName, &MclSignBlock{Material: "wood"}) } } }