This commit is contained in:
Brian Neumann-Fopiano
2026-08-19 19:36:03 -04:00
parent 4adef4576f
commit 41b2b53ac8
25 changed files with 966 additions and 43 deletions
@@ -35,6 +35,8 @@ import java.util.Optional;
import java.util.stream.Stream;
public class IrisWorlds {
private static final String IRIS_GENERATOR_NAME = "iris";
private static final String IRIS_GENERATOR_PREFIX = "iris:";
private static final AtomicCache<IrisWorlds> cache = new AtomicCache<>();
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
private static final Type TYPE = TypeToken.getParameterized(KMap.class, String.class, String.class).getType();
@@ -262,16 +264,10 @@ public class IrisWorlds {
if (worlds == null) return new KMap<>();
KMap<String, String> result = new KMap<>();
String defaultWorldType = IrisSettings.get().getGenerator().getDefaultWorldType();
for (String world : worlds.getKeys(false)) {
String gen = worlds.getString(world + ".generator");
if (gen == null) continue;
String loadKey;
if (gen.equalsIgnoreCase("iris")) {
loadKey = IrisSettings.get().getGenerator().getDefaultWorldType();
} else if (gen.startsWith("Iris:")) {
loadKey = gen.substring(5);
} else continue;
String loadKey = generatorLoadKey(worlds.getString(world + ".generator"), defaultWorldType);
if (loadKey == null) continue;
result.put(world, loadKey);
}
@@ -279,6 +275,22 @@ public class IrisWorlds {
return filterBukkitWorldsByStorage(levelRoot, result);
}
/**
* Maps a bukkit.yml generator string onto the Iris pack it selects, or null when the string is
* not Iris. Bukkit matches generator plugin names case-insensitively, so the prefix does too.
*/
static String generatorLoadKey(String generator, String defaultWorldType) {
if (generator == null) return null;
if (generator.equalsIgnoreCase(IRIS_GENERATOR_NAME)) return defaultWorldType;
int prefixLength = IRIS_GENERATOR_PREFIX.length();
if (generator.length() > prefixLength
&& generator.regionMatches(true, 0, IRIS_GENERATOR_PREFIX, 0, prefixLength)) {
return generator.substring(prefixLength);
}
return null;
}
private Optional<File> packRoot(String worldIdentity) {
NamespacedKey worldKey = WorldIdentity.parse(worldIdentity);
Path worldContainer = levelRoot.getParent();
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Dieser Befehl kann von diesem Ursprung aus nicht ausgeführt werden.",
"director.runtime.error.unknown_parameter": "Unbekannter Parameterschlüssel: {key}",
"director.runtime.error.unexpected_argument": "Unerwartetes Argument \"{argument}\". Optionale Parameter müssen als Schlüssel angegeben werden, z. B. seed=123",
"director.runtime.error.unclosed_group": "Fehlende schließende \"]\" für Parameter {key}",
"director.runtime.error.conversion_failed": "\"{value}\" kann für {parameter} nicht in {type} konvertiert werden",
"director.runtime.error.default_parse_failed": "Der Standardwert für Parameter {parameter} kann nicht gelesen werden",
"director.runtime.error.missing_argument": "Fehlendes Argument \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Este comando no se puede ejecutar desde este origen.",
"director.runtime.error.unknown_parameter": "Clave de parámetro desconocida: {key}",
"director.runtime.error.unexpected_argument": "Argumento inesperado \"{argument}\". Los parámetros opcionales deben especificarse con clave, p. ej. seed=123",
"director.runtime.error.unclosed_group": "Falta el corchete de cierre \"]\" para el parámetro {key}",
"director.runtime.error.conversion_failed": "No se puede convertir \"{value}\" a {type} para {parameter}",
"director.runtime.error.default_parse_failed": "No se puede analizar el valor predeterminado del parámetro {parameter}",
"director.runtime.error.missing_argument": "Falta el argumento \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Tätä komentoa ei voi suorittaa tästä lähteestä.",
"director.runtime.error.unknown_parameter": "Tuntematon parametriavain: {key}",
"director.runtime.error.unexpected_argument": "Odottamaton argumentti \"{argument}\". Valinnaiset parametrit on annettava avaimella, esim. seed=123",
"director.runtime.error.unclosed_group": "Parametrilta {key} puuttuu sulkeva \"]\"",
"director.runtime.error.conversion_failed": "Arvoa \"{value}\" ei voi muuntaa tyypiksi {type} parametrille {parameter}",
"director.runtime.error.default_parse_failed": "Parametrin {parameter} oletusarvoa ei voi jäsentää",
"director.runtime.error.missing_argument": "Puuttuva argumentti \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Cette commande ne peut pas être exécutée depuis cette origine.",
"director.runtime.error.unknown_parameter": "Clé de paramètre inconnue : {key}",
"director.runtime.error.unexpected_argument": "Argument inattendu \"{argument}\". Les paramètres facultatifs doivent être nommés, par ex. seed=123",
"director.runtime.error.unclosed_group": "Crochet fermant \"]\" manquant pour le paramètre {key}",
"director.runtime.error.conversion_failed": "Impossible de convertir \"{value}\" en {type} pour {parameter}",
"director.runtime.error.default_parse_failed": "Impossible d'analyser la valeur par défaut du paramètre {parameter}",
"director.runtime.error.missing_argument": "Argument manquant \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "לא ניתן להריץ פקודה זו ממקור זה.",
"director.runtime.error.unknown_parameter": "מפתח פרמטר לא ידוע: {key}",
"director.runtime.error.unexpected_argument": "ארגומנט לא צפוי \"{argument}\". פרמטרים אופציונליים חייבים להינתן עם מפתח, לדוגמה seed=123",
"director.runtime.error.unclosed_group": "חסר סוגר מרובע סוגר \"]\" עבור הפרמטר {key}",
"director.runtime.error.conversion_failed": "לא ניתן להמיר את \"{value}\" ל-{type} עבור {parameter}",
"director.runtime.error.default_parse_failed": "לא ניתן לנתח את ערך ברירת המחדל של הפרמטר {parameter}",
"director.runtime.error.missing_argument": "חסר ארגומנט \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Questo comando non può essere eseguito da questa origine.",
"director.runtime.error.unknown_parameter": "Chiave di parametro sconosciuta: {key}",
"director.runtime.error.unexpected_argument": "Argomento imprevisto \"{argument}\". I parametri opzionali devono essere specificati con una chiave, ad es. seed=123",
"director.runtime.error.unclosed_group": "Manca la parentesi quadra di chiusura \"]\" per il parametro {key}",
"director.runtime.error.conversion_failed": "Impossibile convertire \"{value}\" in {type} per {parameter}",
"director.runtime.error.default_parse_failed": "Impossibile analizzare il valore predefinito del parametro {parameter}",
"director.runtime.error.missing_argument": "Argomento mancante \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "この実行元からはコマンドを実行できません。",
"director.runtime.error.unknown_parameter": "不明なパラメーターキー: {key}",
"director.runtime.error.unexpected_argument": "予期しない引数 \"{argument}\"。オプションのパラメーターはキー付きで指定してください。例: seed=123",
"director.runtime.error.unclosed_group": "パラメーター {key} の閉じ角括弧 \"]\" がありません",
"director.runtime.error.conversion_failed": "\"{value}\" を {parameter} 用の {type} に変換できません",
"director.runtime.error.default_parse_failed": "パラメーター {parameter} のデフォルト値を解析できません",
"director.runtime.error.missing_argument": "引数 \"{parameter}\" ({type}) が必要です",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "이 실행 위치에서는 이 명령어를 실행할 수 없습니다.",
"director.runtime.error.unknown_parameter": "알 수 없는 매개변수 키: {key}",
"director.runtime.error.unexpected_argument": "예상하지 못한 인수 \"{argument}\". 선택적 매개변수는 키와 함께 지정해야 합니다. 예: seed=123",
"director.runtime.error.unclosed_group": "매개변수 {key}에 닫는 대괄호 \"]\"가 없습니다",
"director.runtime.error.conversion_failed": "\"{value}\" 값을 {parameter}용 {type} 형식으로 변환할 수 없습니다",
"director.runtime.error.default_parse_failed": "매개변수 {parameter}의 기본값을 분석할 수 없습니다",
"director.runtime.error.missing_argument": "인수 \"{parameter}\" ({type})가 필요합니다",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Šios komandos negalima vykdyti iš šio šaltinio.",
"director.runtime.error.unknown_parameter": "Nežinomas parametro raktas: {key}",
"director.runtime.error.unexpected_argument": "Netikėtas argumentas \"{argument}\". Pasirenkami parametrai turi būti nurodyti su raktu, pvz. seed=123",
"director.runtime.error.unclosed_group": "Parametrui {key} trūksta uždaromojo skliausto \"]\"",
"director.runtime.error.conversion_failed": "Reikšmės \"{value}\" nepavyko konvertuoti į {type} parametrui {parameter}",
"director.runtime.error.default_parse_failed": "Nepavyko nuskaityti parametro {parameter} numatytosios reikšmės",
"director.runtime.error.missing_argument": "Trūksta argumento \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Deze opdracht kan niet vanuit deze bron worden uitgevoerd.",
"director.runtime.error.unknown_parameter": "Onbekende parametersleutel: {key}",
"director.runtime.error.unexpected_argument": "Onverwacht argument \"{argument}\". Optionele parameters moeten met een sleutel worden opgegeven, bijv. seed=123",
"director.runtime.error.unclosed_group": "Ontbrekend afsluitend haakje \"]\" voor parameter {key}",
"director.runtime.error.conversion_failed": "Kan \"{value}\" voor {parameter} niet naar {type} converteren",
"director.runtime.error.default_parse_failed": "Kan de standaardwaarde voor parameter {parameter} niet verwerken",
"director.runtime.error.missing_argument": "Ontbrekend argument \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Tego polecenia nie można wykonać z tego źródła.",
"director.runtime.error.unknown_parameter": "Nieznany klucz parametru: {key}",
"director.runtime.error.unexpected_argument": "Nieoczekiwany argument \"{argument}\". Parametry opcjonalne muszą mieć klucz, np. seed=123",
"director.runtime.error.unclosed_group": "Brak zamykającego nawiasu \"]\" dla parametru {key}",
"director.runtime.error.conversion_failed": "Nie można przekonwertować \"{value}\" na {type} dla {parameter}",
"director.runtime.error.default_parse_failed": "Nie można odczytać wartości domyślnej parametru {parameter}",
"director.runtime.error.missing_argument": "Brak argumentu \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Este comando não pode ser executado a partir desta origem.",
"director.runtime.error.unknown_parameter": "Chave de parâmetro desconhecida: {key}",
"director.runtime.error.unexpected_argument": "Argumento inesperado \"{argument}\". Os parâmetros opcionais devem ser indicados por chave, por ex. seed=123",
"director.runtime.error.unclosed_group": "Falta o parêntese reto de fecho \"]\" para o parâmetro {key}",
"director.runtime.error.conversion_failed": "Não foi possível converter \"{value}\" em {type} para {parameter}",
"director.runtime.error.default_parse_failed": "Não foi possível interpretar o valor predefinido do parâmetro {parameter}",
"director.runtime.error.missing_argument": "Falta o argumento \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Эту команду нельзя выполнить из данного источника.",
"director.runtime.error.unknown_parameter": "Неизвестный ключ параметра: {key}",
"director.runtime.error.unexpected_argument": "Неожиданный аргумент \"{argument}\". Необязательные параметры должны задаваться с ключом, например seed=123",
"director.runtime.error.unclosed_group": "Отсутствует закрывающая скобка \"]\" для параметра {key}",
"director.runtime.error.conversion_failed": "Невозможно преобразовать \"{value}\" в {type} для {parameter}",
"director.runtime.error.default_parse_failed": "Невозможно разобрать значение по умолчанию параметра {parameter}",
"director.runtime.error.missing_argument": "Отсутствует аргумент \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Bu komut bu kaynaktan çalıştırılamaz.",
"director.runtime.error.unknown_parameter": "Bilinmeyen parametre anahtarı: {key}",
"director.runtime.error.unexpected_argument": "Beklenmeyen bağımsız değişken \"{argument}\". İsteğe bağlı parametreler anahtarla belirtilmelidir, ör. seed=123",
"director.runtime.error.unclosed_group": "{key} parametresi için kapanış köşeli parantezi \"]\" eksik",
"director.runtime.error.conversion_failed": "\"{value}\", {parameter} için {type} türüne dönüştürülemiyor",
"director.runtime.error.default_parse_failed": "{parameter} parametresinin varsayılan değeri ayrıştırılamıyor",
"director.runtime.error.missing_argument": "Eksik bağımsız değişken \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "Không thể chạy lệnh này từ nguồn này.",
"director.runtime.error.unknown_parameter": "Khóa tham số không xác định: {key}",
"director.runtime.error.unexpected_argument": "Đối số không mong đợi \"{argument}\". Các tham số tùy chọn phải được chỉ định bằng khóa, ví dụ seed=123",
"director.runtime.error.unclosed_group": "Thiếu dấu ngoặc vuông đóng \"]\" cho tham số {key}",
"director.runtime.error.conversion_failed": "Không thể chuyển \"{value}\" thành {type} cho {parameter}",
"director.runtime.error.default_parse_failed": "Không thể phân tích giá trị mặc định của tham số {parameter}",
"director.runtime.error.missing_argument": "Thiếu đối số \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "无法从此来源运行该命令。",
"director.runtime.error.unknown_parameter": "未知参数键: {key}",
"director.runtime.error.unexpected_argument": "意外参数 \"{argument}\"。可选参数必须使用键指定,例如 seed=123",
"director.runtime.error.unclosed_group": "参数 {key} 缺少右方括号 \"]\"",
"director.runtime.error.conversion_failed": "无法将 \"{value}\" 转换为 {parameter} 所需的 {type}",
"director.runtime.error.default_parse_failed": "无法解析参数 {parameter} 的默认值",
"director.runtime.error.missing_argument": "缺少参数 \"{parameter}\" ({type})",
@@ -19,6 +19,7 @@
"director.runtime.error.invalid_origin": "無法從此來源執行該指令。",
"director.runtime.error.unknown_parameter": "未知參數鍵: {key}",
"director.runtime.error.unexpected_argument": "意外參數 \"{argument}\"。選用參數必須使用鍵指定,例如 seed=123",
"director.runtime.error.unclosed_group": "參數 {key} 缺少右方括號 \"]\"",
"director.runtime.error.conversion_failed": "無法將 \"{value}\" 轉換為 {parameter} 所需的 {type}",
"director.runtime.error.default_parse_failed": "無法解析參數 {parameter} 的預設值",
"director.runtime.error.missing_argument": "缺少參數 \"{parameter}\" ({type})",
@@ -11,6 +11,7 @@ import java.util.Map;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
public class IrisWorldsTest {
@Rule
@@ -53,6 +54,18 @@ public class IrisWorldsTest {
assertEquals(Set.of("archive_iris_foreign"), other.keySet());
}
@Test
public void bukkitGeneratorStringsAreMatchedCaseInsensitively() {
assertEquals("pack", IrisWorlds.generatorLoadKey("Iris:pack", "overworld"));
assertEquals("pack", IrisWorlds.generatorLoadKey("iris:pack", "overworld"));
assertEquals("pack", IrisWorlds.generatorLoadKey("IRIS:pack", "overworld"));
assertEquals("overworld", IrisWorlds.generatorLoadKey("Iris", "overworld"));
assertEquals("overworld", IrisWorlds.generatorLoadKey("iris", "overworld"));
assertNull(IrisWorlds.generatorLoadKey("VoidGen", "overworld"));
assertNull(IrisWorlds.generatorLoadKey("Irissy:pack", "overworld"));
assertNull(IrisWorlds.generatorLoadKey(null, "overworld"));
}
@Test
public void bukkitWorldFilteringRecognizesCurrentCraftBukkitConfiguredStorage() throws Exception {
Path worldContainer = temporaryFolder.newFolder("configured-server").toPath();