Fix Merge
Some checks failed
SteamWarCI Build failed

This commit is contained in:
2025-04-14 18:15:05 +02:00
31 changed files with 241 additions and 143 deletions

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
public/favicon-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

3
public/favicon.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 406 KiB

21
public/site.webmanifest Normal file
View 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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -20,6 +20,7 @@
<script lang="ts"> <script lang="ts">
import {t} from "astro-i18n"; import {t} from "astro-i18n";
import {statsRepo} from "@repo/stats.ts"; import {statsRepo} from "@repo/stats.ts";
import "@styles/table.css"
interface Props { interface Props {
@ -64,7 +65,3 @@
<p>{error.message}</p> <p>{error.message}</p>
{/await} {/await}
<style>
@import "../styles/table.css";
</style>

View File

@ -79,6 +79,8 @@
}) })
}, },
options: { options: {
maintainAspectRatio: false,
scales: { scales: {
x: { x: {
type: "time", type: "time",
@ -105,5 +107,5 @@
</script> </script>
<div> <div>
<canvas bind:this={canvas}></canvas> <canvas height="500" bind:this={canvas}></canvas>
</div> </div>

View File

@ -101,6 +101,8 @@
<a href={l("/rules/microwargear")} <a href={l("/rules/microwargear")}
class="btn btn-gray">{t("navbar.links.rules.micro")}</a> 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> <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>
</div> </div>
<!-- TODO: Add help center <!-- TODO: Add help center

View File

@ -43,7 +43,5 @@
maximumFractionDigits: 2 maximumFractionDigits: 2
}).format(data.playtime)})}h</p> }).format(data.playtime)})}h</p>
<p>{t("dashboard.stats.fights", {fights: data.fights})}</p> <p>{t("dashboard.stats.fights", {fights: data.fights})}</p>
{#if user.perms.includes("CHECK")} <p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
<p>{t("dashboard.stats.checked", {checked: data.acceptedSchematics})}</p>
{/if}
{/await} {/await}

View File

@ -21,19 +21,21 @@
import {createEventDispatcher} from "svelte"; import {createEventDispatcher} from "svelte";
import {schemRepo} from "@repo/schem.ts"; import {schemRepo} from "@repo/schem.ts";
import SWModal from "@components/styled/SWModal.svelte"; import SWModal from "@components/styled/SWModal.svelte";
import {t} from "astro-i18n" import {t} from "astro-i18n";
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
interface Props { interface Props {
open?: boolean; 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) { if (uploadFile == null) {
return error = "dashboard.schematic.errors.noFile";
return;
} }
let file = uploadFile[0]; let file = uploadFile[0];
@ -42,33 +44,46 @@
let type = name.split(".").pop(); let type = name.split(".").pop();
if (type !== "schem" && type !== "schematic") { if (type !== "schem" && type !== "schematic") {
return error = "dashboard.schematic.errors.invalidEnding";
return;
} }
let content = await file.arrayBuffer(); let content = await file.arrayBuffer();
// @ts-ignore
let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content))); 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 = ""; value = "";
dispatch("reset")
} }
let uploadFile: FileList | null = $state(null); let uploadFile: FileList | null = $state(null);
let value = $state(""); let value = $state("");
let error = $state(null)
</script> </script>
<SWModal title={t("dashboard.schematic.title")} bind:open> <SWModal title={t("dashboard.schematic.title")} bind:open>
<form> <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> </form>
{#snippet footer()} {#snippet footer()}
<button class="btn" onclick={upload}>{t("dashboard.schematic.upload")}</button>
<button class="btn !ml-auto" onclick={upload}>{t("dashboard.schematic.upload")}</button> <button class="btn btn-gray" onclick={reset}>{t("dashboard.schematic.cancel")}</button>
<button class="btn btn-gray" onclick={() => open = false}>{t("dashboard.schematic.cancel")}</button> {/snippet}
{/snippet}
</SWModal> </SWModal>

View File

@ -68,16 +68,18 @@
}) })
</script> </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"> <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"> <div onclick={stopPropagation(onclick)} aria-hidden="true" class="w-fit">
<div class="p-6 border-b border-neutral-200 dark:border-neutral-700"> <div class="p-6 border-b border-neutral-200 dark:border-neutral-700">
<h1 class="text-4xl font-bold">{title}</h1> <h1 class="text-4xl font-bold">{title}</h1>
</div> </div>
<div class="p-6 main border-b border-neutral-200 dark:border-neutral-700"> <div class="p-6 main border-b border-neutral-200 dark:border-neutral-700">
{@render children?.()} {@render children?.()}
</div> </div>
<div class="flex mx-4 my-2 p-6" onclick={() => dialog.close()} aria-hidden="true"> <div class="mx-4 my-2 p-6">
{@render footer?.()} <div class="ml-auto flex justify-end" onclick={() => dialog.close()} aria-hidden="true">
{@render footer?.()}
</div>
</div> </div>
</div> </div>
</dialog> </dialog>

