11 Commits

Author SHA1 Message Date
6fae27b165 bluemap: fix exporter marker sets
All checks were successful
Build maps / build-bluemap (push) Successful in 29s
Build maps / build-mapcrafter (push) Successful in 32s
The earlier version would put the markers outside the marker set
2025-12-17 02:04:43 +09:00
d3bb5c7e8c overworld/area_names: add 'Nordørkenen' 2025-12-17 02:02:18 +09:00
7c86d342e6 README: add links to map export artifacts
All checks were successful
Build maps / build-bluemap (push) Successful in 30s
Build maps / build-mapcrafter (push) Successful in 40s
2025-12-17 01:46:29 +09:00
1af4bbc330 .gitea/workflows: upload map exports as artifacts
All checks were successful
Build maps / build-bluemap (push) Successful in 29s
Build maps / build-mapcrafter (push) Successful in 30s
2025-12-17 01:42:40 +09:00
be638b2ade Implement track export for bluemap, ignore for mapcrafter
All checks were successful
Build maps / build-mapcrafter (push) Successful in 28s
Build maps / build-bluemap (push) Successful in 29s
2025-12-17 01:36:07 +09:00
1b3a7d0e90 Add two railways
Some checks failed
Build maps / build-mapcrafter (push) Failing after 19s
Build maps / build-bluemap (push) Failing after 22s
2025-12-17 01:25:21 +09:00
89e9d8827c Add missing points from mapcrafter
All checks were successful
Build maps / build-bluemap (push) Successful in 30s
Build maps / build-mapcrafter (push) Successful in 1m8s
2025-12-17 00:50:59 +09:00
08507b8d53 README: improve sections on getting started
All checks were successful
Build maps / build-bluemap (push) Successful in 29s
Build maps / build-mapcrafter (push) Successful in 38s
2025-12-08 22:29:38 +09:00
30e1aabde9 Makefile: init
All checks were successful
Build maps / build-mapcrafter (push) Successful in 29s
Build maps / build-bluemap (push) Successful in 31s
2025-12-08 22:20:07 +09:00
1168d37d7e .gitea/workflows: add workflow for building map exports
Some checks failed
Build maps / build-mapcrafter (push) Failing after 28s
Build maps / build-bluemap (push) Successful in 27s
2025-12-08 22:02:39 +09:00
c20520b400 flake.lock: bump, uv.lock: bump 2025-12-08 18:57:39 +09:00
12 changed files with 286 additions and 15 deletions

View File

@@ -0,0 +1,82 @@
name: "Build maps"
on:
pull_request:
push:
jobs:
build-mapcrafter:
runs-on: debian-latest
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build map
run: uv run mckart export-mapcrafter
# - name: Setup Biome
# uses: biomejs/setup-biome@v2
# - name: Format map
# run: biome format ./mapcrafter/* --write
- name: Transfer results
uses: https://git.pvv.ntnu.no/Projects/rsync-action@v1
with:
source: ./mapcrafter/
target: ${{ gitea.ref_name }}/mapcrafter/
username: gitea-web
ssh-key: ${{ secrets.WEB_SYNC_SSH_KEY }}
host: pages.pvv.ntnu.no
known-hosts: "pages.pvv.ntnu.no ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2QjfFB+city1SYqltkVqWACfo1j37k+oQQfj13mtgg"
- name: Upload deb package artifact
uses: actions/upload-artifact@v3
with:
name: minecraft-kartverket-mapcrafter-export-${{ gitea.sha }}.zip
path: ./mapcrafter/
if-no-files-found: error
retention-days: 30
compression: 7
build-bluemap:
runs-on: debian-latest
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build map
run: uv run mckart export-bluemap
- name: Transfer results
uses: https://git.pvv.ntnu.no/Projects/rsync-action@v1
with:
source: ./bluemap/
target: ${{ gitea.ref_name }}/bluemap/
username: gitea-web
ssh-key: ${{ secrets.WEB_SYNC_SSH_KEY }}
host: pages.pvv.ntnu.no
known-hosts: "pages.pvv.ntnu.no ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2QjfFB+city1SYqltkVqWACfo1j37k+oQQfj13mtgg"
- name: Upload deb package artifact
uses: actions/upload-artifact@v3
with:
name: minecraft-kartverket-bluemap-export-${{ gitea.sha }}.zip
path: ./bluemap/
if-no-files-found: error
retention-days: 30
compression: 7
# build-nix:
# runs-on: debian-latest
# steps:
# - name: Install sudo
# run: apt-get update && apt-get -y install sudo
# - name: Install nix
# uses: https://github.com/cachix/install-nix-action@v31
# - name: Configure nix
# run: echo -e "show-trace = true\nmax-jobs = auto\ntrusted-users = root\nexperimental-features = nix-command flakes\nbuild-users-group =" > /etc/nix/nix.conf

