Accurate teleport failures

- Waits for the destination chunk without a wall-clock deadline so a cold first chunk no longer fails the teleport
- Reports the failure cause, an unloaded dimension, an offline player or a refused teleport separately
- Adds the new messages to every locale
This commit is contained in:
Brian Neumann-Fopiano
2026-09-29 06:50:24 -04:00
parent 5cadd9b8c4
commit 82fa69611e
20 changed files with 147 additions and 5 deletions
@@ -60,6 +60,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import java.util.concurrent.TimeUnit;
import art.arcane.volmlib.util.localization.MessageArgument;
@@ -132,8 +133,7 @@ public final class IrisModdedCommands {
String dimensionId = level.name();
NativeModdedServer server = source.server();
CompletableFuture<Boolean> teleport = NativeWorldTeleport.teleport(player, new NativeWorldTeleport.Destination(
server, ModdedDimensionManager.level(server, dimensionId), 8.5D, Double.MIN_VALUE, 8.5D,
System.nanoTime() + TimeUnit.SECONDS.toNanos(10L)));
server, ModdedDimensionManager.level(server, dimensionId), 8.5D, Double.MIN_VALUE, 8.5D, 0L));
teleport.whenComplete((success, failure) -> {
if (Boolean.TRUE.equals(success) && failure == null) {
return;
@@ -142,14 +142,42 @@ public final class IrisModdedCommands {
ModdedIrisLog.error("Iris teleport into '{}' failed for {}",
dimensionId, player.id(), failure);
}
server.execute(() -> fail(source, IrisLanguage.plain(
ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_FAILED_DIMENSION_IS_NOT_LOADED,
MessageArgument.untrusted("dimensionId", dimensionId))));
server.execute(() -> fail(source, teleportFailure(dimensionId, player.name(), failure,
ModdedDimensionManager.level(server, dimensionId) != null, server.player(player.id()) != null)));
});
ok(source, IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORTING, MessageArgument.untrusted("value", player.name()), MessageArgument.untrusted("dimensionId", dimensionId)));
return 1;
}
static String teleportFailure(String dimensionId, String playerName, Throwable failure,
boolean dimensionLoaded, boolean playerOnline) {
if (failure != null) {
return IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_FAILED_REASON,
MessageArgument.untrusted("dimensionId", dimensionId),
MessageArgument.untrusted("reason", failureReason(failure)));
}
if (!dimensionLoaded) {
return IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_FAILED_DIMENSION_IS_NOT_LOADED,
MessageArgument.untrusted("dimensionId", dimensionId));
}
if (!playerOnline) {
return IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_CANCELLED_PLAYER_OFFLINE,
MessageArgument.untrusted("dimensionId", dimensionId),
MessageArgument.untrusted("value", playerName));
}
return IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_REFUSED,
MessageArgument.untrusted("dimensionId", dimensionId));
}
private static String failureReason(Throwable failure) {
Throwable cause = failure;
while (cause instanceof CompletionException && cause.getCause() != null) {
cause = cause.getCause();
}
String message = cause.getMessage();
return message == null || message.isBlank() ? cause.getClass().getSimpleName() : message;
}
static int evacuate(NativeCommandSource source, NativeWorld target) {
NativeModdedServer server = source.server();
NativeWorld level = target != null ? target : source.world();
@@ -71,6 +71,18 @@ public final class ModdedCommandMessages {
"iris.modded.irismoddedcommands.teleport_failed_dimension_is_not_loaded",
"Teleport failed: dimension " + "{dimensionId}" + " is not loaded."
);
public static final TextKey IRIS_MODDED_COMMANDS_TELEPORT_FAILED_REASON = TextKey.of(
"iris.modded.irismoddedcommands.teleport_failed_reason",
"Teleport into " + "{dimensionId}" + " failed: " + "{reason}"
);
public static final TextKey IRIS_MODDED_COMMANDS_TELEPORT_CANCELLED_PLAYER_OFFLINE = TextKey.of(
"iris.modded.irismoddedcommands.teleport_cancelled_player_offline",
"Teleport into " + "{dimensionId}" + " cancelled: " + "{value}" + " is no longer online."
);
public static final TextKey IRIS_MODDED_COMMANDS_TELEPORT_REFUSED = TextKey.of(
"iris.modded.irismoddedcommands.teleport_refused",
"Teleport into " + "{dimensionId}" + " was refused by the server."
);
public static final TextKey IRIS_MODDED_COMMANDS_TELEPORTING = TextKey.of(
"iris.modded.irismoddedcommands.teleporting",
"Teleporting " + "{value}" + " to " + "{dimensionId}" + "..."
@@ -1266,6 +1278,9 @@ public final class ModdedCommandMessages {
IRIS_MODDED_COMMANDS_CONSOLE_MUST_NAME_PLAYER_IRIS_TP_DIMENSION_PLAYER,
IRIS_MODDED_COMMANDS_IS_NOT_GENERATED_BY_IRIS,
IRIS_MODDED_COMMANDS_TELEPORT_FAILED_DIMENSION_IS_NOT_LOADED,
IRIS_MODDED_COMMANDS_TELEPORT_FAILED_REASON,
IRIS_MODDED_COMMANDS_TELEPORT_CANCELLED_PLAYER_OFFLINE,
IRIS_MODDED_COMMANDS_TELEPORT_REFUSED,
IRIS_MODDED_COMMANDS_TELEPORTING,
IRIS_MODDED_COMMANDS_IS_NOT_GENERATED_BY_IRIS_2,
IRIS_MODDED_COMMANDS_CANNOT_EVACUATE_PRIMARY_WORLD_THERE_IS_NOWHERE_SEND_PLAYERS,
@@ -0,0 +1,48 @@
package art.arcane.iris.modded.command;
import art.arcane.iris.localization.IrisLanguage;
import art.arcane.iris.modded.localization.ModdedCommandMessages;
import art.arcane.volmlib.util.localization.MessageArgument;
import org.junit.Test;
import java.util.concurrent.CompletionException;
import java.util.concurrent.TimeoutException;
import static org.junit.Assert.assertEquals;
public class IrisModdedCommandsTeleportTest {
private static final String DIMENSION = "irisworldgen:1";
@Test
public void failureReportsItsRootCauseInsteadOfAnUnloadedDimension() {
String message = IrisModdedCommands.teleportFailure(DIMENSION, "Tester",
new CompletionException(new IllegalStateException("Exception generating new chunk")), true, true);
assertEquals(IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_FAILED_REASON,
MessageArgument.untrusted("dimensionId", DIMENSION),
MessageArgument.untrusted("reason", "Exception generating new chunk")), message);
}
@Test
public void failureWithoutMessageNamesTheFailureType() {
String message = IrisModdedCommands.teleportFailure(DIMENSION, "Tester", new TimeoutException(), true, true);
assertEquals(IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_FAILED_REASON,
MessageArgument.untrusted("dimensionId", DIMENSION),
MessageArgument.untrusted("reason", "TimeoutException")), message);
}
@Test
public void unloadedDimensionIsReportedOnlyWhenItIsGone() {
assertEquals(IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_FAILED_DIMENSION_IS_NOT_LOADED,
MessageArgument.untrusted("dimensionId", DIMENSION)),
IrisModdedCommands.teleportFailure(DIMENSION, "Tester", null, false, true));
assertEquals(IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_CANCELLED_PLAYER_OFFLINE,
MessageArgument.untrusted("dimensionId", DIMENSION),
MessageArgument.untrusted("value", "Tester")),
IrisModdedCommands.teleportFailure(DIMENSION, "Tester", null, true, false));
assertEquals(IrisLanguage.plain(ModdedCommandMessages.IRIS_MODDED_COMMANDS_TELEPORT_REFUSED,
MessageArgument.untrusted("dimensionId", DIMENSION)),
IrisModdedCommands.teleportFailure(DIMENSION, "Tester", null, true, true));
}
}
@@ -769,6 +769,9 @@ opening_your_editor = "Öffne {value} {value2} in deinem Editor."
console_must_name_player_iris_tp_dimension_player = "Die Konsole muss einen Spieler benennen: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} wird nicht von Iris generiert."
teleport_failed_dimension_is_not_loaded = "Teleportation fehlgeschlagen: Dimension {dimensionId} ist nicht geladen."
teleport_failed_reason = "Teleport nach {dimensionId} fehlgeschlagen: {reason}"
teleport_cancelled_player_offline = "Teleport nach {dimensionId} abgebrochen: {value} ist nicht mehr online."
teleport_refused = "Teleport nach {dimensionId} wurde vom Server abgelehnt."
teleporting = "Teleportiere {value} nach {dimensionId}..."
is_not_generated_by_iris_2 = "{value} wird nicht von Iris generiert."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Die primäre Welt kann nicht evakuiert werden, da es kein Ziel für die Spieler gibt."
@@ -769,6 +769,9 @@ opening_your_editor = "Abriendo {value} {value2} en tu editor."
console_must_name_player_iris_tp_dimension_player = "La consola debe indicar un jugador: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} no se genera por Iris."
teleport_failed_dimension_is_not_loaded = "El teletransporte falló: la dimensión {dimensionId} no está cargada."
teleport_failed_reason = "El teletransporte a {dimensionId} falló: {reason}"
teleport_cancelled_player_offline = "Teletransporte a {dimensionId} cancelado: {value} ya no está conectado."
teleport_refused = "El servidor rechazó el teletransporte a {dimensionId}."
teleporting = "Teletransportando a {value} a {dimensionId}..."
is_not_generated_by_iris_2 = "{value} no se genera por Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "No se puede evacuar el mundo principal porque no hay adónde enviar a los jugadores."
@@ -774,6 +774,9 @@ opening_your_editor = "Avaaminen {value} {value2} Päätoimittajassasi."
console_must_name_player_iris_tp_dimension_player = "Konsolin on nimettävä pelaaja: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} ei ole tuotettu Iris."
teleport_failed_dimension_is_not_loaded = "Teleportti epäonnistui: ulottuvuus {dimensionId} ei ole ladattu."
teleport_failed_reason = "Teleporttaus ulottuvuuteen {dimensionId} epäonnistui: {reason}"
teleport_cancelled_player_offline = "Teleporttaus ulottuvuuteen {dimensionId} peruttiin: {value} ei ole enää paikalla."
teleport_refused = "Palvelin hylkäsi teleporttauksen ulottuvuuteen {dimensionId}."
teleporting = "Telesiirtäminen {value} - {dimensionId}..."
is_not_generated_by_iris_2 = "{value} ei ole tuotettu Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Ensisijaista maailmaa ei voida evakuoida; pelaajia ei voi lähettää minnekään."
@@ -769,6 +769,9 @@ opening_your_editor = "Ouverture de {value} {value2} dans votre éditeur."
console_must_name_player_iris_tp_dimension_player = "La console doit indiquer un joueur : /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} n'est pas généré par Iris."
teleport_failed_dimension_is_not_loaded = "Échec de la téléportation : la dimension {dimensionId} n'est pas chargée."
teleport_failed_reason = "Échec de la téléportation vers {dimensionId} : {reason}"
teleport_cancelled_player_offline = "Téléportation vers {dimensionId} annulée : {value} n'est plus connecté."
teleport_refused = "Le serveur a refusé la téléportation vers {dimensionId}."
teleporting = "Téléportation de {value} vers {dimensionId}..."
is_not_generated_by_iris_2 = "{value} n'est pas généré par Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Impossible d'évacuer le monde principal, car aucun autre monde ne peut accueillir les joueurs."
@@ -774,6 +774,9 @@ opening_your_editor = "פתיחה {value} {value2} בעורך שלך."
console_must_name_player_iris_tp_dimension_player = "הקונסולה חייבת לקרוא לשחקן: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} לא נוצר על ידי Iris."
teleport_failed_dimension_is_not_loaded = "טלפורט נכשל: ממד {dimensionId} לא טעון."
teleport_failed_reason = "השיגור אל {dimensionId} נכשל: {reason}"
teleport_cancelled_player_offline = "השיגור אל {dimensionId} בוטל: {value} כבר לא מחובר."
teleport_refused = "השרת דחה את השיגור אל {dimensionId}."
teleporting = "תקשורת {value} כדי {dimensionId}..."
is_not_generated_by_iris_2 = "{value} לא נוצר על ידי Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "לא ניתן לפנות לעולם הראשי, אין מקום לשלוח שחקנים."
@@ -769,6 +769,9 @@ opening_your_editor = "Apertura di {value} {value2} nel tuo editor."
console_must_name_player_iris_tp_dimension_player = "La console deve specificare un giocatore: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} non è generato da Iris."
teleport_failed_dimension_is_not_loaded = "Teletrasporto non riuscito: la dimensione {dimensionId} non è caricata."
teleport_failed_reason = "Teletrasporto verso {dimensionId} non riuscito: {reason}"
teleport_cancelled_player_offline = "Teletrasporto verso {dimensionId} annullato: {value} non è più online."
teleport_refused = "Il server ha rifiutato il teletrasporto verso {dimensionId}."
teleporting = "Teletrasporto di {value} verso {dimensionId}..."
is_not_generated_by_iris_2 = "{value} non è generato da Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Impossibile evacuare il mondo principale: non esiste una destinazione per i giocatori."
@@ -772,6 +772,9 @@ opening_your_editor = "エディターで {value} {value2} を開いています
console_must_name_player_iris_tp_dimension_player = "コンソールではプレイヤーを指定してください: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} は Iris によって生成されていません。"
teleport_failed_dimension_is_not_loaded = "テレポートに失敗しました: ディメンション {dimensionId} は読み込まれていません。"
teleport_failed_reason = "{dimensionId} へのテレポートに失敗しました: {reason}"
teleport_cancelled_player_offline = "{dimensionId} へのテレポートを中止しました: {value} はオフラインです。"
teleport_refused = "サーバーが {dimensionId} へのテレポートを拒否しました。"
teleporting = "{value} を {dimensionId} にテレポートしています..."
is_not_generated_by_iris_2 = "{value} は Iris によって生成されていません。"
cannot_evacuate_primary_world_there_is_nowhere_send_players = "プライマリーワールドからは退避できません。プレイヤーの移動先がありません。"
@@ -772,6 +772,9 @@ opening_your_editor = "편집기에서 {value} {value2} 여는 중입니다."
console_must_name_player_iris_tp_dimension_player = "콘솔은 플레이어를 지정해야 합니다: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} 에 의해 생성되지 않음 Iris."
teleport_failed_dimension_is_not_loaded = "Teleport 실패: 차원 {dimensionId} 로드 되지 않습니다."
teleport_failed_reason = "{dimensionId}(으)로 순간이동 실패: {reason}"
teleport_cancelled_player_offline = "{dimensionId}(으)로 순간이동 취소됨: {value} 님이 더 이상 접속해 있지 않습니다."
teleport_refused = "서버가 {dimensionId}(으)로의 순간이동을 거부했습니다."
teleporting = "팟캐스트 {value} 으로 {dimensionId}..."
is_not_generated_by_iris_2 = "{value} 에 의해 생성되지 않음 Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "1 차 세계를 피할 수 없습니다. 플레이어에게 보내는 곳이 없습니다."
@@ -774,6 +774,9 @@ opening_your_editor = "Atidaryti {value} {value2} redaktoriuje."
console_must_name_player_iris_tp_dimension_player = "Konsolė turi pavadinti žaidėją: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} generuoja ne Iris."
teleport_failed_dimension_is_not_loaded = "Teleportas nepavyko: dimensija {dimensionId} neįkrauta."
teleport_failed_reason = "Teleportavimas į {dimensionId} nepavyko: {reason}"
teleport_cancelled_player_offline = "Teleportavimas į {dimensionId} atšauktas: {value} nebėra prisijungęs."
teleport_refused = "Serveris atmetė teleportavimą į {dimensionId}."
teleporting = "Teleportavimas {value} iki {dimensionId}..."
is_not_generated_by_iris_2 = "{value} generuoja ne Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Negalima evakuoti pirminio pasaulio; nėra kur siųsti žaidėjų."
@@ -769,6 +769,9 @@ opening_your_editor = "Openen {value} {value2} in uw redacteur."
console_must_name_player_iris_tp_dimension_player = "Console moet een speler een naam geven: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} wordt niet gegenereerd door Iris."
teleport_failed_dimension_is_not_loaded = "Teleporteren mislukt: dimensie {dimensionId} is niet geladen."
teleport_failed_reason = "Teleporteren naar {dimensionId} mislukt: {reason}"
teleport_cancelled_player_offline = "Teleporteren naar {dimensionId} geannuleerd: {value} is niet meer online."
teleport_refused = "De server heeft het teleporteren naar {dimensionId} geweigerd."
teleporting = "Teleporteren {value} tot {dimensionId}..."
is_not_generated_by_iris_2 = "{value} wordt niet gegenereerd door Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Kan de primaire wereld niet evacueren; er is geen plek om spelers te sturen."
@@ -774,6 +774,9 @@ opening_your_editor = "Otwarcie {value} {value2} w twoim wydawcy."
console_must_name_player_iris_tp_dimension_player = "Konsola musi nazwać gracza: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} nie jest generowany przez Iris."
teleport_failed_dimension_is_not_loaded = "Teleport nie powiódł się: wymiar {dimensionId} nie jest załadowany."
teleport_failed_reason = "Teleportacja do {dimensionId} nie powiodła się: {reason}"
teleport_cancelled_player_offline = "Teleportacja do {dimensionId} anulowana: {value} nie jest już online."
teleport_refused = "Serwer odrzucił teleportację do {dimensionId}."
teleporting = "Teleportowanie {value} do {dimensionId}..."
is_not_generated_by_iris_2 = "{value} nie jest generowany przez Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Nie można ewakuować głównego świata; nie ma gdzie wysłać graczy."
@@ -769,6 +769,9 @@ opening_your_editor = "Abertura {value} {value2} no seu editor."
console_must_name_player_iris_tp_dimension_player = "A consola deve nomear um jogador: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} não é gerado por Iris."
teleport_failed_dimension_is_not_loaded = "Falha no teletransporte: dimensão {dimensionId} não está carregada."
teleport_failed_reason = "Falha no teletransporte para {dimensionId}: {reason}"
teleport_cancelled_player_offline = "Teletransporte para {dimensionId} cancelado: {value} já não está online."
teleport_refused = "O servidor recusou o teletransporte para {dimensionId}."
teleporting = "Teletransportando {value} para {dimensionId}..."
is_not_generated_by_iris_2 = "{value} não é gerado por Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Não é possível evacuar o mundo primário; não há nenhum lugar para enviar jogadores."
@@ -774,6 +774,9 @@ opening_your_editor = "Открытие {value} {value2} В вашем реда
console_must_name_player_iris_tp_dimension_player = "Консоль должна называть игрока: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} не генерируется путем Iris."
teleport_failed_dimension_is_not_loaded = "Телепорт провалился: измерение {dimensionId} не загружается."
teleport_failed_reason = "Не удалось телепортироваться в {dimensionId}: {reason}"
teleport_cancelled_player_offline = "Телепортация в {dimensionId} отменена: {value} больше не в сети."
teleport_refused = "Сервер отклонил телепортацию в {dimensionId}."
teleporting = "телепортация {value} то {dimensionId}..."
is_not_generated_by_iris_2 = "{value} не генерируется путем Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Нельзя эвакуировать основной мир, негде отправить игроков."
@@ -774,6 +774,9 @@ opening_your_editor = "Açılış {value} {value2} editörünüzde."
console_must_name_player_iris_tp_dimension_player = "Konsol bir oyuncu adı olmalıdır: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} tarafından üretilmiyor Iris."
teleport_failed_dimension_is_not_loaded = "Teleport başarısız oldu: Boyut {dimensionId} yüklenemez."
teleport_failed_reason = "{dimensionId} boyutuna ışınlanma başarısız oldu: {reason}"
teleport_cancelled_player_offline = "{dimensionId} boyutuna ışınlanma iptal edildi: {value} artık çevrimiçi değil."
teleport_refused = "Sunucu {dimensionId} boyutuna ışınlanmayı reddetti."
teleporting = "Telporting {value} tom için {dimensionId}..."
is_not_generated_by_iris_2 = "{value} tarafından üretilmiyor Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "birincil dünyayı tahliye edemez; oyuncuları göndermek için hiçbir yer yoktur."
@@ -772,6 +772,9 @@ opening_your_editor = "Mở {value} {value2} trong biên tập của anh."
console_must_name_player_iris_tp_dimension_player = "Cần phải đặt tên người chơi: /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} không được tạo ra bởi Iris."
teleport_failed_dimension_is_not_loaded = "Chuyển tiếp thất bại: chiều {dimensionId} không nạp đạn."
teleport_failed_reason = "Dịch chuyển tới {dimensionId} thất bại: {reason}"
teleport_cancelled_player_offline = "Đã hủy dịch chuyển tới {dimensionId}: {value} không còn trực tuyến."
teleport_refused = "Máy chủ đã từ chối dịch chuyển tới {dimensionId}."
teleporting = "Chuyển tiếp {value} phải {dimensionId}..."
is_not_generated_by_iris_2 = "{value} không được tạo ra bởi Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "Không thể sơ tán thế giới chính; không có nơi nào để gửi cầu thủ."
@@ -772,6 +772,9 @@ opening_your_editor = "开幕 {value} {value2} 在你的编辑。"
console_must_name_player_iris_tp_dimension_player = "控制台必须给玩家命名 : /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} 不由 Iris."
teleport_failed_dimension_is_not_loaded = "Teleport 失败: 维度 {dimensionId} 未加载。"
teleport_failed_reason = "传送到 {dimensionId} 失败:{reason}"
teleport_cancelled_player_offline = "已取消传送到 {dimensionId}:{value} 已不在线。"
teleport_refused = "服务器拒绝了传送到 {dimensionId}。"
teleporting = "远程传送 {value} 改为: {dimensionId}..."
is_not_generated_by_iris_2 = "{value} 不由 Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "无法撤离主世界; 没有地方可以发送玩家 。"
@@ -772,6 +772,9 @@ opening_your_editor = "開幕 {value} {value2} 在你的編輯。"
console_must_name_player_iris_tp_dimension_player = "控制檯必須給玩家命名 : /iris tp <dimension> <player>"
is_not_generated_by_iris = "{value} 不由 Iris."
teleport_failed_dimension_is_not_loaded = "Teleport 失敗: 維度 {dimensionId} 未載入。"
teleport_failed_reason = "傳送到 {dimensionId} 失敗:{reason}"
teleport_cancelled_player_offline = "已取消傳送到 {dimensionId}:{value} 已不在線上。"
teleport_refused = "伺服器拒絕了傳送到 {dimensionId}。"
teleporting = "遠端傳送 {value} 改為: {dimensionId}..."
is_not_generated_by_iris_2 = "{value} 不由 Iris."
cannot_evacuate_primary_world_there_is_nowhere_send_players = "無法撤離主世界; 沒有地方可以傳送玩家 。"