Modpacks verwalten

Modpacks verwalten

Installiertes Modpack anzeigen, auf neue Versionen aktualisieren, Modpacks wechseln und das Tracking-System verstehen.


Installiertes Modpack anzeigen

Der Installiert-Tab zeigt Informationen zum aktuell installierten Modpack:

Feld Beschreibung
Anbieter Von welcher Plattform es stammt (Modrinth, CurseForge usw.)
Modpack-Name Anzeigename
Version Aktuell installierte Version
Installiert am Wann es installiert wurde (ISO-Zeitstempel)

Diese Daten stammen aus .installed_modpack.json im Server-Root.


Modpack aktualisieren

Wie die Update-Erkennung funktioniert

Beim Betrachten eines bereits installierten Modpacks:

  1. Plugin liest .installed_modpack.json für aktuelle Version
  2. Vergleicht mit verfügbaren Versionen vom Anbieter
  3. Neuere Versionen werden mit Update-Option angezeigt

Update-Optionen

Beim Aktualisieren (🟠-Typ) gibt es zwei Möglichkeiten:

Option Was passiert
Update (Konfigurationen löschen) Alte Konfigurationen gelöscht, neue Modpack-Konfigurationen verwendet
Update (Konfigurationen behalten) Alte Konfigurationen bewahrt und mit neuen zusammengeführt

Empfohlen: „Konfigurationen behalten" für die meisten Updates — bewahrt deine Anpassungen.

Nach dem Update

  1. Warten bis der 8-Schritte-Fortschritt abgeschlossen ist
  2. Server neustarten
  3. Überprüfen ob das Modpack korrekt lädt
  4. Zusammengeführte Konfigurationen auf Probleme prüfen

Zu einem anderen Modpack wechseln

Modpack wechseln (🔴-Typ) ist die destruktivste Operation:

  1. Vollständiges Backup wird automatisch erstellt
  2. Alle Dateien gelöscht (außer Welten, Plugins, Logs)
  3. Plugin-übergreifende Bereinigung läuft (Game Mods + Minecraft Plugins Daten gelöscht)
  4. Neues Modpack heruntergeladen und installiert
  5. Wichtige Dateien wiederhergestellt

Warnung: Modpack-Wechsel löscht alle Mod- und Plugin-Tracking-Daten anderer Eranio-Plugins.


Aktuelles Modpack neu installieren

Neuinstallation (🔵-Typ) lädt das gleiche Modpack und die gleiche Version erneut herunter:

  • Nützlich zur Reparatur beschädigter Installationen
  • Backup wird vor der Neuinstallation erstellt
  • Konfigurationen können behalten oder ersetzt werden

Konsolen-Widget

Ein Widget auf der Server-Konsolenseite verfolgt den Modpack-Status:

  • Cache: 5 Minuten für Update-Prüfungen
  • Zeigt installierte Modpack-Informationen
  • Warnt wenn Updates verfügbar sind mit Weiterleitung zum Modpack Browser

Fehlerbehebung

„.installed_modpack.json" fehlt

  • Noch kein Modpack über das Plugin installiert
  • Datei wurde manuell gelöscht
  • Plugin behandelt dies als Erstinstallation

Modpack lädt aber stürzt beim Start ab

  1. Serverkonsole auf Fehlermeldungen prüfen
  2. Java-Version stimmt mit Modpack-Anforderungen überein? (8, 11, 16, 17 oder 21)
  3. RAM-Zuweisung prüfen — Modpacks brauchen oft 4-8+ GB
  4. Mod-Loader-Versionskompatibilität verifizieren
  5. Neuinstallation mit „Konfigurationen löschen" versuchen

Konfigurationszusammenführung hat Probleme verursacht

  • Manche Mods ändern das Konfig-Format zwischen Versionen — Merge kann Konflikte verursachen
  • Lösung: Neuinstallation mit „Konfigurationen löschen", dann Änderungen manuell erneut anwenden

Server hängt auf Installer-Egg

  • Installation ist möglicherweise bei Schritt 4-5 fehlgeschlagen
  • Egg manuell zurück zum Runtime in Admin Panel → Server → [Server] → Build wechseln
  • Logs auf Timeout- oder Download-Fehler prüfen

⚠️ „Cache leeren" löscht alles

  • clearCache() des Modpack-Plugins verwendet Cache::flush() — eine globale Cache-Leerung
  • Dies löscht ALLE gecachten Daten für ALLE Plugins und das gesamte Panel
  • Nach dem Leeren: andere Plugins können langsam sein bis ihre Caches sich wieder aufbauen
  • Sparsam verwenden — bevorzuge Warten auf TTL-Ablauf wenn möglich

Interne Provider-Funktionen (Referenz)

Dieser Abschnitt dokumentiert den internen PHP-Code für jede Provider-Integration, einschließlich API-Parameter, Antwort-Schemata, Rate-Limits und Verarbeitungslogik.

CurseForge Provider (Modpacks) — Vollständige Referenz

Verwendet die gleiche CurseForge-API wie die anderen Plugins, aber mit classId=4471 (Modpacks).

API-Endpunkt-Parameter — GET /v1/mods/search

