You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reach the tile route, and give the map what it was missing (#130, #131)
**The world rendered in the app and in neither web surface, because the panel's
tile route was unreachable.** Server routes match
/^\/api\/servers\/([^/]+)(?:\/(\w+))?$/
and `\w` does not match a slash, so `/api/servers/:id/map/tiles` matched nothing
and fell through to the 404 at the bottom. Every tile fetch from the panel has
404'd since #119; the desktop was fine because it goes over IPC. One nested
segment is allowed now, still `\w`-only per segment so a sub-route cannot
express a traversal.
The coverage test could not have caught it: it compares the documented surface
to route literals found in the handler's own source, and `'map/tiles'` was in
the source. So there is a second check now — every documented fixed-path GET
route must answer something other than the router's own "not-found", called with
an owner token so a scope refusal cannot be mistaken for a reachable route. It
found the bug immediately when reinstated, and it also flags routes with a
second placeholder as untestable rather than pretending to cover them.
**Heatmap off by default**, on all three surfaces. It is an analysis overlay,
and a red block over the one player online was the first thing anyone saw.
**Click a player to go to them.** The list under the map was inert; with several
people online, finding one meant panning and reading the coordinate readout. It
centres the view and keeps the zoom — jumping to a fixed zoom would throw away
the scale the operator had chosen.
**Structures on the map**: villages, dungeons and ruins, temples, fortresses,
mineshafts, with a filter. Read from `structures.starts` in the same chunk NBT
the surface already comes from, so it costs a lookup rather than a second pass
over the world, and only when asked for — a payload that carries them "in case"
is one the public feed could leak.
Off by default everywhere. An operator may switch them on for their own map
without a setting, because they can already read the world folder. **The public
map cannot**: the feed sends markers only when the operator published them and
ignores what the caller asks for, so the site cannot be talked into a treasure
map of a private world. The toggle is hidden on the public page for the same
reason — a control the feed ignores is not a control.
**How far ahead to load**, as an operator setting. Worth being exact about what
it is not: MSMS never generates terrain. It reads region files the server has
already written, and a map that could grow a world by being panned would be a
map that can fill a disk. "Load ahead" reads a ring of chunks around the
viewport so panning is already drawn — more parsing, same world. Pregenerating
terrain deliberately is a separate feature.
Copy file name to clipboardExpand all lines: src/renderer/src/locales/en.ts
+6Lines changed: 6 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -125,6 +125,7 @@ export default {
125
125
needsBridge:
126
126
'No live positions yet — this server has no MSMS-Bridge plugin. Positions arrive over the server console, so installing it opens no extra port.',
127
127
heads: 'Heads',
128
+
goTo: 'Centre the map here',
128
129
world: 'World',
129
130
resetView: 'Reset view',
130
131
installBridge: 'Install MSMS-Bridge {{version}}',
@@ -715,6 +716,11 @@ export default {
715
716
mapRound: 'Round to (blocks)',
716
717
mapNames: 'Show names',
717
718
mapHeads: 'Draw skin heads',
719
+
mapWorld: 'Show the terrain',
720
+
mapStructures: 'Show villages and dungeons',
721
+
mapLoadAhead: 'Load ahead of the view',
722
+
mapLoadHint:
723
+
'MSMS never generates terrain — it reads what the server has already written. “Load ahead” only reads a ring of chunks around the view so panning is already drawn; it costs more parsing and changes nothing about the world.',
Copy file name to clipboardExpand all lines: src/renderer/src/locales/tr.ts
+6Lines changed: 6 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -127,6 +127,7 @@ const tr: typeof en = {
127
127
needsBridge:
128
128
'Henüz canlı konum yok — bu sunucuda MSMS-Bridge eklentisi yok. Konumlar sunucu konsolu üzerinden geldiği için kurmak ek bir port açmaz.',
129
129
heads: 'Kafalar',
130
+
goTo: 'Haritayı buraya ortala',
130
131
world: 'Dünya',
131
132
resetView: 'Görünümü sıfırla',
132
133
installBridge: 'MSMS-Bridge {{version}} kur',
@@ -719,6 +720,11 @@ const tr: typeof en = {
719
720
mapRound: 'Yuvarlama (blok)',
720
721
mapNames: 'İsimleri göster',
721
722
mapHeads: 'Oyuncu kafalarını çiz',
723
+
mapWorld: 'Araziyi göster',
724
+
mapStructures: 'Köyleri ve zindanları göster',
725
+
mapLoadAhead: 'Görünümün ötesini önceden yükle',
726
+
mapLoadHint:
727
+
'MSMS arazi üretmez — sunucunun zaten yazdığını okur. “Önceden yükle” yalnızca görünümün etrafındaki chunk halkasını okur, böylece kaydırınca çizilmiş olur; daha fazla ayrıştırma demektir, dünyada hiçbir şeyi değiştirmez.',
0 commit comments