SCOPENET Map viewer: shared canvas engine, launcher window and claim terrain, admin map card; BlueMap/Vantage UI removed

This commit is contained in:
Claude committed 2026-10-01 01:15:05 +00:00
1 parent 19d111eeff
commit 280f9eaf1b
25 files changed
+1387 -343

No files matched your search

+11 -10
View File
@@ -2,15 +2,15 @@
import { onMount } from 'svelte';
import { Compass, Globe, LocateFixed, RefreshCw, Server as ServerIcon, Shield } from '@lucide/svelte';
import { invoke } from '../lib/tauri';
import { toast } from '../lib/store.svelte';
import { activeAccount, toast } from '../lib/store.svelte';
import type { GuildClaim } from '../lib/types';
import BlueMapTiles from './BlueMapTiles.svelte';
import ClaimTerrain from './ClaimTerrain.svelte';
let { instanceId, myGuildId = null, myGuildTag = '', onclaim, onunclaim }: {
instanceId: string; myGuildId?: string | null; myGuildTag?: string;
onclaim?: (claim: GuildClaim) => void; onunclaim?: (claimId: number) => void;
} = $props();
type GameServer = { id: number; name: string; instance_id: string; map_address?: string; live_map?: boolean };
type GameServer = { id: number; name: string; instance_id: string; map?: boolean };
type Player = { x: number; z: number; dimension: string };
let servers = $state<GameServer[]>([]);
let serverId = $state<number | null>(null);
@@ -32,9 +32,10 @@
async function refreshPosition(id: number) {
try {
const info = await invoke<{ me?: Player | null }>('get_livemap_info', { serverId: id });
const info = await invoke<{ players: Array<Player & { uuid: string }> }>('get_map_overlay', { serverId: id });
if (serverId !== id) return;
player = info.me ?? null;
const mine = activeAccount()?.uuid?.toLowerCase();
player = info.players.find((p) => p.uuid.toLowerCase() === mine) ?? null;
if (player && centeredServer !== id) {
centeredServer = id;
dimension = (dimensions.find((d) => d.id === player?.dimension)?.id ?? 'minecraft:overworld');
@@ -134,20 +135,20 @@
<button class="ghost icon sm" onclick={loadClaims} title="Refresh claims" aria-label="Refresh claims"><RefreshCw size={15} class={loading ? 'spin' : ''} /></button>
</div>
</div>
{#if selectedServer?.map_address}
{#key `${serverId}:${selectedServer.map_address}`}
<BlueMapTiles address={selectedServer.map_address} serverId={selectedServer.id} {dimension} {centerX} {centerZ}
{#if selectedServer?.map}
{#key serverId}
<ClaimTerrain serverId={selectedServer.id} {dimension} {centerX} {centerZ}
{claims} {myGuildId} {player} onpaint={paintChunks}
oncenterchange={(x, z) => { centerX = x; centerZ = z; }} />
{/key}
{:else}
<div class="notice">Configure this server's BlueMap address in the panel to show its 2D terrain and claim land.</div>
<div class="notice">The map is switched off for this server. An admin can turn it on under Servers in the panel.</div>
{/if}
<div class="footer">
<span><Shield size={14} /> Your guild: {myClaimsCount} visible claims</span>
<span class="legend"><i class="mine"></i> Your guild <i class="other"></i> Other guilds</span>
{#if painting}<span>Updating claims…</span>{/if}
{#if !player}<span class="hint">Player position appears when the server sends live positions to the panel.</span>{/if}
{#if !player}<span class="hint">Your position appears once you are in game and the server's map is running.</span>{/if}
</div>
</div>