Parameter Typ Pflicht Standard Beschreibung
gameId int Ja 432 Immer Minecraft
classId int Ja 4471 Modpacks (NICHT 9137 für Mods, NICHT 5 für Plugins!)
searchFilter string Nein Volltextsuche
sortField int Nein 2 1=Featured (mit Query), 2=Beliebtheit (ohne)
sortOrder string Nein desc Sortierrichtung
gameVersion string Nein MC-Versionsfilter (z.B. 1.20.1)
modLoaderType int Nein 1=Forge, 4=Fabric, 5=Quilt, 6=NeoForge
pageSize int Nein 20 Max 50
index int Nein 0 Paginierungs-Offset

Antwort-Schema — Suchergebnisse

Feld Typ Beschreibung
data[].id int CurseForge Modpack-ID
data[].name string Modpack-Anzeigename
data[].slug string URL-Slug
data[].summary string Kurzbeschreibung
data[].authors[].name string Autorname
data[].downloadCount int Gesamtdownloads
data[].logo.url string Modpack-Logo-URL
data[].latestFiles[] array Dateiobjekte mit Download-Info
data[].latestFiles[].serverPackFileId int|null Server-spezifische Pack-Datei-ID
data[].latestFiles[].modules[].name string z.B. "overrides", "manifest.json"
data[].latestFiles[].modules[].fingerprint int Murmur2-Hash zur Verifizierung
pagination.totalCount int Gesamtergebnisse

Rate-Limits

Stufe Limit Hinweise
Kostenloser API-Key ~1000 Anfragen/Std Geteilt über alle CurseForge-Plugins
Bei Überschreitung HTTP 429 60s warten, Antwort enthält Retry-After
// Modpack-Suche (classId=4471) — einziger Unterschied zu Mods/Plugins
$response = Http::withHeaders(['x-api-key' => $apiKey])
    ->timeout($timeout)
    ->get('https://api.curseforge.com/v1/mods/search', [
        'gameId'        => 432,      // Minecraft
        'classId'       => 4471,     // ⚠ Modpacks — NICHT 9137 (Mods) oder 5 (Plugins)!
        'searchFilter'  => $query,
        'sortField'     => $query ? 1 : 2,
        'sortOrder'     => 'desc',
        'gameVersion'   => $mcVersion,
        'pageSize'      => $perPage,
        'index'         => ($page - 1) * $perPage,
    ]);
// Antwortverarbeitung — Modpacks zu Kartendaten
$results = $response->json('data', []);
$packs = collect($results)->map(function ($mod) {
    return [
        'id'         => $mod['id'],
        'name'       => $mod['name'],
        'slug'       => $mod['slug'],
        'summary'    => $mod['summary'],
        'author'     => $mod['authors'][0]['name'] ?? 'Unbekannt',
        'downloads'  => $mod['downloadCount'],
        'icon_url'   => $mod['logo']['url'] ?? null,
        'provider'   => 'curseforge',
    ];
});
// Server-Pack-Erkennung — bevorzuge Server-Pack statt Client-Pack
// Manche CurseForge-Modpacks bieten eine separate „Server-Pack"-Datei
if (!empty($fileData['serverPackFileId'])) {
    $serverPack = $this->getFile($modId, $fileData['serverPackFileId']);
    // Server-Pack für Server-Installationen verwenden — kleiner, ohne Client-seitige Mods
}
// Modpack-Dateistruktur — overrides/-Ordner + manifest.json
// CurseForge-Modpacks enthalten Murmur2-fingerprinted Module
foreach ($file['modules'] as $module) {
    // module['name']        => z.B. "overrides", "manifest.json"
    // module['fingerprint'] => Murmur2-Hash zur Dateiintegritätsprüfung
    // overrides/-Ordner wird ins Server-Stammverzeichnis extrahiert
}

CurseForge Modpacks Provider-Fehlertabelle

Fehler / Log-Nachricht Ursache Auswirkung Lösung
classId=9137 oder classId=5 Ergebnisse Falsche classId verwendet Mods/Plugins statt Modpacks angezeigt classId=4471 für Modpacks sicherstellen
downloadUrl null Autor hat Download eingeschränkt Manueller Download nötig Von CurseForge-Website herunterladen
serverPackFileId null Kein Server-Pack hochgeladen Client-Pack verwendet — kann Client-Mods enthalten Server-Dateien manuell extrahieren oder warten bis Autor hochlädt
fingerprint-Abweichung Modifizierte oder beschädigte Dateien Integritätsprüfung schlägt fehl Von CurseForge erneut herunterladen
CurseForge API-Schlüssel nicht gesetzt Kein Key konfiguriert Alle CurseForge-Suchen scheitern CURSEFORGE_API_KEY in Einstellungen setzen

Modrinth Provider (Modpacks) — Vollständige Referenz

API-Endpunkt-Parameter — GET /v2/search

Parameter Typ Pflicht Standard Beschreibung
query string Nein Suchbegriffe
facets string (JSON) Ja siehe unten Muss project_type:modpack enthalten
limit int Nein 20 Max 100
offset int Nein 0 Paginierungs-Offset

Modpack-spezifische Facetten

