Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
FROM node:22.22.0 as bundle-builder

Check warning on line 1 in Dockerfile

View workflow job for this annotation

GitHub Actions / build

The 'as' keyword should match the case of the 'from' keyword

FromAsCasing: 'as' and 'FROM' keywords' casing do not match More info: https://docs.docker.com/go/dockerfile/rule/from-as-casing/
COPY public /public
WORKDIR /public
RUN npm ci && npm run bundle

FROM golang:1.24.3 as go-builder

Check warning on line 6 in Dockerfile

View workflow job for this annotation

GitHub Actions / build

The 'as' keyword should match the case of the 'from' keyword

FromAsCasing: 'as' and 'FROM' keywords' casing do not match More info: https://docs.docker.com/go/dockerfile/rule/from-as-casing/
COPY . /data
COPY --from=bundle-builder /public/js/bundle* /data/public/js/
WORKDIR /data
RUN CGO_ENABLED=0 go build .
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 go build .

FROM alpine:3.21.3
COPY --from=go-builder /data/mapserver /bin/mapserver
ENV MT_CONFIG_PATH "mapserver.json"

Check warning on line 18 in Dockerfile

View workflow job for this annotation

GitHub Actions / build

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/
ENV MT_LOGLEVEL "INFO"

Check warning on line 19 in Dockerfile

View workflow job for this annotation

GitHub Actions / build

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/
ENV MT_READONLY "false"

Check warning on line 20 in Dockerfile

View workflow job for this annotation

GitHub Actions / build

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/
EXPOSE 8080
ENTRYPOINT ["/bin/mapserver"]
ENTRYPOINT ["/bin/mapserver"]
6 changes: 6 additions & 0 deletions app/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ func ParseConfig(filename string) (*Config, error) {
Digiterms: true,
Digilines: true,
Travelnet: true,
RespawnPlaces: true,
MapserverPlayer: true,
MapserverPOI: true,
MapserverLabel: true,
Expand Down Expand Up @@ -109,6 +110,10 @@ func ParseConfig(filename string) (*Config, error) {
SkinsPath: "",
}

respawn := RespawnConfig{
PlacesColor: "green",
}

cfg := Config{
ConfigVersion: 1,
Port: 8080,
Expand All @@ -134,6 +139,7 @@ func ParseConfig(filename string) (*Config, error) {
WorldPath: "./",
DataPath: "./",
ColorsTxtPath: "./",
Respawn: &respawn,
}

info, err := os.Stat(filename)
Expand Down
6 changes: 6 additions & 0 deletions app/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type Config struct {
WorldPath string `json:"worldpath"`
DataPath string `json:"datapath"`
ColorsTxtPath string `json:"colorstxtpath"`
Respawn *RespawnConfig `json:"respawn"`
}

type MapBlockAccessorConfig struct {
Expand All @@ -49,6 +50,7 @@ type MapObjectConfig struct {
Digiterms bool `json:"digiterms"`
Digilines bool `json:"digilines"`
Travelnet bool `json:"travelnet"`
RespawnPlaces bool `json:"respawn_places"`
MapserverPlayer bool `json:"mapserver_player"`
MapserverPOI bool `json:"mapserver_poi"`
MapserverLabel bool `json:"mapserver_label"`
Expand Down Expand Up @@ -82,3 +84,7 @@ type SkinsConfig struct {
EnableSkinsDB bool `json:"enableskinsdb"`
SkinsPath string `json:"skinspath"`
}

type RespawnConfig struct {
PlacesColor string `json:"placescolor"`
}
8 changes: 6 additions & 2 deletions dev/mapserver.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"digiterms": true,
"digilines": true,
"travelnet": true,
"respawn_places": true,
"mapserver_player": true,
"mapserver_poi": true,
"mapserver_label": true,
Expand Down Expand Up @@ -82,5 +83,8 @@
},
"worldpath": "./",
"datapath": "./",
"colorstxtpath": "./"
}
"colorstxtpath": "./",
"respawn": {
"placescolor": "green"
}
}
15 changes: 11 additions & 4 deletions doc/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ The mapserver will generate a fresh `mapserver.json` if there is none at startup
"digiterms": true,
"digilines": true,
"travelnet": true,
"respawn_places": true,
"mapserver": true,
"mission": true,
"jumpdrive": true,
Expand All @@ -62,10 +63,13 @@ The mapserver will generate a fresh `mapserver.json` if there is none at startup
"purgetime": "15s",
"maxitems": 5000
},
"skins": {
"enableskinsdb": true,
"skinspath": "/path/to/minetest/mods/skinsdb/textures"
}
"skins": {
"enableskinsdb": true,
"skinspath": "/path/to/minetest/mods/skinsdb/textures"
},
"respawn": {
"placescolor": "green"
},
}
```

Expand Down Expand Up @@ -129,3 +133,6 @@ Enables support for serving/displaying custom player skins provided by the Skins
The path to where SkinsDB textures are stored. This should be the SkinsDB textures directory.

Example: `/path/to/minetest/mods/skinsdb/textures`

#### respawn.placescolor
The [marker color](https://github.com/lennardv2/Leaflet.awesome-markers) of the map pin for each respawn point.
49 changes: 49 additions & 0 deletions mapobject/mcl_sign.go
Original file line number Diff line number Diff line change
@@ -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
}
131 changes: 76 additions & 55 deletions mapobject/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,61 +190,82 @@ 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"})
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"})
// Mineclonia legacy
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{
"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, &MclSignBlock{Material: "wood"})
}
}
}

//Phonograph
Expand Down
8 changes: 8 additions & 0 deletions public/js/map/Overlaysetup.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ShopOverlay from './overlays/ShopOverlay.js';
import LabelOverlay from './overlays/LabelOverlay.js';
import TrainlineOverlay from './overlays/TrainlineOverlay.js';
import TravelnetOverlay from './overlays/TravelnetOverlay.js';
import RespawnOverlay from './overlays/RespawnOverlay.js';
import BonesOverlay from './overlays/BonesOverlay.js';
import LcdOverlay from './overlays/LcdOverlay.js';
import DigitermOverlay from './overlays/DigitermOverlay.js';
Expand Down Expand Up @@ -81,6 +82,13 @@ export default function(cfg, map, overlays, wsChannel){
}
}

if (cfg.mapobjects.respawn_places) {
overlays["Respawn places"] = new RespawnOverlay(cfg);
if (isDefault("respawn_places")) {
map.addLayer(overlays.RespawnPlaces);
}
}

if (cfg.mapobjects.bones) {
overlays.Bones = new BonesOverlay();
if (isDefault("bones")) {
Expand Down
Loading
Loading