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">
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>

View File

@ -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>

View File

@ -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

View File

@ -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}
{/await}

View File

@ -21,7 +21,7 @@
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();
@ -29,11 +29,13 @@
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;
value = "";
dispatch("reset")
dispatch("reset");
} catch (e) {
error = "dashboard.schematic.errors.upload";
}
}
function reset(e: Event) {
e.stopPropagation();
open = false
value = "";
}
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>
<button class="btn" onclick={upload}>{t("dashboard.schematic.upload")}</button>
<button class="btn btn-gray" onclick={reset}>{t("dashboard.schematic.cancel")}</button>
{/snippet}
</SWModal>

View File

@ -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">
<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>

View File

@ -18,6 +18,7 @@ Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn
- 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
@ -33,6 +34,6 @@ Die Tage werden kürzer und kälter, es geht auf die weiße Jahreszeit zu. Wenn
- 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!**

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 |
|-------------|-------------|--------|
| 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,42 +29,44 @@ 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 ? | / |
|------------|--------------|----------|
| 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 ? | / |
|------------|--------------|----------|
| 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 ? | / |
|------------|-------------|----------|
| 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 | - | / |
@ -73,32 +74,32 @@ tags:
### 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 ? | / |
|------------|--------------|----------|
| 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 ? | / |
|------------|--------------|----------|
| 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 ? | / |
|------------|--------------|----------|
| 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 | - | / |

View File

@ -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"
}

View File

@ -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"
}

View File

@ -1,4 +1,5 @@
{
"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.",
"id": 123,
"creator": ["Test", "Test2"],
"gamemode": "warship",
"image": "../../../images/publics/grafspree/area_render.png",
"image": "../../../images/publics/grafspee/area_render.png",
"3d": false
}

View File

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

View File

@ -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": {

View File

@ -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!"
}
}
},

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 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)) {
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>

View File

@ -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 => (

View File

@ -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);

View File

@ -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>

View File

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