// Das Plugin baut Facetten speziell für Modpacks
$facets = [
    ['project_type:modpack'],                    // Muss Modpack sein, nicht Mod/Plugin
];
if ($mcVersion) $facets[] = ["versions:$mcVersion"];
if ($loader)    $facets[] = ["categories:$loader"];  // z.B. categories:forge

$params['facets'] = json_encode($facets);

Antwort-Schema — Suchergebnisse

Feld Typ Beschreibung
hits[].project_id string Modrinth-Projekt-ID
hits[].title string Modpack-Name
hits[].slug string URL-Slug
hits[].description string Kurzbeschreibung
hits[].author string Autor-Benutzername
hits[].downloads int Gesamtdownloads
hits[].icon_url string Modpack-Icon-URL
hits[].versions string[] Unterstützte MC-Versionen
hits[].categories string[] Enthält Loader-Info (forge, fabric, etc.)
total_hits int Gesamtergebnisse für Paginierung

Rate-Limits

Stufe Limit Hinweise
Ohne Authentifizierung 300 Anfragen/Min pro IP X-Ratelimit-Remaining-Header verfügbar
Bei Überschreitung HTTP 429 Retry-After-Header bereitgestellt
// Modpack-Suche mit Modpack-spezifischen Facetten
$response = Http::timeout($timeout)
    ->get('https://api.modrinth.com/v2/search', [
        'query'  => $query,
        'facets' => json_encode([
            ['project_type:modpack'],
            $mcVersion ? ["versions:$mcVersion"] : [],
            $loader ? ["categories:$loader"] : [],
        ]),
        'limit'  => $perPage,
        'offset' => ($page - 1) * $perPage,
    ]);

// Antwortverarbeitung
$hits = $response->json('hits', []);
$packs = collect($hits)->map(function ($hit) {
    return [
        'id'         => $hit['project_id'],
        'name'       => $hit['title'],
        'slug'       => $hit['slug'],
        'summary'    => $hit['description'],
        'author'     => $hit['author'],
        'downloads'  => $hit['downloads'],
        'icon_url'   => $hit['icon_url'] ?? null,
        'versions'   => $hit['versions'] ?? [],
        'provider'   => 'modrinth',
    ];
});
// Modrinth-Modpacks verwenden .mrpack-Format (ZIP-Datei)
// Struktur: modrinth.index.json + overrides/
$manifest = json_decode($zip->getFromName('modrinth.index.json'), true);
foreach ($manifest['files'] as $file) {
    // $file['path']            => Zielpfad relativ zum Server-Stammverzeichnis
    // $file['downloads']       => Array von Download-Mirror-URLs
    // $file['hashes']['sha1']  => SHA-1 zur Integritätsprüfung
    // $file['hashes']['sha512'] => SHA-512 zur Integritätsprüfung
    // $file['fileSize']        => Erwartete Dateigröße in Bytes
}
// overrides/-Verzeichnis wird ins Server-Stammverzeichnis extrahiert

Modrinth Modpacks Provider-Fehlertabelle

Fehler / Log-Nachricht Ursache Auswirkung Lösung
Keine Ergebnisse mit project_type:modpack Modpack nicht auf Modrinth getaggt Fehlende Modpacks Andere Provider versuchen (CurseForge, FTB)
SHA-1/SHA-512-Abweichung Download beschädigt Dateiintegrität schlägt fehl Cache leeren, erneut herunterladen
modrinth.index.json fehlt Beschädigte .mrpack-Datei Installation schlägt fehl Von Modrinth erneut herunterladen
Falscher project_type Facetten falsch konfiguriert Mods mit Modpacks vermischt project_type:modpack-Facette sicherstellen

FeedTheBeast (FTB) Provider — Vollständige Referenz

FTB API unter https://api.feed-the-beast.com/v1. Keine Authentifizierung nötig. Verwendet ein einzigartiges zweistufiges Lademuster.

API-Endpunkt-Parameter — GET /v1/modpacks/public/modpack/all

Parameter Typ Pflicht Standard Beschreibung
(keine) Gibt alle öffentlichen Pack-IDs zurück

API-Endpunkt-Parameter — GET /v1/modpacks/public/modpack/{packId}

Parameter Typ Pflicht Standard Beschreibung
packId int (Pfad) Ja FTB Pack-ID

API-Endpunkt-Parameter — GET /v1/modpacks/public/modpack/search/{limit}

Parameter Typ Pflicht Standard Beschreibung
limit int (Pfad) Ja Max Ergebnisse (z.B. 100)
term string (Query) Ja Suchbegriff

Antwort-Schema — Alle Packs

Feld Typ Beschreibung
packs int[] Array von Pack-IDs
total int Gesamtanzahl öffentlicher Packs

Antwort-Schema — Pack-Details

Feld Typ Beschreibung
id int Pack-ID
name string Pack-Name
synopsis string Kurzbeschreibung
description string Vollständige HTML-Beschreibung
art[].url string Logo/Splash-Bild-URL
art[].type string "square" oder "splash"
versions[].id int Versions-ID (für Download)
versions[].name string Versionsstring (z.B. 1.2.3)
versions[].type string "Release", "Beta", "Alpha"
tags[].name string Tag-Labels
installs int Gesamtinstallationen
plays int Gesamte Spielsitzungen
status string "released" oder "private"

