{#if activeTab === 'personal'} {#if loadingPersonal}
{:else if !me || me.kind === 'offline'}

Server account required

Personal gameplay stats are synced when you play on servers with your SCOPENET server account.

{:else if !personalData || !personalData.total}

No recorded stats yet

Hop into a server through the launcher to begin logging kills, blocks mined, and playtime!

{:else} {@const t = personalData.total} {@const kd = (t.player_kills / Math.max(1, t.deaths)).toFixed(2)}
{personalData.username} Active
UUID: {personalData.uuid.slice(0, 14)}โ€ฆ ยท First played: {formatDate(t.first_seen)} ยท Last active: {formatDate(t.last_seen)}
Total Playtime {formatPlaytime(t.playtime_secs)}
Playtime
{formatPlaytime(t.playtime_secs)}
Across all servers
Player Kills
{formatNumber(t.player_kills)}
PvP eliminations
Deaths
{formatNumber(t.deaths)}
K/D: {kd}
Mob Kills
{formatNumber(t.mob_kills)}
Monsters & animals
Blocks Mined
{formatNumber(t.blocks_broken)}
Broken blocks
Blocks Placed
{formatNumber(t.blocks_placed)}
Structures built
Server Joins
{formatNumber(t.joins)}
Sessions played
Chat Messages
{formatNumber(t.messages)}
Messages sent
{#if personalData.servers.length}

Server Activity

{#each personalData.servers as s}
{s.server_name} Last played {formatDate(s.last_seen)}
Playtime {formatPlaytime(s.playtime_secs)}
Kills {s.player_kills}
Deaths {s.deaths}
Mined {formatNumber(s.blocks_broken)}
{/each}
{/if} {/if} {:else if activeTab === 'economy'}
{#if loadingEconomy && !economyBalances.length}
{:else if !me || me.kind === 'offline'}

Server account required

In-game economy balances and transactions are synced to your SCOPENET server account.

{:else}
My Server Balances

Synced in real-time from SCOPENET economy plugins and mods.

{#if economyBalances.length === 0}
No active currency balances found yet. Join a SCOPENET server to start earning money!
{:else}
{#each economyBalances as bal (bal.server_id)} {/each}
{/if}
Server Rich List (Baltop)

Top richest players on the selected game server.

{#if servers.length > 0}
Server:
{/if}
{#if baltopData.length === 0}
No baltop entries recorded for this server yet.
{:else}
{#each baltopData as row} {@const isMe = row.uuid === me?.uuid}
#{row.rank} {#if isMe}You{/if}
${row.balance.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
{/each}
{/if}
Recent Transactions

Payments, player trades, market listings, and server shop logs.

{#if transactions.length === 0}
No recorded economy transactions yet.
{:else}
Type Description Date Amount
{#each transactions.slice(0, 15) as tx (tx.id)} {@const isSender = tx.from_uuid === me?.uuid}
{#if isSender} Sent{:else} Received{/if} {tx.description || `${tx.from_name} โ†’ ${tx.to_name}`} {new Date(tx.created_at).toLocaleString()} {isSender ? '-' : '+'}${Math.abs(tx.amount).toFixed(2)}
{/each}
{/if}
{/if}
{:else}
Server:
{#each sortOptions as opt} {@const Icon = opt.icon} {/each}
{#if loadingLeaderboard}
{:else if !leaderboardData || leaderboardData.leaderboard.length === 0}

No leaderboard entries yet

As players explore, mine, and battle on servers, the rankings will appear here automatically.

{:else} {#if top3.length > 0}
{#if top3[1]}
2 {top3[1].name} {statValue(top3[1], sortField)}
{/if} {#if top3[0]}
๐Ÿ‘‘ 1 {top3[0].name} {statValue(top3[0], sortField)}
{/if} {#if top3[2]}
3 {top3[2].name} {statValue(top3[2], sortField)}
{/if}
{/if}
# Player {sortOptions.find(o => o.id === sortField)?.label ?? 'Stat'} Playtime PvP Kills Last Seen
{#each leaderboardData.leaderboard as row, idx (row.uuid)} {@const isMe = me?.uuid === row.uuid}
{#if idx === 0}๐Ÿฅ‡{:else if idx === 1}๐Ÿฅˆ{:else if idx === 2}๐Ÿฅ‰{:else}{idx + 1}{/if}
{#if isMe}You{/if}
{statValue(row, sortField)} {formatPlaytime(row.playtime_secs)} {row.player_kills} {formatDate(row.last_seen)}
{/each}
{/if} {/if}