From 67a9925a2a5fe7d2be224b5d9c0dae15e700b1c4 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Sun, 6 Apr 2025 11:12:32 +0100 Subject: [PATCH 1/3] fix: fix keyboard navigation crash after all items sold --- .../destinationsol/ui/nui/screens/InventoryScreen.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java index 3ca548f90..330ed77ef 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java @@ -251,7 +251,9 @@ public boolean onKeyEvent(NUIKeyEvent event) { previousButton.getClickSound().play(previousButton.getClickVolume()); } - items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + if (items.groupCount() > 0) { + items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + } updateItemRows(); return true; @@ -269,7 +271,9 @@ public boolean onKeyEvent(NUIKeyEvent event) { nextButton.getClickSound().play(nextButton.getClickVolume()); } - items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + if (items.groupCount() > 0) { + items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + } updateItemRows(); return true; From aeb21ad75d7d27077abcc631cd37b245f531a393 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Sun, 6 Apr 2025 12:10:36 +0100 Subject: [PATCH 2/3] fix: fix highlight after item removal --- .../game/item/ItemContainer.java | 7 +++-- .../ui/nui/screens/InventoryScreen.java | 29 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java b/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java index 09378b7e7..ed3cb56e7 100644 --- a/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java +++ b/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java @@ -130,11 +130,12 @@ public List getSelectionAfterRemove(List selected) { if (selected.size() > 1) { return selected; } - int idx = groups.indexOf(selected) + 1; - if (idx <= 0 || idx >= groupCount()) { + int groupCount = groupCount(); + int idx = groups.indexOf(selected); + if (idx <= 0 || groupCount <= 1) { return null; } - return groups.get(idx); + return groups.get(idx == (groupCount - 1) ? idx - 1 : idx + 1); } public SolItem getRandom() { diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java index 330ed77ef..633286059 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java @@ -73,6 +73,7 @@ public class InventoryScreen extends NUIScreenLayer { private ColumnLayout inventoryActionButtons; private UIWarnButton closeButton; private InventoryOperationsScreen inventoryOperations; + private List selectedItemGroup; private int selectedIndex; private int page; @@ -102,6 +103,7 @@ public void initialise() { nextButton.subscribe(button -> { nextPage(button); selectedIndex = 0; + selectedItemGroup = null; updateItemRows(); }); @@ -110,6 +112,7 @@ public void initialise() { previousButton.subscribe(button -> { previousPage(button); selectedIndex = 0; + selectedItemGroup = null; updateItemRows(); }); @@ -250,6 +253,7 @@ public boolean onKeyEvent(NUIKeyEvent event) { selectedIndex--; previousButton.getClickSound().play(previousButton.getClickVolume()); } + selectedItemGroup = null; if (items.groupCount() > 0) { items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); @@ -270,6 +274,7 @@ public boolean onKeyEvent(NUIKeyEvent event) { selectedIndex++; nextButton.getClickSound().play(nextButton.getClickVolume()); } + selectedItemGroup = null; if (items.groupCount() > 0) { items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); @@ -318,18 +323,7 @@ public SolItem getSelectedItem() { * @param itemGroup the item group to select */ public void setSelected(List itemGroup) { - ItemContainer items = inventoryOperations.getItems(solApplication.getGame()); - if (!items.containsGroup(itemGroup)) { - selectedIndex = 0; - } else { - for (int groupNo = 0; groupNo < items.groupCount(); groupNo++) { - if (items.getGroup(groupNo) == itemGroup) { - page = groupNo / Const.ITEM_GROUPS_PER_PAGE; - selectedIndex = groupNo % Const.ITEM_GROUPS_PER_PAGE; - } - } - } - + selectedItemGroup = itemGroup; updateItemRows(); } @@ -541,6 +535,17 @@ private UIWidget createItemRow(int index) { public void updateItemRows() { ItemContainer items = inventoryOperations.getItems(solApplication.getGame()); + if (selectedItemGroup != null && items.containsGroup(selectedItemGroup)) { + for (int groupNo = 0; groupNo < items.groupCount(); groupNo++) { + if (items.getGroup(groupNo) == selectedItemGroup) { + page = groupNo / Const.ITEM_GROUPS_PER_PAGE; + selectedIndex = groupNo % Const.ITEM_GROUPS_PER_PAGE; + } + } + } else { + selectedItemGroup = items.groupCount() < selectedIndex ? items.getGroup(selectedIndex) : null; + } + Iterator rowsIterator = inventoryRows.iterator(); rowsIterator.next(); // Ignore the first row, since it's the header. UIWidget row = rowsIterator.next(); From 16ece126f75ebd9d6b9af8fa4846a44195cb53eb Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Sun, 6 Apr 2025 12:10:51 +0100 Subject: [PATCH 3/3] fix: fix crash on shield removal --- .../src/main/java/org/destinationsol/game/ship/SolShip.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engine/src/main/java/org/destinationsol/game/ship/SolShip.java b/engine/src/main/java/org/destinationsol/game/ship/SolShip.java index c556a8dc4..2252348d4 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/SolShip.java +++ b/engine/src/main/java/org/destinationsol/game/ship/SolShip.java @@ -580,6 +580,10 @@ public boolean maybeUnequip(SolGame game, SolItem item, boolean unequip) { } public boolean maybeUnequip(SolGame game, SolItem item, boolean secondarySlot, boolean unequip) { + if (item == null) { + return false; + } + if (!secondarySlot) { if (myHull.getEngine() == item) { if (unequip) {