Antwort-Schema — Suche

Feld Typ Beschreibung
packs int[] Passende Pack-IDs
curseforge int[] CurseForge-Querverweise-IDs
total int Gesamttreffer

Rate-Limits

Stufe Limit Hinweise
Öffentlich Kein dokumentiertes Limit Faire Nutzung — schnelle Massenanfragen vermeiden
De facto ~100 Detail-Anfragen/Min Jedes Pack-Detail ist ein separater HTTP-Aufruf
// Schritt 1: Alle FTB Pack-IDs abrufen
$all = Http::timeout($timeout)
    ->get('https://api.feed-the-beast.com/v1/modpacks/public/modpack/all');
// Gibt zurück: { "packs": [100, 200, 300, ...], "total": 150 }
// ⚠ Pack-ID 81 ist FTBs Test-Pack — MUSS herausgefiltert werden!
$packIds = collect($all->json('packs', []))->reject(fn ($id) => $id === 81);
// Schritt 2: Details für jedes Pack abrufen (gebatcht mit Parallelitätskontrolle)
$packs = $packIds->map(function ($id) use ($timeout) {
    $pack = Http::timeout($timeout)
        ->get("https://api.feed-the-beast.com/v1/modpacks/public/modpack/{$id}")
        ->json();

    return [
        'id'         => $pack['id'],
        'name'       => $pack['name'],
        'summary'    => $pack['synopsis'] ?? '',
        'icon_url'   => collect($pack['art'] ?? [])->firstWhere('type', 'square')['url'] ?? null,
        'downloads'  => $pack['installs'] ?? 0,
        'versions'   => collect($pack['versions'] ?? [])->pluck('name')->toArray(),
        'provider'   => 'ftb',
    ];
});
// FTB-Packs durchsuchen — gibt Pack-IDs zurück, dann Details abrufen
$search = Http::timeout($timeout)
    ->get("https://api.feed-the-beast.com/v1/modpacks/public/modpack/search/100", [
        'term' => $query,
    ]);
// Gibt zurück: { "packs": [100, 200], "curseforge": [], "total": 2 }
// Das numerische Suffix (100) ist die maximale Ergebnisanzahl
// "curseforge"-Array enthält querverweisende CurseForge-Mod-IDs
// Server-Pack-Download — benötigt Versions-ID für plattformspezifischen Download
$serverUrl = "https://api.feed-the-beast.com/v1/modpacks/public/modpack/{$packId}/versions/{$versionId}/server/linux";
// Alternative: .../server/windows für Windows-Server
// Lädt ein Server-Installer-Skript/ZIP herunter

FTB-spezifisches Verhalten:

  • Zweistufiges Laden: Erst GET .../all für IDs → dann GET .../{id} pro Pack für Details
  • Suche gibt Pack-IDs zurück (keine vollständigen Objekte) — erfordert zweiten Schritt für Details
  • Pack-ID 81 wird immer herausgefiltert — es ist FTBs internes Test-Pack
  • art-Array hat type: "square" (Logo) und type: "splash" (Banner)
  • status: "released" = öffentlich; "private" = braucht speziellen Zugangscode
  • Server-Downloads sind plattformspezifisch: /server/linux oder /server/windows
  • Versions-type kann "Release", "Beta" oder "Alpha" sein — standardmäßig nur Release angezeigt
  • Modpack-Daten werden 24 Stunden pro Pack gecacht

FTB Provider-Fehlertabelle

Fehler / Log-Nachricht Ursache Auswirkung Lösung
Pack-ID 81 erscheint Test-Pack nicht gefiltert Defektes Pack in der Liste Plugin filtert es — wenn sichtbar, Cache leeren
Leere Versionsliste Pack ist privat/eingeschränkt Kann nicht installiert werden Pack-Status auf FTB-Website prüfen
Server-Download 404 Keine Server-Distributionsrechte Server-Pack nicht verfügbar Pack-Autor für Server-Pack kontaktieren
Langsames Pack-Laden Zweistufiger Abruf (100+ einzelne Anfragen) Seite lädt langsam Normal für FTB — warten bis Cache aufgebaut
Veraltete Daten Pack-Liste 24h gecacht Veraltete Infos Cache leeren für sofortige Aktualisierung
status: "private" Pack nicht öffentlich zugänglich Kann nicht listen/installiert werden Zugangscode vom Pack-Autor benötigt

Technic Platform Provider — Vollständige Referenz

Technic API unter https://api.technicpack.net. Benötigt einen build-Parameter für Launcher-Versionskompatibilität.

API-Endpunkt-Parameter — GET /search/modpacks/{query}

Parameter Typ Pflicht Standard Beschreibung
query string (Pfad) Ja Suchbegriff (URL-kodiert)
build int Ja 822 Technic Launcher Build-Nummer — muss gültig sein

API-Endpunkt-Parameter — GET /modpack/{slug}

Parameter Typ Pflicht Standard Beschreibung
slug string (Pfad) Ja Modpack-Slug (z.B. tekkit)
build int Ja 822 Technic Launcher Build-Nummer