1
.gitignore vendored
View File

@@ -13,3 +13,4 @@ result-*
# Ignore generated files by default
/mapcrafter
/bluemap
/out

20
Makefile Normal file
View File

@@ -0,0 +1,20 @@
.PHONY: all clean validate
all: bluemap mapcrafter
export PYTHONPATH := $(CURDIR)/src/
OUT := $(CURDIR)/out
validate:
python -m cli.main validate
bluemap: validate
python -m cli.main export-bluemap --output-dir "$(OUT)/bluemap"
mapcrafter: validate
python -m cli.main export-mapcrafter --output-dir "$(OUT)/mapcrafter"
clean:
rm -rf ./bluemap
rm -rf ./mapcrafter

View File

@@ -7,7 +7,16 @@ Map markers for PVV's minecraft server
This project is meant to let PVV members contribute map data for PVV's minecraft server, like coordinates for bases, cities, and other points of interest.
These markers are written in python so that we can do things like generating points in a loop, calculating distances, and other types of automation.
There is also a cli tool that we use to export these points into the formats of several minecraft map implementations.
The codebase includes a CLI tool that we use to export this data into the formats of several minecraft map implementations.
Grab the latest exports here:
- Bluemap:
- https://pages.pvv.ntnu.no/Projects/minecraft-kartverket/main/bluemap/overworld.hocon
- https://pages.pvv.ntnu.no/Projects/minecraft-kartverket/main/bluemap/nether.hocon
- https://pages.pvv.ntnu.no/Projects/minecraft-kartverket/main/bluemap/the-end.hocon
- Mapcrafter:
- https://pages.pvv.ntnu.no/Projects/minecraft-kartverket/main/mapcrafter/markers.js
## Marker sets
@@ -37,6 +46,47 @@ Here is an overview of the different marker sets, and what they are meant for.
- Other: anything that doesn't fit into the other categories
- Portals: end portals that send you back to the center of the map
## How to run the python code
You can either use `uv`, `nix` or the bundled `Makefile` with a bare python installation to run the project.
There should be no external dependencies to run the code.
In the following sections of the readme, we will assume that you are using `uv`, but the other methods can also be adapted to the instructions.
### Using uv
If you have [uv](https://docs.astral.sh/uv/) installed, running the code is as easy as executing
```bash
uv run mckart <args>
```
### Using the Makefile
The makefile will validate the map data, and generate both types of map exports in a directory named `out`
You can invoke it with:
```bash
make
ls out
```
### Using nix
```bash
# Run the cli tool
nix run .# <args>
# Build the exports
nix build .#bluemap-export
nix build .#mapcrafter-export
# Get a python environment with development tooling
nix develop
```
## How to add a point marker
1. Find the correct marker set file in `src/marker_sets/<world>`.
@@ -48,7 +98,7 @@ uv run mckart verify
uv run mckart print
```
4. Open a PR
4. Open a pull request at https://git.pvv.ntnu.no/Projects/minecraft-kartverket/pulls
## How to add a railway / road

6
flake.lock generated
View File

@@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1762482733,
"narHash": "sha256-g/da4FzvckvbiZT075Sb1/YDNDr+tGQgh4N8i5ceYMg=",
"lastModified": 1764947035,
"narHash": "sha256-EYHSjVM4Ox4lvCXUMiKKs2vETUSL5mx+J2FfutM7T9w=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e1ebeec86b771e9d387dd02d82ffdc77ac753abc",
"rev": "a672be65651c80d3f592a89b3945466584a22069",
"type": "github"
},
"original": {

View File

@@ -1,10 +1,10 @@
import json
from pathlib import Path
from textwrap import indent
from typing import Any
from pathlib import Path
from lib_marker import Point, Track
from marker_sets import WORLDS
from lib_marker import Point
def generate_bluemap_output(output_dir: Path):
@@ -42,8 +42,11 @@ def convert_data_to_bluemap_structure() -> dict:
}
for marker in marker_set.markers:
poi_markers = result[world_name][slug(marker_set.name)]["markers"]
track_markers = result[world_name][slug(marker_set.name)]["markers"]
if isinstance(marker, Point):
result[world_name][slug(marker_set.name)][slug(marker.name)] = {
# https://bluemap.bluecolored.de/wiki/customization/Markers.html#poi-markers
poi_markers[slug(marker.name)] = {
"type": "poi",
"label": marker.name,
"position": {
@@ -52,6 +55,21 @@ def convert_data_to_bluemap_structure() -> dict:
"z": marker.z,
},
}
elif isinstance(marker, Track):
# https://bluemap.bluecolored.de/wiki/customization/Markers.html#line-markers
track_markers[slug(marker.name)] = {
"type": "line",
# TODO: Calculate the median point of the track for the label position
"position": {
"x": marker.points[0][0],
"y": marker.points[0][1],
"z": marker.points[0][2],
},
"label": marker.name,
"line": [
{"x": p[0], "y": p[1], "z": p[2]} for p in marker.points
],
}
else:
raise NotImplementedError(f"Unknown marker type: {marker}")
@@ -72,7 +90,7 @@ def to_hocon(x: Any) -> str:
return f"[\n{'\n'.join(items)}\n]"
elif isinstance(x, dict):
items = [
f' "{k}": {indent(to_hocon(v), ' ').removeprefix(' ')}'
f' "{k}": {indent(to_hocon(v), " ").removeprefix(" ")}'
for k, v in x.items()
]
return f"{{\n{'\n'.join(items)}\n}}"

View File

@@ -1,8 +1,8 @@
import json
from pathlib import Path
from lib_marker import Area, Point, Track
from marker_sets import WORLDS
from lib_marker import Point, Track, Area
def generate_mapcrafter_output(output_dir: Path):
@@ -30,6 +30,7 @@ def convert_data_to_mapcrafter_structure() -> dict:
for world_name, world_marker_sets in WORLDS.items():
for marker_set in world_marker_sets:
# https://mapcrafter.readthedocs.io/en/latest/markers.html#manually-specifying-markers
if marker_set.name not in result:
result[marker_set.name] = {
"id": marker_set.name.lower().replace(" ", "-"),
@@ -46,10 +47,14 @@ def convert_data_to_mapcrafter_structure() -> dict:
)
elif isinstance(marker, Track):
raise NotImplementedError("Track markers are not supported")
print(
f"Track markers are not natively supported in Mapcrafter, skipping '{marker.name}'..."
)
elif isinstance(marker, Area):
raise NotImplementedError("Area markers are not supported")
print(
f"Area markers are not natively supported in Mapcrafter, skipping '{marker.name}'..."
)
else:
raise ValueError(f"Unknown marker type: {marker}")

View File

@@ -38,5 +38,12 @@ MARKER_SET = MarkerSet(
y=64,
z=0,
),
Point(
name="Nordørkenen",
icon=None,
x=0,
y=67,
z=-485,
),
],
)

View File

@@ -38,5 +38,19 @@ MARKER_SET = MarkerSet(
y=64,
z=-460,
),
Point(
name="Shiro",
icon=None,
x=-790,
y=64,
z=-837,
),
Point(
name="Singapore",
icon=None,
x=-600,
y=64,
z=-1130,
),
],
)

View File

@@ -38,6 +38,13 @@ MARKER_SET = MarkerSet(
y=78,
z=-3043,
),
Point(
name="Blomenholm",
icon=None,
x=-295,
y=64,
z=2372,
),
Point(
name="Huløyeid",
icon=None,
@@ -45,6 +52,13 @@ MARKER_SET = MarkerSet(
y=64,
z=234,
),
Point(
name="Linder",
icon=None,
x=4321,
y=64,
z=-8778,
),
Point(
name="Singapore",
icon=None,
@@ -80,5 +94,12 @@ MARKER_SET = MarkerSet(
y=64,
z=447,
),
Point(
name="Østsumpøyene",
icon=None,
x=4070,
y=64,
z=2900,
),
],
)

View File

@@ -1,7 +1,59 @@
from lib_marker import MarkerSet
from lib_marker import MarkerSet, Track
MARKER_SET = MarkerSet(
name="Railways",
markers=[],
markers=[
Track(
name="Sentralbane vest",
points=[
(143, 71, 127),
(44, 71, 127),
(41, 71, 123),
(-32, 71, 123),
(-32, 71, 126),
(-34, 71, 128),
(-53, 71, 128),
(-68, 71, 128),
(-77, 71, 128),
(-106, 71, 173),
(-106, 71, 180),
(-129, 71, 203),
(-271, 71, 203),
(-308, 71, 165),
(-358, 71, 165),
],
),
Track(
name="Shiro Monorail",
points=[
(-689, 73, -770),
(-685, 73, -770),
(-685, 73, -765),
(-685, 74, -764),
(-685, 74, -760),
(-720, 74, -760),
(-737, 76, -760),
(-737, 76, -646),
(-739, 77, -646),
(-742, 77, -646),
(-744, 78, -646),
(-759, 92, -646),
(-815, 92, -646),
(-815, 92, -643),
(-815, 101, -633),
(-815, 101, -385),
(-815, 97, -380),
(-815, 97, -377),
(-815, 90, -370),
(-813, 90, -370),
(-813, 73, -352),
(-813, 73, -306),
(-813, 68, -300),
(-813, 68, -298),
(-817, 68, -298),
(-819, 67, -298),
(-822, 67, -298),
],
),
],
)

1
uv.lock generated
View File

@@ -1,4 +1,5 @@
version = 1
revision = 3
requires-python = ">=3.12"
[[package]]