BIN
public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
public/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
3
public/favicon.svg
Normal file
|
After Width: | Height: | Size: 406 KiB |
21
public/site.webmanifest
Normal file
@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "MyWebSite",
|
||||
"short_name": "MySite",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/web-app-manifest-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/web-app-manifest-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
}
|
||||
],
|
||||
"theme_color": "#ffffff",
|
||||
"background_color": "#ffffff",
|
||||
"display": "standalone"
|
||||
}
|
||||
BIN
public/web-app-manifest-192x192.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
public/web-app-manifest-512x512.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
@ -20,6 +20,7 @@
|
||||
<script lang="ts">
|
||||
import {t} from "astro-i18n";
|
||||
import {statsRepo} from "@repo/stats.ts";
|
||||
import "@styles/table.css"
|
||||
|
||||
|
||||
interface Props {
|
||||
@ -64,7 +65,3 @@
|
||||
<p>{error.message}</p>
|
||||
{/await}
|
||||
|
||||
<style>
|
||||
@import "../styles/table.css";
|
||||
</style>
|
||||
|
||||
|
||||
@ -79,6 +79,8 @@
|
||||
})
|
||||
},
|
||||
options: {
|
||||
maintainAspectRatio: false,
|
||||
|
||||
scales: {
|
||||
x: {
|
||||
type: "time",
|
||||
@ -105,5 +107,5 @@
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<canvas bind:this={canvas}></canvas>
|
||||
<canvas height="500" bind:this={canvas}></canvas>
|
||||
</div>
|
||||
@ -101,6 +101,8 @@
|
||||
<a href={l("/rules/microwargear")}
|
||||
class="btn btn-gray">{t("navbar.links.rules.micro")}</a>
|
||||
<a href={l("/rules/streetfight")} class="btn btn-gray">{t("navbar.links.rules.sf")}</a>
|
||||
<h2 class="px-2 text-gray-300">{t("navbar.links.rules.ranked")}</h2>
|
||||
<a href={l("/rangliste/missilewars")} class="btn btn-gray">{t("navbar.links.ranked.mw")}</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- TODO: Add help center
|
||||
|
||||
@ -43,7 +43,5 @@
|
||||
maximumFractionDigits: 2
|
||||
}).format(data.playtime)})}h</p>
|
||||
<p>{t("dashboard.stats.fights", {fights: data.fights})}</p>
|
||||
{#if user.perms.includes("CHECK")}
|
||||
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
||||
{/if}
|
||||
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
|
||||
{/await}
|
||||
@ -21,19 +21,21 @@
|
||||
import {createEventDispatcher} from "svelte";
|
||||
import {schemRepo} from "@repo/schem.ts";
|
||||
import SWModal from "@components/styled/SWModal.svelte";
|
||||
import {t} from "astro-i18n"
|
||||
import {t} from "astro-i18n";
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
interface Props {
|
||||
open?: boolean;
|
||||
}
|
||||
interface Props {
|
||||
open?: boolean;
|
||||
}
|
||||
|
||||
let { open = $bindable(false) }: Props = $props();
|
||||
let {open = $bindable(false)}: Props = $props();
|
||||
|
||||
async function upload() {
|
||||
async function upload(e: Event) {
|
||||
e.stopPropagation();
|
||||
if (uploadFile == null) {
|
||||
return
|
||||
error = "dashboard.schematic.errors.noFile";
|
||||
return;
|
||||
}
|
||||
let file = uploadFile[0];
|
||||
|
||||
@ -42,33 +44,46 @@
|
||||
let type = name.split(".").pop();
|
||||
|
||||
if (type !== "schem" && type !== "schematic") {
|
||||
return
|
||||
error = "dashboard.schematic.errors.invalidEnding";
|
||||
return;
|
||||
}
|
||||
|
||||
let content = await file.arrayBuffer();
|
||||
|
||||
// @ts-ignore
|
||||
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content)));
|
||||
|
||||
let response = await $schemRepo.uploadSchematic(name, b64);
|
||||
try {
|
||||
await $schemRepo.uploadSchematic(name, b64);
|
||||
|
||||
open = false;
|
||||
open = false;
|
||||
value = "";
|
||||
dispatch("reset");
|
||||
} catch (e) {
|
||||
error = "dashboard.schematic.errors.upload";
|
||||
}
|
||||
}
|
||||
|
||||
function reset(e: Event) {
|
||||
e.stopPropagation();
|
||||
open = false
|
||||
value = "";
|
||||
dispatch("reset")
|
||||
}
|
||||
|
||||
let uploadFile: FileList | null = $state(null);
|
||||
let value = $state("");
|
||||
let error = $state(null)
|
||||
</script>
|
||||
|
||||
<SWModal title={t("dashboard.schematic.title")} bind:open>
|
||||
<form>
|
||||
<input type="file" bind:files={uploadFile} bind:value />
|
||||
<label for="schem-upload">{t("dashboard.schematic.title")}</label>
|
||||
<input type="file" id="schem-upload" bind:files={uploadFile} class="overflow-ellipsis" bind:value accept=".schem, .schematic"/>
|
||||
{#if error !== null}
|
||||
<p class="text-red-400">{t(error)}</p>
|
||||
{/if}
|
||||
</form>
|
||||
{#snippet footer()}
|
||||
|
||||
<button class="btn !ml-auto" onclick={upload}>{t("dashboard.schematic.upload")}</button>
|
||||
<button class="btn btn-gray" onclick={() => open = false}>{t("dashboard.schematic.cancel")}</button>
|
||||
|
||||
{/snippet}
|
||||
<button class="btn" onclick={upload}>{t("dashboard.schematic.upload")}</button>
|
||||
<button class="btn btn-gray" onclick={reset}>{t("dashboard.schematic.cancel")}</button>
|
||||
{/snippet}
|
||||
</SWModal>
|
||||
@ -68,16 +68,18 @@
|
||||
})
|
||||
</script>
|
||||
|
||||
<dialog bind:this={dialog} onclose={close} onclick={(e) => dialog.close()} aria-hidden="true" class="max-h-full max-w-md w-full rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100">
|
||||
<div onclick={stopPropagation(onclick)} aria-hidden="true">
|
||||
<dialog bind:this={dialog} onclose={close} onclick={(e) => dialog.close()} aria-hidden="true" class="max-h-full min-w-md w-fit rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100">
|
||||
<div onclick={stopPropagation(onclick)} aria-hidden="true" class="w-fit">
|
||||
<div class="p-6 border-b border-neutral-200 dark:border-neutral-700">
|
||||
<h1 class="text-4xl font-bold">{title}</h1>
|
||||
</div>
|
||||
<div class="p-6 main border-b border-neutral-200 dark:border-neutral-700">
|
||||
{@render children?.()}
|
||||
</div>
|
||||
<div class="flex mx-4 my-2 p-6" onclick={() => dialog.close()} aria-hidden="true">
|
||||
{@render footer?.()}
|
||||
<div class="mx-4 my-2 p-6">
|
||||
<div class="ml-auto flex justify-end" onclick={() => dialog.close()} aria-hidden="true">
|
||||
{@render footer?.()}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
@ -4,8 +4,8 @@ key: schneeballschlacht
|
||||
description: Die Schneeballschlacht auf SteamWar.
|
||||
created: 2024-11-17
|
||||
tags:
|
||||
- event
|
||||
- miniwargear
|
||||
- event
|
||||
- miniwargear
|
||||
image: ../../../images/SchneeballschlachtMWG.png
|
||||
---
|
||||
|
||||
@ -13,26 +13,27 @@ image: ../../../images/SchneeballschlachtMWG.png
|
||||
|
||||
Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn der erste Schnee liegt, wird es Zeit, sich mit Mütze und Handschuhen zu bewaffnen und nach draußen zu eilen. Auch auf SteamWar wird dieses Jahr eine Schneeballschlacht stattfinden, im Modus MiniWarGear. Das Event wird, wie auch schon das Halloween-Event, von einer Community-Abstimmung begleitet, Das MWG-Regelwerk wurde mit einigen zusätzlichen Regeln erweitert.
|
||||
|
||||
- Das Event wird am **22.12.2024** stattfinden
|
||||
- Einsendeschluss **18.12.2024**, Hotfixes dürfen bis zum **20.12.2024** Eingesendet werden
|
||||
- Design-Regel: **Weihnachtliches/Winterliches Design**
|
||||
- Das Event wird am **22.12.2024** stattfinden
|
||||
- Einsendeschluss **18.12.2024**, Hotfixes dürfen bis zum **20.12.2024** Eingesendet werden
|
||||
- Design-Regel: **Weihnachtliches/Winterliches Design**
|
||||
|
||||
## Regeln:
|
||||
- Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt
|
||||
- **Weißer Trockenbeton**/**White Concrete Powder** darf zum Gegner geschossen und/oder geboosted werden, beginnend ab der Ausfahrzeit
|
||||
- Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können
|
||||
- Schneeballkanonen dürfen Wasser für ihre Treibladungen benutzen
|
||||
- Der Turnieraufbau ist wie folgt:
|
||||
- Alle 20 min Start, jeweils zwei Fights je 10 min versetzt
|
||||
- Struktur: Ranglistenturnier (Gruppenphase, in KO-Phase wird jeder Platz (1, 2, 3, 4, 5, 6, …) umkämpft
|
||||
|
||||
- Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt
|
||||
- **Weißer Trockenbeton**/**White Concrete Powder** darf zum Gegner geschossen und/oder geboosted werden, beginnend ab der Ausfahrzeit
|
||||
- Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können
|
||||
- Schneeballkanonen dürfen Wasser für ihre Treibladungen benutzen
|
||||
- Der Turnieraufbau ist wie folgt:
|
||||
- Alle 20 min Start, jeweils zwei Fights je 10 min versetzt
|
||||
- Struktur: Ranglistenturnier (Gruppenphase, in KO-Phase wird jeder Platz (1, 2, 3, 4, 5, 6, …) umkämpft
|
||||
|
||||
## Die beste „Schneeballkanone“ wird per Uservoting wie folgt besimmt
|
||||
|
||||
- Jedes Team muss am Tag des Turnieres (z.B. nach Ende der Fights) Bild/Videomaterial von ihrer Schneeballkanone per Discord an Zent4rus oder zSalos schicken, diese werden danach unter einem Thread zur Abstimmung veröffentlicht
|
||||
- Die Darstellung der Schneeballkanone (mit/ohne Techhider, mit/ohne MWG außen rum) obliegt den Teams selbst
|
||||
- Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG – Designcontest)
|
||||
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung
|
||||
- Jedes Team muss am Tag des Turnieres (z.B. nach Ende der Fights) Bild/Videomaterial von ihrer Schneeballkanone per Discord an Zent4rus oder zSalos schicken, diese werden danach unter einem Thread zur Abstimmung veröffentlicht
|
||||
- Die Darstellung der Schneeballkanone (mit/ohne Techhider, mit/ohne MWG außen rum) obliegt den Teams selbst
|
||||
- Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG – Designcontest)
|
||||
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung
|
||||
|
||||
Der Gesamtsieger wird mit folgender Formel bestimmt: 0,66 * Fightplatzierung + 0,33 * Platzierung Uservoting, bei Gleichstand bestimmt die Fightplatzierung
|
||||
Der Gesamtsieger wird mit folgender Formel bestimmt: 0,66 _ Fightplatzierung + 0,33 _ Platzierung Uservoting, bei Gleichstand bestimmt die Fightplatzierung
|
||||
|
||||
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
||||
28
src/content/announcements/de/sw-arcade.md
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
title: SteamWar Arcade
|
||||
description: "Das erste SteamWar Arcade Event: MissleWars, TowerRun und TNTLeague"
|
||||
key: steamwar-arcade
|
||||
created: 2025-04-14
|
||||
tags:
|
||||
- event
|
||||
- towerrun
|
||||
- misslewars
|
||||
- tntleague
|
||||
- arcade
|
||||
image: ../../../images/sw-arcade-image.png
|
||||
---
|
||||
|
||||
**Ahoi Liebe Community,**
|
||||
|
||||
Am **18. Mai** feiert SteamWar seinen 6. Geburtstag. Zur Feier dieses Meilensteins werden wir ein kleines Event veranstalten: **SteamWar Arcade**
|
||||
|
||||
- Anmeldeschluss ist der **11.5.2025**
|
||||
- In jedem Modus können bis zu **drei Personen** an einem Kampf teilnehmen
|
||||
|
||||
## Ablauf:
|
||||
|
||||
- Es gibt drei Modi zur Auswahl: **TowerRun**, **TNTLeague** und **MissleWars**
|
||||
- Die Teams stimmen 5 Minuten vor Beginn den Modus ab. Sind die Teams sich einig, wird dieser Modus gespielt. Sind die Teams sich nicht einig, wird der dritte Modus gespielt.
|
||||
- Es wird eine einfache Gruppenphase geben: alle gegen alle
|
||||
|
||||
**Wir wünschen allen teilnehmenden Teams viel Erfolg!**
|
||||
@ -14,13 +14,12 @@ tags:
|
||||
|
||||
| Platzierung | Team | Punkte |
|
||||
|-------------|-------------|--------|
|
||||
| 1. | ABYSS | 0 |
|
||||
| | BlackFire | 0 |
|
||||
| | Borg | 0 |
|
||||
| | Halcyon | 0 |
|
||||
| | Happy-End | 0 |
|
||||
| | Pulse | 0 |
|
||||
| | TheNoobTeam | 0 |
|
||||
| 1. | Halcyon | 10 |
|
||||
| 2. | Happy-End | 8 |
|
||||
| 3. | ABYSS | 5 |
|
||||
| 4. | Borg | 4 |
|
||||
| 5. | BlackFire | 2 |
|
||||
| 6. | TheNoobTeam | 1 |
|
||||
|
||||
### Aktueller Spieltag
|
||||
|
||||
@ -30,75 +29,77 @@ tags:
|
||||
|
||||
| 01.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | HPY vs ABYS | / |
|
||||
| 19:30 | Borg vs Hlcy | / |
|
||||
| 20:00 | TNT vs BF | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
| 19:00 | HPY vs ABYS | HPY qualifiziert |
|
||||
| 19:30 | Borg vs Hlcy | Hlcy qualifiziert |
|
||||
| 20:00 | TNT vs BF | TNT qualifiziert |
|
||||
| 20:30 | ABYS vs Borg | Sieg ABYS |
|
||||
| 21:00 | Borg vs BF | Sieg Borg |
|
||||
| 21:30 | BF vs ABYS | ABYS, Borg qualifiziert |
|
||||
|
||||
PL hat sich nach der Qualifikation zurückgezogen, womit BF nachgerückt ist.
|
||||
|
||||
### 1. Spieltag
|
||||
|
||||
| 08.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
| 08.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | ABYS vs Borg | Sieg ABYS |
|
||||
| 19:30 | Hlcy vs HPY | Sieg Hlcy |
|
||||
| 20:00 | BF vs TNT | Sieg TNT |
|
||||
| 20:30 | HPY vs ABYS | Sieg HPY |
|
||||
| 21:00 | Borg vs BF | Sieg Borg |
|
||||
| 21:30 | TNT vs Hlcy | Sieg Hlcy |
|
||||
|
||||
### 2. Spieltag
|
||||
|
||||
| 15.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
| 15.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | HPY vs TNT | Sieg HPY |
|
||||
| 19:30 | ABYS vs BF | Sieg ABYS |
|
||||
| 20:00 | Borg vs Hlcy | Sieg Hlcy |
|
||||
| 20:30 | BF vs HPY | Sieg HPY |
|
||||
| 21:00 | TNT vs Borg | Sieg Borg |
|
||||
| 21:30 | Hlcy vs ABYS | Sieg Hlcy |
|
||||
|
||||
### 3. Spieltag
|
||||
|
||||
| 22.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | - | / |
|
||||
| 21:00 | - | / |
|
||||
| 21:30 | - | / |
|
||||
| 22.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-------------|----------|
|
||||
| 19:00 | ABYS vs TNT | Sieg ABYS |
|
||||
| 19:30 | Borg vs HPY | Sieg HPY |
|
||||
| 20:00 | Hlcy vs BF | Sieg Hlcy |
|
||||
| 20:30 | - | / |
|
||||
| 21:00 | - | / |
|
||||
| 21:30 | - | / |
|
||||
|
||||
### 4. Spieltag
|
||||
|
||||
| 29.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
| 29.03.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | TNT vs ABYS | Sieg ABYS |
|
||||
| 19:30 | HPY vs Borg | Sieg HPY |
|
||||
| 20:00 | BF vs Hlcy | Sieg Hlcy |
|
||||
| 20:30 | Borg vs TNT | Sieg Borg |
|
||||
| 21:00 | HPY vs BF | Sieg HPY |
|
||||
| 21:30 | ABYS vs Hlcy | Sieg Hlcy |
|
||||
|
||||
### 5. Spieltag
|
||||
|
||||
| 05.04.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | ? vs ? | / |
|
||||
| 21:00 | ? vs ? | / |
|
||||
| 21:30 | ? vs ? | / |
|
||||
| 05.04.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | TNT vs HPY | Sieg HPY |
|
||||
| 19:30 | BF vs ABYS | Sieg BF |
|
||||
| 20:00 | Hlcy vs Borg | Sieg Hlcy |
|
||||
| 20:30 | ABYS vs HPY | Sieg HPY |
|
||||
| 21:00 | BF vs Borg | Sieg Borg |
|
||||
| 21:30 | Hlcy vs TNT | Sieg Hlcy |
|
||||
|
||||
### 6. Spieltag
|
||||
|
||||
| 12.04.2025 | Begegnung | Ergebnis |
|
||||
|------------|-----------|----------|
|
||||
| 19:00 | ? vs ? | / |
|
||||
| 19:30 | ? vs ? | / |
|
||||
| 20:00 | ? vs ? | / |
|
||||
| 20:30 | - | / |
|
||||
| 21:00 | - | / |
|
||||
| 21:30 | - | / |
|
||||
| 12.04.2025 | Begegnung | Ergebnis |
|
||||
|------------|--------------|----------|
|
||||
| 19:00 | Borg vs ABYS | Sieg ABYS |
|
||||
| 19:30 | HPY vs Hlcy | Sieg Hlcy |
|
||||
| 20:00 | TNT vs BF | Sieg BF |
|
||||
| 20:30 | - | / |
|
||||
| 21:00 | - | / |
|
||||
| 21:30 | - | / |
|
||||
|
||||
@ -4,7 +4,8 @@
|
||||
"url": {
|
||||
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar",
|
||||
"1.20.6": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.1.0/AdvancedScripts-2.1.0.jar",
|
||||
"1.19.3": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.0.0/AdvancedScripts-2.0.0.jar"
|
||||
"1.19.3": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.0.0/AdvancedScripts-2.0.0.jar",
|
||||
"Hotkey script": "https://git.steamwar.de/SteamWar/SteamWar/src/branch/main/BauSystem/hotkeys.lua"
|
||||
},
|
||||
"sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
|
||||
}
|
||||
@ -2,7 +2,8 @@
|
||||
"name": "SteamWarTeamserver",
|
||||
"description": "Dieses Plugin ermöglicht die einfache Einbindung deines Servers in SteamWar. Wie du deinen (Team-)Server über SteamWar erreichbar machen kannst findest du hier.",
|
||||
"url": {
|
||||
"Info": "/teamserverintegration"
|
||||
"Info": "/teamserverintegration",
|
||||
"Download": "https://git.steamwar.de/SteamWar/SteamWarTeamserverIntegration/releases/download/latest/SteamWarTeamserverIntegration.jar"
|
||||
},
|
||||
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarBungeeTeamserver"
|
||||
"sourceUrl": "https://git.steamwar.de/SteamWar/SteamWarTeamserverIntegration"
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
{
|
||||
"translationKey": "microwg",
|
||||
"main": false
|
||||
"main": false,
|
||||
"ranked": true
|
||||
}
|
||||
5
src/content/modes/missilewars.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"translationKey": "mw",
|
||||
"main": false,
|
||||
"ranked": true
|
||||
}
|
||||
@ -1,9 +1,9 @@
|
||||
{
|
||||
"name": "Graf Spree",
|
||||
"name": "Graf Spee",
|
||||
"description": "A simple, lightweight description of a frostbite.",
|
||||
"id": 123,
|
||||
"creator": ["Test", "Test2"],
|
||||
"gamemode": "warship",
|
||||
"image": "../../../images/publics/grafspree/area_render.png",
|
||||
"image": "../../../images/publics/grafspee/area_render.png",
|
||||
"3d": false
|
||||
}
|
||||
3
src/content/rules/de/missilewars.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
translationKey: mw
|
||||
---
|
||||
@ -87,7 +87,10 @@
|
||||
"title": "Hilfe",
|
||||
"docs": "Dokumentation"
|
||||
},
|
||||
"account": "Konto"
|
||||
"account": "Konto",
|
||||
"ranked": {
|
||||
"mw": "MissileWars"
|
||||
}
|
||||
}
|
||||
},
|
||||
"wg": {
|
||||
@ -123,6 +126,9 @@
|
||||
"microwg": {
|
||||
"title": "MicroWarGear"
|
||||
},
|
||||
"mw": {
|
||||
"title": "MissileWars"
|
||||
},
|
||||
"footer": {
|
||||
"imprint": "Impressum",
|
||||
"privacy": "Datenschutzerklärung",
|
||||
@ -167,7 +173,7 @@
|
||||
"stats": {
|
||||
"playtime": "Spielzeit: {# playtime #}",
|
||||
"fights": "Kämpfe: {# fights #}",
|
||||
"checked": "Schematics Geprüft: {# checked #}"
|
||||
"checked": "Freigegebene Schematics: {# checked #}"
|
||||
},
|
||||
"schematic": {
|
||||
"upload": "Hochladen",
|
||||
@ -194,7 +200,12 @@
|
||||
}
|
||||
},
|
||||
"cancel": "Abbrechen",
|
||||
"title": "Schematic hochladen"
|
||||
"title": "Schematic hochladen",
|
||||
"errors": {
|
||||
"invalidEnding": "Diese Dateiendung kann nicht Hochgeladen werden.",
|
||||
"noFile": "Keine Datei.",
|
||||
"upload": "Fehler beim Hochladen, Überprüfe deine Schematic!"
|
||||
}
|
||||
}
|
||||
},
|
||||
"login": {
|
||||
|
||||
@ -111,7 +111,7 @@
|
||||
"stats": {
|
||||
"playtime": "Playtime: {# playtime #}",
|
||||
"fights": "Fights: {# fights #}",
|
||||
"checked": "Schematics Checked: {# checked #}"
|
||||
"checked": "Accepted Schematics: {# checked #}"
|
||||
},
|
||||
"schematic": {
|
||||
"upload": "Upload",
|
||||
@ -137,6 +137,11 @@
|
||||
"download": "Download",
|
||||
"close": "Close"
|
||||
}
|
||||
},
|
||||
"errors": {
|
||||
"invalidEnding": "This file extension cannot be uploaded.",
|
||||
"noFile": "No file.",
|
||||
"upload": "Error uploading, check your schematic!"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
BIN
src/images/sw-arcade-image.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
@ -1,24 +1,24 @@
|
||||
---
|
||||
import "$lib/styles/app.css";
|
||||
import icon from "../images/logo.png";
|
||||
import {getImage} from "astro:assets";
|
||||
import {astroI18n} from "astro-i18n";
|
||||
import {SEO} from "astro-seo";
|
||||
import {ClientRouter} from "astro:transitions";
|
||||
const {title, description, clientSideRouter = true} = Astro.props.frontmatter || Astro.props;
|
||||
import { astroI18n } from "astro-i18n";
|
||||
import { SEO } from "astro-seo";
|
||||
import { ClientRouter } from "astro:transitions";
|
||||
const { title, description, clientSideRouter = true } = Astro.props.frontmatter || Astro.props;
|
||||
import "../../public/fonts/roboto/roboto.css";
|
||||
|
||||
const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png", quality: 100});
|
||||
---
|
||||
|
||||
<html lang={astroI18n.locale} class="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<meta name="icbm" content="52.370216;4.895168"/>
|
||||
<link rel="icon" type="imgage/png" href={iconImage.src}/>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||
<meta name="icbm" content="52.370216;4.895168" />
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
<meta name="apple-mobile-web-app-title" content="MyWebSite" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
|
||||
<SEO
|
||||
title={title}
|
||||
@ -33,17 +33,17 @@ const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png
|
||||
/>
|
||||
|
||||
<script is:inline data-astro-rerun>
|
||||
if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) && window.matchMedia("(prefers-color-scheme: light)").matches)) {
|
||||
document.documentElement.classList.remove("dark");
|
||||
}
|
||||
if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) && window.matchMedia("(prefers-color-scheme: light)").matches)) {
|
||||
document.documentElement.classList.remove("dark");
|
||||
}
|
||||
</script>
|
||||
|
||||
<slot name="head"/>
|
||||
<slot name="head" />
|
||||
|
||||
{clientSideRouter && <ClientRouter/>}
|
||||
{clientSideRouter && <ClientRouter />}
|
||||
</head>
|
||||
<body class="dark:bg-zinc-800">
|
||||
<slot/>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@ -77,7 +77,7 @@ const ogImage = await getImage({
|
||||
)}
|
||||
<div class={post.data.image ? "absolute bottom-8 left-2" : "mb-4"}>
|
||||
<h1 class="text-4xl mb-0" transition:name={post.data.title + "-title"}>{post.data.title}</h1>
|
||||
<div class="flex items-center mt-2 text-neutral-300">
|
||||
<div class="flex items-center mt-2 text-neutral-800 dark:text-neutral-300">
|
||||
<TagSolid class="w-4 h-4 mr-2"/>
|
||||
<div transition:name={post.data.title + "-tags"}>
|
||||
{post.data.tags.map(tag => (
|
||||
|
||||
@ -15,7 +15,7 @@ import {type Player} from "../components/types/data";
|
||||
import PostComponent from "../components/PostComponent.astro";
|
||||
import BackgroundImage from "../components/BackgroundImage.astro";
|
||||
|
||||
const teamMember: { [key: string]: Player[]} = await fetch("http://127.0.0.1:1337/data/team")
|
||||
const teamMember: { [key: string]: Player[]} = await fetch(import.meta.env.PUBLIC_API_SERVER + "/data/team")
|
||||
.then(value => value.json());
|
||||
|
||||
const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale);
|
||||
|
||||
@ -44,4 +44,5 @@ const modes = await getCollection("modes", entry => entry.data.main);
|
||||
</div>
|
||||
</div>
|
||||
</div>))}
|
||||
<a href={l("/rangliste/MissileWars")}>MissileWars Rangliste</a>
|
||||
</PageLayout>
|
||||
@ -31,7 +31,7 @@ table {
|
||||
text-align: center;
|
||||
|
||||
tr:nth-child(odd) {
|
||||
@apply bg-neutral-800;
|
||||
@apply bg-neutral-200 dark:bg-neutral-800;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||