Antwort-Schema — Suche (Dictionary-Format!)

Feld Typ Beschreibung
modpacks object Dictionary nach Slug geordnet, KEIN Array!
modpacks.{slug}.name string Interner Modpack-Name
modpacks.{slug}.displayName string Lesbarer Anzeigename
modpacks.{slug}.url string Technic-Website-URL
modpacks.{slug}.platformUrl string Plattform-Seitenlink
modpacks.{slug}.minecraft string Minecraft-Version
modpacks.{slug}.runs int Gesamte Starts
modpacks.{slug}.ratings int Anzahl Bewertungen

Antwort-Schema — Pack-Details

Feld Typ Beschreibung
name string Interner Pack-Name
displayName string Lesbarer Anzeigename
url string Direkte Download-URL (ZIP)
platformUrl string Technic-Plattform-Seiten-URL
minecraft string Minecraft-Versionsstring
runs int Gesamte Startanzahl
ratings int Bewertungsanzahl
icon.url string Pack-Icon-URL
logo.url string Pack-Logo-URL
background.url string Hintergrundbild-URL

Rate-Limits

Stufe Limit Hinweise
Öffentlich Kein dokumentiertes Limit Faire Nutzung erwartet
De facto ~200 Anfragen/Min Aggressive Anfragen können gedrosselt werden
// Technic Modpacks durchsuchen — beachte Dictionary-Antwortformat
$response = Http::timeout($timeout)
    ->get("https://api.technicpack.net/search/modpacks/{$query}", [
        'build' => 822,  // ⚠ Muss eine gültige Technic Launcher Build-Nummer sein!
    ]);

// WICHTIG: Technic gibt ein DICTIONARY nach Slug zurück, kein Array!
$modpacks = $response->json('modpacks', []);
// $modpacks = { "tekkit": { ... }, "hexxit": { ... } }
// Muss array_values() oder collect() zum Iterieren verwenden
$packs = collect($modpacks)->map(function ($pack, $slug) {
    return [
        'id'         => $slug,
        'name'       => $pack['displayName'] ?? $pack['name'],
        'summary'    => '', // Technic-Suche liefert keine Beschreibungen
        'downloads'  => $pack['runs'] ?? 0,
        'mc_version' => $pack['minecraft'] ?? 'Unbekannt',
        'provider'   => 'technic',
    ];
});
// Spezifische Modpack-Details abrufen — enthält Download-URL
$pack = Http::timeout($timeout)
    ->get("https://api.technicpack.net/modpack/{$slug}", [
        'build' => 822,
    ])->json();

// Antwortverarbeitung — Pack-Metadaten extrahieren
$result = [
    'name'        => $pack['displayName'] ?? $pack['name'],
    'url'         => $pack['url'],              // Direkte ZIP-Download-URL
    'platform'    => $pack['platformUrl'],       // Technic-Website-Seite
    'mc_version'  => $pack['minecraft'] ?? '',   // MC-Versionsstring
    'runs'        => $pack['runs'] ?? 0,
    'icon'        => $pack['icon']['url'] ?? null,
    'logo'        => $pack['logo']['url'] ?? null,
];
// url-Feld → direkter Download des Modpack-ZIP (Server oder Client)

Technic-spezifisches Verhalten:

  • Suche gibt ein Dictionary nach Slug zurück, kein Array — muss konvertiert werden
  • build-Parameter ist erforderlich — steuert API-Kompatibilitätsversion
  • minecraft-Feld enthält den MC-Versionsstring direkt (kein Array)
  • platformUrl verlinkt zur Technic-Website-Seite für das Pack
  • url-Feld → direkter ZIP-Download (für Client und Server gleich)
  • runs zählt die Anzahl der Modpack-Starts (nicht Downloads)
  • Keine server-spezifischen Packs — gleiche ZIP für Client und Server; manuelle Extraktion nötig
  • Keine Paginierung — Suche gibt alle passenden Packs auf einmal zurück

Technic Provider-Fehlertabelle

Fehler / Log-Nachricht Ursache Auswirkung Lösung
Keine Ergebnisse Build-Nummer veraltet oder Anfrage zu spezifisch Leere Suche build-Parameter aktualisieren, Anfrage erweitern
Modpack lädt nicht herunter URL zeigt auf Client-Pack oder ist ungültig Download schlägt fehl URL-Erreichbarkeit prüfen, Technic-Website checken
„0 runs" angezeigt Pack-Statistiken nicht verfügbar Kosmetisch Normal für sehr alte oder inaktive Packs
Dictionary-Parse-Fehler Code erwartet Array, bekommt Objekt Anzeigeprobleme Plugin behandelt dies — Cache leeren bei Problemen
build-Parameter abgelehnt Technic hat gültige Build-Version geändert API gibt Fehler zurück Technic-API auf aktuelle gültige Build-Nummer prüfen

ATLauncher Provider — Vollständige Referenz

ATLauncher verwendet eine GraphQL-API unter https://api.atlauncher.com/v2/graphql. Dies ist der einzige GraphQL-basierte Provider.

GraphQL-Endpunkt — POST /v2/graphql

Parameter Typ Pflicht Beschreibung
query string Ja GraphQL-Abfragestring

