Toggle Vision entities

- Hide living-entity markers by default while retaining player markers.
- Add an Entities control beside Grid and stop polling hidden entity snapshots.
- Localize the new control and status messages across all bundled languages.
- God i gate these kinds of commit messages
This commit is contained in:
Brian Neumann-Fopiano
2026-08-28 16:41:06 -04:00
parent 27799039d1
commit 9103796845
19 changed files with 102 additions and 13 deletions
@@ -123,6 +123,7 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
private VisionRenderController.Frame renderFrame;
private JComboBox<RenderType> modeSelector;
private JToggleButton gridToggle;
private JToggleButton entitiesToggle;
private JToggleButton followToggle;
private RenderType currentType;
private List<GuiMarker> players;
@@ -140,6 +141,7 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
private double blocksPerPixel;
private int paintCadenceFps;
private boolean grid;
private boolean entitiesVisible;
private boolean follow;
private boolean help;
private boolean debug;
@@ -158,6 +160,7 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
this.notifications = new LinkedHashMap<>();
this.players = List.of();
this.entities = List.of();
this.entitiesVisible = false;
this.currentType = RenderType.BIOME;
this.blocksPerPixel = DEFAULT_BLOCKS_PER_PIXEL;
this.contentRevision = 1L;
@@ -263,6 +266,12 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
vision.gridToggle = createToggle(IrisLanguage.plain(DesktopUiMessages.VISION_GRID), vision.grid);
vision.gridToggle.addActionListener(event -> vision.toggleGrid());
trailing.add(vision.gridToggle);
vision.entitiesToggle = createToggle(
IrisLanguage.plain(DesktopUiMessages.VISION_ENTITIES),
vision.entitiesVisible
);
vision.entitiesToggle.addActionListener(event -> vision.toggleEntities());
trailing.add(vision.entitiesToggle);
vision.followToggle = createToggle(IrisLanguage.plain(DesktopUiMessages.VISION_FOLLOW), vision.follow);
vision.followToggle.addActionListener(event -> vision.toggleFollow());
trailing.add(vision.followToggle);
@@ -409,11 +418,13 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
}
private void renderMarkers(Graphics2D canvas) {
for (GuiMarker marker : entities) {
int screenX = (int) Math.round(worldToScreenX(marker.worldX()));
int screenY = (int) Math.round(worldToScreenZ(marker.worldZ()));
canvas.setColor(MOB_COLOR);
canvas.fillRect(screenX - 2, screenY - 2, 5, 5);
if (entitiesVisible) {
for (GuiMarker marker : entities) {
int screenX = (int) Math.round(worldToScreenX(marker.worldX()));
int screenY = (int) Math.round(worldToScreenZ(marker.worldZ()));
canvas.setColor(MOB_COLOR);
canvas.fillRect(screenX - 2, screenY - 2, 5, 5);
}
}
for (GuiMarker marker : players) {
@@ -428,7 +439,7 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
int labelWidth = canvas.getFontMetrics().stringWidth(marker.label());
canvas.drawString(marker.label(), screenX - labelWidth / 2, screenY - 14);
}
if (detailedHover) {
if (entitiesVisible && detailedHover) {
renderNearestEntity(canvas);
}
}
@@ -759,12 +770,16 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
try {
List<GuiMarker> nextPlayers = overlay.players();
players = nextPlayers == null ? List.of() : List.copyOf(nextPlayers);
overlay.requestEntities(next -> EventQueue.invokeLater(() -> {
if (!closed) {
entities = next == null ? List.of() : List.copyOf(next);
repaint();
}
}));
if (entitiesVisible) {
overlay.requestEntities(next -> EventQueue.invokeLater(() -> {
if (!closed && entitiesVisible) {
entities = next == null ? List.of() : List.copyOf(next);
repaint();
}
}));
} else if (!entities.isEmpty()) {
entities = List.of();
}
if (follow && !players.isEmpty()) {
GuiMarker player = players.get(0);
if (Math.abs(centerX - player.worldX()) > 0.5D || Math.abs(centerZ - player.worldZ()) > 0.5D) {
@@ -828,6 +843,22 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
notifyUser(IrisLanguage.plain(grid ? DesktopUiMessages.VISION_GRID_ENABLED : DesktopUiMessages.VISION_GRID_DISABLED));
}
private void toggleEntities() {
entitiesVisible = !entitiesVisible;
if (entitiesVisible) {
refreshMarkers();
} else {
entities = List.of();
repaint();
}
syncControls();
notifyUser(IrisLanguage.plain(
entitiesVisible
? DesktopUiMessages.VISION_ENTITIES_ENABLED
: DesktopUiMessages.VISION_ENTITIES_DISABLED
));
}
private void toggleFollow() {
follow = !follow;
if (follow && players.isEmpty()) {
@@ -857,6 +888,9 @@ public final class VisionGUI extends JPanel implements MouseWheelListener, KeyLi
if (gridToggle != null) {
gridToggle.setSelected(grid);
}
if (entitiesToggle != null) {
entitiesToggle.setSelected(entitiesVisible);
}
if (followToggle != null) {
followToggle.setSelected(follow);
}
@@ -9,12 +9,15 @@ public final class DesktopUiMessages {
public static final TextKey VISION_TITLE = TextKey.of("iris.desktop.vision.title", "Iris Vision");
public static final TextKey VISION_VIEW = TextKey.of("iris.desktop.vision.view", "View:");
public static final TextKey VISION_GRID = TextKey.of("iris.desktop.vision.grid", "Grid");
public static final TextKey VISION_ENTITIES = TextKey.of("iris.desktop.vision.entities", "Entities");
public static final TextKey VISION_FOLLOW = TextKey.of("iris.desktop.vision.follow", "Follow");
public static final TextKey VISION_REFRESHING = TextKey.of("iris.desktop.vision.refreshing", "Refreshing");
public static final TextKey VISION_FPS = TextKey.of("iris.desktop.vision.fps", "{fps} FPS");
public static final TextKey VISION_ZOOM_RESET = TextKey.of("iris.desktop.vision.zoom_reset", "Zoom reset");
public static final TextKey VISION_GRID_ENABLED = TextKey.of("iris.desktop.vision.grid_enabled", "Grid enabled");
public static final TextKey VISION_GRID_DISABLED = TextKey.of("iris.desktop.vision.grid_disabled", "Grid disabled");
public static final TextKey VISION_ENTITIES_ENABLED = TextKey.of("iris.desktop.vision.entities_enabled", "Entities enabled");
public static final TextKey VISION_ENTITIES_DISABLED = TextKey.of("iris.desktop.vision.entities_disabled", "Entities disabled");
public static final TextKey VISION_FOLLOWING = TextKey.of("iris.desktop.vision.following", "Following {player}");
public static final TextKey VISION_NO_PLAYER = TextKey.of("iris.desktop.vision.no_player", "No player in world");
public static final TextKey VISION_FOLLOW_DISABLED = TextKey.of("iris.desktop.vision.follow_disabled", "Follow disabled");
@@ -157,8 +160,9 @@ public final class DesktopUiMessages {
public static final TextKey IMAGEMAP_PREVIEW_STATUS = TextKey.of("iris.desktop.imagemap.preview_status", "X {x} Z {z} | {value} | {scale} blocks/pixel");
private static final List<MessageKey> KEYS = List.of(
VISION_TITLE, VISION_VIEW, VISION_GRID, VISION_FOLLOW,
VISION_TITLE, VISION_VIEW, VISION_GRID, VISION_ENTITIES, VISION_FOLLOW,
VISION_REFRESHING, VISION_FPS, VISION_ZOOM_RESET, VISION_GRID_ENABLED, VISION_GRID_DISABLED,
VISION_ENTITIES_ENABLED, VISION_ENTITIES_DISABLED,
VISION_FOLLOWING, VISION_NO_PLAYER, VISION_FOLLOW_DISABLED,
VISION_STATUS_LEFT, VISION_STATUS_RIGHT, VISION_ENTITY_POSITION, VISION_ENTITY_HEALTH,
VISION_BLOCK_POSITION, VISION_CHUNK_POSITION, VISION_REGION_POSITION, VISION_BIOME_KEY,
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Vision",
"iris.desktop.vision.view": "Ansicht:",
"iris.desktop.vision.grid": "Raster",
"iris.desktop.vision.entities": "Entitäten",
"iris.desktop.vision.follow": "Folgen",
"iris.desktop.vision.refreshing": "Wird aktualisiert",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Zoom-Reset",
"iris.desktop.vision.grid_enabled": "Raster aktiviert",
"iris.desktop.vision.grid_disabled": "Raster deaktiviert",
"iris.desktop.vision.entities_enabled": "Entitäten aktiviert",
"iris.desktop.vision.entities_disabled": "Entitäten deaktiviert",
"iris.desktop.vision.following": "Folge {player}",
"iris.desktop.vision.no_player": "Kein Spieler in der Welt",
"iris.desktop.vision.follow_disabled": "Folgen deaktiviert",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Vision",
"iris.desktop.vision.view": "Vista:",
"iris.desktop.vision.grid": "Cuadrícula",
"iris.desktop.vision.entities": "Entidades",
"iris.desktop.vision.follow": "Seguir",
"iris.desktop.vision.refreshing": "Actualizando",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Zoom restablecido",
"iris.desktop.vision.grid_enabled": "Cuadrícula activada",
"iris.desktop.vision.grid_disabled": "Cuadrícula desactivada",
"iris.desktop.vision.entities_enabled": "Entidades activadas",
"iris.desktop.vision.entities_disabled": "Entidades desactivadas",
"iris.desktop.vision.following": "Siguiendo a {player}",
"iris.desktop.vision.no_player": "No hay jugadores en el mundo",
"iris.desktop.vision.follow_disabled": "Seguimiento desactivado",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Näkö",
"iris.desktop.vision.view": "Näytä:",
"iris.desktop.vision.grid": "Ruudukko",
"iris.desktop.vision.entities": "Entiteetit",
"iris.desktop.vision.follow": "Seuraa",
"iris.desktop.vision.refreshing": "Virkistävä",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Lähennä nollaus",
"iris.desktop.vision.grid_enabled": "Verkko käytössä",
"iris.desktop.vision.grid_disabled": "Verkko pois käytöstä",
"iris.desktop.vision.entities_enabled": "Entiteetit käytössä",
"iris.desktop.vision.entities_disabled": "Entiteetit pois käytöstä",
"iris.desktop.vision.following": "Seurataan pelaajaa {player}",
"iris.desktop.vision.no_player": "Ei pelaajaa maailmassa",
"iris.desktop.vision.follow_disabled": "Seuraa pois käytöstä",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Vision",
"iris.desktop.vision.view": "Vue :",
"iris.desktop.vision.grid": "Grille",
"iris.desktop.vision.entities": "Entités",
"iris.desktop.vision.follow": "Suivre",
"iris.desktop.vision.refreshing": "Actualisation",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Zoom réinitialisé",
"iris.desktop.vision.grid_enabled": "Grille activée",
"iris.desktop.vision.grid_disabled": "Grille désactivée",
"iris.desktop.vision.entities_enabled": "Entités activées",
"iris.desktop.vision.entities_disabled": "Entités désactivées",
"iris.desktop.vision.following": "Suivi de {player}",
"iris.desktop.vision.no_player": "Aucun joueur dans le monde",
"iris.desktop.vision.follow_disabled": "Suivi désactivé",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris חזון",
"iris.desktop.vision.view": "תגית:",
"iris.desktop.vision.grid": "גרי",
"iris.desktop.vision.entities": "ישויות",
"iris.desktop.vision.follow": "עקבו אחרי עקוב",
"iris.desktop.vision.refreshing": "מרעננים",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "ZOOE",
"iris.desktop.vision.grid_enabled": "רשת אפשר",
"iris.desktop.vision.grid_disabled": "סגור",
"iris.desktop.vision.entities_enabled": "ישויות מופעלות",
"iris.desktop.vision.entities_disabled": "ישויות מושבתות",
"iris.desktop.vision.following": "עוקב אחר {player}",
"iris.desktop.vision.no_player": "אין שחקן בעולם",
"iris.desktop.vision.follow_disabled": "עקבו אחרי מוגבלויות",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Vision",
"iris.desktop.vision.view": "Vedi:",
"iris.desktop.vision.grid": "Griglia",
"iris.desktop.vision.entities": "Entità",
"iris.desktop.vision.follow": "Segui",
"iris.desktop.vision.refreshing": "Aggiornamento",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Ripristino dello zoom",
"iris.desktop.vision.grid_enabled": "Griglia abilitata",
"iris.desktop.vision.grid_disabled": "Griglia disattivata",
"iris.desktop.vision.entities_enabled": "Entità abilitate",
"iris.desktop.vision.entities_disabled": "Entità disabilitate",
"iris.desktop.vision.following": "Stai seguendo {player}",
"iris.desktop.vision.no_player": "Nessun giocatore nel mondo",
"iris.desktop.vision.follow_disabled": "Segui disattivato",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris ビジョン",
"iris.desktop.vision.view": "表示:",
"iris.desktop.vision.grid": "グリッド",
"iris.desktop.vision.entities": "エンティティ",
"iris.desktop.vision.follow": "フォロー",
"iris.desktop.vision.refreshing": "更新中",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "ズームリセット",
"iris.desktop.vision.grid_enabled": "グリッド有効",
"iris.desktop.vision.grid_disabled": "グリッド無効",
"iris.desktop.vision.entities_enabled": "エンティティ有効",
"iris.desktop.vision.entities_disabled": "エンティティ無効",
"iris.desktop.vision.following": "{player} を追跡中",
"iris.desktop.vision.no_player": "ワールドにプレイヤーがいません",
"iris.desktop.vision.follow_disabled": "追跡無効",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Vision",
"iris.desktop.vision.view": "보기:",
"iris.desktop.vision.grid": "격자",
"iris.desktop.vision.entities": "엔티티",
"iris.desktop.vision.follow": "추적",
"iris.desktop.vision.refreshing": "새로 고치는 중",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Zoom 리셋",
"iris.desktop.vision.grid_enabled": "격자 활성화",
"iris.desktop.vision.grid_disabled": "격자 비활성화",
"iris.desktop.vision.entities_enabled": "엔티티 활성화",
"iris.desktop.vision.entities_disabled": "엔티티 비활성화",
"iris.desktop.vision.following": "{player} 추적 중",
"iris.desktop.vision.no_player": "월드에 플레이어가 없음",
"iris.desktop.vision.follow_disabled": "추적 비활성화",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Regėjimas",
"iris.desktop.vision.view": "Rodymas:",
"iris.desktop.vision.grid": "Tinklelis",
"iris.desktop.vision.entities": "Esybės",
"iris.desktop.vision.follow": "Sekti",
"iris.desktop.vision.refreshing": "Atnaujinimas",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Mastelis iš naujo",
"iris.desktop.vision.grid_enabled": "Tinklelis įjungtas",
"iris.desktop.vision.grid_disabled": "Tinklelis išjungtas",
"iris.desktop.vision.entities_enabled": "Esybės įjungtos",
"iris.desktop.vision.entities_disabled": "Esybės išjungtos",
"iris.desktop.vision.following": "Sekamas {player}",
"iris.desktop.vision.no_player": "Jokio žaidėjo pasaulyje",
"iris.desktop.vision.follow_disabled": "Sekti išjungtą",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Gezicht",
"iris.desktop.vision.view": "Beeld:",
"iris.desktop.vision.grid": "Raster",
"iris.desktop.vision.entities": "Entiteiten",
"iris.desktop.vision.follow": "Volgen",
"iris.desktop.vision.refreshing": "Verversen",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Reset zoomen",
"iris.desktop.vision.grid_enabled": "Raster ingeschakeld",
"iris.desktop.vision.grid_disabled": "Raster uitgeschakeld",
"iris.desktop.vision.entities_enabled": "Entiteiten ingeschakeld",
"iris.desktop.vision.entities_disabled": "Entiteiten uitgeschakeld",
"iris.desktop.vision.following": "Volgt {player}",
"iris.desktop.vision.no_player": "Geen speler in de wereld",
"iris.desktop.vision.follow_disabled": "Volgen uitgeschakeld",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Wizja",
"iris.desktop.vision.view": "Widok:",
"iris.desktop.vision.grid": "Sieć",
"iris.desktop.vision.entities": "Byty",
"iris.desktop.vision.follow": "Śledź",
"iris.desktop.vision.refreshing": "Odświeżające",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Zmień powiększenie",
"iris.desktop.vision.grid_enabled": "Siatka włączona",
"iris.desktop.vision.grid_disabled": "Sieć wyłączona",
"iris.desktop.vision.entities_enabled": "Byty włączone",
"iris.desktop.vision.entities_disabled": "Byty wyłączone",
"iris.desktop.vision.following": "Śledzenie gracza {player}",
"iris.desktop.vision.no_player": "Brak gracza na świecie",
"iris.desktop.vision.follow_disabled": "Śledź wyłączone",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Visão",
"iris.desktop.vision.view": "Ver:",
"iris.desktop.vision.grid": "Grade",
"iris.desktop.vision.entities": "Entidades",
"iris.desktop.vision.follow": "Seguir",
"iris.desktop.vision.refreshing": "Atualizando",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Ampliação repor",
"iris.desktop.vision.grid_enabled": "Grade habilitada",
"iris.desktop.vision.grid_disabled": "Grade desabilitada",
"iris.desktop.vision.entities_enabled": "Entidades ativadas",
"iris.desktop.vision.entities_disabled": "Entidades desativadas",
"iris.desktop.vision.following": "A seguir {player}",
"iris.desktop.vision.no_player": "Nenhum jogador no mundo",
"iris.desktop.vision.follow_disabled": "Seguir desabilitado",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Видение",
"iris.desktop.vision.view": "Посмотреть:",
"iris.desktop.vision.grid": "сетка",
"iris.desktop.vision.entities": "Сущности",
"iris.desktop.vision.follow": "Следить",
"iris.desktop.vision.refreshing": "освежающий",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Сброс Zoom",
"iris.desktop.vision.grid_enabled": "Сетка включена",
"iris.desktop.vision.grid_disabled": "Сетка отключена",
"iris.desktop.vision.entities_enabled": "Сущности включены",
"iris.desktop.vision.entities_disabled": "Сущности отключены",
"iris.desktop.vision.following": "Отслеживается {player}",
"iris.desktop.vision.no_player": "Нет игрока в мире",
"iris.desktop.vision.follow_disabled": "Следить за инвалидами",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Vizyon",
"iris.desktop.vision.view": "Görüntüleme:",
"iris.desktop.vision.grid": "Izgara",
"iris.desktop.vision.entities": "Varlıklar",
"iris.desktop.vision.follow": "Takip",
"iris.desktop.vision.refreshing": "Yenileme",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "yakınlaştırma reset sıfırlama",
"iris.desktop.vision.grid_enabled": "Grid etkinleştirdi",
"iris.desktop.vision.grid_disabled": "Izgara",
"iris.desktop.vision.entities_enabled": "Varlıklar etkin",
"iris.desktop.vision.entities_disabled": "Varlıklar devre dışı",
"iris.desktop.vision.following": "{player} takip ediliyor",
"iris.desktop.vision.no_player": "Hiçbir oyuncu dünyada",
"iris.desktop.vision.follow_disabled": "Engellileri Takip Et",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris Tầm nhìn",
"iris.desktop.vision.view": "Xem:",
"iris.desktop.vision.grid": "Lưới",
"iris.desktop.vision.entities": "Thực thể",
"iris.desktop.vision.follow": "Theo",
"iris.desktop.vision.refreshing": "Cập nhật",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "Đặt lại phóng đại",
"iris.desktop.vision.grid_enabled": "Lưới đã bật",
"iris.desktop.vision.grid_disabled": "Tắt Lưới",
"iris.desktop.vision.entities_enabled": "Đã bật thực thể",
"iris.desktop.vision.entities_disabled": "Đã tắt thực thể",
"iris.desktop.vision.following": "Đang theo dõi {player}",
"iris.desktop.vision.no_player": "Không có người chơi trên thế giới",
"iris.desktop.vision.follow_disabled": "Tắt theo",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris 愿景",
"iris.desktop.vision.view": "视图 :",
"iris.desktop.vision.grid": "网格",
"iris.desktop.vision.entities": "实体",
"iris.desktop.vision.follow": "跟着",
"iris.desktop.vision.refreshing": "刷新",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "缩放重置",
"iris.desktop.vision.grid_enabled": "已启用网格",
"iris.desktop.vision.grid_disabled": "已禁用网格",
"iris.desktop.vision.entities_enabled": "实体已启用",
"iris.desktop.vision.entities_disabled": "实体已禁用",
"iris.desktop.vision.following": "跟踪 {player}",
"iris.desktop.vision.no_player": "世界上没有玩家",
"iris.desktop.vision.follow_disabled": "跟随已禁用",
@@ -1355,12 +1355,15 @@
"iris.desktop.vision.title": "Iris 願景",
"iris.desktop.vision.view": "檢視 :",
"iris.desktop.vision.grid": "網格",
"iris.desktop.vision.entities": "實體",
"iris.desktop.vision.follow": "跟著",
"iris.desktop.vision.refreshing": "重新整理",
"iris.desktop.vision.fps": "{fps} FPS",
"iris.desktop.vision.zoom_reset": "縮放重置",
"iris.desktop.vision.grid_enabled": "已啟用網格",
"iris.desktop.vision.grid_disabled": "已禁用網格",
"iris.desktop.vision.entities_enabled": "實體已啟用",
"iris.desktop.vision.entities_disabled": "實體已停用",
"iris.desktop.vision.following": "跟蹤 {player}",
"iris.desktop.vision.no_player": "世界上沒有玩家",
"iris.desktop.vision.follow_disabled": "跟隨已禁用",