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:
- Plugin liest
.installed_modpack.jsonfür aktuelle Version - Vergleicht mit verfügbaren Versionen vom Anbieter
- 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
- Warten bis der 8-Schritte-Fortschritt abgeschlossen ist
- Server neustarten
- Überprüfen ob das Modpack korrekt lädt
- Zusammengeführte Konfigurationen auf Probleme prüfen
Zu einem anderen Modpack wechseln
Modpack wechseln (🔴-Typ) ist die destruktivste Operation:
- Vollständiges Backup wird automatisch erstellt
- Alle Dateien gelöscht (außer Welten, Plugins, Logs)
- Plugin-übergreifende Bereinigung läuft (Game Mods + Minecraft Plugins Daten gelöscht)
- Neues Modpack heruntergeladen und installiert
- 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
- Serverkonsole auf Fehlermeldungen prüfen
- Java-Version stimmt mit Modpack-Anforderungen überein? (8, 11, 16, 17 oder 21)
- RAM-Zuweisung prüfen — Modpacks brauchen oft 4-8+ GB
- Mod-Loader-Versionskompatibilität verifizieren
- 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 verwendetCache::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 .../allfür IDs → dannGET .../{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 hattype: "square"(Logo) undtype: "splash"(Banner)status: "released"= öffentlich;"private"= braucht speziellen Zugangscode- Server-Downloads sind plattformspezifisch:
/server/linuxoder/server/windows - Versions-
typekann"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ätsversionminecraft-Feld enthält den MC-Versionsstring direkt (kein Array)platformUrlverlinkt zur Technic-Website-Seite für das Packurl-Feld → direkter ZIP-Download (für Client und Server gleich)runszä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
descriptionkann 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
serverUrlkann null sein für Packs ohne Server-Distribution- Statische Datei auf
ric-rac.orggehostet — 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 |