Verfügbare Abfragefelder

Feldpfad Typ Beschreibung
packs(first: N) query Stammabfrage mit Paginierung
edges[].node.id int Pack-Unique-ID
edges[].node.name string Pack-Anzeigename
edges[].node.description string Vollständige Pack-Beschreibung
edges[].node.type string "public", "semi-public", "private"
edges[].node.versions[].version string Pack-Versionsstring
edges[].node.versions[].minecraft string MC-Version für diese Pack-Version

Rate-Limits

Stufe Limit Hinweise
Öffentlich Kein dokumentiertes Limit GraphQL-Overhead ist höher pro Anfrage
De facto ~50 Anfragen/Min Komplexe Abfragen können langsamer sein
// GraphQL-Abfrage für ATLauncher Pack-Auflistung
$query = <<<'GRAPHQL'
{
    packs(first: 20) {
        edges {
            node {
                id
                name
                description
                type
                versions {
                    version
                    minecraft
                }
            }
        }
    }
}
GRAPHQL;

$response = Http::timeout($timeout)
    ->post('https://api.atlauncher.com/v2/graphql', ['query' => $query]);
// Antwortverarbeitung für ATLauncher GraphQL
$data = $response->json('data.packs.edges', []);
$packs = collect($data)->map(function ($edge) {
    $node = $edge['node'];
    $latestVersion = collect($node['versions'] ?? [])->first();
    return [
        'id'         => $node['id'],
        'name'       => $node['name'],
        'summary'    => Str::limit($node['description'] ?? '', 200),
        'mc_version' => $latestVersion['minecraft'] ?? 'Unbekannt',
        'pack_version' => $latestVersion['version'] ?? '',
        'type'       => $node['type'],  // "public", "semi-public", "private"
        'provider'   => 'atlauncher',
    ];
})->filter(fn ($p) => $p['type'] === 'public');  // Nur öffentliche Packs anzeigen
// Server-Download-URL-Muster — benötigt exakten Pack-Namen und Version
$serverUrl = "https://servers.atlauncher.com/server/{$packName}/{$version}";
// Nicht alle Packs haben Server-Distributionsrechte — 404 wenn nicht verfügbar

ATLauncher-spezifisches Verhalten:

  • Nur GraphQL — keine REST-API-Endpunkte verfügbar
  • Pack-Typen: "public" (offen), "semi-public" (braucht Code), "private" (eingeschränkt)
  • Nur "public"-Packs in der Standardliste — clientseitig gefiltert
  • Server-Downloads auf servers.atlauncher.com — nicht alle Packs haben Server-Distribution
  • GraphQL-Abfragen haben höheren Overhead als REST — langsamere Antwortzeiten erwartet
  • Versionsliste enthält MC-Versions-Zuordnung pro Pack-Version
  • Kein Such-Endpunkt — Filterung erfolgt clientseitig auf der zurückgegebenen Liste
  • description kann HTML enthalten — für Anzeige zu Klartext umgewandelt

ATLauncher Provider-Fehlertabelle

Fehler / Log-Nachricht Ursache Auswirkung Lösung
GraphQL-Fehler / leere Antwort Fehlerhafte Abfrage oder API-Problem Keine Packs zurückgegeben Cache leeren, API-Erreichbarkeit prüfen
„Privates Pack" oder type: "semi-public" Pack erfordert Zugangscode Kann nicht installiert werden Pack-Autor für Zugangscode kontaktieren
Server-Download 404 Keine Server-Distributionsrechte für dieses Pack Automatische Server-Installation nicht möglich Client-Pack verwenden, Server-Dateien manuell extrahieren
Langsame Antwort (~2-5s) GraphQL-Parsing-Overhead Längere Seitenladezeit Normal für ATLauncher — bei Bedarf Timeout erhöhen
Leeres versions-Array Pack hat keine veröffentlichten Versionen Kann nicht installiert werden ATLauncher-Website auf Pack-Status prüfen

VoidsWrath Provider — Vollständige Referenz

VoidsWrath verwendet eine statische JSON-Datei — keine dynamische API, keine Suche, keine Paginierung.

API-Endpunkt — GET /minecraft-modpack-server-installer/voidswrath.json

Parameter Typ Pflicht Beschreibung
(keine) Gibt gesamten Katalog als JSON-Array zurück

Antwort-Schema — Pack-Array

Feld Typ Beschreibung
[].name string Modpack-Name
[].version string Aktueller Versionsstring
[].mcVersion string Minecraft-Version
[].url string Direkte ZIP-Download-URL
[].serverUrl string|null Server-spezifische Download-URL
[].description string Pack-Beschreibung
[].icon string Icon-Bild-URL

Rate-Limits

Stufe Limit Hinweise
Öffentlich Kein Limit Statische Datei auf ric-rac.org gehostet
De facto N/A Datei ist klein (~50KB), schnell zu laden
// Gesamten VoidsWrath-Katalog abrufen — eine Anfrage, alle Packs
$response = Http::timeout($timeout)
    ->get('https://www.ric-rac.org/minecraft-modpack-server-installer/voidswrath.json');

$allPacks = $response->json();
// Gibt zurück: Vollständiges Array aller Packs — typischerweise <20 Einträge