View File

@ -4,8 +4,8 @@ key: schneeballschlacht
description: Die Schneeballschlacht auf SteamWar. description: Die Schneeballschlacht auf SteamWar.
created: 2024-11-17 created: 2024-11-17
tags: tags:
- event - event
- miniwargear - miniwargear
image: ../../../images/SchneeballschlachtMWG.png 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. 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 - Das Event wird am **22.12.2024** stattfinden
- Einsendeschluss **18.12.2024**, Hotfixes dürfen bis zum **20.12.2024** Eingesendet werden - Einsendeschluss **18.12.2024**, Hotfixes dürfen bis zum **20.12.2024** Eingesendet werden
- Design-Regel: **Weihnachtliches/Winterliches Design** - Design-Regel: **Weihnachtliches/Winterliches Design**
## Regeln: ## 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 - Regelwerk: **MiniWarGear**, ohne MGs, 120 TNT trotzdem erlaubt
- Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können - **Weißer Trockenbeton**/**White Concrete Powder** darf zum Gegner geschossen und/oder geboosted werden, beginnend ab der Ausfahrzeit
- Schneeballkanonen dürfen Wasser für ihre Treibladungen benutzen - Solche „Schneeballkanonen“ zählen nicht zum Kanonenlimit und dürfen vorbeladen sein, solange sie keine Projektile schießen können
- Der Turnieraufbau ist wie folgt: - Schneeballkanonen dürfen Wasser für ihre Treibladungen benutzen
- Alle 20 min Start, jeweils zwei Fights je 10 min versetzt - Der Turnieraufbau ist wie folgt:
- Struktur: Ranglistenturnier (Gruppenphase, in KO-Phase wird jeder Platz (1, 2, 3, 4, 5, 6, …) umkämpft - 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 ## 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 - 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 - 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) - Sieger von bester Schneeballkanone wird durch Uservote bestimmt (ähnlich wie bei WG Designcontest)
- Die Abstimmung endet drei Tage nach Veröffentlichung der Abstimmung - 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!** **Wir wünschen allen teilnehmenden Teams viel Erfolg!**

View 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!**

View File

@ -14,13 +14,12 @@ tags:
| Platzierung | Team | Punkte | | Platzierung | Team | Punkte |
|-------------|-------------|--------| |-------------|-------------|--------|
| 1. | ABYSS | 0 | | 1. | Halcyon | 10 |
| | BlackFire | 0 | | 2. | Happy-End | 8 |
| | Borg | 0 | | 3. | ABYSS | 5 |
| | Halcyon | 0 | | 4. | Borg | 4 |
| | Happy-End | 0 | | 5. | BlackFire | 2 |
| | Pulse | 0 | | 6. | TheNoobTeam | 1 |
| | TheNoobTeam | 0 |
### Aktueller Spieltag ### Aktueller Spieltag
@ -30,75 +29,77 @@ tags:
| 01.03.2025 | Begegnung | Ergebnis | | 01.03.2025 | Begegnung | Ergebnis |
|------------|--------------|----------| |------------|--------------|----------|
| 19:00 | HPY vs ABYS | / | | 19:00 | HPY vs ABYS | HPY qualifiziert |
| 19:30 | Borg vs Hlcy | / | | 19:30 | Borg vs Hlcy | Hlcy qualifiziert |
| 20:00 | TNT vs BF | / | | 20:00 | TNT vs BF | TNT qualifiziert |
| 20:30 | ? vs ? | / | | 20:30 | ABYS vs Borg | Sieg ABYS |
| 21:00 | ? vs ? | / | | 21:00 | Borg vs BF | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | BF vs ABYS | ABYS, Borg qualifiziert |
PL hat sich nach der Qualifikation zurückgezogen, womit BF nachgerückt ist.
### 1. Spieltag ### 1. Spieltag
| 08.03.2025 | Begegnung | Ergebnis | | 08.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | ABYS vs Borg | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | Hlcy vs HPY | Sieg Hlcy |
| 20:00 | ? vs ? | / | | 20:00 | BF vs TNT | Sieg TNT |
| 20:30 | ? vs ? | / | | 20:30 | HPY vs ABYS | Sieg HPY |
| 21:00 | ? vs ? | / | | 21:00 | Borg vs BF | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | TNT vs Hlcy | Sieg Hlcy |
### 2. Spieltag ### 2. Spieltag
| 15.03.2025 | Begegnung | Ergebnis | | 15.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | HPY vs TNT | Sieg HPY |
| 19:30 | ? vs ? | / | | 19:30 | ABYS vs BF | Sieg ABYS |
| 20:00 | ? vs ? | / | | 20:00 | Borg vs Hlcy | Sieg Hlcy |
| 20:30 | ? vs ? | / | | 20:30 | BF vs HPY | Sieg HPY |
| 21:00 | ? vs ? | / | | 21:00 | TNT vs Borg | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | Hlcy vs ABYS | Sieg Hlcy |
### 3. Spieltag ### 3. Spieltag
| 22.03.2025 | Begegnung | Ergebnis | | 22.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|-------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | ABYS vs TNT | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | Borg vs HPY | Sieg HPY |
| 20:00 | ? vs ? | / | | 20:00 | Hlcy vs BF | Sieg Hlcy |
| 20:30 | - | / | | 20:30 | - | / |
| 21:00 | - | / | | 21:00 | - | / |
| 21:30 | - | / | | 21:30 | - | / |
### 4. Spieltag ### 4. Spieltag
| 29.03.2025 | Begegnung | Ergebnis | | 29.03.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | TNT vs ABYS | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | HPY vs Borg | Sieg HPY |
| 20:00 | ? vs ? | / | | 20:00 | BF vs Hlcy | Sieg Hlcy |
| 20:30 | ? vs ? | / | | 20:30 | Borg vs TNT | Sieg Borg |
| 21:00 | ? vs ? | / | | 21:00 | HPY vs BF | Sieg HPY |
| 21:30 | ? vs ? | / | | 21:30 | ABYS vs Hlcy | Sieg Hlcy |
### 5. Spieltag ### 5. Spieltag
| 05.04.2025 | Begegnung | Ergebnis | | 05.04.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | TNT vs HPY | Sieg HPY |
| 19:30 | ? vs ? | / | | 19:30 | BF vs ABYS | Sieg BF |
| 20:00 | ? vs ? | / | | 20:00 | Hlcy vs Borg | Sieg Hlcy |
| 20:30 | ? vs ? | / | | 20:30 | ABYS vs HPY | Sieg HPY |
| 21:00 | ? vs ? | / | | 21:00 | BF vs Borg | Sieg Borg |
| 21:30 | ? vs ? | / | | 21:30 | Hlcy vs TNT | Sieg Hlcy |
### 6. Spieltag ### 6. Spieltag
| 12.04.2025 | Begegnung | Ergebnis | | 12.04.2025 | Begegnung | Ergebnis |
|------------|-----------|----------| |------------|--------------|----------|
| 19:00 | ? vs ? | / | | 19:00 | Borg vs ABYS | Sieg ABYS |
| 19:30 | ? vs ? | / | | 19:30 | HPY vs Hlcy | Sieg Hlcy |
| 20:00 | ? vs ? | / | | 20:00 | TNT vs BF | Sieg BF |
| 20:30 | - | / | | 20:30 | - | / |
| 21:00 | - | / | | 21:00 | - | / |
| 21:30 | - | / | | 21:30 | - | / |

View File

@ -4,7 +4,8 @@
"url": { "url": {
"1.21.4": "https://git.steamwar.de/SteamWar/AdvancedScripts/releases/download/2.2.0/AdvancedScripts-2.2.0.jar", "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.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" "sourceUrl": "https://git.steamwar.de/SteamWar/AdvancedScripts"
} }

View File

@ -2,7 +2,8 @@
"name": "SteamWarTeamserver", "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.", "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": { "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"
} }

View File

@ -1,4 +1,5 @@
{ {
"translationKey": "microwg", "translationKey": "microwg",
"main": false "main": false,
"ranked": true
} }

View File

@ -0,0 +1,5 @@
{
"translationKey": "mw",
"main": false,
"ranked": true
}

View File

@ -1,9 +1,9 @@
{ {
"name": "Graf Spree", "name": "Graf Spee",
"description": "A simple, lightweight description of a frostbite.", "description": "A simple, lightweight description of a frostbite.",
"id": 123, "id": 123,
"creator": ["Test", "Test2"], "creator": ["Test", "Test2"],
"gamemode": "warship", "gamemode": "warship",
"image": "../../../images/publics/grafspree/area_render.png", "image": "../../../images/publics/grafspee/area_render.png",
"3d": false "3d": false
} }

View File

@ -0,0 +1,3 @@
---
translationKey: mw
---

View File

@ -87,7 +87,10 @@
"title": "Hilfe", "title": "Hilfe",
"docs": "Dokumentation" "docs": "Dokumentation"
}, },
"account": "Konto" "account": "Konto",
"ranked": {
"mw": "MissileWars"
}
} }
}, },
"wg": { "wg": {
@ -123,6 +126,9 @@
"microwg": { "microwg": {
"title": "MicroWarGear" "title": "MicroWarGear"
}, },
"mw": {
"title": "MissileWars"
},
"footer": { "footer": {
"imprint": "Impressum", "imprint": "Impressum",
"privacy": "Datenschutzerklärung", "privacy": "Datenschutzerklärung",
@ -167,7 +173,7 @@
"stats": { "stats": {
"playtime": "Spielzeit: {# playtime #}", "playtime": "Spielzeit: {# playtime #}",
"fights": "Kämpfe: {# fights #}", "fights": "Kämpfe: {# fights #}",
"checked": "Schematics Geprüft: {# checked #}" "checked": "Freigegebene Schematics: {# checked #}"
}, },
"schematic": { "schematic": {
"upload": "Hochladen", "upload": "Hochladen",
@ -194,7 +200,12 @@
} }
}, },
"cancel": "Abbrechen", "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": { "login": {

View File

@ -111,7 +111,7 @@
"stats": { "stats": {
"playtime": "Playtime: {# playtime #}", "playtime": "Playtime: {# playtime #}",
"fights": "Fights: {# fights #}", "fights": "Fights: {# fights #}",
"checked": "Schematics Checked: {# checked #}" "checked": "Accepted Schematics: {# checked #}"
}, },
"schematic": { "schematic": {
"upload": "Upload", "upload": "Upload",
@ -137,6 +137,11 @@
"download": "Download", "download": "Download",
"close": "Close" "close": "Close"
} }
},
"errors": {
"invalidEnding": "This file extension cannot be uploaded.",
"noFile": "No file.",
"upload": "Error uploading, check your schematic!"
} }
} }
}, },

View File

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@ -1,24 +1,24 @@
--- ---
import "$lib/styles/app.css"; import "$lib/styles/app.css";
import icon from "../images/logo.png"; import { astroI18n } from "astro-i18n";
import {getImage} from "astro:assets"; import { SEO } from "astro-seo";
import {astroI18n} from "astro-i18n"; import { ClientRouter } from "astro:transitions";
import {SEO} from "astro-seo"; const { title, description, clientSideRouter = true } = Astro.props.frontmatter || Astro.props;
import {ClientRouter} from "astro:transitions";
const {title, description, clientSideRouter = true} = Astro.props.frontmatter || Astro.props;
import "../../public/fonts/roboto/roboto.css"; 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"> <html lang={astroI18n.locale} class="dark">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<meta name="viewport" <meta name="viewport" content="width=device-width, user-scalable=5, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0" />
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 http-equiv="X-UA-Compatible" content="ie=edge"> <meta name="icbm" content="52.370216;4.895168" />
<meta name="icbm" content="52.370216;4.895168"/> <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="imgage/png" href={iconImage.src}/> <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 <SEO
title={title} title={title}
@ -31,19 +31,19 @@ const iconImage = await getImage({src: icon, height: 32, width: 32, format: "png
href: `https://steamwar.de/${locale}/`, href: `https://steamwar.de/${locale}/`,
}))} }))}
/> />
<script is:inline data-astro-rerun> <script is:inline data-astro-rerun>
if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) && window.matchMedia("(prefers-color-scheme: light)").matches)) { if (localStorage["theme-mode"] === "light" || (!("theme-mode" in localStorage) && window.matchMedia("(prefers-color-scheme: light)").matches)) {
document.documentElement.classList.remove("dark"); document.documentElement.classList.remove("dark");
} }
</script> </script>
<slot name="head"/> <slot name="head" />
{clientSideRouter && <ClientRouter/>} {clientSideRouter && <ClientRouter />}
</head> </head>
<body class="dark:bg-zinc-800"> <body class="dark:bg-zinc-800">
<slot/> <slot />
</body> </body>
</html> </html>

View File

@ -77,7 +77,7 @@ const ogImage = await getImage({
)} )}
<div class={post.data.image ? "absolute bottom-8 left-2" : "mb-4"}> <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> <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"/> <TagSolid class="w-4 h-4 mr-2"/>
<div transition:name={post.data.title + "-tags"}> <div transition:name={post.data.title + "-tags"}>
{post.data.tags.map(tag => ( {post.data.tags.map(tag => (

View File

@ -15,7 +15,7 @@ import {type Player} from "../components/types/data";
import PostComponent from "../components/PostComponent.astro"; import PostComponent from "../components/PostComponent.astro";
import BackgroundImage from "../components/BackgroundImage.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()); .then(value => value.json());
const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale); const posts = await getCollection("announcements", entry => entry.id.split("/")[0] === astroI18n.locale);

View File

@ -44,4 +44,5 @@ const modes = await getCollection("modes", entry => entry.data.main);
</div> </div>
</div> </div>
</div>))} </div>))}
<a href={l("/rangliste/MissileWars")}>MissileWars Rangliste</a>
</PageLayout> </PageLayout>

View File

@ -31,7 +31,7 @@ table {
text-align: center; text-align: center;
tr:nth-child(odd) { tr:nth-child(odd) {
@apply bg-neutral-800; @apply bg-neutral-200 dark:bg-neutral-800;
} }
} }
} }