diff --git a/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java b/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java index 4d1694b7d..64d077c28 100644 --- a/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java +++ b/src/main/java/com/cleanroommc/modularui/value/sync/PanelSyncHandler.java @@ -112,8 +112,11 @@ public void closeSubPanels() { @ApiStatus.Internal @Override public void closePanelInternal() { - getSyncManager().getModularSyncManager().close(this.panelName); this.open = false; + // Sync infrastructure may already be torn down if the screen was disposed + // (e.g. deferred PanelManager.dispose() running after ModularNetwork.closeAll()) + if (!isValid()) return; + getSyncManager().getModularSyncManager().close(this.panelName); if (getSyncManager().isClient()) { syncToServer(SYNC_CLOSE); } diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java index 70df3be36..a1149008b 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldHandler.java @@ -327,8 +327,10 @@ private Point insert(List text, List insertion) { text.addAll(insertion); return new Point(text.get(text.size() - 1).length(), text.size() - 1); } - String lineStart = text.get(this.cursor.y).substring(0, this.cursor.x); - String lineEnd = text.get(this.cursor.y).substring(this.cursor.x); + String line = text.get(this.cursor.y); + int cursorX = Math.min(this.cursor.x, line.length()); + String lineStart = line.substring(0, cursorX); + String lineEnd = line.substring(cursorX); if (insertion.size() == 1 && text.size() == 1 && !test(lineStart + insertion.get(0) + lineEnd)) { return null; } @@ -338,7 +340,7 @@ private Point insert(List text, List insertion) { return null; } text.set(this.cursor.y, text.get(this.cursor.y) + lineEnd); - return new Point(this.cursor.x + insertion.get(0).length(), this.cursor.y); + return new Point(cursorX + insertion.get(0).length(), this.cursor.y); } else { text.add(this.cursor.y + 1, insertion.get(insertion.size() - 1) + lineEnd); x = insertion.get(insertion.size() - 1).length();