// Antwortverarbeitung — keine Filterung nötig
$packs = collect($allPacks)->map(function ($pack) {
    return [
        'id'         => Str::slug($pack['name']),         // Generierter Slug
        'name'       => $pack['name'],
        'summary'    => $pack['description'] ?? '',
        'mc_version' => $pack['mcVersion'] ?? 'Unbekannt',
        'version'    => $pack['version'] ?? '',
        'icon_url'   => $pack['icon'] ?? null,
        'download'   => $pack['url'],                      // Direkte ZIP-URL
        'server_url' => $pack['serverUrl'] ?? null,        // Server-spezifische URL
        'provider'   => 'voidswrath',
    ];
});

VoidsWrath-spezifisches Verhalten:

  • Keine Suche — alle Packs werden auf einmal aus einer einzigen statischen JSON-Datei geladen
  • Keine Paginierung — gesamter Katalog in einer Anfrage (typischerweise <20 Packs)
  • Keine API-Versionierung — wenn sich die JSON-Struktur ändert, kann das Abrufen fehlschlagen
  • Downloads zeigen direkt auf ZIP-Dateien — kein CDN oder Mirror-System
  • Pack-Updates erfordern vollständigen Neu-Download — keine differenzielle/inkrementelle Updates
  • serverUrl kann null sein für Packs ohne Server-Distribution
  • Statische Datei auf ric-rac.org gehostet — Verfügbarkeit hängt von diesem einzelnen Host ab
  • Sehr kleiner Katalog im Vergleich zu anderen Providern
  • Cache-TTL sollte großzügig sein (24h+), da sich Daten selten ändern

VoidsWrath Provider-Fehlertabelle

Fehler / Log-Nachricht Ursache Auswirkung Lösung
Statische JSON nicht erreichbar Host ric-rac.org offline oder DNS-Fehler Alle VoidsWrath-Packs nicht verfügbar Auf Wiederherstellung des Hosts warten, DNS prüfen
Alte Pack-Versionen angezeigt JSON-Datei nicht vom VoidsWrath-Team aktualisiert Veraltete Infos VoidsWrath kontaktieren oder deren Website prüfen
Alle Packs auf einmal angezeigt Erwartet — keine Paginierung oder Filterung Kein Fehler Normales Verhalten für VoidsWrath
Download fehlgeschlagen / 404 Direkter ZIP-Link defekt oder Datei verschoben Installation schlägt fehl Bei VoidsWrath melden, auf aktualisierte URL prüfen
JSON-Parse-Fehler Server hat HTML-Fehlerseite statt JSON geliefert Keine Packs angezeigt Host möglicherweise fehlkonfiguriert — später erneut versuchen

Providerübergreifende Muster (Modpacks)

// Modpack-Installationsablauf (alle Provider)
// 1. Pack-Archiv herunterladen (ZIP/mrpack)
// 2. Zum Installer-Egg wechseln falls nötig
// 3. Ins Server-Verzeichnis extrahieren
// 4. Konfigurationen zusammenführen (bei Update)
// 5. Zurück zum Game-Egg wechseln
// 6. Game Mods + Plugins Daten löschen (Plugin-übergreifende Bereinigung)
// Backup vor Installation — erstellt zeitgestempeltes Archiv
$backupName = "backup_" . date('Y-m-d_H-i-s') . ".tar.gz";
// Bei fehlgeschlagenem Backup wird die Installation mit Warnung fortgesetzt
// Such-Wiederholungslogik — gleich wie bei anderen Plugins
$results = $this->search($query, $mcVersion, $loader);
if (empty($results) && $mcVersion) {
    $results = $this->search($query, null, $loader);
    // Wiederholung ohne Versionsfilter — Version evtl. noch nicht indiziert
}

Vollständige Benachrichtigungs-Referenz

Ereignis Typ Titel Nachricht
Modpack installiert Erfolg Installiert „Modpack [Name] erfolgreich installiert"
Installation fehlgeschlagen Fehler Fehler „Modpack-Installation fehlgeschlagen" + Fehler
Update gestartet Info Aktualisierung „Modpack auf Version X aktualisiert"
Update erfolgreich Erfolg Aktualisiert „Modpack auf Version X aktualisiert"
Update fehlgeschlagen Fehler Fehler „Update fehlgeschlagen" + Fehler
Backup erstellt Info Backup „Backup vor Installation erstellt"
Backup fehlgeschlagen Warnung Backup „Backup fehlgeschlagen — fahre ohne Backup fort"
Egg-Wechsel gestartet Info Egg „Wechsel zum Installer-Egg"
Egg-Wechsel fehlgeschlagen Fehler Egg „Egg-Wechsel fehlgeschlagen"
Cache geleert Erfolg Cache „Cache geleert"
Version erkannt Erfolg Erkennung „Minecraft-Version erkannt: X.X.X"
Konfig-Merge-Warnung Warnung Konfiguration „Konfigurationsformat geändert — manuelle Überprüfung empfohlen"
Plugin-übergreifende Bereinigung Info Bereinigung „Game Mods und Minecraft Plugins Daten werden gelöscht"
CurseForge-Key fehlt Warnung Konfiguration „CurseForge API-Schlüssel nicht gesetzt"

HTTP-Fehlercode-Referenz (Alle Provider)

HTTP-Status Quelle Bedeutung Maßnahme
200 Alle Erfolg
400 CurseForge Ungültige Anfrage (ungültige Parameter) gameId/classId prüfen
401 CurseForge API-Key ungültig Key auf console.curseforge.com erneuern
403 CurseForge Fehlende Berechtigungen Key neu generieren
403 Plugin Feature-Flag modpack-installer fehlt Zu Egg-Features hinzufügen
404 Alle Pack/Version nicht gefunden Pack wurde möglicherweise entfernt
404 ATLauncher Server-Pack nicht verfügbar Nicht alle Packs haben Server-Distribution
429 CurseForge Rate-Limit 60s warten, Cache erhöhen
429 Modrinth Rate-Limit Auf Retry-After warten, Häufigkeit reduzieren
500 Alle Serverfehler Später erneut versuchen
502/503 Alle Gateway/Wartung Provider offline
0 / Timeout Alle Verbindungs-Timeout Timeout erhöhen, Firewall prüfen
0 / Timeout FTB Pack-Detail-Abruf-Timeout Zweistufiges Laden ist langsam — Timeout erhöhen

Provider-spezifische Fehlertabelle

CurseForge (Modpacks) Fehler

Fehler / Symptom Ursache Lösung
„CurseForge API-Schlüssel nicht gesetzt" Kein Key konfiguriert Key in Einstellungen eingeben
HTTP 403 Key ungültig Auf console.curseforge.com neu generieren
Leere Download-URL Autor-Beschränkung Manuell von Website herunterladen
Server-Pack nicht verfügbar Autor hat kein Server-Pack hochgeladen Client-Pack mit manueller Extraktion verwenden
Falsche classId-Ergebnisse classId-Abweichung classId=4471 sicherstellen
Fingerprint-Abweichung Dateien modifiziert/beschädigt Von CurseForge erneut herunterladen

Modrinth (Modpacks) Fehler

Fehler / Symptom Ursache Lösung
Keine Ergebnisse Modpack nicht korrekt getaggt CurseForge oder FTB versuchen
.mrpack-Extraktion schlägt fehl Beschädigter Download oder ZIP Erneut herunterladen, Speicherplatz prüfen
Hash-Abweichung Datei bei Übertragung beschädigt Cache leeren, erneut herunterladen
Fehlende Overrides .mrpack-Struktur geändert Plugin auf neueste Version aktualisieren

FTB Fehler

Fehler / Symptom Ursache Lösung
Pack-ID 81 erscheint Test-Pack in der API Plugin filtert es — wenn sichtbar, Cache leeren
Leere Versionsliste Pack ist privat/eingeschränkt Pack-Status auf FTB-Website prüfen
Server-Download 404 Keine Server-Distribution Pack-Autor kontaktieren
Langsames Pack-Laden Zweistufiger Abruf (IDs → Details) Normal — jedes Pack braucht einzelnen Abruf
Veraltete Daten Pack-Liste 24h gecacht Cache leeren für sofortige Aktualisierung
status: "private" Pack nicht öffentlich Kann nicht ohne Zugang installiert werden

Technic Fehler

Fehler / Symptom Ursache Lösung
Keine Ergebnisse Build-Nummer veraltet build-Parameter aktualisieren (aktuell 822)
Modpack lädt nicht herunter URL zeigt auf Client-Pack Server-Pack-Verfügbarkeit verifizieren
„0 runs" angezeigt Pack-Statistiken nicht verfügbar Normal für ältere/inaktive Packs
Dictionary vs. Array-Verwechslung Technic gibt Dictionary nach Slug zurück Plugin behandelt dies — Cache leeren bei Anzeigeproblemen
build-Parameter abgelehnt Technic hat gültigen Build-Bereich geändert Technic-Dokumentation auf aktuelle Build-Werte prüfen

ATLauncher Fehler

Fehler / Symptom Ursache Lösung
GraphQL-Fehler Fehlerhafte Abfrage Cache leeren, erneut versuchen
„Privates Pack" Pack benötigt Sonderzugang Pack-Autor für Zugangscode kontaktieren
Server-Download 404 Keine Server-Distributionsrechte Client-Pack für manuelle Extraktion verwenden
Langsame Antwort GraphQL-Parsing-Overhead Normal für ATLauncher — Timeout erhöhen
Leere Ergebnisse Keine öffentlichen Packs passen zum Filter ATLauncher-Website prüfen

VoidsWrath Fehler

Fehler / Symptom Ursache Lösung
Statische JSON nicht erreichbar Host ric-rac.org offline Auf Wiederherstellung des Hosts warten
Alte Pack-Versionen JSON-Datei nicht aktualisiert VoidsWrath-Team kontaktieren
Alle Packs auf einmal angezeigt Erwartet — keine Paginierung Kein Fehler
Download schlägt fehl Direkter ZIP-Link defekt Bei VoidsWrath melden
JSON-Parse-Fehler Server hat HTML statt JSON geliefert Host fehlkonfiguriert — später erneut versuchen