From 5d5f9e8f7addacbe4935df2624e0116ddcd949a6 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Fri, 20 Feb 2026 18:18:32 +0100 Subject: [PATCH 01/70] New translations en_us.json (Japanese) --- .../create_mobile_packages/lang/ja_jp.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 4f132812..7b1b54ed 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -54,19 +54,19 @@ "create_mobile_packages.ponder.port_to_port.text_5": "この機能は設定ファイルで無効にすることができます", "tooltip.create_mobile_packages.robo_bee.package_transport": "オフハンドに小包を持って使用すると、小包がロボビーと一緒に送られます。", "tooltip.create_mobile_packages.robo_bee.robo_bee": "使用するとロボビーを配置できるアイテム。ビーポートからの搬送に必要です。", - "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", - "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", - "tooltip.create_mobile_packages.network.remove_player": "Remove Player", - "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", - "tooltip.create_mobile_packages.network.leave": "Leave Network", - "tooltip.create_mobile_packages.network.settings": "Network Settings", + "tooltip.create_mobile_packages.bee_port.jade.network": "ネットワーク: %1$s", + "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "あなたはこのネットワークに属しています", + "tooltip.create_mobile_packages.network.remove_player": "プレイヤーを削除", + "tooltip.create_mobile_packages.network.add_yourself": "自分を追加", + "tooltip.create_mobile_packages.network.leave": "ネットワークから退出する", + "tooltip.create_mobile_packages.network.settings": "ネットワークの設定", "item.create_mobile_packages.mobile_packager": "モバイル梱包機", "item.create_mobile_packages.mobile_packager.tooltip.summary": "移動中にアイテムを梱包します", "item.create_mobile_packages.mobile_packager.tooltip.condition1": "使ったとき", "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "小包を作成するメニューを開きます", "item.create_mobile_packages.mobile_packager.tooltip.condition2": "スニークして使ったとき", "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "小包を編集するメニューを開きます", - "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", - "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "config.jade.plugin_create_mobile_packages.bee_port": "ビーポートの情報", + "create_mobile_packages.network.players": "ネットワーク内のプレイヤー:", + "create_mobile_packages.network.owner": "所有者: %1$s" } From 976989d4250666a2a652c13e0db6c70ca2917031 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Fri, 20 Feb 2026 18:18:33 +0100 Subject: [PATCH 02/70] New translations en_us.json (Polish) --- .../create_mobile_packages/lang/pl_pl.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index 48ab832c..3ff867ef 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -12,15 +12,15 @@ "item.create_mobile_packages.portable_stock_ticker.tooltip.behaviour2": "Przenośny Licznik Zapasów otworzy mobilne menu magazino", "item.create_mobile_packages.robo_bee": "Robo-Pszczoła", "entity.create_mobile_packages.robo_bee": "Robo-Pszczoła", - "entity.create_mobile_packages.robo_bee.no_valid_target": "No valid target", + "entity.create_mobile_packages.robo_bee.no_valid_target": "Brak prawidłowego celu", "create_mobile_packages.bee_port.send_items": "Wysłano Przedmioty do Gracza", "create_mobile_packages.bee_port.screen.arrival_time": "Robo-Pszcól przybędzie za: %1$ss", "create_mobile_packages.bee_port.screen.no_bee_on_travel": "Niema Robo-Pszcól w Podróży", "create_mobile_packages.display_source.bee_count": "Ilość Robo-Pszczół", "create_mobile_packages.display_source.bee_eta": "Robo-Pszczoła ETA", "create_mobile_packages.robo_entity.death": "Robo-Pszczoła umarła w X %1$s Y %2$s Z %3$s z Paczką dla %4$s", - "create_mobile_packages.toast.robo_bee_on_the_way": "Robo Bee on the way!", - "create_mobile_packages.toast.eta": "%1$s seconds remaining", + "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Pszczół w drodze!", + "create_mobile_packages.toast.eta": "Pozostało %1$s sekund", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Otwórz Przenośny Licznik Zapasów", "create_mobile_packages.ponder.robo_bee_port.header": "Port Robo-Pszczół", "create_mobile_packages.ponder.robo_bee_port.text_1": "Port Robo-Pszczół może wysłać Paczkę do gracza.", @@ -29,15 +29,15 @@ "create_mobile_packages.ponder.robo_bee_port.text_4": "Port będzie teraz wysyłał Robo-Pszcól do gracza, którego imię i nazwisko pokrywa się z adresem podanym w paczce.", "create_mobile_packages.ponder.pull_from_chest.header": "Wyciągnij z Pojemnika", "create_mobile_packages.ponder.pull_from_chest.text_1": "Włóż paczkę do pojemnika.", - "create_mobile_packages.ponder.pull_from_chest.text_2": "The Port will pull the package from any adjacent inventory and take it in.", - "create_mobile_packages.ponder.simple_setup.header": "Simple Setup", - "create_mobile_packages.ponder.simple_setup.text_1": "This is a basic setup for automated package handling.", - "create_mobile_packages.ponder.simple_setup.text_2": "Place a Chest or any other storage.", - "create_mobile_packages.ponder.simple_setup.text_3": "Place a Packager facing the storage to create packages.", - "create_mobile_packages.ponder.simple_setup.text_4": "Connect a Stocklink to the Packager to connect it to a logistics network.", - "create_mobile_packages.ponder.simple_setup.text_5": "Finally, place a Robo Bee Port to send packages.", + "create_mobile_packages.ponder.pull_from_chest.text_2": "Port ściągnie paczkę z dowolnego sąsiedniego magazynu i przyjmie ją.", + "create_mobile_packages.ponder.simple_setup.header": "Prosta konfiguracja", + "create_mobile_packages.ponder.simple_setup.text_1": "To podstawowa konfiguracja do automatycznej obsługi przesyłek.", + "create_mobile_packages.ponder.simple_setup.text_2": "Umieść skrzynię lub inny schowek.", + "create_mobile_packages.ponder.simple_setup.text_3": "Aby utworzyć paczki, należy umieścić Pakowaczkę naprzeciwko magazynu.", + "create_mobile_packages.ponder.simple_setup.text_4": "Połącz Łącznik magazynowy z Pakowacz, aby połączyć go z siecią logistyczną.", + "create_mobile_packages.ponder.simple_setup.text_5": "Na koniec umieść Port Robo-Pszczół, aby wysyłać paczki.", "create_mobile_packages.ponder.push_to_chest.header": "Push to Chest", - "create_mobile_packages.ponder.push_to_chest.text_1": "The Robo Bee Port can push it to adjacent inventories when powered by redstone.", + "create_mobile_packages.ponder.push_to_chest.text_1": "Port Robo-Pszczół może przenieść je do sąsiednich ekwipunków, gdy jest zasilany czerwonym kamieniem.", "create_mobile_packages.ponder.push_to_chest.text_2": "Make sure the Port is powered by redstone.", "create_mobile_packages.ponder.push_to_chest.text_3": "The package will be pushed into any adjacent inventory, such as a chest.", "create_mobile_packages.ponder.crafter_setup.header": "Crafter Setup", From 64c24a5f113dae6c8667026481d5c1b340a00bcf Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Fri, 20 Feb 2026 18:18:34 +0100 Subject: [PATCH 03/70] New translations en_us.json (Russian) --- .../create_mobile_packages/lang/ru_ru.json | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index 4db4d7d8..bf166fda 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -54,19 +54,19 @@ "create_mobile_packages.ponder.port_to_port.text_5": "Эта функция может быть выключена в настройках.", "tooltip.create_mobile_packages.robo_bee.package_transport": "Если держать коробку не в ведущей руке, она может быть отправлена при помощи пчелодрона.", "tooltip.create_mobile_packages.robo_bee.robo_bee": "Предмет для создания Пчёлодрона. Необходим в Дронопорте для отправки посылок.", - "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", - "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", - "tooltip.create_mobile_packages.network.remove_player": "Remove Player", - "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", - "tooltip.create_mobile_packages.network.leave": "Leave Network", - "tooltip.create_mobile_packages.network.settings": "Network Settings", + "tooltip.create_mobile_packages.bee_port.jade.network": "Сеть: %1$s", + "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Вы часть этой сети", + "tooltip.create_mobile_packages.network.remove_player": "Выгнать игрока", + "tooltip.create_mobile_packages.network.add_yourself": "Добавить себя", + "tooltip.create_mobile_packages.network.leave": "Выйти из сети", + "tooltip.create_mobile_packages.network.settings": "Настройки сети", "item.create_mobile_packages.mobile_packager": "Портативный упаковщик", - "item.create_mobile_packages.mobile_packager.tooltip.summary": "Package items on the go", - "item.create_mobile_packages.mobile_packager.tooltip.condition1": "When used", - "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "Opens a menu to create Packages", - "item.create_mobile_packages.mobile_packager.tooltip.condition2": "When sneak used", - "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Opens a menu to modify Packages", + "item.create_mobile_packages.mobile_packager.tooltip.summary": "Упаковывает предметы на ходу", + "item.create_mobile_packages.mobile_packager.tooltip.condition1": "Когда используется", + "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "Открывает меню создания посылки", + "item.create_mobile_packages.mobile_packager.tooltip.condition2": "Когда shift нажат", + "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Открывает меню изменения посылки", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", - "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.players": "Игроки в сети:", + "create_mobile_packages.network.owner": "Владелец: %1$s" } From 45bdced3faadd7bd057b3899e705c1959f95c30a Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Fri, 20 Feb 2026 18:18:36 +0100 Subject: [PATCH 04/70] New translations en_us.json (Swedish) --- .../create_mobile_packages/lang/sv_se.json | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 8c037a4e..797affff 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -12,15 +12,15 @@ "item.create_mobile_packages.portable_stock_ticker.tooltip.behaviour2": "Den Portabla Lagerinikatorn kommer att öppna en portabel Lagerhanterar meny", "item.create_mobile_packages.robo_bee": "Robot Bi", "entity.create_mobile_packages.robo_bee": "Robot Bi", - "entity.create_mobile_packages.robo_bee.no_valid_target": "No valid target", + "entity.create_mobile_packages.robo_bee.no_valid_target": "Inget giltigt mål", "create_mobile_packages.bee_port.send_items": "Skickat Föremål till Spelaren", "create_mobile_packages.bee_port.screen.arrival_time": "Robot Biet kommer att anlända om: %1$ss", "create_mobile_packages.bee_port.screen.no_bee_on_travel": "Inga Robot Bi i Rörelse", "create_mobile_packages.display_source.bee_count": "Mängd Robot Bi", "create_mobile_packages.display_source.bee_eta": "Robot Bi ETA", "create_mobile_packages.robo_entity.death": "Robot Bi dog vid X %1$s Y %2$s Z %3$s med Packet för %4$s", - "create_mobile_packages.toast.robo_bee_on_the_way": "Robo Bee on the way!", - "create_mobile_packages.toast.eta": "%1$s seconds remaining", + "create_mobile_packages.toast.robo_bee_on_the_way": "Robot Bi på väg!", + "create_mobile_packages.toast.eta": "%1$s sekunder kvar", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öppna Portabel Lagerindikator", "create_mobile_packages.ponder.robo_bee_port.header": "Robot Bi Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Robot Bi Porten kan skicka Paket till Spelare.", @@ -54,19 +54,19 @@ "create_mobile_packages.ponder.port_to_port.text_5": "Denna funktion kan stängas av i konfigurationsfilerna.", "tooltip.create_mobile_packages.robo_bee.package_transport": "När man håller ett packet i sin sekundära han kommer den skickas med Robot Biet.", "tooltip.create_mobile_packages.robo_bee.robo_bee": "Föremål att skapa ett Robot Bi. Används i Robot Bi Portar att skicka paket.", - "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", - "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", - "tooltip.create_mobile_packages.network.remove_player": "Remove Player", - "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", - "tooltip.create_mobile_packages.network.leave": "Leave Network", - "tooltip.create_mobile_packages.network.settings": "Network Settings", - "item.create_mobile_packages.mobile_packager": "Mobile Packager", - "item.create_mobile_packages.mobile_packager.tooltip.summary": "Package items on the go", - "item.create_mobile_packages.mobile_packager.tooltip.condition1": "When used", - "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "Opens a menu to create Packages", - "item.create_mobile_packages.mobile_packager.tooltip.condition2": "When sneak used", - "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Opens a menu to modify Packages", - "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", - "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "tooltip.create_mobile_packages.bee_port.jade.network": "Nätverk: %1$s", + "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Du är en del av detta nätverk", + "tooltip.create_mobile_packages.network.remove_player": "Ta bort Spelare", + "tooltip.create_mobile_packages.network.add_yourself": "Lägg till dig själv", + "tooltip.create_mobile_packages.network.leave": "Lämna Nätverk", + "tooltip.create_mobile_packages.network.settings": "Nätverksinställningar", + "item.create_mobile_packages.mobile_packager": "Portabel Packare", + "item.create_mobile_packages.mobile_packager.tooltip.summary": "Packa föremål på språng", + "item.create_mobile_packages.mobile_packager.tooltip.condition1": "När använd", + "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "Öppnar en meny för att skapa Packet", + "item.create_mobile_packages.mobile_packager.tooltip.condition2": "När använd medans man smyger", + "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öppnar en meny att ändra Paket", + "config.jade.plugin_create_mobile_packages.bee_port": "Robot Bi Ports Information", + "create_mobile_packages.network.players": "Spelare i Nätverk: ", + "create_mobile_packages.network.owner": "Ägare: %1$s" } From c16d15cfb91614c5a4d6c4409588d730be5aaa3d Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Fri, 20 Feb 2026 18:18:37 +0100 Subject: [PATCH 05/70] New translations en_us.json (Chinese Simplified) --- .../create_mobile_packages/lang/zh_cn.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 5e4ca092..3a676b28 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -54,19 +54,19 @@ "create_mobile_packages.ponder.port_to_port.text_5": "这个功能可以在配置文件中禁用。", "tooltip.create_mobile_packages.robo_bee.package_transport": "运输蜂可以运输处于副手上的包裹。", "tooltip.create_mobile_packages.robo_bee.robo_bee": "运输蜂的物品形式。运输蜂停泊港发送包裹时需要使用。", - "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", - "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", - "tooltip.create_mobile_packages.network.remove_player": "Remove Player", - "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", - "tooltip.create_mobile_packages.network.leave": "Leave Network", - "tooltip.create_mobile_packages.network.settings": "Network Settings", + "tooltip.create_mobile_packages.bee_port.jade.network": "网络:%1$s", + "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "你是此网络的成员之一", + "tooltip.create_mobile_packages.network.remove_player": "移除玩家", + "tooltip.create_mobile_packages.network.add_yourself": "添加你自己", + "tooltip.create_mobile_packages.network.leave": "离开网络", + "tooltip.create_mobile_packages.network.settings": "网络设置", "item.create_mobile_packages.mobile_packager": "手持式打包工具", "item.create_mobile_packages.mobile_packager.tooltip.summary": "随时随地,打包物品", "item.create_mobile_packages.mobile_packager.tooltip.condition1": "使用时", "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "打开创建包裹界面", "item.create_mobile_packages.mobile_packager.tooltip.condition2": "潜行并使用时", "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "打开编辑包裹界面", - "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", - "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "config.jade.plugin_create_mobile_packages.bee_port": "运输蜂停泊港信息", + "create_mobile_packages.network.players": "网络中的玩家:", + "create_mobile_packages.network.owner": "所有者:%1$s" } From ea5563c8d4555c28c3ba469e0794eba7c38f83c8 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Fri, 20 Feb 2026 18:30:59 +0100 Subject: [PATCH 06/70] New translations en_us.json (Swedish) --- .../create_mobile_packages/lang/sv_se.json | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 272bf176..797affff 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -2,14 +2,14 @@ "itemGroup.create_mobile_packages": "Create: Mobila Packet", "block.create_mobile_packages.bee_port": "Robot Bi Port", "item.create_mobile_packages.bee_port": "Robot Bi Port", - "item.create_mobile_packages.portable_stock_ticker": "Portabel Lagervakt", - "item.create_mobile_packages.portable_stock_ticker.screen_title": "Portabel Lagervakt", + "item.create_mobile_packages.portable_stock_ticker": "Portabel Lagerindikator", + "item.create_mobile_packages.portable_stock_ticker.screen_title": "Portabel Lagerindikator", "item.create_mobile_packages.portable_stock_ticker.not_linked": "Inte ansluten till ett Nätverk", - "item.create_mobile_packages.portable_stock_ticker.tooltip.summary": "En portabel Lagervakt", - "item.create_mobile_packages.portable_stock_ticker.tooltip.condition1": "När smyg tryckt på en Lagerlänk eller Lagervakt", - "item.create_mobile_packages.portable_stock_ticker.tooltip.behaviour1": "Den portabla Lagervakten kommer att anslutas till Nätverket", + "item.create_mobile_packages.portable_stock_ticker.tooltip.summary": "En portabel Lagerindikator", + "item.create_mobile_packages.portable_stock_ticker.tooltip.condition1": "När smyg tryckt på en Lagerlänk eller Lagerindikator", + "item.create_mobile_packages.portable_stock_ticker.tooltip.behaviour1": "Den Portabla Lagerinikatorn kommer att anslutas till Nätverket", "item.create_mobile_packages.portable_stock_ticker.tooltip.condition2": "När använd", - "item.create_mobile_packages.portable_stock_ticker.tooltip.behaviour2": "Den portabla Lagervakten kommer att öppna en portabel Lagervakts meny", + "item.create_mobile_packages.portable_stock_ticker.tooltip.behaviour2": "Den Portabla Lagerinikatorn kommer att öppna en portabel Lagerhanterar meny", "item.create_mobile_packages.robo_bee": "Robot Bi", "entity.create_mobile_packages.robo_bee": "Robot Bi", "entity.create_mobile_packages.robo_bee.no_valid_target": "Inget giltigt mål", @@ -21,39 +21,39 @@ "create_mobile_packages.robo_entity.death": "Robot Bi dog vid X %1$s Y %2$s Z %3$s med Packet för %4$s", "create_mobile_packages.toast.robo_bee_on_the_way": "Robot Bi på väg!", "create_mobile_packages.toast.eta": "%1$s sekunder kvar", - "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öppna Portabel Lagervakt", + "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öppna Portabel Lagerindikator", "create_mobile_packages.ponder.robo_bee_port.header": "Robot Bi Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Robot Bi Porten kan skicka Paket till Spelare.", - "create_mobile_packages.ponder.robo_bee_port.text_2": "Placera ett paket med en adress som matchar Spelarens namn i Robot Bi Porten.", - "create_mobile_packages.ponder.robo_bee_port.text_3": "Placera Robot Biet i föremålsplatsen för Robot Bi inuti i Robot Bi Porten.", - "create_mobile_packages.ponder.robo_bee_port.text_4": "Porten kommer nu att skicka Robot Biet till Spelaren som matchar adressen i Paketet.", + "create_mobile_packages.ponder.robo_bee_port.text_2": "Placera ett paket med en adress som machar Spelarens namn i Robot Bi Porten.", + "create_mobile_packages.ponder.robo_bee_port.text_3": "Placera Robot Biet i föremålsplatsen för Robot Bi innut i Robot Bi Porten.", + "create_mobile_packages.ponder.robo_bee_port.text_4": "Porten kommer nu att skicka Robot Biet till Spelaren som machar adressen i Paketet.", "create_mobile_packages.ponder.pull_from_chest.header": "Dra ut från en Kista", - "create_mobile_packages.ponder.pull_from_chest.text_1": "Placera paketet inuti Kistan.", + "create_mobile_packages.ponder.pull_from_chest.text_1": "Placera packetet innuti Kistan.", "create_mobile_packages.ponder.pull_from_chest.text_2": "Porten hämtar paketet från alla angränsande lådor och tar in det.", "create_mobile_packages.ponder.simple_setup.header": "Enkel installation", "create_mobile_packages.ponder.simple_setup.text_1": "Detta en enkel installation för automatisk paket hantering.", "create_mobile_packages.ponder.simple_setup.text_2": "Sätt ut en Kista eller någon annan låda.", "create_mobile_packages.ponder.simple_setup.text_3": "Sätt ut en Förpackare mot lådan för att skapa paket.", - "create_mobile_packages.ponder.simple_setup.text_4": "Anslut en Lagerlänk till Paketeraren för att ansluta den till ett logistiskt nätverk.", - "create_mobile_packages.ponder.simple_setup.text_5": "Slutligen, Sätt ut ett Robot Bi Port för att skicka paket.", - "create_mobile_packages.ponder.push_to_chest.header": "Förflyttning till Kista", + "create_mobile_packages.ponder.simple_setup.text_4": "Anslut en Lagerlänk till Förpackaren för att ansluta den till ett logistiskt nätverk.", + "create_mobile_packages.ponder.simple_setup.text_5": "Äntligen, Sätt ut ett Robot Bi Port för att skicka paket.", + "create_mobile_packages.ponder.push_to_chest.header": "Tryck till Kistan", "create_mobile_packages.ponder.push_to_chest.text_1": "Robot Bi Porten kan trycka dem till närliggande lådor när den är driven av rödsten.", "create_mobile_packages.ponder.push_to_chest.text_2": "Se till att Porten är driven av rödsten.", "create_mobile_packages.ponder.push_to_chest.text_3": "Paketet kommer att bli tryckt in i vilken närliggande lådor som hälst, som till exempel en Kista.", - "create_mobile_packages.ponder.crafter_setup.header": "Tillverknings uppsättning", + "create_mobile_packages.ponder.crafter_setup.header": "Tillverkar Installation", "create_mobile_packages.ponder.crafter_setup.text_1": "Detta är en inställning för automatiserat tillverkning med Robot Bi Porten.", - "create_mobile_packages.ponder.crafter_setup.text_2": "Ompaketerare delar upp paketet i flera mindre paket.", + "create_mobile_packages.ponder.crafter_setup.text_2": "Ompaketeraren delar upp paketet i flera mindre paket.", "create_mobile_packages.ponder.crafter_setup.text_3": "Paketen skickas genom en Kana till Paketeraren.", "create_mobile_packages.ponder.crafter_setup.text_4": "Paketeraren är ansluten till ett system med 3x3 Mekaniska tillverkare, vilket tillverkar föremålen.", "create_mobile_packages.ponder.crafter_setup.text_5": "Den tillverkade föremålen är lagda i en Kista.", "create_mobile_packages.ponder.port_to_port.header": "Port till Port", "create_mobile_packages.ponder.port_to_port.text_1": "Robot Bi Porten kan också skicka paket till andra Portar.", "create_mobile_packages.ponder.port_to_port.text_2": "Sätt en adress i destinations Porten.", - "create_mobile_packages.ponder.port_to_port.text_3": "Set samma adress som i packeterarens adress och lägg in packetet i den första Porten.", + "create_mobile_packages.ponder.port_to_port.text_3": "Set samma adress som i packetes adress och lägg in packetet i den första Porten.", "create_mobile_packages.ponder.port_to_port.text_4": "Paketet kommer att skickas från en Port till en annan.", "create_mobile_packages.ponder.port_to_port.text_5": "Denna funktion kan stängas av i konfigurationsfilerna.", - "tooltip.create_mobile_packages.robo_bee.package_transport": "När man håller ett packet i sin andra hand kommer den skickas med Robot Biet.", - "tooltip.create_mobile_packages.robo_bee.robo_bee": "Föremål att skapa ett Robot Bi. Behövs i Robot Bi Porten för att skicka paket.", + "tooltip.create_mobile_packages.robo_bee.package_transport": "När man håller ett packet i sin sekundära han kommer den skickas med Robot Biet.", + "tooltip.create_mobile_packages.robo_bee.robo_bee": "Föremål att skapa ett Robot Bi. Används i Robot Bi Portar att skicka paket.", "tooltip.create_mobile_packages.bee_port.jade.network": "Nätverk: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Du är en del av detta nätverk", "tooltip.create_mobile_packages.network.remove_player": "Ta bort Spelare", From 3717b589869a627f69309eb6f1aadce2e4fb07ce Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:00:18 +0100 Subject: [PATCH 07/70] remove spamming debug log --- .../create_mobile_packages/network_settings/NetworkHelper.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/network_settings/NetworkHelper.java b/src/main/java/de/theidler/create_mobile_packages/network_settings/NetworkHelper.java index e005e8ad..bc9edd7c 100644 --- a/src/main/java/de/theidler/create_mobile_packages/network_settings/NetworkHelper.java +++ b/src/main/java/de/theidler/create_mobile_packages/network_settings/NetworkHelper.java @@ -27,9 +27,6 @@ public class NetworkHelper { public static @Nullable IExtendedLogisticsNetwork getExtendedLogisticsNetwork(@Nullable LogisticsNetwork logisticsNetwork) { if (logisticsNetwork == null) return null; - // Debugging to console - CreateMobilePackages.LOGGER.debug("Checking network: " + logisticsNetwork.getClass().getName()); - if (logisticsNetwork instanceof IExtendedLogisticsNetwork extendedLogisticsNetwork) { return extendedLogisticsNetwork; } From c6569373046f98ff084863de4282ec1f1c94b99f Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:13 +0100 Subject: [PATCH 08/70] New translations en_us.json (French) --- .../assets/create_mobile_packages/lang/fr_fr.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json index 7bd33ed1..dda8f335 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json +++ b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Ouvre un menu pour modifier un colis", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 28c57411593fc0eb2d6486d6ac52727e6b5a2826 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:14 +0100 Subject: [PATCH 09/70] New translations en_us.json (German) --- .../assets/create_mobile_packages/lang/de_de.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index 7af1a7aa..0e04d29d 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öffnet ein Menü zum Verändern von Päckchen", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 6f9fdbeca3813a8bcc53a7115d0b2943b4fa67a9 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:15 +0100 Subject: [PATCH 10/70] New translations en_us.json (Japanese) --- .../assets/create_mobile_packages/lang/ja_jp.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 7b1b54ed..29d71a37 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "小包を編集するメニューを開きます", "config.jade.plugin_create_mobile_packages.bee_port": "ビーポートの情報", "create_mobile_packages.network.players": "ネットワーク内のプレイヤー:", - "create_mobile_packages.network.owner": "所有者: %1$s" + "create_mobile_packages.network.owner": "所有者: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 87b622d31317cb4fbdf5767fe902a0e9baae403c Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:16 +0100 Subject: [PATCH 11/70] New translations en_us.json (Polish) --- .../assets/create_mobile_packages/lang/pl_pl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index 3ff867ef..e95615bd 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Opens a menu to modify Packages", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 284f02e3dc208dfa294c6ca36873a5c07c287b0c Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:17 +0100 Subject: [PATCH 12/70] New translations en_us.json (Russian) --- .../assets/create_mobile_packages/lang/ru_ru.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index bf166fda..e9076bbe 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Открывает меню изменения посылки", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Игроки в сети:", - "create_mobile_packages.network.owner": "Владелец: %1$s" + "create_mobile_packages.network.owner": "Владелец: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 786bd3ab71344ec86e891748f8eab98332c161c0 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:18 +0100 Subject: [PATCH 13/70] New translations en_us.json (Swedish) --- .../assets/create_mobile_packages/lang/sv_se.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 797affff..546e1de8 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öppnar en meny att ändra Paket", "config.jade.plugin_create_mobile_packages.bee_port": "Robot Bi Ports Information", "create_mobile_packages.network.players": "Spelare i Nätverk: ", - "create_mobile_packages.network.owner": "Ägare: %1$s" + "create_mobile_packages.network.owner": "Ägare: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From bc609c0b4bbf4bd9e41e288693e49d46a885db55 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:19 +0100 Subject: [PATCH 14/70] New translations en_us.json (Chinese Simplified) --- .../assets/create_mobile_packages/lang/zh_cn.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 3a676b28..9d7d0802 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "打开编辑包裹界面", "config.jade.plugin_create_mobile_packages.bee_port": "运输蜂停泊港信息", "create_mobile_packages.network.players": "网络中的玩家:", - "create_mobile_packages.network.owner": "所有者:%1$s" + "create_mobile_packages.network.owner": "所有者:%1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 391442053e00dfb905e32c62cf24919508dc8555 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:49:20 +0100 Subject: [PATCH 15/70] New translations en_us.json (Portuguese, Brazilian) --- .../assets/create_mobile_packages/lang/pt_br.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json index 7c781625..c6f28ad1 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json @@ -68,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Abre um menu para modificar Pacotes", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 40689d9bca441add004b8578ecd4cbbaf19b7871 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:56:37 +0100 Subject: [PATCH 16/70] Fix Translation --- .../assets/create_mobile_packages/lang/de_de.json | 8 ++------ .../assets/create_mobile_packages/lang/en_us.json | 1 + .../assets/create_mobile_packages/lang/fr_fr.json | 8 ++------ .../assets/create_mobile_packages/lang/ja_jp.json | 8 ++------ .../assets/create_mobile_packages/lang/pl_pl.json | 8 ++------ .../assets/create_mobile_packages/lang/pt_br.json | 8 ++------ .../assets/create_mobile_packages/lang/ru_ru.json | 8 ++------ .../assets/create_mobile_packages/lang/sv_se.json | 8 ++------ .../assets/create_mobile_packages/lang/zh_cn.json | 8 ++------ 9 files changed, 17 insertions(+), 48 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index 0e04d29d..7df26f76 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Biene auf dem Weg!", "create_mobile_packages.toast.eta": "%1$s Sekunden verbleibend", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öffne den Mobilen Lagerticker", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robo-Bienen Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Der Robo-Bienen Port kann Pakete an Spieler senden.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Platziere ein Paket mit einer Adresse, die dem Namen des Spielers entspricht in den Robo-Bienen Port.", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öffnet ein Menü zum Verändern von Päckchen", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "Owner: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/en_us.json b/src/main/resources/assets/create_mobile_packages/lang/en_us.json index 862a721f..a0bdfcf9 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/en_us.json +++ b/src/main/resources/assets/create_mobile_packages/lang/en_us.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo Bee on the way!", "create_mobile_packages.toast.eta": "%1$s seconds remaining", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Open Portable Stock Ticker", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robo Bee Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "The Robo Bee Port can send a Package to a Player.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Place a package with an address matching the Player's name in the Robo Bee Port.", diff --git a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json index dda8f335..6cca584e 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json +++ b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robeille est en chemin !", "create_mobile_packages.toast.eta": "%1$s secondes restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Ouvrir le Téléscripteur de Stock Portable", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Port de Robeille", "create_mobile_packages.ponder.robo_bee_port.text_1": "Le Port de Robeille peut envoyer des colis à un joueur.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Placez un colis avec une adresse correspondant au nom du joueur dans le Port de Robeille.", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Ouvre un menu pour modifier un colis", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "Owner: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 29d71a37..44353305 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "ロボビーが間もなく到着します!", "create_mobile_packages.toast.eta": "到着まで残り%1$s秒", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "所持しているポータブルストックティッカーの画面を開く", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "ビーポート", "create_mobile_packages.ponder.robo_bee_port.text_1": "ロボビーはプレイヤーに小包を送ることができます", "create_mobile_packages.ponder.robo_bee_port.text_2": "プレイヤーと同じ名前のアドレスが設定された小包を配置してください", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "小包を編集するメニューを開きます", "config.jade.plugin_create_mobile_packages.bee_port": "ビーポートの情報", "create_mobile_packages.network.players": "ネットワーク内のプレイヤー:", - "create_mobile_packages.network.owner": "所有者: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "所有者: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index e95615bd..b7fd99f5 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Pszczół w drodze!", "create_mobile_packages.toast.eta": "Pozostało %1$s sekund", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Otwórz Przenośny Licznik Zapasów", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Port Robo-Pszczół", "create_mobile_packages.ponder.robo_bee_port.text_1": "Port Robo-Pszczół może wysłać Paczkę do gracza.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Umieść przesyłkę z adresem odpowiadającym imieniu Gracza w Porcie Robo-Pszcól.", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Opens a menu to modify Packages", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "Owner: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json index c6f28ad1..f53b6dfe 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Abelha Robô a caminho!", "create_mobile_packages.toast.eta": "%1$s segundos restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Abrir o Telégrafo de Estoque Portátil", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Porto de Abelhas Robô", "create_mobile_packages.ponder.robo_bee_port.text_1": "Porto de Abelhas Robô pode enviar Pacotes ao Jogador.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Coloque um pacote com o endereço correspondente ao nome do jogador no Porto de Abelhas Robô.", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Abre um menu para modificar Pacotes", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "Owner: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index e9076bbe..0d5ba96d 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Пчелодрон в пути", "create_mobile_packages.toast.eta": "Ожидайте %1$s сек", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Открыть складскую сеть", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Размышляем над пчелопортами", "create_mobile_packages.ponder.robo_bee_port.text_1": "Пчелопорт может быть использован чтобы отправить посылку прямо к игроку.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Поместите посылку, у которой адрес совпадает с ником игрока в печлопорт.", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Открывает меню изменения посылки", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Игроки в сети:", - "create_mobile_packages.network.owner": "Владелец: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "Владелец: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 546e1de8..37ffbb77 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robot Bi på väg!", "create_mobile_packages.toast.eta": "%1$s sekunder kvar", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öppna Portabel Lagerindikator", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robot Bi Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Robot Bi Porten kan skicka Paket till Spelare.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Placera ett paket med en adress som machar Spelarens namn i Robot Bi Porten.", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öppnar en meny att ändra Paket", "config.jade.plugin_create_mobile_packages.bee_port": "Robot Bi Ports Information", "create_mobile_packages.network.players": "Spelare i Nätverk: ", - "create_mobile_packages.network.owner": "Ägare: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "Ägare: %1$s" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 9d7d0802..0249cf0c 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "运输蜂正在运送货物!", "create_mobile_packages.toast.eta": "剩余时间:%1$s 秒", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "打开便携式仓库管理器", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "运输蜂停泊港", "create_mobile_packages.ponder.robo_bee_port.text_1": "运输蜂停泊港可将包裹送至玩家。", "create_mobile_packages.ponder.robo_bee_port.text_2": "将地址为玩家名的包裹放入运输蜂停泊港内。", @@ -68,10 +69,5 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "打开编辑包裹界面", "config.jade.plugin_create_mobile_packages.bee_port": "运输蜂停泊港信息", "create_mobile_packages.network.players": "网络中的玩家:", - "create_mobile_packages.network.owner": "所有者:%1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "create_mobile_packages.network.owner": "所有者:%1$s" } From 659b946e9de6b25f81170adb3c227bc54f5b40f1 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:13 +0100 Subject: [PATCH 17/70] New translations en_us.json (French) --- .../assets/create_mobile_packages/lang/fr_fr.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json index 6cca584e..dda8f335 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json +++ b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robeille est en chemin !", "create_mobile_packages.toast.eta": "%1$s secondes restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Ouvrir le Téléscripteur de Stock Portable", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Port de Robeille", "create_mobile_packages.ponder.robo_bee_port.text_1": "Le Port de Robeille peut envoyer des colis à un joueur.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Placez un colis avec une adresse correspondant au nom du joueur dans le Port de Robeille.", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Ouvre un menu pour modifier un colis", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 4d50a5ef1846e982190d1f20da4cce433f67fb61 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:14 +0100 Subject: [PATCH 18/70] New translations en_us.json (German) --- .../assets/create_mobile_packages/lang/de_de.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index 7df26f76..0e04d29d 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Biene auf dem Weg!", "create_mobile_packages.toast.eta": "%1$s Sekunden verbleibend", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öffne den Mobilen Lagerticker", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robo-Bienen Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Der Robo-Bienen Port kann Pakete an Spieler senden.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Platziere ein Paket mit einer Adresse, die dem Namen des Spielers entspricht in den Robo-Bienen Port.", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öffnet ein Menü zum Verändern von Päckchen", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From b5b9309cc03ec4e4712faff2e2af18c26a3f1a70 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:15 +0100 Subject: [PATCH 19/70] New translations en_us.json (Japanese) --- .../assets/create_mobile_packages/lang/ja_jp.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 44353305..29d71a37 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "ロボビーが間もなく到着します!", "create_mobile_packages.toast.eta": "到着まで残り%1$s秒", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "所持しているポータブルストックティッカーの画面を開く", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "ビーポート", "create_mobile_packages.ponder.robo_bee_port.text_1": "ロボビーはプレイヤーに小包を送ることができます", "create_mobile_packages.ponder.robo_bee_port.text_2": "プレイヤーと同じ名前のアドレスが設定された小包を配置してください", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "小包を編集するメニューを開きます", "config.jade.plugin_create_mobile_packages.bee_port": "ビーポートの情報", "create_mobile_packages.network.players": "ネットワーク内のプレイヤー:", - "create_mobile_packages.network.owner": "所有者: %1$s" + "create_mobile_packages.network.owner": "所有者: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From ce2ce118a4e6c09dfaaeffd279f13d586dee4be9 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:15 +0100 Subject: [PATCH 20/70] New translations en_us.json (Polish) --- .../assets/create_mobile_packages/lang/pl_pl.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index b7fd99f5..e95615bd 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Pszczół w drodze!", "create_mobile_packages.toast.eta": "Pozostało %1$s sekund", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Otwórz Przenośny Licznik Zapasów", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Port Robo-Pszczół", "create_mobile_packages.ponder.robo_bee_port.text_1": "Port Robo-Pszczół może wysłać Paczkę do gracza.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Umieść przesyłkę z adresem odpowiadającym imieniu Gracza w Porcie Robo-Pszcól.", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Opens a menu to modify Packages", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 0f31229e41ae099d101b7f26dc9c69982ba6524f Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:16 +0100 Subject: [PATCH 21/70] New translations en_us.json (Russian) --- .../assets/create_mobile_packages/lang/ru_ru.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index 0d5ba96d..e9076bbe 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Пчелодрон в пути", "create_mobile_packages.toast.eta": "Ожидайте %1$s сек", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Открыть складскую сеть", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Размышляем над пчелопортами", "create_mobile_packages.ponder.robo_bee_port.text_1": "Пчелопорт может быть использован чтобы отправить посылку прямо к игроку.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Поместите посылку, у которой адрес совпадает с ником игрока в печлопорт.", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Открывает меню изменения посылки", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Игроки в сети:", - "create_mobile_packages.network.owner": "Владелец: %1$s" + "create_mobile_packages.network.owner": "Владелец: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From c673c28749f21b666715eb50ec72acf55efd5add Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:17 +0100 Subject: [PATCH 22/70] New translations en_us.json (Swedish) --- .../assets/create_mobile_packages/lang/sv_se.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 37ffbb77..546e1de8 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robot Bi på väg!", "create_mobile_packages.toast.eta": "%1$s sekunder kvar", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öppna Portabel Lagerindikator", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robot Bi Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Robot Bi Porten kan skicka Paket till Spelare.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Placera ett paket med en adress som machar Spelarens namn i Robot Bi Porten.", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Öppnar en meny att ändra Paket", "config.jade.plugin_create_mobile_packages.bee_port": "Robot Bi Ports Information", "create_mobile_packages.network.players": "Spelare i Nätverk: ", - "create_mobile_packages.network.owner": "Ägare: %1$s" + "create_mobile_packages.network.owner": "Ägare: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 08235efda2df81d9f16d2e9bba3845ab7289acec Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:18 +0100 Subject: [PATCH 23/70] New translations en_us.json (Chinese Simplified) --- .../assets/create_mobile_packages/lang/zh_cn.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 0249cf0c..9d7d0802 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "运输蜂正在运送货物!", "create_mobile_packages.toast.eta": "剩余时间:%1$s 秒", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "打开便携式仓库管理器", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "运输蜂停泊港", "create_mobile_packages.ponder.robo_bee_port.text_1": "运输蜂停泊港可将包裹送至玩家。", "create_mobile_packages.ponder.robo_bee_port.text_2": "将地址为玩家名的包裹放入运输蜂停泊港内。", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "打开编辑包裹界面", "config.jade.plugin_create_mobile_packages.bee_port": "运输蜂停泊港信息", "create_mobile_packages.network.players": "网络中的玩家:", - "create_mobile_packages.network.owner": "所有者:%1$s" + "create_mobile_packages.network.owner": "所有者:%1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From 828077c7be1cd10f5c0919b509ce7b3769720a82 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 21:59:19 +0100 Subject: [PATCH 24/70] New translations en_us.json (Portuguese, Brazilian) --- .../assets/create_mobile_packages/lang/pt_br.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json index f53b6dfe..c6f28ad1 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json @@ -22,7 +22,6 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Abelha Robô a caminho!", "create_mobile_packages.toast.eta": "%1$s segundos restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Abrir o Telégrafo de Estoque Portátil", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Porto de Abelhas Robô", "create_mobile_packages.ponder.robo_bee_port.text_1": "Porto de Abelhas Robô pode enviar Pacotes ao Jogador.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Coloque um pacote com o endereço correspondente ao nome do jogador no Porto de Abelhas Robô.", @@ -69,5 +68,10 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Abre um menu para modificar Pacotes", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "create_mobile_packages": { + "keyinfo": { + "open_player_networks_screen": "Open Network Settings" + } + } } From a478da2f2ed7228082b98a1b6b9c49647668f46b Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sat, 21 Feb 2026 22:58:23 +0100 Subject: [PATCH 25/70] Add Trash Menu and associated functionality for Portable Stock Ticker --- .../index/CMPMenuTypes.java | 10 ++ .../index/CMPPackets.java | 3 +- .../PortableStockTickerScreen.java | 10 +- .../trash_menu/OpenTrashMenuPacket.java | 32 +++++ .../trash_menu/TrashMenu.java | 119 ++++++++++++++++++ .../trash_menu/TrashScreen.java | 19 +++ .../robo/RoboManager.java | 85 +++++++++++-- .../create_mobile_packages/lang/en_us.json | 3 +- 8 files changed, 267 insertions(+), 14 deletions(-) create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java index 78e53c64..5e495418 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java @@ -6,8 +6,11 @@ import de.theidler.create_mobile_packages.blocks.bee_port.BeePortMenu; import de.theidler.create_mobile_packages.blocks.bee_port.BeePortScreen; import de.theidler.create_mobile_packages.items.mobile_packager.*; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTicker; import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTickerMenu; import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTickerScreen; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.TrashMenu; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.TrashScreen; public class CMPMenuTypes { @@ -39,6 +42,13 @@ public class CMPMenuTypes { () -> MobilePackagerEditScreen::new ).register(); + public static final MenuEntry TRASH_MENU = + CreateMobilePackages.REGISTRATE.menu( + "trash_menu", + (trashMenuType, containerId, playerInventory) -> new TrashMenu(containerId, playerInventory, (PortableStockTicker) PortableStockTicker.find(playerInventory).getItem()), + () -> TrashScreen::new + ).register(); + public static void register() { } } diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java index da4d224c..ade78bc7 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java @@ -4,6 +4,7 @@ import de.theidler.create_mobile_packages.items.mobile_packager.ConfirmEditMenuPacket; import de.theidler.create_mobile_packages.items.mobile_packager.OpenEditMenuPacket; import de.theidler.create_mobile_packages.items.portable_stock_ticker.*; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.OpenTrashMenuPacket; import de.theidler.create_mobile_packages.network_settings.*; import de.theidler.create_mobile_packages.toast.RemoveAllToastsOnClientPacket; import de.theidler.create_mobile_packages.toast.RemoveToastOnClientPacket; @@ -30,7 +31,7 @@ public enum CMPPackets implements BasePacketPayload.PacketTypeProvider { MODIFY_NETWORK_LOCK_STATE(ModifyNetworkLockStatePackage.class, ModifyNetworkLockStatePackage.STREAM_CODEC), REQUEST_NETWORK_DATA(RequestNetworkDataPacket.class, RequestNetworkDataPacket.STREAM_CODEC), REQUEST_PLAYER_NETWORKS(RequestPlayerNetworksPacket.class, RequestPlayerNetworksPacket.STREAM_CODEC), - + OPEN_TRASH_MENU(OpenTrashMenuPacket.class, OpenTrashMenuPacket.STREAM_CODEC), // Server to Client BIG_ITEM_STACK_LIST(GenericStackListPacket.class, GenericStackListPacket.STREAM_CODEC), diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java index 4c5201f6..5c1d8b20 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java @@ -12,13 +12,16 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrderWithCrafts; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import de.theidler.create_mobile_packages.CreateMobilePackages; import de.theidler.create_mobile_packages.compat.Mods; import de.theidler.create_mobile_packages.compat.jei.CMPJEI; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.OpenTrashMenuPacket; import net.createmod.catnip.animation.LerpedFloat; import net.createmod.catnip.data.Couple; import net.createmod.catnip.data.Pair; @@ -57,7 +60,6 @@ import javax.annotation.Nullable; import java.util.*; -import java.util.Optional; public class PortableStockTickerScreen extends AbstractSimiContainerScreen implements OrderProvider, CategoriesProvider { @@ -67,6 +69,8 @@ public class PortableStockTickerScreen extends AbstractSimiContainerScreen CatnipServices.NETWORK.sendToServer(OpenTrashMenuPacket.INSTANCE)); + addRenderableWidget(trashMenuButton); } private Couple getHoveredSlot(int x, int y) { diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java new file mode 100644 index 00000000..a3b21228 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java @@ -0,0 +1,32 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; + +import de.theidler.create_mobile_packages.index.CMPPackets; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTicker; +import net.createmod.catnip.net.base.ServerboundPacketPayload; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.SimpleMenuProvider; + +public class OpenTrashMenuPacket implements ServerboundPacketPayload { + public static final OpenTrashMenuPacket INSTANCE = new OpenTrashMenuPacket(); + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); + + @Override + public void handle(ServerPlayer player) { + if (player == null || !player.isAlive()) return; + + player.closeContainer(); + player.openMenu(new SimpleMenuProvider( + (id, inv, p) -> new TrashMenu(id, inv, (PortableStockTicker) PortableStockTicker.find(inv).getItem()), + net.minecraft.network.chat.Component.translatable("item.create_mobile_packages.portable_stock_ticker.trash_menu") + ), buf -> { + // No additional data to write + }); + } + + @Override + public PacketTypeProvider getTypeProvider() { + return CMPPackets.OPEN_TRASH_MENU; + } +} diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java new file mode 100644 index 00000000..fd118a04 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -0,0 +1,119 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; + +import com.simibubi.create.foundation.gui.menu.MenuBase; +import de.theidler.create_mobile_packages.index.CMPMenuTypes; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.LogisticallyLinkedItem; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTicker; +import de.theidler.create_mobile_packages.robo.RoboManager; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemStackHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TrashMenu extends MenuBase { + + private ItemStackHandler trashInventory; + + public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentHolder) { + super(CMPMenuTypes.TRASH_MENU.get(), id, playerInventory, contentHolder); + } + + @Override + public @NotNull ItemStack quickMoveStack(@NotNull Player player, int i) { + ItemStack itemStack = ItemStack.EMPTY; + Slot slot = this.slots.get(i); + + if (slot.hasItem()) { + ItemStack itemStackInSlot = slot.getItem(); + itemStack = itemStackInSlot.copy(); + + if (i < trashInventory.getSlots()) { + // Trash Inventory -> Player Inventory + if (!this.moveItemStackTo(itemStackInSlot, trashInventory.getSlots(), this.slots.size(), true)) { + return ItemStack.EMPTY; + } + } else { + // Player Inventory -> Trash Inventory + if (!this.moveItemStackTo(itemStackInSlot, 0, trashInventory.getSlots(), false)) { + return ItemStack.EMPTY; + } + } + + if (itemStackInSlot.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + } + return itemStack; + } + + @Override + public boolean stillValid(@NotNull Player player) { + return true; + } + + @Override + protected PortableStockTicker createOnClient(RegistryFriendlyByteBuf extraData) { + return null; + } + + @Override + protected void initAndReadInventory(PortableStockTicker contentHolder) { + trashInventory = new ItemStackHandler(9); + if (player.level() instanceof ServerLevel serverLevel) { + List trashStacks = RoboManager.get(serverLevel).getTrashSlots(getNetworkId(), player.getUUID()); + for (int i = 0; i < trashStacks.size() && i < trashInventory.getSlots(); i++) { + trashInventory.setStackInSlot(i, trashStacks.get(i)); + } + } + } + + private @Nullable UUID getNetworkId() { + ItemStack stack = PortableStockTicker.find(player.getInventory()); + if (stack != null && stack.getItem() instanceof PortableStockTicker) { + return LogisticallyLinkedItem.networkFromStack(stack); + } + return null; + } + + private List toTrashStacks() { + List trashStacks = new ArrayList<>(); + for (int i = 0; i < trashInventory.getSlots(); i++) { + trashStacks.add(trashInventory.getStackInSlot(i)); + } + return trashStacks; + } + + @Override + protected void addSlots() { + for (int i = 0; i < trashInventory.getSlots(); i++) { + addSlot(new TrashStackHandler(trashInventory, i, 8 + i * 18, 18)); + } + addPlayerSlots(8, 84); + } + + @Override + protected void saveData(PortableStockTicker contentHolder) { + if (player.level() instanceof ServerLevel serverLevel) { + RoboManager.get(serverLevel).setTrashSlots(getNetworkId(), player.getUUID(), toTrashStacks()); + } + } + + static class TrashStackHandler extends SlotItemHandler { + public TrashStackHandler(IItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + } + } +} diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java new file mode 100644 index 00000000..efafb954 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java @@ -0,0 +1,19 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; + +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import org.jetbrains.annotations.NotNull; + +public class TrashScreen extends AbstractSimiContainerScreen { + + public TrashScreen(TrashMenu container, Inventory inv, Component title) { + super(container, inv, title); + } + + @Override + protected void renderBg(@NotNull GuiGraphics guiGraphics, float v, int i, int i1) { + + } +} diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index 21ca5e9f..d534b0c2 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -23,21 +23,12 @@ public class RoboManager extends SavedData { public Map robos; public List beePortRoboRequests; + public Map>> trashSlotsByNetworkAndPlayer; public RoboManager() { init(); } - @Override - public @NotNull CompoundTag save(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider provider) { - ListTag robosList = new ListTag(); - for (VirtualRobo robo : robos.values()) { - robosList.add(robo.serializeNBT()); - } - tag.put("robos", robosList); - return tag; - } - public static RoboManager load(CompoundTag tag, ServerLevel level) { RoboManager manager = new RoboManager(); @@ -48,9 +39,66 @@ public static RoboManager load(CompoundTag tag, ServerLevel level) { VirtualRobo robo = VirtualRobo.deserializeNBT(level, roboTag); manager.robos.put(robo.getId(), robo); } + + // Load Trash Slots by Network and Player + if (tag.contains("trashSlots", Tag.TAG_COMPOUND)) { + CompoundTag trashSlotsTag = tag.getCompound("trashSlots"); + for (String networkIdStr : trashSlotsTag.getAllKeys()) { + UUID networkId = UUID.fromString(networkIdStr); + Map> playerMap = new HashMap<>(); + CompoundTag playerTag = trashSlotsTag.getCompound(networkIdStr); + for (String playerIdStr : playerTag.getAllKeys()) { + UUID playerId = UUID.fromString(playerIdStr); + List trashSlots = new ArrayList<>(); + ListTag trashSlotsList = playerTag.getList(playerIdStr, Tag.TAG_COMPOUND); + for (int i = 0; i < trashSlotsList.size(); i++) { + CompoundTag itemTag = trashSlotsList.getCompound(i); + ItemStack itemStack = ItemStack.CODEC.parse(net.minecraft.nbt.NbtOps.INSTANCE, itemTag) + .result() + .orElse(ItemStack.EMPTY); + if (!itemStack.isEmpty()) { + trashSlots.add(itemStack); + } + } + playerMap.put(playerId, trashSlots); + } + manager.trashSlotsByNetworkAndPlayer.put(networkId, playerMap); + } + } return manager; } + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider provider) { + ListTag robosList = new ListTag(); + for (VirtualRobo robo : robos.values()) { + robosList.add(robo.serializeNBT()); + } + tag.put("robos", robosList); + + // Save Trash Slots by Network and Player + CompoundTag trashSlotsTag = new CompoundTag(); + for (Map.Entry>> networkEntry : trashSlotsByNetworkAndPlayer.entrySet()) { + String networkIdStr = networkEntry.getKey().toString(); + CompoundTag playerTag = new CompoundTag(); + for (Map.Entry> playerEntry : networkEntry.getValue().entrySet()) { + String playerIdStr = playerEntry.getKey().toString(); + List trashSlots = playerEntry.getValue(); + ListTag trashSlotsList = new ListTag(); + for (ItemStack itemStack : trashSlots) { + ItemStack stackToSave = itemStack == null ? ItemStack.EMPTY : itemStack; + if (!stackToSave.isEmpty()) { + trashSlotsList.add(stackToSave.save(provider)); + } + } + playerTag.put(playerIdStr, trashSlotsList); + } + trashSlotsTag.put(networkIdStr, playerTag); + } + tag.put("trashSlots", trashSlotsTag); + return tag; + } + public static RoboManager get(ServerLevel level) { return level.getDataStorage().computeIfAbsent( new SavedData.Factory<>(RoboManager::new, (tag, provider) -> RoboManager.load(tag, level)), @@ -72,6 +120,19 @@ public void add(VirtualRobo robo) { this.setDirty(); } + public List getTrashSlots(UUID networkId, UUID playerId) { + return trashSlotsByNetworkAndPlayer + .getOrDefault(networkId, new HashMap<>()) + .getOrDefault(playerId, List.of()); + } + + public void setTrashSlots(UUID networkId, UUID playerId, List trashSlots) { + trashSlotsByNetworkAndPlayer + .computeIfAbsent(networkId, k -> new ConcurrentHashMap<>()) + .put(playerId, trashSlots); + this.setDirty(); + } + public void tick(ServerLevel level) { robos.values().forEach(robo -> robo.tick(level)); getPendingRoboRequests().forEach(roboRequest -> tryHandlingRequest(roboRequest, level)); @@ -150,5 +211,7 @@ public List getETAs(BlockPos pos) { private void init() { this.robos = new ConcurrentHashMap<>(); this.beePortRoboRequests = new CopyOnWriteArrayList<>(); + this.trashSlotsByNetworkAndPlayer = new ConcurrentHashMap<>(); } -} \ No newline at end of file +} + diff --git a/src/main/resources/assets/create_mobile_packages/lang/en_us.json b/src/main/resources/assets/create_mobile_packages/lang/en_us.json index 862a721f..ea38d93c 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/en_us.json +++ b/src/main/resources/assets/create_mobile_packages/lang/en_us.json @@ -68,5 +68,6 @@ "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Opens a menu to modify Packages", "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s" + "create_mobile_packages.network.owner": "Owner: %1$s", + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From ba669be1c872be8059a668be60f42115756dfb00 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 16:06:01 +0100 Subject: [PATCH 26/70] Implement TrashSlot feature - Modifying infrastructure to allow players to request bees - Adding Address to TrashMenu - Syncing Address to Server for a persistent address --- .../blocks/bee_port/BeePortBlockEntity.java | 9 +- .../blocks/bee_port/RoboRequest.java | 31 +++- .../RoboBeeBehaviorController.java | 51 ++++++- .../entities/robo_entity/RoboBeeState.java | 1 + .../index/CMPPackets.java | 4 + .../trash_menu/OpenTrashMenuPacket.java | 20 ++- .../trash_menu/SyncTrashAddressPacket.java | 48 +++++++ .../SyncTrashAddressToClientPacket.java | 43 ++++++ .../trash_menu/TrashMenu.java | 34 ++++- .../trash_menu/TrashScreen.java | 93 ++++++++++++ .../robo/RoboManager.java | 136 ++++++++++-------- .../robo/RoboTrashStore.java | 79 ++++++++++ .../robo/VirtualRobo.java | 14 +- 13 files changed, 479 insertions(+), 84 deletions(-) create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressPacket.java create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressToClientPacket.java create mode 100644 src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java index 53d7ff91..d8ed0677 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java @@ -14,12 +14,13 @@ import de.theidler.create_mobile_packages.index.config.CMPConfigs; import de.theidler.create_mobile_packages.items.robo_bee.RoboBeeItem; import de.theidler.create_mobile_packages.network_settings.NetworkHelper; +import de.theidler.create_mobile_packages.robo.BeePortBlockEntityTarget; import de.theidler.create_mobile_packages.robo.RoboManager; import de.theidler.create_mobile_packages.robo.VirtualRobo; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.HolderLookup; import net.minecraft.core.GlobalPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -36,12 +37,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; import net.neoforged.neoforge.items.ItemStackHandler; import org.jetbrains.annotations.NotNull; -import net.neoforged.neoforge.capabilities.Capabilities; -import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import org.jetbrains.annotations.Nullable; import java.util.Comparator; @@ -200,7 +201,7 @@ public static boolean sendPackageToPlayer(Player player, ItemStack itemStack) { private synchronized void requestRoboEntity() { if (level instanceof ServerLevel serverLevel) { - RoboManager.get(serverLevel).requestRobo(this.getBlockPos(), this.getLogisticsNetworkId()); + RoboManager.get(serverLevel).requestRobo(new BeePortBlockEntityTarget(this), this.getLogisticsNetworkId(), RoboRequest.Mission.RESTOCK); } } diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/RoboRequest.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/RoboRequest.java index 77119003..d325ea0e 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/RoboRequest.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/RoboRequest.java @@ -1,21 +1,28 @@ package de.theidler.create_mobile_packages.blocks.bee_port; -import net.minecraft.core.BlockPos; +import de.theidler.create_mobile_packages.robo.RoboTarget; +import net.minecraft.world.phys.Vec3; import java.util.UUID; -public class RoboRequest { //TODO: integrate with RoboTarget logic to allow requests from players / ports and blocks +public class RoboRequest { private final UUID logisticsNetworkId; - BlockPos targetPos; + private final Mission mission; long createdAt; private Status status; private int eta = -1; + RoboTarget target; - public RoboRequest(BlockPos pos, UUID logisticsNetworkId) { - this.targetPos = pos; + public RoboRequest(RoboTarget target, UUID logisticsNetworkId, Mission mission) { + this.target = target; status = Status.PENDING; createdAt = System.currentTimeMillis(); this.logisticsNetworkId = logisticsNetworkId; + this.mission = mission; + } + + public Mission getMission() { + return mission; } public int getEta() { @@ -39,8 +46,12 @@ public void setStatus(Status status) { this.status = status; } - public BlockPos getTargetPos() { - return targetPos; + public Vec3 getTargetPos() { + return target.getTargetPos(); + } + + public RoboTarget getTarget() { + return target; } public long getCreatedAt() { @@ -50,4 +61,10 @@ public long getCreatedAt() { public enum Status { PENDING, IN_PROGRESS, DONE, CANCELLED } + + public enum Mission { + RESTOCK, // TODO: remove and replace with PICKUP for "fly by" PICKUP + DELIVER, + PICKUP + } } diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java index 3f75eb90..9e0b35bf 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java @@ -4,13 +4,18 @@ import de.theidler.create_mobile_packages.blocks.bee_port.BeePortBlockEntity; import de.theidler.create_mobile_packages.blocks.bee_port.RoboRequest; import de.theidler.create_mobile_packages.robo.PlayerTarget; +import de.theidler.create_mobile_packages.robo.RoboManager; +import de.theidler.create_mobile_packages.robo.RoboTrashStore; import de.theidler.create_mobile_packages.robo.VirtualRobo; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; +import java.util.List; + import static de.theidler.create_mobile_packages.CMPHelper.calcETA; public class RoboBeeBehaviorController { @@ -37,12 +42,46 @@ public void tick(VirtualRobo robo) { case DELIVER_PACKAGE: handleDeliverPackage(robo); break; + case PICKUP_PACKAGE: + handlePickupPackage(robo); + break; case SHUTDOWN: handleShutdown(robo); break; } } + private void handlePickupPackage(VirtualRobo robo) { + boolean pickedUp = false; + // Try to pickup from player + if (robo.getTarget() != null && robo.getTarget().asPlayer() != null) { + pickedUp = pickupPackageFromPlayer(robo.getTarget().asPlayer(), robo); + } + // TODO: PICKUP from bee port + + if (pickedUp) { + robo.clearRequest(); + setState(RoboBeeState.IDLE); + } + } + + private boolean pickupPackageFromPlayer(Player player, VirtualRobo robo) { + RoboTrashStore trashStore = RoboManager.get(robo.getServerLevel()).getTrashStore(robo.getLogisticsNetworkId(), player.getUUID()); + List trashSlots = trashStore != null ? trashStore.getItemStacks() : List.of(); + if (trashSlots.isEmpty()) { + return true; + } + ItemStack packageItem = PackageItem.containing(trashSlots); + if (packageItem.isEmpty()) { + return false; + } + + RoboManager.get(robo.getServerLevel()).setTrashSlots(robo.getLogisticsNetworkId(), player.getUUID(), List.of()); + PackageItem.addAddress(packageItem, trashStore.getTargetAddress()); + robo.setItemStack(packageItem); + return true; + } + private void handleIdle(VirtualRobo robo) { robo.setTargetVelocity(Vec3.ZERO); if (robo.getTarget() != null && robo.getTarget().isValid()) { @@ -112,7 +151,11 @@ private void handleAlignForDelivery(VirtualRobo robo) { private void handleLand(VirtualRobo robo) { @Nullable BeePortBlockEntity port = robo.getTarget() != null ? robo.getTarget().asBeePortBlockEntity() : null; if (port == null) { - setState(RoboBeeState.DELIVER_PACKAGE); + if (robo.getRequest() != null && robo.getRequest().getMission() == RoboRequest.Mission.PICKUP) { + setState(RoboBeeState.PICKUP_PACKAGE); + } else { + setState(RoboBeeState.DELIVER_PACKAGE); + } return; } Vec3 end = getBelow(port, 0.5); @@ -134,7 +177,11 @@ private void handleLand(VirtualRobo robo) { robo.setPos(end); robo.setTargetVelocity(Vec3.ZERO); openPort(robo.getTarget().asBeePortBlockEntity(), false); - setState(RoboBeeState.DELIVER_PACKAGE); + if (robo.getRequest() != null && robo.getRequest().getMission() == RoboRequest.Mission.PICKUP) { + setState(RoboBeeState.PICKUP_PACKAGE); + } else { + setState(RoboBeeState.DELIVER_PACKAGE); + } } } diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeState.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeState.java index 34780bf1..6cf7d5d5 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeState.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeState.java @@ -6,6 +6,7 @@ public enum RoboBeeState { NAVIGATE_TO_TARGET, ALIGN_FOR_DELIVERY, DELIVER_PACKAGE, + PICKUP_PACKAGE, LAND, SHUTDOWN } diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java index ade78bc7..28087502 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java @@ -5,6 +5,8 @@ import de.theidler.create_mobile_packages.items.mobile_packager.OpenEditMenuPacket; import de.theidler.create_mobile_packages.items.portable_stock_ticker.*; import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.OpenTrashMenuPacket; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashAddressPacket; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashAddressToClientPacket; import de.theidler.create_mobile_packages.network_settings.*; import de.theidler.create_mobile_packages.toast.RemoveAllToastsOnClientPacket; import de.theidler.create_mobile_packages.toast.RemoveToastOnClientPacket; @@ -32,9 +34,11 @@ public enum CMPPackets implements BasePacketPayload.PacketTypeProvider { REQUEST_NETWORK_DATA(RequestNetworkDataPacket.class, RequestNetworkDataPacket.STREAM_CODEC), REQUEST_PLAYER_NETWORKS(RequestPlayerNetworksPacket.class, RequestPlayerNetworksPacket.STREAM_CODEC), OPEN_TRASH_MENU(OpenTrashMenuPacket.class, OpenTrashMenuPacket.STREAM_CODEC), + SYNC_TRASH_ADDRESS(SyncTrashAddressPacket.class, SyncTrashAddressPacket.STREAM_CODEC), // Server to Client BIG_ITEM_STACK_LIST(GenericStackListPacket.class, GenericStackListPacket.STREAM_CODEC), + SYNC_TRASH_ADDRESS_TO_CLIENT(SyncTrashAddressToClientPacket.class, SyncTrashAddressToClientPacket.STREAM_CODEC), SHOW_TOAST_ON_CLIENT(ShowToastOnClientPacket.class, ShowToastOnClientPacket.STREAM_CODEC), REMOVE_TOAST_ON_CLIENT(RemoveToastOnClientPacket.class, RemoveToastOnClientPacket.STREAM_CODEC), REMOVE_ALL_TOAST_ON_CLIENT(RemoveAllToastsOnClientPacket.class, RemoveAllToastsOnClientPacket.STREAM_CODEC), diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java index a3b21228..f8bb8a1b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java @@ -2,11 +2,17 @@ import de.theidler.create_mobile_packages.index.CMPPackets; import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTicker; +import de.theidler.create_mobile_packages.robo.RoboManager; +import de.theidler.create_mobile_packages.robo.RoboTrashStore; import net.createmod.catnip.net.base.ServerboundPacketPayload; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.item.ItemStack; + +import static de.theidler.create_mobile_packages.items.portable_stock_ticker.LogisticallyLinkedItem.networkFromStack; public class OpenTrashMenuPacket implements ServerboundPacketPayload { public static final OpenTrashMenuPacket INSTANCE = new OpenTrashMenuPacket(); @@ -16,13 +22,19 @@ public class OpenTrashMenuPacket implements ServerboundPacketPayload { public void handle(ServerPlayer player) { if (player == null || !player.isAlive()) return; + ItemStack pstItem = PortableStockTicker.find(player.getInventory()); + if (pstItem == null) return; + PortableStockTicker pst = (PortableStockTicker) pstItem.getItem(); + RoboTrashStore trashStore = RoboManager.get(player.serverLevel()).getTrashStore(networkFromStack(pstItem), player.getUUID()); + String targetAddress = trashStore != null ? trashStore.getTargetAddress() : ""; + player.closeContainer(); player.openMenu(new SimpleMenuProvider( - (id, inv, p) -> new TrashMenu(id, inv, (PortableStockTicker) PortableStockTicker.find(inv).getItem()), + (id, inv, p) -> new TrashMenu(id, inv, pst, targetAddress), net.minecraft.network.chat.Component.translatable("item.create_mobile_packages.portable_stock_ticker.trash_menu") - ), buf -> { - // No additional data to write - }); + )); + + CatnipServices.NETWORK.sendToClient(player, new SyncTrashAddressToClientPacket(targetAddress)); } @Override diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressPacket.java new file mode 100644 index 00000000..c88325ef --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressPacket.java @@ -0,0 +1,48 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; + +import de.theidler.create_mobile_packages.index.CMPPackets; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.LogisticallyLinkedItem; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTicker; +import de.theidler.create_mobile_packages.robo.RoboManager; +import net.createmod.catnip.net.base.ServerboundPacketPayload; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +import java.util.UUID; + +public class SyncTrashAddressPacket implements ServerboundPacketPayload { + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, packet -> packet.address, + SyncTrashAddressPacket::new + ); + + private final String address; + + public SyncTrashAddressPacket(String address) { + this.address = address; + } + + @Override + public void handle(ServerPlayer player) { + if (player == null || !(player.level() instanceof ServerLevel serverLevel)) return; + + ItemStack pstItem = PortableStockTicker.find(player.getInventory()); + if (pstItem == null) return; + + UUID networkId = LogisticallyLinkedItem.networkFromStack(pstItem); + if (networkId == null) return; + + RoboManager roboManager = RoboManager.get(serverLevel); + roboManager.setTrashTargetAddress(networkId, player.getUUID(), address); + } + + @Override + public PacketTypeProvider getTypeProvider() { + return CMPPackets.SYNC_TRASH_ADDRESS; + } +} diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressToClientPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressToClientPacket.java new file mode 100644 index 00000000..7f9fa296 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashAddressToClientPacket.java @@ -0,0 +1,43 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; + +import de.theidler.create_mobile_packages.index.CMPPackets; +import net.createmod.catnip.net.base.ClientboundPacketPayload; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +public class SyncTrashAddressToClientPacket implements ClientboundPacketPayload { + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, packet -> packet.address, + SyncTrashAddressToClientPacket::new + ); + + private final String address; + + public SyncTrashAddressToClientPacket(String address) { + this.address = address; + } + + @Override + public void handle(LocalPlayer player) { + if (player == null) return; + + if (player.containerMenu instanceof TrashMenu trashMenu) { + trashMenu.setTargetAddress(address); + } + + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.screen instanceof TrashScreen trashScreen) { + trashScreen.applyTargetAddress(address); + } + } + + @Override + public PacketTypeProvider getTypeProvider() { + return CMPPackets.SYNC_TRASH_ADDRESS_TO_CLIENT; + } +} + diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index fd118a04..9933d3bd 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -5,6 +5,7 @@ import de.theidler.create_mobile_packages.items.portable_stock_ticker.LogisticallyLinkedItem; import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTicker; import de.theidler.create_mobile_packages.robo.RoboManager; +import de.theidler.create_mobile_packages.robo.RoboTrashStore; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Inventory; @@ -24,11 +25,17 @@ public class TrashMenu extends MenuBase { private ItemStackHandler trashInventory; + private String targetAddress = ""; public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentHolder) { super(CMPMenuTypes.TRASH_MENU.get(), id, playerInventory, contentHolder); } + public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentHolder, String targetAddress) { + super(CMPMenuTypes.TRASH_MENU.get(), id, playerInventory, contentHolder); + this.targetAddress = targetAddress != null ? targetAddress : ""; + } + @Override public @NotNull ItemStack quickMoveStack(@NotNull Player player, int i) { ItemStack itemStack = ItemStack.EMPTY; @@ -73,9 +80,13 @@ protected PortableStockTicker createOnClient(RegistryFriendlyByteBuf extraData) protected void initAndReadInventory(PortableStockTicker contentHolder) { trashInventory = new ItemStackHandler(9); if (player.level() instanceof ServerLevel serverLevel) { - List trashStacks = RoboManager.get(serverLevel).getTrashSlots(getNetworkId(), player.getUUID()); - for (int i = 0; i < trashStacks.size() && i < trashInventory.getSlots(); i++) { - trashInventory.setStackInSlot(i, trashStacks.get(i)); + RoboTrashStore trashStore = RoboManager.get(serverLevel).getTrashStore(getNetworkId(), player.getUUID()); + if (trashStore != null) { + List trashSlots = trashStore.getItemStacks(); + for (int i = 0; i < trashSlots.size() && i < trashInventory.getSlots(); i++) { + trashInventory.setStackInSlot(i, trashSlots.get(i)); + } + targetAddress = trashStore.getTargetAddress(); } } } @@ -88,10 +99,21 @@ protected void initAndReadInventory(PortableStockTicker contentHolder) { return null; } + public String getTargetAddress() { + return targetAddress; + } + + public void setTargetAddress(String address) { + this.targetAddress = address; + } + private List toTrashStacks() { List trashStacks = new ArrayList<>(); for (int i = 0; i < trashInventory.getSlots(); i++) { - trashStacks.add(trashInventory.getStackInSlot(i)); + ItemStack stack = trashInventory.getStackInSlot(i); + if (!stack.isEmpty()) { + trashStacks.add(stack); + } } return trashStacks; } @@ -107,7 +129,9 @@ protected void addSlots() { @Override protected void saveData(PortableStockTicker contentHolder) { if (player.level() instanceof ServerLevel serverLevel) { - RoboManager.get(serverLevel).setTrashSlots(getNetworkId(), player.getUUID(), toTrashStacks()); + UUID networkId = getNetworkId(); + RoboManager roboManager = RoboManager.get(serverLevel); + roboManager.setTrashSlots(networkId, player.getUUID(), toTrashStacks()); } } diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java index efafb954..d763efad 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java @@ -1,6 +1,9 @@ package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; +import com.simibubi.create.content.logistics.AddressEditBox; +import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; @@ -8,12 +11,102 @@ public class TrashScreen extends AbstractSimiContainerScreen { + private AddressEditBox addressBox; + private String lastSyncedAddress = ""; + public TrashScreen(TrashMenu container, Inventory inv, Component title) { super(container, inv, title); } + @Override + protected void init() { + super.init(); + int x = getGuiLeft(); + int y = getGuiTop(); + + String previousAddress = addressBox == null ? menu.getTargetAddress() : addressBox.getValue(); + lastSyncedAddress = previousAddress; + addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 8, y + 35, 160, 10, + true); + addressBox.setValue(previousAddress); + addressBox.setTextColor(0x555555); + addRenderableWidget(addressBox); + } + + protected void containerTick() { + super.containerTick(); + addressBox.tick(); + // Check if address has changed and sync to server + String currentAddress = addressBox.getValue(); + if (!currentAddress.equals(lastSyncedAddress)) { + lastSyncedAddress = currentAddress; + CatnipServices.NETWORK.sendToServer(new SyncTrashAddressPacket(currentAddress)); + } + } + + @Override + public void onClose() { + // Save the address one final time when closing + String currentAddress = addressBox.getValue(); + if (!currentAddress.equals(lastSyncedAddress)) { + CatnipServices.NETWORK.sendToServer(new SyncTrashAddressPacket(currentAddress)); + } + super.onClose(); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + // Handle addressBox focus and clicks + if (addressBox.isFocused()) { + // When focused, let addressBox handle clicks in its area (including suggestions dropdown) + if (addressBox.mouseClicked(pMouseX, pMouseY, pButton)) + return true; + // Clicked outside - unfocus + addressBox.setFocused(false); + } + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + if (addressBox.mouseScrolled(mouseX, mouseY, scrollX, scrollY)) + return true; + return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (addressBox.isFocused() && addressBox.keyPressed(pKeyCode, pScanCode, pModifiers)) + return true; + return addressBox.isFocused() && pKeyCode != 256 || super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + @Override + public boolean charTyped(char pCodePoint, int pModifiers) { + if (addressBox.isFocused() && addressBox.charTyped(pCodePoint, pModifiers)) + return true; + return super.charTyped(pCodePoint, pModifiers); + } + + @Override + protected boolean isHovering(int x, int y, int width, int height, double mouseX, double mouseY) { + // Prevent slot hover highlighting when addressBox suggestions dropdown is showing + if (addressBox.isFocused()) + return false; + return super.isHovering(x, y, width, height, mouseX, mouseY); + } + @Override protected void renderBg(@NotNull GuiGraphics guiGraphics, float v, int i, int i1) { } + + public void applyTargetAddress(String address) { + String resolved = address != null ? address : ""; + lastSyncedAddress = resolved; + if (addressBox != null) { + addressBox.setValue(resolved); + } + menu.setTargetAddress(resolved); + } } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index d534b0c2..047f818b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.saveddata.SavedData; @@ -23,7 +24,7 @@ public class RoboManager extends SavedData { public Map robos; public List beePortRoboRequests; - public Map>> trashSlotsByNetworkAndPlayer; + public List roboTrashStores; public RoboManager() { init(); @@ -40,30 +41,12 @@ public static RoboManager load(CompoundTag tag, ServerLevel level) { manager.robos.put(robo.getId(), robo); } - // Load Trash Slots by Network and Player - if (tag.contains("trashSlots", Tag.TAG_COMPOUND)) { - CompoundTag trashSlotsTag = tag.getCompound("trashSlots"); - for (String networkIdStr : trashSlotsTag.getAllKeys()) { - UUID networkId = UUID.fromString(networkIdStr); - Map> playerMap = new HashMap<>(); - CompoundTag playerTag = trashSlotsTag.getCompound(networkIdStr); - for (String playerIdStr : playerTag.getAllKeys()) { - UUID playerId = UUID.fromString(playerIdStr); - List trashSlots = new ArrayList<>(); - ListTag trashSlotsList = playerTag.getList(playerIdStr, Tag.TAG_COMPOUND); - for (int i = 0; i < trashSlotsList.size(); i++) { - CompoundTag itemTag = trashSlotsList.getCompound(i); - ItemStack itemStack = ItemStack.CODEC.parse(net.minecraft.nbt.NbtOps.INSTANCE, itemTag) - .result() - .orElse(ItemStack.EMPTY); - if (!itemStack.isEmpty()) { - trashSlots.add(itemStack); - } - } - playerMap.put(playerId, trashSlots); - } - manager.trashSlotsByNetworkAndPlayer.put(networkId, playerMap); - } + // Load Trash Stores + ListTag trashSlotsTag = tag.getList("trashSlots", Tag.TAG_COMPOUND); + for (int i = 0; i < trashSlotsTag.size(); i++) { + CompoundTag trashStoreTag = trashSlotsTag.getCompound(i); + RoboTrashStore roboTrashStore = RoboTrashStore.load(trashStoreTag); + manager.roboTrashStores.add(roboTrashStore); } return manager; } @@ -76,24 +59,10 @@ public static RoboManager load(CompoundTag tag, ServerLevel level) { } tag.put("robos", robosList); - // Save Trash Slots by Network and Player - CompoundTag trashSlotsTag = new CompoundTag(); - for (Map.Entry>> networkEntry : trashSlotsByNetworkAndPlayer.entrySet()) { - String networkIdStr = networkEntry.getKey().toString(); - CompoundTag playerTag = new CompoundTag(); - for (Map.Entry> playerEntry : networkEntry.getValue().entrySet()) { - String playerIdStr = playerEntry.getKey().toString(); - List trashSlots = playerEntry.getValue(); - ListTag trashSlotsList = new ListTag(); - for (ItemStack itemStack : trashSlots) { - ItemStack stackToSave = itemStack == null ? ItemStack.EMPTY : itemStack; - if (!stackToSave.isEmpty()) { - trashSlotsList.add(stackToSave.save(provider)); - } - } - playerTag.put(playerIdStr, trashSlotsList); - } - trashSlotsTag.put(networkIdStr, playerTag); + // Save Trash Stores + ListTag trashSlotsTag = new ListTag(); + for (RoboTrashStore roboTrashStore : roboTrashStores) { + trashSlotsTag.add(roboTrashStore.save()); } tag.put("trashSlots", trashSlotsTag); return tag; @@ -120,16 +89,43 @@ public void add(VirtualRobo robo) { this.setDirty(); } - public List getTrashSlots(UUID networkId, UUID playerId) { - return trashSlotsByNetworkAndPlayer - .getOrDefault(networkId, new HashMap<>()) - .getOrDefault(playerId, List.of()); + public @Nullable RoboTrashStore getTrashStore(UUID networkId, UUID playerId) { + return roboTrashStores.stream() + .filter((store) -> store.getNetworkUUID().equals(networkId)) + .filter((store) -> store.getPlayerUUID().equals(playerId)) + .findFirst().orElse(null); } - public void setTrashSlots(UUID networkId, UUID playerId, List trashSlots) { - trashSlotsByNetworkAndPlayer - .computeIfAbsent(networkId, k -> new ConcurrentHashMap<>()) - .put(playerId, trashSlots); + public synchronized void setTrashSlots(UUID networkId, UUID playerId, List trashSlots) { + RoboTrashStore existingStore = getTrashStore(networkId, playerId); + if (existingStore != null) { + List storeItems = existingStore.getItemStacks(); + storeItems.clear(); + // Create copies of the ItemStacks to ensure proper data transfer + for (ItemStack stack : trashSlots) { + storeItems.add(stack.copy()); + } + } else { + // Create a new mutable list with copies of the stacks + List copiedStacks = new ArrayList<>(); + for (ItemStack stack : trashSlots) { + copiedStacks.add(stack.copy()); + } + roboTrashStores.add(new RoboTrashStore(playerId, networkId, copiedStacks)); + } + this.setDirty(); + } + + public synchronized void setTrashTargetAddress(UUID networkId, UUID playerId, String targetAddress) { + RoboTrashStore existingStore = getTrashStore(networkId, playerId); + if (existingStore != null) { + existingStore.setTargetAddress(targetAddress != null ? targetAddress : ""); + } else { + List emptyStacks = new ArrayList<>(); + RoboTrashStore store = new RoboTrashStore(playerId, networkId, emptyStacks); + store.setTargetAddress(targetAddress != null ? targetAddress : ""); + roboTrashStores.add(store); + } this.setDirty(); } @@ -139,6 +135,27 @@ public void tick(ServerLevel level) { // prune finished requests older than a minute to avoid unbounded growth long now = System.currentTimeMillis(); beePortRoboRequests.removeIf(r -> (r.getStatus() == RoboRequest.Status.DONE || r.getStatus() == RoboRequest.Status.CANCELLED) && (now - r.getCreatedAt()) > 60_000); + + // handle trash stores + roboTrashStores.forEach(store -> { + if (store.getItemStacks().isEmpty()) return; + Player player = level.getPlayerByUUID(store.getPlayerUUID()); + if (player == null) return; + + RoboRequest lastRequest = store.getLastRequest(); + if (lastRequest != null && (lastRequest.getStatus() == RoboRequest.Status.PENDING || lastRequest.getStatus() == RoboRequest.Status.IN_PROGRESS)) { + return; + } + + RoboRequest request = new RoboRequest(new PlayerTarget( + player, + store.getNetworkUUID() + ), store.getNetworkUUID(), RoboRequest.Mission.PICKUP); + + store.setLastRequest(request); + requestRobo(request); + }); + this.setDirty(); } @@ -146,9 +163,9 @@ private void tryHandlingRequest(RoboRequest request, ServerLevel level) { DronePortTracker tracker = DronePortTracker.get(level); List allBEs = new ArrayList<>(tracker.getAllByNetwork(request.getLogisticsNetworkId())); allBEs.removeIf(BlockEntity::isRemoved); - allBEs.removeIf(be -> be.getBlockPos().equals(request.getTargetPos())); + allBEs.removeIf(be -> be.getBlockPos().equals(BlockPos.containing(request.getTargetPos()))); allBEs.removeIf(be -> be.getRoboBeeInventory().getStackInSlot(0).getCount() <= 0); - allBEs.stream().min(Comparator.comparingDouble(a -> a.getBlockPos().distSqr(request.getTargetPos()))).ifPresent(target -> target.handleRequest(request)); + allBEs.stream().min(Comparator.comparingDouble(a -> a.getBlockPos().getCenter().distanceToSqr(request.getTargetPos()))).ifPresent(target -> target.handleRequest(request)); } public UUID newRobo(ServerLevel level, ItemStack itemStack, BlockPos spawnPos, UUID logisticsNetworkId, float packageHeightScale, @Nullable BlockPos homePort) { @@ -169,8 +186,13 @@ public void newRequestRobo(ServerLevel level, BlockPos spawnPos, RoboRequest req setDirty(); } - public synchronized void requestRobo(BlockPos pos, UUID logisticsNetworkId) { - beePortRoboRequests.add(new RoboRequest(pos, logisticsNetworkId)); + public void requestRobo(RoboTarget roboTarget, UUID logisticsNetworkId, RoboRequest.Mission mission) { + requestRobo(new RoboRequest(roboTarget, logisticsNetworkId, mission)); + } + + public synchronized void requestRobo(RoboRequest request) { + beePortRoboRequests.add(request); + setDirty(); } public List getRoboRequestsWithStatus(RoboRequest.Status status) { @@ -182,7 +204,7 @@ public List getPendingRoboRequests() { } public List getRoboRequests(BlockPos pos) { - return beePortRoboRequests.stream().filter(request -> request.getTargetPos().equals(pos)).toList(); + return beePortRoboRequests.stream().filter(request -> BlockPos.containing(request.getTargetPos()).equals(pos)).toList(); } public List getInboundRobo(BlockPos pos) { @@ -211,7 +233,7 @@ public List getETAs(BlockPos pos) { private void init() { this.robos = new ConcurrentHashMap<>(); this.beePortRoboRequests = new CopyOnWriteArrayList<>(); - this.trashSlotsByNetworkAndPlayer = new ConcurrentHashMap<>(); + this.roboTrashStores = new ArrayList<>(); } } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java new file mode 100644 index 00000000..a253b4cb --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java @@ -0,0 +1,79 @@ +package de.theidler.create_mobile_packages.robo; + +import de.theidler.create_mobile_packages.blocks.bee_port.RoboRequest; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class RoboTrashStore { + private final UUID playerUUID; + private final UUID networkUUID; + private final List itemStacks; + private RoboRequest lastRequest; + private String targetAddress = ""; + + public RoboTrashStore(UUID playerUUID, UUID networkUUID, List itemStacks) { + this.playerUUID = playerUUID; + this.networkUUID = networkUUID; + this.itemStacks = itemStacks; + } + + public static RoboTrashStore load(CompoundTag tag) { + UUID playerUUID = tag.getUUID("PlayerUUID"); + UUID networkUUID = tag.getUUID("NetworkUUID"); + ListTag itemsTag = tag.getList("ItemStacks", Tag.TAG_COMPOUND); + List itemStacks = new ArrayList<>(itemsTag.stream() + .map(itemTag -> ItemStack.CODEC.parse(net.minecraft.nbt.NbtOps.INSTANCE, itemTag).result().orElse(ItemStack.EMPTY)) + .toList()); + + RoboTrashStore store = new RoboTrashStore(playerUUID, networkUUID, itemStacks); + if (tag.contains("TargetAddress")) { + store.setTargetAddress(tag.getString("TargetAddress")); + } + return store; + } + + public RoboRequest getLastRequest() { + return lastRequest; + } + + public void setLastRequest(RoboRequest lastRequest) { + this.lastRequest = lastRequest; + } + + public String getTargetAddress() { + return targetAddress; + } + + public void setTargetAddress(String address) { + this.targetAddress = address; + } + + public UUID getPlayerUUID() { + return playerUUID; + } + + public UUID getNetworkUUID() { + return networkUUID; + } + + public List getItemStacks() { + return itemStacks; + } + + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + tag.putUUID("PlayerUUID", playerUUID); + tag.putUUID("NetworkUUID", networkUUID); + ListTag itemsTag = new ListTag(); + itemStacks.forEach(itemStack -> itemsTag.add(ItemStack.CODEC.encodeStart(net.minecraft.nbt.NbtOps.INSTANCE, itemStack).result().orElse(new CompoundTag()))); + tag.put("ItemStacks", itemsTag); + tag.putString("TargetAddress", targetAddress); + return tag; + } +} diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java b/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java index 75677cb8..9b74eb20 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java @@ -320,10 +320,6 @@ public void setPackageHeightScale(float scale) { this.packageHeightScale = scale; } - public void setTarget(@Nullable RoboTarget target) { - this.target = target; - } - public void setYaw(float yaw) { this.yaw = yaw; } @@ -344,7 +340,15 @@ public RoboRequest getRequest() { public void setRequest(RoboRequest request) { this.request = request; this.request.setStatus(RoboRequest.Status.IN_PROGRESS); - this.target = new BeePortBlockEntityTarget((BeePortBlockEntity) serverLevel.getBlockEntity(request.getTargetPos())); + this.target = request.getTarget(); + } + + public void clearRequest() { + if (this.request != null) { + this.request.setStatus(RoboRequest.Status.DONE); + this.request = null; + } + invalidateTarget(); } public UUID getLogisticsNetworkId() { From d1f7e775deec227ec9bcd8f86dd9a850a5bd4052 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 16:42:43 +0100 Subject: [PATCH 27/70] Add Trash Menu GUI elements and adjust layout for TrashScreen --- .../index/CMPGuiTextures.java | 4 ++- .../trash_menu/TrashMenu.java | 4 +-- .../trash_menu/TrashScreen.java | 28 +++++++++++++++++- .../textures/gui/trash_menu.png | Bin 0 -> 4865 bytes 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/create_mobile_packages/textures/gui/trash_menu.png diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPGuiTextures.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPGuiTextures.java index a0f192b9..f5c49463 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPGuiTextures.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPGuiTextures.java @@ -17,7 +17,9 @@ public enum CMPGuiTextures implements ScreenElement, TextureSheetSegment { PLAYER_NETWORKS_EDIT_NAME("player_networks", 230, 3, 13, 13), PLAYER_NETWORKS_BG("player_networks", 2, 36, 210, 22), PLAYER_NETWORKS_FOOTER("player_networks", 2, 73, 218, 31), - PLAYER_NETWORKS_SLOT("player_networks", 2, 113, 210, 18) + PLAYER_NETWORKS_SLOT("player_networks", 2, 113, 210, 18), + + TRASH_MENU("trash_menu", 0, 0, 256, 95) ; diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 9933d3bd..0d3403b8 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -121,9 +121,9 @@ private List toTrashStacks() { @Override protected void addSlots() { for (int i = 0; i < trashInventory.getSlots(); i++) { - addSlot(new TrashStackHandler(trashInventory, i, 8 + i * 18, 18)); + addSlot(new TrashStackHandler(trashInventory, i, 40 + i * 20, 4)); } - addPlayerSlots(8, 84); + addPlayerSlots(48, 84); } @Override diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java index d763efad..5cda96f1 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java @@ -1,11 +1,15 @@ package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; +import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import de.theidler.create_mobile_packages.index.CMPGuiTextures; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.player.Inventory; import org.jetbrains.annotations.NotNull; @@ -20,13 +24,17 @@ public TrashScreen(TrashMenu container, Inventory inv, Component title) { @Override protected void init() { + int bgWidth = CMPGuiTextures.TRASH_MENU.getWidth(); + int bgHeight = CMPGuiTextures.TRASH_MENU.getHeight(); + setWindowSize(bgWidth, bgHeight + AllGuiTextures.PLAYER_INVENTORY.getHeight()); super.init(); + clearWidgets(); int x = getGuiLeft(); int y = getGuiTop(); String previousAddress = addressBox == null ? menu.getTargetAddress() : addressBox.getValue(); lastSyncedAddress = previousAddress; - addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 8, y + 35, 160, 10, + addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 38, y + 39, 160, 10, true); addressBox.setValue(previousAddress); addressBox.setTextColor(0x555555); @@ -98,7 +106,25 @@ protected boolean isHovering(int x, int y, int width, int height, double mouseX, @Override protected void renderBg(@NotNull GuiGraphics guiGraphics, float v, int i, int i1) { + if (minecraft != null && this != minecraft.screen) + return; // stencil buffer does not cooperate with ponders gui fade out + PoseStack ms = guiGraphics.pose(); + + ms.pushPose(); + + int x = getGuiLeft(); + int y = getGuiTop(); + + CMPGuiTextures.TRASH_MENU.render(guiGraphics, x, y - 20); + renderPlayerInventory(guiGraphics, x + 40, y + 66); + + MutableComponent headerTitle = Component.translatable( + "item.create_mobile_packages.portable_stock_ticker.trash_menu"); + guiGraphics.drawString(font, headerTitle, x + 256 / 2 - font.width(headerTitle) / 2, y - 16, 0x714A40, + false); + + ms.popPose(); } public void applyTargetAddress(String address) { diff --git a/src/main/resources/assets/create_mobile_packages/textures/gui/trash_menu.png b/src/main/resources/assets/create_mobile_packages/textures/gui/trash_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5518dceab3df9e29ea6227b98e00c05d070d88bb GIT binary patch literal 4865 zcmeHLdofO5+OtwMeZs^p^;p3D`L5iE-2Mf$X)Idb00C*O&Eq@ zGPX$}!-UOseD(X|_t)>7-#Nd(e}BB*@8>+{ea`bf&w1Xj_v?8QE?Hj`6_OGH06^5t z^uiSY0PUC{KydfY<`h`s0RYf;vkQh-A7svr2`9n^Ly3O_Aa4=Kp*q-v&hGjHQZlob zkY;lV167}ds^1;R7m|2<=nVLVd3=1o!t*=V-p`bjdp%N$zmwQ+l%U`@gH0JR`T)O# zo!uLA+1Jy`vR%sHx(eN0qBX?tb;ic?mC>xMtTbJ9G-@S#+osxczL`5e8^Opt8#LL~ zm_&FAn7+4Cd-JEQ?8KKZ7x|HDb90pY*c+MIN;Ence(?QEp_}!^&1ngU~^l}>F{j8v`75B;k}_t z9dgfIjSHh~sE-o#1lF@|6~FEP78ay}{;r|#77Qx??w zw%kVlw}@vn_k@|FgSc=qRZ~yh-zZ=uq2NVR%flq{|_hBpV~C#cX%x0TCDm|7_EciD={Th+@CqgRwN8qNdqxt`I_4+lVd zuhUkEFRo_qF)in3+F$KsQcXl?)>cVdF?%AY;Z;60K>f$13SIE+iJ`vT!6F${@}&|Ii7n(?V$vF?oA+MzQ)=n@#68iJJ=dWb{Ht(I5RUPJJ6g^>v}e zHVC66aSq|>2#(JCNrz7cjcgp74oGSv_xkxqtabOgYlIxE(3ZAYCy(u1+W!xqkJPDM z1zRUE-c7#HSb9z7)(;z!xV^P+TZ22vZmoL@7RW31fVgB(qwgVGYG)4r8QY$3_!H1t zXCFpCD+iy0?G5stqrR`NC4*VR_Lj^SH1$5Z*4Ha02gz)m!R4(03;3sQ%7ypn1T z$)$r?QL7Ifz^fVTM-1^^sUCxdne!lrZk3g&0{=PQitJXldW8Q(TM6g(<5XZKG6n)M z!a3LaVFK}chIv1i`tfYNHBzyrVDFu+KiP%Vn_QpY=_;dFGKy9j zIi(MX+^x?ZUP&<{gX&CqL0d`(<&l@iyiOIIN40V9`wfRnEE_Ai+q&4YAaah42#hdI zCBAvKK=|0%FH?Aqsg!>jqk}t)8mB#*SzR#euu!xBimkH)pHPnDNtr#0{epx7mvCR4 z2<_PsGSj}$5-8$l!aR38Kk)XNjR>II_p%D#sHD0z*KNl+OH;~lvH&hW)pGcijw)9S zZY$gFdT?dluTrnxewjOyU~8Z9@&Cgo_mCrCGop} z<4V@}wNoeD@QTQ6>2(je^XRU{FI4mG@hOY7X?g6Mvm30_6}T_z`cZSSBTXO)We0^& zC3ghVg>k90=`#3d|Lw5FWiiDJBPh|&B1QYWEwmTSCp!y!|3Xwdhcx;a+FN2#7(wKe!eHy)jA7Qir)YT7hHJqVBHEafdU@Ud(<@nm*fqlqJUzlKzr82$iWM+O zd$1qHpZ+UF00GFsOA&zRmT|N;MbYGrN(nDcz{j{FXLBMykm4Mn*dNl;ybb~RUcFF! zwp1Pvjq)Q-6qzBny^VS=RIWKkD=f{osNdI(<~EXkFAy(-9Fpmvg%j2I4^Q@EbXV&V z*eP0KgOlC~$PC*%NAB9}$*ar1b*2DW=F`~(6gA)sQH05WpzgpKehrA1+VJA?`o}^5 zSo78fCGL*+c1HhJ_Ay}UpzWh8#B}(!6UJ_dS#1;76EH)=(22O?)2V|@HiLqY2tgf3 zmTA*#&KIEw+NzM+E~AI)kai3R^0}1e7#npa zTWa$kkyqZJ(07a6*16Uz^m)H}o9sgkM9elr9l7x3j#Z?zYJ4^?l@V30K0j~Q5eZpv zrFz7|?|LW1#aJ$|c+nJ1BzeoWIO0Qnmsaavt62D^j1YL@w`hOq1uqov8i2~Ro(xeEbk zzhKM$X-?pQrN`g2tfr-$Si)QL;{n1h>g9XdYpipz{JG08V3M0FCQ;FFv0`nr8$7JQ zCTd-=0VYSBS>Vku!TuCrC;aw_s4Pqa zT!*1@x;#*ur$*S<-cC4=?IC$| zh}*x=Kho^(_f}R;8XN6EE}O&ulpNcBH%L1KiHp%Z3b* z=8a?X?BuCWCJS*E>-fqd#k=_qC_~zPCKcbq?Q0K>!+abouAyVF~z34Hu)aeHYk!{;C{rba8>l4M1^`xV> ziU|SL+7rbDcnP0EOeNpp=SLhQE0jprziRc57#JV;n=z;9tY;^Wu`9VsT6YO};u@vC ztNAk5g5d-uQf%~EOYk&yZ7q2a7i~Xjog*E}%Zk)>ALK;)4W%N2aAgSW zb6xa6RIxT?jPkiCBh--cuwFcPO@YBs?pYDefY(OW)?YOTq&8`jo7pmwQYqfBx!|}Z zG%sv)U20PW7ooklu2sP^@w=&qjoz%O7@2a8qMSy{}$QI@A3BlNzobw&2TOKb5qM`JYJ?MPCo%pjfO z3sN3cExNrTXdpC|ZQZLuftb%jrA#z+>sVSgpcawGHn87c`6$iFT>E|)m7Fh<&l)OvlO zxnu7)QUQPEMzYmJ><`{qYY4FkR+9;58_wuwyv+U<+tb?;444e3>7G>0+if+x7)9w~ zi`yOFd-2jjlZEO$DMpU7L#cr0)}q<(Q^fTi>(Kdr21mJGdY*)#aa)zp+~v19&TBb* z+e+lEH3s!2S%kg%lHER6v-R}@ywr}-^-O0hJU1-bWO(sb-3q70htLG|KqWD1=$i$} z7&`mWke zRm-ZI#-)6MjyU={@Y6yW^neAtQG{5Q@CjZw@Fj$?_~KRS%!&69nBzG~7q_@M$N6#i zN6eeiK3Sa4Ljrr9XAl^LFDL(5ClG)i&Dn?UYF>`3J}!gIApmu)JE{crxk$fV_MXX}L*hcWc#_3V8 z{=PV8&jZOP40G#G7*?de=fB(R`F%KU531~WwvKwpsLV+8C8>Ai>rqobmkRf>;V?+1 zmRi5cLNO#s9;;#w>{4Apou>B}3Y&t@`n-oC$uU(mQwu*%HTS%DnW)!IZQ8!+J&;Bz z-nB;gY6@+aKmc!q%;cP{u7RiL=qPD6U2kYVIbpmCN+c5Zd9PYzqO&#J9$di6n8_Ku z0WO)#$3$pcgXC@u66*d&2FT)`?`gDdc*w`L$lsxMfh0`i1DQh;UeI30;@WqW=e-~< zBq>cbiPC$z_2{=VBSw10W0&fBhGK@Ag*O$Z93)gMr%UDlM#( zPeJTcfR;IM@aXD3&P&-ks4CZRnO!zt{;zw`$lG4XjR@uJZ-K>raB94=H<5{V9DpJ{ z1mc~UN8tPh4(l&%f`;z$8$8tks)a1YyyTu70T(S!2i^W_;PbIPM&J8-07LQyPrO(U zWCp~SR5k%YIA~gAazS1=uHCU!UlI7JcoO8bV6d!mUTvdOEOdh@DS0-uzBOh^rJ+}{ zZEceiPEPjp{w(&@&J^71+S<=-bxU89f~l#>s}+7ZIXHfUH9J-1-lkv1$O*0j;)}8T zE){E>E}Zkbjq-ORX}pDS4tX<WS2?8K`@N2}3>OnUOb(4)kHd{GcNysou{TPWEajfZB&0vApSwSHUfkPm~2TGCs3_qKLfn zyI+bs3jCv^SCdpnF)z(?Vou8SjJr#V=G)m7#9ca`RxqvQ^e~RAr!H6{&4?k))X!iw zG)nJX36lCJ_vDi*1l|~qtL#?nxQVG}<1DyBfBQJv8~KWt1yno7c7@5ZK<-Ew;8OLO z22u#J3TPuN%|!c`?0A%S%1JpbJWKx7eZ5=}AuGTdhK!T1;Gt7xq^_>b@Py?P`Z&{J zB321dVoB(;RCA~qm9G=y33~6z-Wh2e-5H1QNvJNxru1>@PQSXVyVt6yQXfQ_htB?x zc+r`Ti?%dq<7J%)9$Cd-o3igxb!(J2kXE>Q7y--?Z8sJu{>`<=b2N084xJ6POd8o- zoiSZv{maZK`T7c7yLIs^i6$>R=w}g3tFi!sCzrHU18Z0n*OJd}H|pRgO0ax(uaOLw z2^I0+4E;tuvjsl8qb|U+z5|CU4?%$c6~h4_xs&Jr`i1ee?2NVmGh^!u6-F+x{{c?+ BDH#9& literal 0 HcmV?d00001 From daff97e81d2a81647d297f9d8508ef5b258e449a Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 18:22:59 +0100 Subject: [PATCH 28/70] Add synchronization for trash items between server and client --- .../RoboBeeBehaviorController.java | 2 +- .../index/CMPPackets.java | 2 + .../SyncTrashItemsToClientPacket.java | 42 +++++++++++++++++++ .../trash_menu/TrashMenu.java | 23 +++++++++- .../robo/RoboManager.java | 13 ++++++ 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java index 9e0b35bf..cb6a991f 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java @@ -76,7 +76,7 @@ private boolean pickupPackageFromPlayer(Player player, VirtualRobo robo) { return false; } - RoboManager.get(robo.getServerLevel()).setTrashSlots(robo.getLogisticsNetworkId(), player.getUUID(), List.of()); + RoboManager.get(robo.getServerLevel()).setTrashSlots(robo.getServerLevel(), robo.getLogisticsNetworkId(), player.getUUID(), List.of()); PackageItem.addAddress(packageItem, trashStore.getTargetAddress()); robo.setItemStack(packageItem); return true; diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java index 28087502..51b221a0 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java @@ -7,6 +7,7 @@ import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.OpenTrashMenuPacket; import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashAddressPacket; import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashAddressToClientPacket; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashItemsToClientPacket; import de.theidler.create_mobile_packages.network_settings.*; import de.theidler.create_mobile_packages.toast.RemoveAllToastsOnClientPacket; import de.theidler.create_mobile_packages.toast.RemoveToastOnClientPacket; @@ -39,6 +40,7 @@ public enum CMPPackets implements BasePacketPayload.PacketTypeProvider { // Server to Client BIG_ITEM_STACK_LIST(GenericStackListPacket.class, GenericStackListPacket.STREAM_CODEC), SYNC_TRASH_ADDRESS_TO_CLIENT(SyncTrashAddressToClientPacket.class, SyncTrashAddressToClientPacket.STREAM_CODEC), + SYNC_TRASH_ITEMS_TO_CLIENT(SyncTrashItemsToClientPacket.class, SyncTrashItemsToClientPacket.STREAM_CODEC), SHOW_TOAST_ON_CLIENT(ShowToastOnClientPacket.class, ShowToastOnClientPacket.STREAM_CODEC), REMOVE_TOAST_ON_CLIENT(RemoveToastOnClientPacket.class, RemoveToastOnClientPacket.STREAM_CODEC), REMOVE_ALL_TOAST_ON_CLIENT(RemoveAllToastsOnClientPacket.class, RemoveAllToastsOnClientPacket.STREAM_CODEC), diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java new file mode 100644 index 00000000..b1650916 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java @@ -0,0 +1,42 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu; + +import de.theidler.create_mobile_packages.index.CMPPackets; +import net.createmod.catnip.net.base.ClientboundPacketPayload; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class SyncTrashItemsToClientPacket implements ClientboundPacketPayload { + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.collection(ArrayList::new, ItemStack.STREAM_CODEC), packet -> packet.items, + SyncTrashItemsToClientPacket::new + ); + + private final List items; + + public SyncTrashItemsToClientPacket(List items) { + this.items = items; + } + + @Override + public void handle(LocalPlayer player) { + if (player == null) return; + + if (player.containerMenu instanceof TrashMenu trashMenu) { + // Update the trash inventory with the new items + trashMenu.updateTrashInventory(items); + } + } + + @Override + public PacketTypeProvider getTypeProvider() { + return CMPPackets.SYNC_TRASH_ITEMS_TO_CLIENT; + } +} + diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 0d3403b8..ec858f85 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -62,6 +62,9 @@ public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentH } else { slot.setChanged(); } + + // Save immediately when items change + saveDataImmediately(); } return itemStack; } @@ -84,7 +87,8 @@ protected void initAndReadInventory(PortableStockTicker contentHolder) { if (trashStore != null) { List trashSlots = trashStore.getItemStacks(); for (int i = 0; i < trashSlots.size() && i < trashInventory.getSlots(); i++) { - trashInventory.setStackInSlot(i, trashSlots.get(i)); + // Use copies to avoid modifying the original store's items + trashInventory.setStackInSlot(i, trashSlots.get(i).copy()); } targetAddress = trashStore.getTargetAddress(); } @@ -107,6 +111,17 @@ public void setTargetAddress(String address) { this.targetAddress = address; } + public void updateTrashInventory(List items) { + // Update the trash inventory with items from server + for (int i = 0; i < trashInventory.getSlots(); i++) { + if (i < items.size() && !items.get(i).isEmpty()) { + trashInventory.setStackInSlot(i, items.get(i).copy()); + } else { + trashInventory.setStackInSlot(i, ItemStack.EMPTY); + } + } + } + private List toTrashStacks() { List trashStacks = new ArrayList<>(); for (int i = 0; i < trashInventory.getSlots(); i++) { @@ -128,10 +143,14 @@ protected void addSlots() { @Override protected void saveData(PortableStockTicker contentHolder) { + saveDataImmediately(); + } + + private void saveDataImmediately() { if (player.level() instanceof ServerLevel serverLevel) { UUID networkId = getNetworkId(); RoboManager roboManager = RoboManager.get(serverLevel); - roboManager.setTrashSlots(networkId, player.getUUID(), toTrashStacks()); + roboManager.setTrashSlots(serverLevel, networkId, player.getUUID(), toTrashStacks()); } } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index 047f818b..0c3b6146 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -3,12 +3,15 @@ import de.theidler.create_mobile_packages.blocks.bee_port.BeePortBlockEntity; import de.theidler.create_mobile_packages.blocks.bee_port.DronePortTracker; import de.theidler.create_mobile_packages.blocks.bee_port.RoboRequest; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashItemsToClientPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; @@ -116,6 +119,16 @@ public synchronized void setTrashSlots(UUID networkId, UUID playerId, List trashSlots) { + setTrashSlots(networkId, playerId, trashSlots); + + // Send sync packet to the player + ServerPlayer player = level.getServer().getPlayerList().getPlayer(playerId); + if (player != null) { + CatnipServices.NETWORK.sendToClient(player, new SyncTrashItemsToClientPacket(new ArrayList<>(trashSlots))); + } + } + public synchronized void setTrashTargetAddress(UUID networkId, UUID playerId, String targetAddress) { RoboTrashStore existingStore = getTrashStore(networkId, playerId); if (existingStore != null) { From cf7971bc508b7090824ffff0f5d5e77ade0c4048 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 18:39:12 +0100 Subject: [PATCH 29/70] Add active request check for trash slots to prevent multiple requests per player and network --- .../robo/RoboManager.java | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index 0c3b6146..b46a3258 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -155,15 +155,21 @@ public void tick(ServerLevel level) { Player player = level.getPlayerByUUID(store.getPlayerUUID()); if (player == null) return; - RoboRequest lastRequest = store.getLastRequest(); - if (lastRequest != null && (lastRequest.getStatus() == RoboRequest.Status.PENDING || lastRequest.getStatus() == RoboRequest.Status.IN_PROGRESS)) { + UUID networkId = store.getNetworkUUID(); + UUID playerId = store.getPlayerUUID(); + + // Check if there is already an active request for this player and network + // This will also clean up dead robos by marking their requests as CANCELLED + if (hasActiveTrashRequest(playerId, networkId)) { return; } + // At this point, there's no active request, so we can create a new one + // (The previous request either completed, was cancelled, or had a dead robo) RoboRequest request = new RoboRequest(new PlayerTarget( player, - store.getNetworkUUID() - ), store.getNetworkUUID(), RoboRequest.Mission.PICKUP); + networkId + ), networkId, RoboRequest.Mission.PICKUP); store.setLastRequest(request); requestRobo(request); @@ -181,6 +187,45 @@ private void tryHandlingRequest(RoboRequest request, ServerLevel level) { allBEs.stream().min(Comparator.comparingDouble(a -> a.getBlockPos().getCenter().distanceToSqr(request.getTargetPos()))).ifPresent(target -> target.handleRequest(request)); } + /** + * Checks if there is already an active request (PENDING or IN_PROGRESS) for the given player and network. + * This ensures only one bee is sent per player+network combination at a time. + * If a request is IN_PROGRESS but the robo is dead, it will be cancelled and return false. + */ + private boolean hasActiveTrashRequest(UUID playerId, UUID networkId) { + for (RoboRequest request : beePortRoboRequests) { + if (!request.getLogisticsNetworkId().equals(networkId)) continue; + if (!(request.getTarget() instanceof PlayerTarget target)) continue; + + if (target.asPlayer() == null || !target.asPlayer().getUUID().equals(playerId)) continue; + + // Check if this is an active request + if (request.getStatus() == RoboRequest.Status.PENDING) { + // For PENDING requests, check if there's a robo assigned to it + boolean roboExists = robos.values().stream() + .anyMatch(robo -> robo.getRequest() == request); + if (roboExists) { + return true; + } + // If no robo exists for this PENDING request, let it be handled again + } + + if (request.getStatus() == RoboRequest.Status.IN_PROGRESS) { + // Check if the robo actually exists for this request + boolean roboExists = robos.values().stream() + .anyMatch(robo -> robo.getRequest() == request); + + if (roboExists) { + return true; + } else { + // Robo is dead but request is still IN_PROGRESS - mark as cancelled + request.setStatus(RoboRequest.Status.CANCELLED); + } + } + } + return false; + } + public UUID newRobo(ServerLevel level, ItemStack itemStack, BlockPos spawnPos, UUID logisticsNetworkId, float packageHeightScale, @Nullable BlockPos homePort) { UUID id = UUID.randomUUID(); VirtualRobo robo = new VirtualRobo(level, id, itemStack, spawnPos, logisticsNetworkId); From 034c0492d845c01d2c2c175d0a7148f4cd0693fe Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 18:50:28 +0100 Subject: [PATCH 30/70] Fix Item duplication by removing redundant save --- .../items/portable_stock_ticker/trash_menu/TrashMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index ec858f85..2a47cf2b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -143,7 +143,7 @@ protected void addSlots() { @Override protected void saveData(PortableStockTicker contentHolder) { - saveDataImmediately(); + } private void saveDataImmediately() { From 1ebee2087b111b82eb2149c45e27bed2474de614 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 19:03:22 +0100 Subject: [PATCH 31/70] Fix dont allow PST in TrashSlot --- .../items/portable_stock_ticker/trash_menu/TrashMenu.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 2a47cf2b..86e2b651 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -158,5 +158,10 @@ static class TrashStackHandler extends SlotItemHandler { public TrashStackHandler(IItemHandler itemHandler, int index, int xPosition, int yPosition) { super(itemHandler, index, xPosition, yPosition); } + + @Override + public boolean mayPlace(ItemStack stack) { + return !(stack.getItem() instanceof PortableStockTicker); + } } } From 45437128b3900cbee7d4ecd8c604524e3cad9fd3 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Sun, 22 Feb 2026 19:14:22 +0100 Subject: [PATCH 32/70] Change Toast based on Mission (Pickup / Delivery) --- .../robo/PlayerTarget.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java b/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java index 11bb1574..e3d97b7c 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java @@ -2,10 +2,13 @@ import com.simibubi.create.content.logistics.box.PackageItem; import de.theidler.create_mobile_packages.IExtendedLogisticsNetwork; +import de.theidler.create_mobile_packages.blocks.bee_port.RoboRequest; import de.theidler.create_mobile_packages.index.CMPItems; import de.theidler.create_mobile_packages.network_settings.NetworkHelper; import de.theidler.create_mobile_packages.toast.ShowToastOnClientPacket; +import de.theidler.create_mobile_packages.toast.Toast; import de.theidler.create_mobile_packages.toast.types.PackageToast; +import de.theidler.create_mobile_packages.toast.types.SimpleToast; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -67,14 +70,26 @@ public void updateEtaToast(VirtualRobo robo) { items.add(itemHandler.getStackInSlot(i)); } - PackageToast toast = new PackageToast( - robo.getId(), - Component.translatable("create_mobile_packages.toast.robo_bee_on_the_way"), - Component.translatable("create_mobile_packages.toast.eta", getETA()), - CMPItems.ROBO_BEE.asStack(), - items - ); - if (player instanceof ServerPlayer serverPlayer) + Toast toast = null; + + RoboRequest.Mission missionType = robo.getRequest() != null ? robo.getRequest().getMission() : RoboRequest.Mission.DELIVER; + switch (missionType) { + case DELIVER -> toast = new PackageToast( + robo.getId(), + Component.translatable("create_mobile_packages.toast.robo_bee_on_the_way"), + Component.translatable("create_mobile_packages.toast.eta", getETA()), + CMPItems.ROBO_BEE.asStack(), + items + ); + case PICKUP -> toast = new SimpleToast( + robo.getId(), + Component.translatable("create_mobile_packages.toast.robo_bee_on_the_way"), + Component.translatable("create_mobile_packages.toast.eta", getETA()), + CMPItems.ROBO_BEE.asStack() + ); + } + + if (player instanceof ServerPlayer serverPlayer && toast != null) CatnipServices.NETWORK.sendToClient(serverPlayer, new ShowToastOnClientPacket(toast)); lastToastUpdate = System.currentTimeMillis(); } From 8ea846ff2b51c99be8257ec968eadd0806dd6d04 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 18:44:26 +0100 Subject: [PATCH 33/70] Fix not saved on Mouse input --- .../portable_stock_ticker/trash_menu/TrashMenu.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 86e2b651..0a204b66 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -154,7 +154,7 @@ private void saveDataImmediately() { } } - static class TrashStackHandler extends SlotItemHandler { + class TrashStackHandler extends SlotItemHandler { public TrashStackHandler(IItemHandler itemHandler, int index, int xPosition, int yPosition) { super(itemHandler, index, xPosition, yPosition); } @@ -163,5 +163,12 @@ public TrashStackHandler(IItemHandler itemHandler, int index, int xPosition, int public boolean mayPlace(ItemStack stack) { return !(stack.getItem() instanceof PortableStockTicker); } + + @Override + public void setChanged() { + super.setChanged(); + // Save immediately when items are moved via mouse + saveDataImmediately(); + } } } From b6408dfc966b363ab1b1dcdd80914be8fc14b360 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 19:56:21 +0100 Subject: [PATCH 34/70] Fix RoboBee Showing "No Valid Target" of trash pickup --- .../entities/robo_entity/RoboEntity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboEntity.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboEntity.java index bf525a82..58dcf0fa 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboEntity.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboEntity.java @@ -1,6 +1,5 @@ package de.theidler.create_mobile_packages.entities.robo_entity; -import com.simibubi.create.Create; import de.theidler.create_mobile_packages.IExtendedLogisticsNetwork; import de.theidler.create_mobile_packages.index.CMPItems; import de.theidler.create_mobile_packages.index.config.CMPConfigs; @@ -98,6 +97,9 @@ private void updateNametag(VirtualRobo virtualRobo) { BlockPos pos = virtualRobo.getTarget().asBeePortBlockEntity().getBlockPos(); setCustomName(Component.literal("-> [" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + "]")); setCustomNameVisible(true); + } else if (virtualRobo.getTarget() != null && virtualRobo.getTarget().asPlayer() != null) { + setCustomName(Component.literal("-> " + virtualRobo.getTarget().asPlayer().getName().getString())); + setCustomNameVisible(true); } else { setCustomName(Component.translatable("entity.create_mobile_packages.robo_bee.no_valid_target")); setCustomNameVisible(true); From a924a29f5cb78c437cd70b6ce9af475bdcd80b63 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 20:28:45 +0100 Subject: [PATCH 35/70] Fix RoboBee flying to closest port after pickup instead of target port --- .../entities/robo_entity/RoboBeeBehaviorController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java index cb6a991f..30eae6bb 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java @@ -61,6 +61,9 @@ private void handlePickupPackage(VirtualRobo robo) { if (pickedUp) { robo.clearRequest(); + if (robo.getItemStack() != null) { + robo.setTargetAddress(PackageItem.getAddress(robo.getItemStack()), true); + } setState(RoboBeeState.IDLE); } } From a84479c4ea0c7ee38977093225f06ffc6dbb5d71 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 21:46:08 +0100 Subject: [PATCH 36/70] Improve based on Copilot --- .../index/CMPMenuTypes.java | 9 ++- .../trash_menu/OpenTrashMenuPacket.java | 10 ++- .../trash_menu/TrashMenu.java | 65 +++++++++++++------ .../trash_menu/TrashScreen.java | 5 +- .../robo/RoboManager.java | 52 ++++++++------- 5 files changed, 93 insertions(+), 48 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java index 5e495418..16215151 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPMenuTypes.java @@ -11,6 +11,7 @@ import de.theidler.create_mobile_packages.items.portable_stock_ticker.PortableStockTickerScreen; import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.TrashMenu; import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.TrashScreen; +import net.minecraft.world.item.ItemStack; public class CMPMenuTypes { @@ -45,7 +46,13 @@ public class CMPMenuTypes { public static final MenuEntry TRASH_MENU = CreateMobilePackages.REGISTRATE.menu( "trash_menu", - (trashMenuType, containerId, playerInventory) -> new TrashMenu(containerId, playerInventory, (PortableStockTicker) PortableStockTicker.find(playerInventory).getItem()), + (trashMenuType, containerId, playerInventory) -> { + ItemStack pstStack = PortableStockTicker.find(playerInventory); + PortableStockTicker pst = (pstStack != null && pstStack.getItem() instanceof PortableStockTicker) + ? (PortableStockTicker) pstStack.getItem() + : null; + return new TrashMenu(containerId, playerInventory, pst); + }, () -> TrashScreen::new ).register(); diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java index f8bb8a1b..7c35f8ea 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/OpenTrashMenuPacket.java @@ -12,6 +12,8 @@ import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.item.ItemStack; +import java.util.UUID; + import static de.theidler.create_mobile_packages.items.portable_stock_ticker.LogisticallyLinkedItem.networkFromStack; public class OpenTrashMenuPacket implements ServerboundPacketPayload { @@ -25,15 +27,21 @@ public void handle(ServerPlayer player) { ItemStack pstItem = PortableStockTicker.find(player.getInventory()); if (pstItem == null) return; PortableStockTicker pst = (PortableStockTicker) pstItem.getItem(); - RoboTrashStore trashStore = RoboManager.get(player.serverLevel()).getTrashStore(networkFromStack(pstItem), player.getUUID()); + UUID networkId = networkFromStack(pstItem); + if (networkId == null) return; // This should never happen, but just in case + + RoboTrashStore trashStore = RoboManager.get(player.serverLevel()).getTrashStore(networkId, player.getUUID()); String targetAddress = trashStore != null ? trashStore.getTargetAddress() : ""; + // Open the menu on server with targetAddress + // Menu constructor will load inventory from RoboManager automatically player.closeContainer(); player.openMenu(new SimpleMenuProvider( (id, inv, p) -> new TrashMenu(id, inv, pst, targetAddress), net.minecraft.network.chat.Component.translatable("item.create_mobile_packages.portable_stock_ticker.trash_menu") )); + // Sync address to client (redundant but ensures client is aware) CatnipServices.NETWORK.sendToClient(player, new SyncTrashAddressToClientPacket(targetAddress)); } diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 0a204b66..2b9b2808 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -12,6 +12,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.items.SlotItemHandler; @@ -25,10 +26,11 @@ public class TrashMenu extends MenuBase { private ItemStackHandler trashInventory; - private String targetAddress = ""; + private String targetAddress; public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentHolder) { super(CMPMenuTypes.TRASH_MENU.get(), id, playerInventory, contentHolder); + this.targetAddress = ""; } public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentHolder, String targetAddress) { @@ -62,9 +64,6 @@ public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentH } else { slot.setChanged(); } - - // Save immediately when items change - saveDataImmediately(); } return itemStack; } @@ -82,15 +81,29 @@ protected PortableStockTicker createOnClient(RegistryFriendlyByteBuf extraData) @Override protected void initAndReadInventory(PortableStockTicker contentHolder) { trashInventory = new ItemStackHandler(9); - if (player.level() instanceof ServerLevel serverLevel) { - RoboTrashStore trashStore = RoboManager.get(serverLevel).getTrashStore(getNetworkId(), player.getUUID()); - if (trashStore != null) { - List trashSlots = trashStore.getItemStacks(); - for (int i = 0; i < trashSlots.size() && i < trashInventory.getSlots(); i++) { - // Use copies to avoid modifying the original store's items - trashInventory.setStackInSlot(i, trashSlots.get(i).copy()); + + // Ensure targetAddress is initialized (may be called before constructor completes) + if (targetAddress == null) { + targetAddress = ""; + } + + // Server-side only: Load from RoboManager + Level level = player.level(); + if (!level.isClientSide && level instanceof ServerLevel serverLevel) { + UUID networkId = getNetworkId(); + if (networkId != null) { + RoboTrashStore trashStore = RoboManager.get(serverLevel).getTrashStore(networkId, player.getUUID()); + if (trashStore != null) { + List trashSlots = trashStore.getItemStacks(); + for (int i = 0; i < trashSlots.size() && i < trashInventory.getSlots(); i++) { + // Use copies to avoid modifying the original store's items + trashInventory.setStackInSlot(i, trashSlots.get(i).copy()); + } + // Only update targetAddress if it wasn't already set (e.g., from constructor parameter) + if (targetAddress.isEmpty()) { + targetAddress = trashStore.getTargetAddress(); + } } - targetAddress = trashStore.getTargetAddress(); } } } @@ -136,7 +149,9 @@ private List toTrashStacks() { @Override protected void addSlots() { for (int i = 0; i < trashInventory.getSlots(); i++) { - addSlot(new TrashStackHandler(trashInventory, i, 40 + i * 20, 4)); + TrashStackHandler slot = new TrashStackHandler(trashInventory, i, 40 + i * 20, 4); + slot.setMenu(this); + addSlot(slot); } addPlayerSlots(48, 84); } @@ -146,19 +161,26 @@ protected void saveData(PortableStockTicker contentHolder) { } - private void saveDataImmediately() { - if (player.level() instanceof ServerLevel serverLevel) { - UUID networkId = getNetworkId(); + + private void saveDataImmediately(ServerLevel serverLevel) { + UUID networkId = getNetworkId(); + if (networkId != null) { RoboManager roboManager = RoboManager.get(serverLevel); roboManager.setTrashSlots(serverLevel, networkId, player.getUUID(), toTrashStacks()); } } - class TrashStackHandler extends SlotItemHandler { + static class TrashStackHandler extends SlotItemHandler { + private TrashMenu menu; + public TrashStackHandler(IItemHandler itemHandler, int index, int xPosition, int yPosition) { super(itemHandler, index, xPosition, yPosition); } + public void setMenu(TrashMenu menu) { + this.menu = menu; + } + @Override public boolean mayPlace(ItemStack stack) { return !(stack.getItem() instanceof PortableStockTicker); @@ -167,8 +189,13 @@ public boolean mayPlace(ItemStack stack) { @Override public void setChanged() { super.setChanged(); - // Save immediately when items are moved via mouse - saveDataImmediately(); + // Only save immediately on server + if (menu != null) { + var level = menu.player.level(); + if (!level.isClientSide && level instanceof ServerLevel serverLevel) { + menu.saveDataImmediately(serverLevel); + } + } } } } diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java index 5cda96f1..d5de7a96 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashScreen.java @@ -44,17 +44,18 @@ protected void init() { protected void containerTick() { super.containerTick(); addressBox.tick(); - // Check if address has changed and sync to server + // Check if address has changed and sync to server (client initiates, server handles) String currentAddress = addressBox.getValue(); if (!currentAddress.equals(lastSyncedAddress)) { lastSyncedAddress = currentAddress; + // Send to server - server-side will handle RoboManager update CatnipServices.NETWORK.sendToServer(new SyncTrashAddressPacket(currentAddress)); } } @Override public void onClose() { - // Save the address one final time when closing + // Save the address one final time when closing (send to server) String currentAddress = addressBox.getValue(); if (!currentAddress.equals(lastSyncedAddress)) { CatnipServices.NETWORK.sendToServer(new SyncTrashAddressPacket(currentAddress)); diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index b46a3258..2f53e38b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -92,7 +92,7 @@ public void add(VirtualRobo robo) { this.setDirty(); } - public @Nullable RoboTrashStore getTrashStore(UUID networkId, UUID playerId) { + public @Nullable RoboTrashStore getTrashStore(@NotNull UUID networkId, @NotNull UUID playerId) { return roboTrashStores.stream() .filter((store) -> store.getNetworkUUID().equals(networkId)) .filter((store) -> store.getPlayerUUID().equals(playerId)) @@ -150,30 +150,32 @@ public void tick(ServerLevel level) { beePortRoboRequests.removeIf(r -> (r.getStatus() == RoboRequest.Status.DONE || r.getStatus() == RoboRequest.Status.CANCELLED) && (now - r.getCreatedAt()) > 60_000); // handle trash stores - roboTrashStores.forEach(store -> { - if (store.getItemStacks().isEmpty()) return; - Player player = level.getPlayerByUUID(store.getPlayerUUID()); - if (player == null) return; - - UUID networkId = store.getNetworkUUID(); - UUID playerId = store.getPlayerUUID(); - - // Check if there is already an active request for this player and network - // This will also clean up dead robos by marking their requests as CANCELLED - if (hasActiveTrashRequest(playerId, networkId)) { - return; - } + synchronized (this) { + roboTrashStores.forEach(store -> { + if (store.getItemStacks().isEmpty()) return; + Player player = level.getPlayerByUUID(store.getPlayerUUID()); + if (player == null) return; + + UUID networkId = store.getNetworkUUID(); + UUID playerId = store.getPlayerUUID(); + + // Check if there is already an active request for this player and network + // This will also clean up dead robos by marking their requests as CANCELLED + if (hasActiveTrashRequest(playerId, networkId)) { + return; + } - // At this point, there's no active request, so we can create a new one - // (The previous request either completed, was cancelled, or had a dead robo) - RoboRequest request = new RoboRequest(new PlayerTarget( - player, - networkId - ), networkId, RoboRequest.Mission.PICKUP); + // At this point, there's no active request, so we can create a new one + // (The previous request either completed, was canceled, or had a dead robo) + RoboRequest request = new RoboRequest(new PlayerTarget( + player, + networkId + ), networkId, RoboRequest.Mission.PICKUP); - store.setLastRequest(request); - requestRobo(request); - }); + store.setLastRequest(request); + requestRobo(request); + }); + } this.setDirty(); } @@ -190,7 +192,7 @@ private void tryHandlingRequest(RoboRequest request, ServerLevel level) { /** * Checks if there is already an active request (PENDING or IN_PROGRESS) for the given player and network. * This ensures only one bee is sent per player+network combination at a time. - * If a request is IN_PROGRESS but the robo is dead, it will be cancelled and return false. + * If a request is IN_PROGRESS but the robo is dead, it will be canceled and return false. */ private boolean hasActiveTrashRequest(UUID playerId, UUID networkId) { for (RoboRequest request : beePortRoboRequests) { @@ -218,7 +220,7 @@ private boolean hasActiveTrashRequest(UUID playerId, UUID networkId) { if (roboExists) { return true; } else { - // Robo is dead but request is still IN_PROGRESS - mark as cancelled + // Robo is dead but request is still IN_PROGRESS - mark as canceled request.setStatus(RoboRequest.Status.CANCELLED); } } From f9db75878719865d04970d60e9775333b7344c8d Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 22:33:34 +0100 Subject: [PATCH 37/70] Refactor trash store to use Optional ItemStacks --- .../robo_entity/RoboBeeBehaviorController.java | 2 +- .../SyncTrashItemsToClientPacket.java | 2 +- .../trash_menu/TrashMenu.java | 6 ++---- .../robo/RoboManager.java | 3 +-- .../robo/RoboTrashStore.java | 17 +++++++---------- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java index 30eae6bb..796d09db 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java @@ -71,7 +71,7 @@ private void handlePickupPackage(VirtualRobo robo) { private boolean pickupPackageFromPlayer(Player player, VirtualRobo robo) { RoboTrashStore trashStore = RoboManager.get(robo.getServerLevel()).getTrashStore(robo.getLogisticsNetworkId(), player.getUUID()); List trashSlots = trashStore != null ? trashStore.getItemStacks() : List.of(); - if (trashSlots.isEmpty()) { + if (trashStore == null || !trashStore.hasItems()) { return true; } ItemStack packageItem = PackageItem.containing(trashSlots); diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java index b1650916..8b47da67 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/SyncTrashItemsToClientPacket.java @@ -14,7 +14,7 @@ public class SyncTrashItemsToClientPacket implements ClientboundPacketPayload { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.collection(ArrayList::new, ItemStack.STREAM_CODEC), packet -> packet.items, + ByteBufCodecs.collection(ArrayList::new, ItemStack.OPTIONAL_STREAM_CODEC), packet -> packet.items, SyncTrashItemsToClientPacket::new ); diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 2b9b2808..775d7435 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -138,10 +138,8 @@ public void updateTrashInventory(List items) { private List toTrashStacks() { List trashStacks = new ArrayList<>(); for (int i = 0; i < trashInventory.getSlots(); i++) { - ItemStack stack = trashInventory.getStackInSlot(i); - if (!stack.isEmpty()) { - trashStacks.add(stack); - } + // Include all slots (even empty) so slot indices are preserved on the client + trashStacks.add(trashInventory.getStackInSlot(i).copy()); } return trashStacks; } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index 2f53e38b..50c34365 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -152,7 +152,7 @@ public void tick(ServerLevel level) { // handle trash stores synchronized (this) { roboTrashStores.forEach(store -> { - if (store.getItemStacks().isEmpty()) return; + if (!store.hasItems()) return; Player player = level.getPlayerByUUID(store.getPlayerUUID()); if (player == null) return; @@ -172,7 +172,6 @@ public void tick(ServerLevel level) { networkId ), networkId, RoboRequest.Mission.PICKUP); - store.setLastRequest(request); requestRobo(request); }); } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java index a253b4cb..39ce7a8f 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboTrashStore.java @@ -1,6 +1,5 @@ package de.theidler.create_mobile_packages.robo; -import de.theidler.create_mobile_packages.blocks.bee_port.RoboRequest; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -14,7 +13,6 @@ public class RoboTrashStore { private final UUID playerUUID; private final UUID networkUUID; private final List itemStacks; - private RoboRequest lastRequest; private String targetAddress = ""; public RoboTrashStore(UUID playerUUID, UUID networkUUID, List itemStacks) { @@ -38,14 +36,6 @@ public static RoboTrashStore load(CompoundTag tag) { return store; } - public RoboRequest getLastRequest() { - return lastRequest; - } - - public void setLastRequest(RoboRequest lastRequest) { - this.lastRequest = lastRequest; - } - public String getTargetAddress() { return targetAddress; } @@ -66,6 +56,13 @@ public List getItemStacks() { return itemStacks; } + /** + * Returns true if at least one slot contains a non-empty ItemStack. + */ + public boolean hasItems() { + return itemStacks.stream().anyMatch(stack -> !stack.isEmpty()); + } + public CompoundTag save() { CompoundTag tag = new CompoundTag(); tag.putUUID("PlayerUUID", playerUUID); From 4aeaa317726bf57f61395bee5e08e7b2db24ef20 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 22:55:09 +0100 Subject: [PATCH 38/70] Implement atomic trash item pickup and update TrashMenu interaction --- .../RoboBeeBehaviorController.java | 28 ++++++++-- .../trash_menu/TrashMenu.java | 52 +++++++++++++++++-- .../robo/RoboManager.java | 18 +++++++ 3 files changed, 88 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java index 796d09db..8411d038 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java @@ -3,11 +3,15 @@ import com.simibubi.create.content.logistics.box.PackageItem; import de.theidler.create_mobile_packages.blocks.bee_port.BeePortBlockEntity; import de.theidler.create_mobile_packages.blocks.bee_port.RoboRequest; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.SyncTrashItemsToClientPacket; +import de.theidler.create_mobile_packages.items.portable_stock_ticker.trash_menu.TrashMenu; import de.theidler.create_mobile_packages.robo.PlayerTarget; import de.theidler.create_mobile_packages.robo.RoboManager; import de.theidler.create_mobile_packages.robo.RoboTrashStore; import de.theidler.create_mobile_packages.robo.VirtualRobo; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; @@ -69,18 +73,32 @@ private void handlePickupPackage(VirtualRobo robo) { } private boolean pickupPackageFromPlayer(Player player, VirtualRobo robo) { - RoboTrashStore trashStore = RoboManager.get(robo.getServerLevel()).getTrashStore(robo.getLogisticsNetworkId(), player.getUUID()); - List trashSlots = trashStore != null ? trashStore.getItemStacks() : List.of(); + RoboManager manager = RoboManager.get(robo.getServerLevel()); + RoboTrashStore trashStore = manager.getTrashStore(robo.getLogisticsNetworkId(), player.getUUID()); if (trashStore == null || !trashStore.hasItems()) { return true; } - ItemStack packageItem = PackageItem.containing(trashSlots); + String targetAddress = trashStore.getTargetAddress(); + + List takenItems = manager.takeTrashItems(robo.getLogisticsNetworkId(), player.getUUID()); + if (takenItems == null) { + return true; + } + + ServerPlayer serverPlayer = robo.getServerLevel().getServer().getPlayerList().getPlayer(player.getUUID()); + if (serverPlayer != null) { + if (serverPlayer.containerMenu instanceof TrashMenu trashMenu) { + trashMenu.markAsPickedUpByRobo(); + } + CatnipServices.NETWORK.sendToClient(serverPlayer, new SyncTrashItemsToClientPacket(List.of())); + } + + ItemStack packageItem = PackageItem.containing(takenItems); if (packageItem.isEmpty()) { return false; } - RoboManager.get(robo.getServerLevel()).setTrashSlots(robo.getServerLevel(), robo.getLogisticsNetworkId(), player.getUUID(), List.of()); - PackageItem.addAddress(packageItem, trashStore.getTargetAddress()); + PackageItem.addAddress(packageItem, targetAddress); robo.setItemStack(packageItem); return true; } diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java index 775d7435..42877bff 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/trash_menu/TrashMenu.java @@ -27,6 +27,14 @@ public class TrashMenu extends MenuBase { private ItemStackHandler trashInventory; private String targetAddress; + /** + * True after a robo picks up the items; cleared on the next user interaction. + */ + boolean pickedUpByRobo = false; + /** + * True while markAsPickedUpByRobo() clears slots, so setChanged() won't reset the flag. + */ + private boolean clearingForPickup = false; public TrashMenu(int id, Inventory playerInventory, PortableStockTicker contentHolder) { super(CMPMenuTypes.TRASH_MENU.get(), id, playerInventory, contentHolder); @@ -124,6 +132,22 @@ public void setTargetAddress(String address) { this.targetAddress = address; } + /** + * Called by the robo after atomically taking items. Clears the menu inventory and + * blocks saveDataImmediately until the next real user interaction. + */ + public void markAsPickedUpByRobo() { + pickedUpByRobo = true; + clearingForPickup = true; + try { + for (int i = 0; i < trashInventory.getSlots(); i++) { + trashInventory.setStackInSlot(i, ItemStack.EMPTY); + } + } finally { + clearingForPickup = false; + } + } + public void updateTrashInventory(List items) { // Update the trash inventory with items from server for (int i = 0; i < trashInventory.getSlots(); i++) { @@ -155,16 +179,32 @@ protected void addSlots() { } @Override - protected void saveData(PortableStockTicker contentHolder) { - + public void removed(Player playerIn) { + if (!playerIn.level().isClientSide && playerIn.level() instanceof ServerLevel serverLevel && !pickedUpByRobo) { + ItemStack carried = getCarried(); + if (!carried.isEmpty()) { + for (int i = 0; i < trashInventory.getSlots(); i++) { + if (trashInventory.getStackInSlot(i).isEmpty()) { + trashInventory.setStackInSlot(i, carried.copy()); + setCarried(ItemStack.EMPTY); + break; + } + } + } + saveDataImmediately(serverLevel); + } + super.removed(playerIn); } + @Override + protected void saveData(PortableStockTicker contentHolder) { + } private void saveDataImmediately(ServerLevel serverLevel) { + if (pickedUpByRobo) return; UUID networkId = getNetworkId(); if (networkId != null) { - RoboManager roboManager = RoboManager.get(serverLevel); - roboManager.setTrashSlots(serverLevel, networkId, player.getUUID(), toTrashStacks()); + RoboManager.get(serverLevel).setTrashSlots(serverLevel, networkId, player.getUUID(), toTrashStacks()); } } @@ -187,10 +227,12 @@ public boolean mayPlace(ItemStack stack) { @Override public void setChanged() { super.setChanged(); - // Only save immediately on server if (menu != null) { var level = menu.player.level(); if (!level.isClientSide && level instanceof ServerLevel serverLevel) { + if (!menu.clearingForPickup) { + menu.pickedUpByRobo = false; + } menu.saveDataImmediately(serverLevel); } } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index 50c34365..f900ee12 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -99,6 +99,24 @@ public void add(VirtualRobo robo) { .findFirst().orElse(null); } + /** + * Atomically reads and clears the trash items for the given player+network combination. + * Returns a snapshot of the items that were in the store (copies), and empties the store. + * Returns null if no store exists or the store has no items. + * This prevents duplication when items are modified concurrently while a robo picks them up. + */ + public synchronized @Nullable List takeTrashItems(@NotNull UUID networkId, @NotNull UUID playerId) { + RoboTrashStore store = getTrashStore(networkId, playerId); + if (store == null || !store.hasItems()) return null; + List snapshot = new ArrayList<>(); + for (ItemStack stack : store.getItemStacks()) { + snapshot.add(stack.copy()); + } + store.getItemStacks().clear(); + this.setDirty(); + return snapshot; + } + public synchronized void setTrashSlots(UUID networkId, UUID playerId, List trashSlots) { RoboTrashStore existingStore = getTrashStore(networkId, playerId); if (existingStore != null) { From 36cabf0257e4b56dff608d564b6819e4a1b962cc Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:00:26 +0100 Subject: [PATCH 39/70] Update CHANGELOG.md for TrashSlots #299 --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f22bced2..ba774f79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +------------------------------------------------------ +Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased +------------------------------------------------------ + +### Additions + +- Added TrashSlots to the Portable Stock Ticker allowing players to send items (#299) + - Set an address + - Put items in the TrashSlots + - A Robo Bee will come and pick up the items and send them to the address + ------------------------------------------------------ Create: Mobile Packages - v0.6.1 - 1.21.1 - 20.02.2026 ------------------------------------------------------ From 0868d8df13d4225e3b01483d0d73114cb52d2ff3 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:44 +0100 Subject: [PATCH 40/70] New translations en_us.json (French) --- .../resources/assets/create_mobile_packages/lang/fr_fr.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json index dda8f335..5295bcf6 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json +++ b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 5215bc1cc591714b86d11c171adb5f8aeca392ed Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:45 +0100 Subject: [PATCH 41/70] New translations en_us.json (German) --- .../resources/assets/create_mobile_packages/lang/de_de.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index 0e04d29d..6740c41b 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 1c3881f0d283db3d36837bba9cabc1a9e8f2fa78 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:46 +0100 Subject: [PATCH 42/70] New translations en_us.json (Japanese) --- .../resources/assets/create_mobile_packages/lang/ja_jp.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 29d71a37..6d013240 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "ビーポートの情報", "create_mobile_packages.network.players": "ネットワーク内のプレイヤー:", "create_mobile_packages.network.owner": "所有者: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 6aede07204c63d433513df05c7706a58e0c79322 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:48 +0100 Subject: [PATCH 43/70] New translations en_us.json (Polish) --- .../resources/assets/create_mobile_packages/lang/pl_pl.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index e95615bd..109bb214 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 4cfdacb4c602304e0e16ad49aae3dec74abb716a Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:49 +0100 Subject: [PATCH 44/70] New translations en_us.json (Russian) --- .../resources/assets/create_mobile_packages/lang/ru_ru.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index e9076bbe..3dab2e56 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Игроки в сети:", "create_mobile_packages.network.owner": "Владелец: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 4e53316242b0fcedd139fe1c3021eda02bb2c2f4 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:50 +0100 Subject: [PATCH 45/70] New translations en_us.json (Swedish) --- .../resources/assets/create_mobile_packages/lang/sv_se.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 546e1de8..6680c82b 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "Robot Bi Ports Information", "create_mobile_packages.network.players": "Spelare i Nätverk: ", "create_mobile_packages.network.owner": "Ägare: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 98a3b215896fbd81ecd7a4e2bad9f044e305f04e Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:51 +0100 Subject: [PATCH 46/70] New translations en_us.json (Chinese Simplified) --- .../resources/assets/create_mobile_packages/lang/zh_cn.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 9d7d0802..8080fd2e 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "运输蜂停泊港信息", "create_mobile_packages.network.players": "网络中的玩家:", "create_mobile_packages.network.owner": "所有者:%1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 36c77305a8dd91de36968879708c6f2903a4d0e9 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:02:52 +0100 Subject: [PATCH 47/70] New translations en_us.json (Portuguese, Brazilian) --- .../resources/assets/create_mobile_packages/lang/pt_br.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json index c6f28ad1..179c5897 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json @@ -69,9 +69,5 @@ "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", "create_mobile_packages.network.players": "Players in Network:", "create_mobile_packages.network.owner": "Owner: %1$s", - "create_mobile_packages": { - "keyinfo": { - "open_player_networks_screen": "Open Network Settings" - } - } + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" } From 252e37d0e2761ff5ef39d8c20f6a649a22618e69 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:06:54 +0100 Subject: [PATCH 48/70] Add keyinfo for opening player networks screen in en_us.json --- src/main/resources/assets/create_mobile_packages/lang/en_us.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/en_us.json b/src/main/resources/assets/create_mobile_packages/lang/en_us.json index ea38d93c..a40192eb 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/en_us.json +++ b/src/main/resources/assets/create_mobile_packages/lang/en_us.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo Bee on the way!", "create_mobile_packages.toast.eta": "%1$s seconds remaining", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Open Portable Stock Ticker", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robo Bee Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "The Robo Bee Port can send a Package to a Player.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Place a package with an address matching the Player's name in the Robo Bee Port.", From 5cc229f9e61d00727ed889c0fc085e0f8aaca02c Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:26 +0100 Subject: [PATCH 49/70] New translations en_us.json (French) --- src/main/resources/assets/create_mobile_packages/lang/fr_fr.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json index 5295bcf6..6de2efe6 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json +++ b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robeille est en chemin !", "create_mobile_packages.toast.eta": "%1$s secondes restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Ouvrir le Téléscripteur de Stock Portable", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Port de Robeille", "create_mobile_packages.ponder.robo_bee_port.text_1": "Le Port de Robeille peut envoyer des colis à un joueur.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Placez un colis avec une adresse correspondant au nom du joueur dans le Port de Robeille.", From c5987b21d583ef44dc8d60d60827e590ebbb531a Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:27 +0100 Subject: [PATCH 50/70] New translations en_us.json (German) --- src/main/resources/assets/create_mobile_packages/lang/de_de.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index 6740c41b..c57915c2 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Biene auf dem Weg!", "create_mobile_packages.toast.eta": "%1$s Sekunden verbleibend", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öffne den Mobilen Lagerticker", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robo-Bienen Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Der Robo-Bienen Port kann Pakete an Spieler senden.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Platziere ein Paket mit einer Adresse, die dem Namen des Spielers entspricht in den Robo-Bienen Port.", From 9301304bbc0b1551b982d838757a32dad8ea01e0 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:28 +0100 Subject: [PATCH 51/70] New translations en_us.json (Japanese) --- src/main/resources/assets/create_mobile_packages/lang/ja_jp.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 6d013240..008d5ae2 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "ロボビーが間もなく到着します!", "create_mobile_packages.toast.eta": "到着まで残り%1$s秒", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "所持しているポータブルストックティッカーの画面を開く", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "ビーポート", "create_mobile_packages.ponder.robo_bee_port.text_1": "ロボビーはプレイヤーに小包を送ることができます", "create_mobile_packages.ponder.robo_bee_port.text_2": "プレイヤーと同じ名前のアドレスが設定された小包を配置してください", From 29d8ddac9ef098afb4fed83630cf92a306d3eaab Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:30 +0100 Subject: [PATCH 52/70] New translations en_us.json (Polish) --- src/main/resources/assets/create_mobile_packages/lang/pl_pl.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index 109bb214..a5a25529 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robo-Pszczół w drodze!", "create_mobile_packages.toast.eta": "Pozostało %1$s sekund", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Otwórz Przenośny Licznik Zapasów", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Port Robo-Pszczół", "create_mobile_packages.ponder.robo_bee_port.text_1": "Port Robo-Pszczół może wysłać Paczkę do gracza.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Umieść przesyłkę z adresem odpowiadającym imieniu Gracza w Porcie Robo-Pszcól.", From 1761aa06d1e692ba4ca4b2b3b2e115cbd223309c Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:31 +0100 Subject: [PATCH 53/70] New translations en_us.json (Russian) --- src/main/resources/assets/create_mobile_packages/lang/ru_ru.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index 3dab2e56..c0dc5922 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Пчелодрон в пути", "create_mobile_packages.toast.eta": "Ожидайте %1$s сек", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Открыть складскую сеть", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Размышляем над пчелопортами", "create_mobile_packages.ponder.robo_bee_port.text_1": "Пчелопорт может быть использован чтобы отправить посылку прямо к игроку.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Поместите посылку, у которой адрес совпадает с ником игрока в печлопорт.", From e35f085f0b7c3a7fbeb3362a394459c933443f5c Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:32 +0100 Subject: [PATCH 54/70] New translations en_us.json (Swedish) --- src/main/resources/assets/create_mobile_packages/lang/sv_se.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 6680c82b..47915f96 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robot Bi på väg!", "create_mobile_packages.toast.eta": "%1$s sekunder kvar", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Öppna Portabel Lagerindikator", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Robot Bi Port", "create_mobile_packages.ponder.robo_bee_port.text_1": "Robot Bi Porten kan skicka Paket till Spelare.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Placera ett paket med en adress som machar Spelarens namn i Robot Bi Porten.", From e3ca7bf4f2bb4bc33a71c937ca645c94ddd78ce6 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:33 +0100 Subject: [PATCH 55/70] New translations en_us.json (Chinese Simplified) --- src/main/resources/assets/create_mobile_packages/lang/zh_cn.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 8080fd2e..25411fa8 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "运输蜂正在运送货物!", "create_mobile_packages.toast.eta": "剩余时间:%1$s 秒", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "打开便携式仓库管理器", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "运输蜂停泊港", "create_mobile_packages.ponder.robo_bee_port.text_1": "运输蜂停泊港可将包裹送至玩家。", "create_mobile_packages.ponder.robo_bee_port.text_2": "将地址为玩家名的包裹放入运输蜂停泊港内。", From 7fa7b5899f7dc8aac1cf91c71996e55d6f441d39 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Mon, 23 Feb 2026 23:07:34 +0100 Subject: [PATCH 56/70] New translations en_us.json (Portuguese, Brazilian) --- src/main/resources/assets/create_mobile_packages/lang/pt_br.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json index 179c5897..5aacd4e5 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json @@ -22,6 +22,7 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Abelha Robô a caminho!", "create_mobile_packages.toast.eta": "%1$s segundos restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Abrir o Telégrafo de Estoque Portátil", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", "create_mobile_packages.ponder.robo_bee_port.header": "Porto de Abelhas Robô", "create_mobile_packages.ponder.robo_bee_port.text_1": "Porto de Abelhas Robô pode enviar Pacotes ao Jogador.", "create_mobile_packages.ponder.robo_bee_port.text_2": "Coloque um pacote com o endereço correspondente ao nome do jogador no Porto de Abelhas Robô.", From baf52552c43158b52d6dae4b172da71cecb787f2 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Thu, 26 Feb 2026 22:15:12 +0100 Subject: [PATCH 57/70] Fix Port with full packages inventory can't accept bee without package - fixed by replacing a line that didn't consider whether the bee has a package - Refactor hasSpace Functions fixes #301 --- CHANGELOG.md | 4 ++ .../blocks/bee_port/BeePortBlockEntity.java | 39 +++++++++---------- .../RoboBeeBehaviorController.java | 2 +- .../robo/BeePortBlockEntityTarget.java | 6 ++- .../robo/PlayerTarget.java | 2 +- .../robo/RoboTarget.java | 2 +- .../robo/VirtualRobo.java | 8 ++-- 7 files changed, 34 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba774f79..af5452f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased - Put items in the TrashSlots - A Robo Bee will come and pick up the items and send them to the address +### Bug Fixes + +- Fixed Port with full packages inventory can't accept RoboBee without package (#301) + ------------------------------------------------------ Create: Mobile Packages - v0.6.1 - 1.21.1 - 20.02.2026 ------------------------------------------------------ diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java index d8ed0677..683e3c07 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java @@ -363,7 +363,7 @@ private void sendItem(ItemStack itemStack, int slot) { // Check if the item can be sent to another drone port. if (CMPConfigs.server().portToPort.get() && !PackageItem.matchAddress(address, addressFilter)) { BeePortBlockEntity beePortBlockEntity = CMPHelper.getClosestBeePort(level, address, this.getBlockPos(), null, getLogisticsNetworkId()); - if (beePortBlockEntity != null && !beePortBlockEntity.isFull()) { + if (beePortBlockEntity != null && beePortBlockEntity.hasSpaceForPackageAndRobo()) { sendDrone(itemStack, slot); } } @@ -524,36 +524,35 @@ public void destroy() { } /** - * Checks if the drone port is full, considering a specified number of slots to leave empty. + * Checks if the at least one of the PackageSlots is empty. * - * @param slotsToLeaveEmpty The number of slots that should remain empty. - * @return True if the number of empty slots is less than or equal to the specified slots to leave empty, false otherwise. + * @return True if at least one slot is empty, false if all slots are full. */ - public boolean hasFullInventory(int slotsToLeaveEmpty) { - int emptySlots = 0; + public boolean hasSpaceForPackage() { for (int i = 0; i < inventory.getSlots(); i++) { if (inventory.getStackInSlot(i).isEmpty()) { - emptySlots++; + return true; } } - return emptySlots <= slotsToLeaveEmpty; - } - - public synchronized boolean hasFullRoboSlot(int leaveEmpty) { - return roboBeeInventory.getStackInSlot(0).getCount() >= ROBOBEE_INVENTORY_STACK_SIZE - leaveEmpty; + return false; } /** - * Checks if the drone port is full. + * Checks if there is space for at least one Robo-Bee in the RoboBeeInventory. * - * @return True if the drone port is full, false otherwise. + * @return True if there is space for at least one Robo-Bee, false otherwise. */ - public boolean isFull() { - return isFull(0); + public synchronized boolean hasSpaceForRobo() { + return roboBeeInventory.getStackInSlot(0).getCount() < ROBOBEE_INVENTORY_STACK_SIZE; } - public boolean isFull(int slotsToLeaveEmpty) { - return hasFullInventory(slotsToLeaveEmpty) || hasFullRoboSlot(0); + /** + * Checks if there is space for at least one Package and one Robo-Bee in the respective inventories. + * + * @return True if there is space for at least one Package and one Robo-Bee, false otherwise. + */ + public boolean hasSpaceForPackageAndRobo() { + return hasSpaceForPackage() && hasSpaceForRobo(); } /** @@ -565,9 +564,9 @@ public boolean isFull(int slotsToLeaveEmpty) { */ public synchronized boolean canAcceptEntity(VirtualRobo entity, Boolean hasPackage) { if (this.isRemoved()) return false; - if (entity == null) return hasPackage ? !isFull() : !hasFullRoboSlot(0); + if (entity == null) return hasPackage ? hasSpaceForPackageAndRobo() : hasSpaceForRobo(); if (hasRoboRequest()) return false; - return hasPackage ? !isFull() : !hasFullRoboSlot(0); + return hasPackage ? hasSpaceForPackageAndRobo() : hasSpaceForRobo(); } public ItemStackHandler getRoboBeeInventory() { diff --git a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java index 8411d038..d6adc93a 100644 --- a/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java +++ b/src/main/java/de/theidler/create_mobile_packages/entities/robo_entity/RoboBeeBehaviorController.java @@ -105,7 +105,7 @@ private boolean pickupPackageFromPlayer(Player player, VirtualRobo robo) { private void handleIdle(VirtualRobo robo) { robo.setTargetVelocity(Vec3.ZERO); - if (robo.getTarget() != null && robo.getTarget().isValid()) { + if (robo.getTarget() != null && robo.getTarget().isValid(robo)) { setState(RoboBeeState.TAKEOFF); } } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java b/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java index ff57c6c8..130025d4 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java @@ -29,9 +29,11 @@ public BeePortBlockEntity asBeePortBlockEntity() { } @Override - public boolean isValid() { + public boolean isValid(VirtualRobo robo) { BeePortBlockEntity be = asBeePortBlockEntity(); - return be != null && !be.isRemoved() && !be.isFull(); + boolean doesBeePortExits = be != null && !be.isRemoved(); + boolean hasItemStack = !robo.getItemStack().isEmpty(); + return doesBeePortExits && (hasItemStack ? be.hasSpaceForPackageAndRobo() : be.hasSpaceForRobo()); } @Override diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java b/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java index e3d97b7c..73f75a16 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/PlayerTarget.java @@ -56,7 +56,7 @@ public Player asPlayer() { } @Override - public boolean isValid() { + public boolean isValid(VirtualRobo robo) { return player != null && player.isAlive() && network != null && network.create_mobile_packages$getPlayers().contains(player.getUUID()); } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboTarget.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboTarget.java index 8cf1471b..0e289088 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboTarget.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboTarget.java @@ -20,7 +20,7 @@ default BlockPos asBlockPos() { return null; } - default boolean isValid() { + default boolean isValid(VirtualRobo robo) { return true; } diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java b/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java index 9b74eb20..74c90bdd 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java @@ -103,11 +103,11 @@ private void setTargetFromItemStack(ItemStack itemStack) { private void updateTarget() { // if the target is still valid and in the correct network, do nothing - if (target != null && target.isValid()) return; + if (target != null && target.isValid(this)) return; // try finding a Player first target = PlayerTarget.fromAddress(serverLevel, targetAddress, logisticsNetworkId); - if (target != null && target.isValid()) { + if (target != null && target.isValid(this)) { return; } @@ -116,7 +116,7 @@ private void updateTarget() { if (targetBlockEntity != null) { target = new BeePortBlockEntityTarget(targetBlockEntity); } - if (target != null && target.isValid()) { + if (target != null && target.isValid(this)) { return; } @@ -125,7 +125,7 @@ private void updateTarget() { if (homePort != null) { target = new BeePortBlockEntityTarget(homePort); } - if (target != null && target.isValid()) { + if (target != null && target.isValid(this)) { return; } From 9fc1f4e70a327c55711d0e15191f76cb81556d35 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 18:22:18 +0100 Subject: [PATCH 58/70] Fix PST not updating if Netowrk has no Items fixes #302 --- CHANGELOG.md | 1 + .../items/portable_stock_ticker/RequestStockUpdate.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af5452f9..d476e322 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased ### Bug Fixes - Fixed Port with full packages inventory can't accept RoboBee without package (#301) +- Fixed Portable Stock Ticker not updating to an empty item list if the last item is removed (#302) ------------------------------------------------------ Create: Mobile Packages - v0.6.1 - 1.21.1 - 20.02.2026 diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/RequestStockUpdate.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/RequestStockUpdate.java index 4a01756c..522e285b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/RequestStockUpdate.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/RequestStockUpdate.java @@ -30,6 +30,11 @@ public void handle(ServerPlayer player) { return; List allStacks = getAccurateSummary(stack).get(); + if (allStacks.isEmpty()) { + CatnipServices.NETWORK.sendToClient(player, new GenericStackListPacket(List.of(), true)); + return; + } + for (int i = 0; i < allStacks.size(); i += MAX_ITEMS_PER_PACKET) { int end = Math.min(i + MAX_ITEMS_PER_PACKET, allStacks.size()); boolean last = end == allStacks.size(); From 859c50284858cb3559a42d50cb0c8152a5bf8c4c Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 19:02:22 +0100 Subject: [PATCH 59/70] feat: Add admin commands for network management (#305) Add comprehensive admin/OP command system for managing logistics networks: - /cmp network list: Display all networks with details * Shows network name, short ID, player count * Displays lock status and owner information * Only lists named networks (filters out unnamed networks) - /cmp network add : Add a player to a network * Argument order: player first, then network ID * Auto-completes to named networks only * Prevents adding players to unnamed networks - /cmp network remove : Remove a player from a network * Argument order: player first, then network ID * Auto-completes to networks the player is part of * Prevents removing players from networks they're not in Features: - Full command auto-completion with intelligent filtering - Clear success feedback messages - Admin/OP permission level 2 requirement for all commands - Null-safe checks for player lookups and network data Resolves server owner requests for easier network management on larger servers. --- CHANGELOG.md | 7 + .../index/CMPCommands.java | 120 +++++++++++++++++- 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d476e322..47b236c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased ### Additions +- Added Admin/OP Commands for Network Management (#305) + - `/cmp network list` - Display all logistics networks with names, player counts, lock status, and owner information + - `/cmp network add ` - Add a player to a network (auto-filters to named networks only) + - `/cmp network remove ` - Remove a player from a network (auto-filters to networks the player is + part of) + - Full command auto-completion with intelligent filtering + - Added TrashSlots to the Portable Stock Ticker allowing players to send items (#299) - Set an address - Put items in the TrashSlots diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java index 4904658a..9bd61131 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java @@ -3,16 +3,23 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; +import com.simibubi.create.Create; +import de.theidler.create_mobile_packages.IExtendedLogisticsNetwork; +import de.theidler.create_mobile_packages.network_settings.AddPlayerToNetworkPackage; +import de.theidler.create_mobile_packages.network_settings.NetworkHelper; +import de.theidler.create_mobile_packages.network_settings.RemovePlayerFromNetworkPackage; import de.theidler.create_mobile_packages.robo.RoboManager; -import de.theidler.create_mobile_packages.toast.types.SimpleToast; import de.theidler.create_mobile_packages.toast.RemoveAllToastsOnClientPacket; import de.theidler.create_mobile_packages.toast.ShowToastOnClientPacket; +import de.theidler.create_mobile_packages.toast.types.SimpleToast; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; import java.util.UUID; @@ -47,9 +54,100 @@ public static void register(CommandDispatcher dispatcher) { .executes(CMPCommands::clearRobos) ) ) + .then( + Commands.literal("network") + .requires(cs -> cs.hasPermission(2)) // admin only + .then( + Commands.literal("list") + .executes(CMPCommands::showAllNetworks) + ) + .then( + Commands.literal("add") + .then( + Commands.argument("player", EntityArgument.player()) + .then( + Commands.argument("networkId", StringArgumentType.word()) + .suggests((ctx, builder) -> { + Create.LOGISTICS.logisticsNetworks.forEach((uuid, value) -> { + IExtendedLogisticsNetwork extendedNetwork = NetworkHelper.getExtendedLogisticsNetwork(value); + String name = extendedNetwork != null ? extendedNetwork.create_mobile_packages$getName() : "Unnamed Network"; + if (!name.equals("Unnamed Network")) { + builder.suggest(uuid.toString()); + } + }); + return builder.buildFuture(); + }) + .executes(ctx -> addPlayerToNetwork(ctx, + EntityArgument.getPlayer(ctx, "player"), + UUID.fromString(StringArgumentType.getString(ctx, "networkId")))) + ) + ) + ) + .then( + Commands.literal("remove") + .then( + Commands.argument("player", EntityArgument.player()) + .then( + Commands.argument("networkId", StringArgumentType.word()) + .suggests((ctx, builder) -> { + ServerPlayer player = EntityArgument.getPlayer(ctx, "player"); + Create.LOGISTICS.logisticsNetworks.forEach((key, value) -> { + IExtendedLogisticsNetwork extendedNetwork = NetworkHelper.getExtendedLogisticsNetwork(value); + if (extendedNetwork != null && extendedNetwork.create_mobile_packages$getPlayers().contains(player.getUUID())) { + builder.suggest(key.toString()); + } + }); + return builder.buildFuture(); + }) + .executes(ctx -> removePlayerFromNetwork(ctx, + EntityArgument.getPlayer(ctx, "player"), + UUID.fromString(StringArgumentType.getString(ctx, "networkId")))) + ) + ) + ) + ) ); } + private static int showAllNetworks(CommandContext context) { + CommandSourceStack source = context.getSource(); + ServerLevel level = source.getLevel(); + + if (Create.LOGISTICS.logisticsNetworks.isEmpty()) { + source.sendSuccess(() -> Component.literal("No logistics networks found."), false); + return 0; + } + + StringBuilder output = new StringBuilder("═══════════════════════════════════\n"); + output.append("Logistics Networks:\n"); + + for (var entry : Create.LOGISTICS.logisticsNetworks.entrySet()) { + UUID networkId = entry.getKey(); + var logisticsNetwork = entry.getValue(); + IExtendedLogisticsNetwork extendedNetwork = NetworkHelper.getExtendedLogisticsNetwork(logisticsNetwork); + + String name = extendedNetwork != null ? extendedNetwork.create_mobile_packages$getName() : "Unnamed Network"; + if (name.equals("Unnamed Network")) continue; // Skip unnamed networks + + int playerCount = extendedNetwork.create_mobile_packages$getPlayers().size(); + boolean isLocked = logisticsNetwork.locked; + Player owner = level.getPlayerByUUID(logisticsNetwork.owner); + String ownerName = owner != null ? owner.getName().getString() : "Unknown"; + + String shortId = networkId.toString().substring(0, 8); + output.append("\n▸ ").append(name) + .append(" | ID: ").append(shortId).append("...") + .append("\n └─ Players: ").append(playerCount) + .append(" | Status: ").append(isLocked ? "🔒 Locked" : "🔓 Unlocked") + .append(" | Owner: ").append(ownerName); + } + + output.append("\n═══════════════════════════════════"); + String finalOutput = output.toString(); + source.sendSuccess(() -> Component.literal(finalOutput), false); + return 1; + } + private static int clearRobos(CommandContext context) { CommandSourceStack source = context.getSource(); ServerLevel level = source.getLevel(); @@ -78,4 +176,24 @@ private static int clearToasts(CommandContext context) { CatnipServices.NETWORK.sendToClient(player, RemoveAllToastsOnClientPacket.INSTANCE); return 1; } + + private static int addPlayerToNetwork(CommandContext context, ServerPlayer targetPlayer, UUID networkId) { + CommandSourceStack source = context.getSource(); + + AddPlayerToNetworkPackage packet = new AddPlayerToNetworkPackage(targetPlayer.getUUID(), networkId); + CatnipServices.NETWORK.sendToServer(packet); + + source.sendSuccess(() -> Component.literal("Added player " + targetPlayer.getName().getString() + " to network " + networkId), true); + return 1; + } + + private static int removePlayerFromNetwork(CommandContext context, ServerPlayer targetPlayer, UUID networkId) { + CommandSourceStack source = context.getSource(); + + RemovePlayerFromNetworkPackage packet = new RemovePlayerFromNetworkPackage(targetPlayer.getUUID(), networkId); + CatnipServices.NETWORK.sendToServer(packet); + + source.sendSuccess(() -> Component.literal("Removed player " + targetPlayer.getName().getString() + " from network " + networkId), true); + return 1; + } } From 18199299359f433614399de057fcfa46f7eae07f Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 20:41:36 +0100 Subject: [PATCH 60/70] Added Bee Port Return Mode toggle in the Bee Port GUI (#136) - New button that toggles between normal delivery and return mode - In return mode, Robo Bees spawned from that port fly back to their origin port after successful player delivery --- CHANGELOG.md | 4 ++ .../blocks/bee_port/BeePortBlockEntity.java | 17 ++++++- .../blocks/bee_port/BeePortMenu.java | 7 +++ .../blocks/bee_port/BeePortScreen.java | 39 +++++++++++++++- .../bee_port/ToggleBeeReturnModePacket.java | 42 ++++++++++++++++++ .../index/CMPIcons.java | 42 ++++++++++++++++++ .../index/CMPPackets.java | 2 + .../items/robo_bee/RoboBeeItem.java | 2 +- .../robo/RoboManager.java | 3 +- .../robo/VirtualRobo.java | 28 ++++++++++++ .../create_mobile_packages/lang/de_de.json | 2 + .../create_mobile_packages/lang/en_us.json | 2 + .../textures/gui/icons.png | Bin 0 -> 1047 bytes 13 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java create mode 100644 src/main/java/de/theidler/create_mobile_packages/index/CMPIcons.java create mode 100644 src/main/resources/assets/create_mobile_packages/textures/gui/icons.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 47b236c8..1755269a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased ### Additions +- Added Bee Port Return Mode toggle in the Bee Port GUI (#136) + - New button that toggles between normal delivery and return mode + - In return mode, Robo Bees spawned from that port fly back to their origin port after successful player delivery + - Added Admin/OP Commands for Network Management (#305) - `/cmp network list` - Display all logistics networks with names, player counts, lock status, and owner information - `/cmp network add ` - Add a player to a network (auto-filters to named networks only) diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java index 683e3c07..fd9fae85 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortBlockEntity.java @@ -61,8 +61,9 @@ public class BeePortBlockEntity extends PackagePortBlockEntity { private static final int ROBOBEE_INVENTORY_STACK_SIZE = 64; private UUID placerUUID; - private final ContainerData data = new SimpleContainerData(2); + private final ContainerData data = new SimpleContainerData(3); private final ItemStackHandler roboBeeInventory = new ItemStackHandler(1); + private boolean beeReturnModeEnabled = false; private final IItemHandler handler = new IItemHandler() { @Override public int getSlots() { @@ -209,6 +210,7 @@ private synchronized void requestRoboEntity() { protected void write(CompoundTag tag, HolderLookup.Provider registries, boolean clientPacket) { super.write(tag, registries, clientPacket); tag.put("RoboBeeInventory", roboBeeInventory.serializeNBT(registries)); + tag.putBoolean("BeeReturnModeEnabled", beeReturnModeEnabled); if (placerUUID != null) { tag.putUUID("PlacerUUID", placerUUID); } @@ -220,6 +222,7 @@ protected void read(CompoundTag tag, HolderLookup.Provider registries, boolean c if (tag.contains("RoboBeeInventory")) { roboBeeInventory.deserializeNBT(registries, tag.getCompound("RoboBeeInventory")); } + beeReturnModeEnabled = tag.getBoolean("BeeReturnModeEnabled"); if (tag.contains("PlacerUUID")) { placerUUID = tag.getUUID("PlacerUUID"); } @@ -242,6 +245,7 @@ public void tick() { int minEta = eta.stream().min(Comparator.naturalOrder()).orElse(-1); this.data.set(0, minEta); this.data.set(1, eta.isEmpty() ? 0 : 1); + this.data.set(2, beeReturnModeEnabled ? 1 : 0); } } @@ -412,7 +416,7 @@ private void sendDrone(ItemStack itemStack, int slot) { } roboSendCooldown = 2; if (level instanceof ServerLevel serverLevel) { - RoboManager.get(serverLevel).newRobo(serverLevel, itemStack, this.getBlockPos(), this.getLogisticsNetworkId(), 0, this.getBlockPos()); + RoboManager.get(serverLevel).newRobo(serverLevel, itemStack, this.getBlockPos(), this.getLogisticsNetworkId(), 0, this.getBlockPos(), beeReturnModeEnabled); } inventory.setStackInSlot(slot, ItemStack.EMPTY); } @@ -616,4 +620,13 @@ public void handleRequest(RoboRequest request) { RoboManager.get(serverLevel).newRequestRobo(serverLevel, this.getBlockPos(), request); } } + + public void setBeeReturnModeEnabled(boolean beeReturnModeEnabled) { + if (this.beeReturnModeEnabled == beeReturnModeEnabled) return; + this.beeReturnModeEnabled = beeReturnModeEnabled; + if (level != null && !level.isClientSide) { + level.blockEntityChanged(worldPosition); + } + setChanged(); + } } \ No newline at end of file diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortMenu.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortMenu.java index 4b331717..29d3909c 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortMenu.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortMenu.java @@ -127,4 +127,11 @@ public boolean isBeeOnTravel() { } return false; } + + public boolean isBeeReturnModeEnabled() { + if (data != null) { + return data.get(2) == 1; + } + return false; + } } diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortScreen.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortScreen.java index 108e4ec0..452df400 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortScreen.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/BeePortScreen.java @@ -3,7 +3,10 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortMenu; import com.simibubi.create.content.logistics.packagePort.PackagePortScreen; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; +import com.simibubi.create.foundation.gui.widget.IconButton; import de.theidler.create_mobile_packages.CreateMobilePackages; +import de.theidler.create_mobile_packages.index.CMPIcons; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; @@ -12,6 +15,9 @@ public class BeePortScreen extends PackagePortScreen { + private IconButton enableReturnModeButton; + private IconButton disableReturnModeButton; + public BeePortScreen(PackagePortMenu container, Inventory inv, Component title) { super(container, inv, title); } @@ -19,9 +25,31 @@ public BeePortScreen(PackagePortMenu container, Inventory inv, Component title) @Override protected void init() { super.init(); + int buttonX = getGuiLeft() - 22; + int buttonY = getGuiTop() - 10; + LogisticallyLinkedBehaviour lo = (LogisticallyLinkedBehaviour) menu.contentHolder.getAllBehaviours().stream().filter(b -> b instanceof LogisticallyLinkedBehaviour).findFirst().orElse(null); if (lo == null) return; - addRenderableWidget(createNetworkSettingsButton(getGuiLeft() - 22, getGuiTop() - 10, lo.freqId)); + addRenderableWidget(createNetworkSettingsButton(buttonX, buttonY, lo.freqId)); + + if (!(menu instanceof BeePortMenu beePortMenu) || !(menu.contentHolder instanceof BeePortBlockEntity beePort)) + return; + + enableReturnModeButton = new IconButton(buttonX, buttonY + 18, CMPIcons.I_RETURN); + enableReturnModeButton.setToolTip(Component.translatable("tooltip.create_mobile_packages.bee_port.enable_return_mode")); + enableReturnModeButton.withCallback(() -> CatnipServices.NETWORK.sendToServer( + new ToggleBeeReturnModePacket(beePort.getBlockPos(), true) + )); + addRenderableWidget(enableReturnModeButton); + + disableReturnModeButton = new IconButton(buttonX, buttonY + 18, CMPIcons.I_DIRECT); + disableReturnModeButton.setToolTip(Component.translatable("tooltip.create_mobile_packages.bee_port.disable_return_mode")); + disableReturnModeButton.withCallback(() -> CatnipServices.NETWORK.sendToServer( + new ToggleBeeReturnModePacket(beePort.getBlockPos(), false) + )); + addRenderableWidget(disableReturnModeButton); + + updateReturnModeButtons(beePortMenu.isBeeReturnModeEnabled()); } @Override @@ -30,6 +58,7 @@ protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, i graphics.blit(CreateMobilePackages.asResource("textures/gui/bee_port.png"), getGuiLeft(), getGuiTop(), 0, 47, 220, 82); if (menu instanceof BeePortMenu beePortMenu) { + updateReturnModeButtons(beePortMenu.isBeeReturnModeEnabled()); int eta = beePortMenu.getETA(); Component text = beePortMenu.isBeeOnTravel() ? Component.translatable("create_mobile_packages.bee_port.screen.arrival_time", eta) @@ -37,4 +66,12 @@ protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, i graphics.drawString(font, text, getGuiLeft() + 34, getGuiTop() + 64, 0x3D3C48, false); } } + + private void updateReturnModeButtons(boolean returnModeEnabled) { + if (enableReturnModeButton == null || disableReturnModeButton == null) return; + enableReturnModeButton.visible = !returnModeEnabled; + enableReturnModeButton.active = !returnModeEnabled; + disableReturnModeButton.visible = returnModeEnabled; + disableReturnModeButton.active = returnModeEnabled; + } } diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java new file mode 100644 index 00000000..cfad4825 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java @@ -0,0 +1,42 @@ +package de.theidler.create_mobile_packages.blocks.bee_port; + +import de.theidler.create_mobile_packages.index.CMPPackets; +import net.createmod.catnip.net.base.ServerboundPacketPayload; +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; + +public class ToggleBeeReturnModePacket implements ServerboundPacketPayload { + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, packet -> packet.portPos, + ByteBufCodecs.BOOL, packet -> packet.returnModeEnabled, + ToggleBeeReturnModePacket::new + ); + + private final BlockPos portPos; + private final boolean returnModeEnabled; + + public ToggleBeeReturnModePacket(BlockPos portPos, boolean returnModeEnabled) { + this.portPos = portPos; + this.returnModeEnabled = returnModeEnabled; + } + + @Override + public void handle(ServerPlayer player) { + if (player == null) return; + ServerLevel serverLevel = player.serverLevel(); + if (!(serverLevel.getBlockEntity(portPos) instanceof BeePortBlockEntity beePort)) return; + + beePort.setBeeReturnModeEnabled(returnModeEnabled); + } + + @Override + public PacketTypeProvider getTypeProvider() { + return CMPPackets.TOGGLE_BEE_RETURN_MODE; + } +} + diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPIcons.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPIcons.java new file mode 100644 index 00000000..2896e874 --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPIcons.java @@ -0,0 +1,42 @@ +package de.theidler.create_mobile_packages.index; + +import de.theidler.create_mobile_packages.CreateMobilePackages; +import net.createmod.catnip.gui.element.ScreenElement; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +public class CMPIcons implements ScreenElement { + // from com.simibubi.create.foundation.gui.AllIcons + public static final ResourceLocation ICON_ATLAS = ResourceLocation.fromNamespaceAndPath(CreateMobilePackages.MODID, "textures/gui/icons.png"); + public static final int ICON_ATLAS_SIZE = 256; + + private static int x = 0, y = -1; + public static final CMPIcons + I_RETURN = newRow(), + I_DIRECT = next(); + private final int iconX; + private final int iconY; + + + public CMPIcons(int x, int y) { + iconX = x * 16; + iconY = y * 16; + } + + private static CMPIcons next() { + return new CMPIcons(++x, y); + } + + private static CMPIcons newRow() { + return new CMPIcons(x = 0, ++y); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void render(@NotNull GuiGraphics graphics, int x, int y) { + graphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, ICON_ATLAS_SIZE, ICON_ATLAS_SIZE); + } +} diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java index 51b221a0..68859a57 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java @@ -1,6 +1,7 @@ package de.theidler.create_mobile_packages.index; import de.theidler.create_mobile_packages.CreateMobilePackages; +import de.theidler.create_mobile_packages.blocks.bee_port.ToggleBeeReturnModePacket; import de.theidler.create_mobile_packages.items.mobile_packager.ConfirmEditMenuPacket; import de.theidler.create_mobile_packages.items.mobile_packager.OpenEditMenuPacket; import de.theidler.create_mobile_packages.items.portable_stock_ticker.*; @@ -36,6 +37,7 @@ public enum CMPPackets implements BasePacketPayload.PacketTypeProvider { REQUEST_PLAYER_NETWORKS(RequestPlayerNetworksPacket.class, RequestPlayerNetworksPacket.STREAM_CODEC), OPEN_TRASH_MENU(OpenTrashMenuPacket.class, OpenTrashMenuPacket.STREAM_CODEC), SYNC_TRASH_ADDRESS(SyncTrashAddressPacket.class, SyncTrashAddressPacket.STREAM_CODEC), + TOGGLE_BEE_RETURN_MODE(ToggleBeeReturnModePacket.class, ToggleBeeReturnModePacket.STREAM_CODEC), // Server to Client BIG_ITEM_STACK_LIST(GenericStackListPacket.class, GenericStackListPacket.STREAM_CODEC), diff --git a/src/main/java/de/theidler/create_mobile_packages/items/robo_bee/RoboBeeItem.java b/src/main/java/de/theidler/create_mobile_packages/items/robo_bee/RoboBeeItem.java index 1c66d360..d4c04a28 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/robo_bee/RoboBeeItem.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/robo_bee/RoboBeeItem.java @@ -48,7 +48,7 @@ public RoboBeeItem(Properties pProperties) { if (level instanceof ServerLevel serverLevel) { UUID networkId = networkFromStack(context.getItemInHand()); UUID finalNetworkId = networkId != null ? networkId : UUID.randomUUID(); - RoboManager.get(serverLevel).newRobo(serverLevel, packageItem, pos, finalNetworkId, 1, null); + RoboManager.get(serverLevel).newRobo(serverLevel, packageItem, pos, finalNetworkId, 1, null, false); } context.getItemInHand().shrink(1); return InteractionResult.SUCCESS; diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index f900ee12..54570f87 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -245,11 +245,12 @@ private boolean hasActiveTrashRequest(UUID playerId, UUID networkId) { return false; } - public UUID newRobo(ServerLevel level, ItemStack itemStack, BlockPos spawnPos, UUID logisticsNetworkId, float packageHeightScale, @Nullable BlockPos homePort) { + public UUID newRobo(ServerLevel level, ItemStack itemStack, BlockPos spawnPos, UUID logisticsNetworkId, float packageHeightScale, @Nullable BlockPos homePort, boolean returnToHomeAfterDelivery) { UUID id = UUID.randomUUID(); VirtualRobo robo = new VirtualRobo(level, id, itemStack, spawnPos, logisticsNetworkId); robo.setPackageHeightScale(packageHeightScale); robo.setHomePortPos(homePort); + robo.setReturnToHomeAfterDelivery(returnToHomeAfterDelivery); this.add(robo); setDirty(); return id; diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java b/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java index 74c90bdd..b4295762 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/VirtualRobo.java @@ -39,6 +39,7 @@ public class VirtualRobo { private float packageHeightScale; private RoboRequest request = null; private @Nullable BlockPos homePortPos; + private boolean returnToHomeAfterDelivery; public VirtualRobo(ServerLevel level, UUID id, ItemStack itemStack, BlockPos spawnPos, UUID logisticsNetworkId) { this.id = id; @@ -64,6 +65,10 @@ public static VirtualRobo deserializeNBT(ServerLevel level, CompoundTag roboTag) VirtualRobo virtualRobo = new VirtualRobo(level, id, itemStack, BlockPos.containing(pos), logisticsNetworkId); virtualRobo.setSpeed(speed); + if (roboTag.contains("homePortPos")) { + virtualRobo.setHomePortPos(BlockPos.of(roboTag.getLong("homePortPos"))); + } + virtualRobo.setReturnToHomeAfterDelivery(roboTag.getBoolean("returnToHomeAfterDelivery")); if (!virtualRobo.getItemStack().isEmpty()) { virtualRobo.setPackageHeightScale(1.0f); } @@ -105,6 +110,17 @@ private void updateTarget() { // if the target is still valid and in the correct network, do nothing if (target != null && target.isValid(this)) return; + // Return-mode should prefer the original home port after successful delivery. + if (shouldReturnToHomePort()) { + BeePortBlockEntity homePort = CMPHelper.getPortAtPos(serverLevel, homePortPos); + if (homePort != null) { + target = new BeePortBlockEntityTarget(homePort); + if (target.isValid(this)) { + return; + } + } + } + // try finding a Player first target = PlayerTarget.fromAddress(serverLevel, targetAddress, logisticsNetworkId); if (target != null && target.isValid(this)) { @@ -222,6 +238,10 @@ public CompoundTag serializeNBT() { if (!getItemStack().isEmpty()) { tag.put("itemStack", getItemStack().save(serverLevel.registryAccess(), new CompoundTag())); } + if (homePortPos != null) { + tag.putLong("homePortPos", homePortPos.asLong()); + } + tag.putBoolean("returnToHomeAfterDelivery", returnToHomeAfterDelivery); return tag; } @@ -359,4 +379,12 @@ public void setHomePortPos(@Nullable BlockPos homePort) { if (homePort == null) return; this.homePortPos = homePort; } + + public boolean shouldReturnToHomePort() { + return returnToHomeAfterDelivery && request == null && (itemStack == null || itemStack.isEmpty()); + } + + public void setReturnToHomeAfterDelivery(boolean returnToHomeAfterDelivery) { + this.returnToHomeAfterDelivery = returnToHomeAfterDelivery; + } } diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index c57915c2..8d6b9401 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Platziere, das Item, um eine Robo-Biene zu erzeugen. Wird gebraucht in Robo-Bienen Ports um Pakete zu versenden.", "tooltip.create_mobile_packages.bee_port.jade.network": "Netzwerk: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Du bist Teil dieses Netzwerkes", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Bienen-Rückkehrmodus aktivieren", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Bienen-Rückkehrmodus deaktivieren", "tooltip.create_mobile_packages.network.remove_player": "Spieler entfernen", "tooltip.create_mobile_packages.network.add_yourself": "Füge dich hinzu", "tooltip.create_mobile_packages.network.leave": "Verlasse das Netzwerk", diff --git a/src/main/resources/assets/create_mobile_packages/lang/en_us.json b/src/main/resources/assets/create_mobile_packages/lang/en_us.json index e5f0695b..66a87786 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/en_us.json +++ b/src/main/resources/assets/create_mobile_packages/lang/en_us.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Item to spawn a Robo Bee. Needed in Robo Bee Ports to send packages.", "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "Remove Player", "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", "tooltip.create_mobile_packages.network.leave": "Leave Network", diff --git a/src/main/resources/assets/create_mobile_packages/textures/gui/icons.png b/src/main/resources/assets/create_mobile_packages/textures/gui/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..66e9d6056e9006248046a6b217e0172a893ab906 GIT binary patch literal 1047 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFdd!8*2|_w&Sfw(2>4|DUU?RqssQzCV6%ef-z8?>6v0H*WY?y2kw3 z>90b~S7%%^XPv&<{qTN+FB@#HFSM28`~2xj{r>;^`F~aLaNI65UUC091Dga_o*c7O tO@`qIfoHcH1k@Nt(P#(^pAh)Q&GtC*iO*KIg}@BY;OXk;vd$@?2>=0^%{c%7 literal 0 HcmV?d00001 From 65b2b9598d52b8d158de9ace76cd2ea511ca24bd Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 20:57:48 +0100 Subject: [PATCH 61/70] fix: Portable Stock Ticker loses address after restart (#287) Fixes the issue where the Portable Stock Ticker address was reset every time a player logs back into the world or restarts the game. Changes: - Created SavePortableStockTickerAddressPacket to persist address on server - Modified PortableStockTickerScreen to: * Load address directly from ItemStack in init() method (works in Curios slot) * Sync address to server whenever it changes (containerTick) * Save address when screen closes (onClose) - Registered new packet in CMPPackets enum Technical Details: - Address is now stored in ItemStack's DataComponent (persistent storage) - Fallback chain: ItemStack > in-memory > last known value - Works correctly with items in Curios slot or regular inventory - Minimal overhead: only syncs when address actually changes Fixes: - Address persists across world reloads - Address persists across game restarts - Works with items in any inventory slot (including Curios) --- CHANGELOG.md | 1 + .../index/CMPPackets.java | 1 + .../PortableStockTickerScreen.java | 37 ++++++++++++++++- .../SavePortableStockTickerAddressPacket.java | 40 +++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/SavePortableStockTickerAddressPacket.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 1755269a..c076b84f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased - Fixed Port with full packages inventory can't accept RoboBee without package (#301) - Fixed Portable Stock Ticker not updating to an empty item list if the last item is removed (#302) +- Fixed Portable Stock Ticker losing address after restart (#287) ------------------------------------------------------ Create: Mobile Packages - v0.6.1 - 1.21.1 - 20.02.2026 diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java index 68859a57..2a861753 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPPackets.java @@ -37,6 +37,7 @@ public enum CMPPackets implements BasePacketPayload.PacketTypeProvider { REQUEST_PLAYER_NETWORKS(RequestPlayerNetworksPacket.class, RequestPlayerNetworksPacket.STREAM_CODEC), OPEN_TRASH_MENU(OpenTrashMenuPacket.class, OpenTrashMenuPacket.STREAM_CODEC), SYNC_TRASH_ADDRESS(SyncTrashAddressPacket.class, SyncTrashAddressPacket.STREAM_CODEC), + SAVE_PORTABLE_STOCK_TICKER_ADDRESS(SavePortableStockTickerAddressPacket.class, SavePortableStockTickerAddressPacket.STREAM_CODEC), TOGGLE_BEE_RETURN_MODE(ToggleBeeReturnModePacket.class, ToggleBeeReturnModePacket.STREAM_CODEC), // Server to Client diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java index 5c1d8b20..a8b36b4b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/PortableStockTickerScreen.java @@ -85,6 +85,7 @@ public class PortableStockTickerScreen extends AbstractSimiContainerScreen stacks) { // Sort first (O(N log N)) stacks.sort(Comparator.comparingInt((GenericStack bigStack) -> -bigStack.amount())); @@ -260,11 +279,27 @@ protected void init() { addWidget(searchBox); boolean initial = addressBox == null; - String previouslyUsedAddress = initial ? menu.portableStockTicker.previouslyUsedAddress : addressBox.getValue(); + // Load address directly from the ItemStack to ensure it persists across world reloads + ItemStack pstStack = PortableStockTicker.find(playerInventory); + String previouslyUsedAddress = ""; + if (pstStack != null && pstStack.getItem() instanceof PortableStockTicker pst) { + String loadedAddress = pst.loadAddressFromStack(pstStack); + previouslyUsedAddress = loadedAddress != null ? loadedAddress : ""; + } + // Fall back to the in-memory address if nothing was loaded from stack + if (previouslyUsedAddress.isEmpty() && !initial) { + previouslyUsedAddress = addressBox.getValue(); + } + // If still empty, use the item's previouslyUsedAddress field as last resort + if (previouslyUsedAddress.isEmpty()) { + previouslyUsedAddress = menu.portableStockTicker.previouslyUsedAddress != null ? + menu.portableStockTicker.previouslyUsedAddress : ""; + } addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 27, y + windowHeight - 36, 92, 10, true, "@" + this.playerInventory.player.getName().getString()); addressBox.setTextColor(0x714A40); addressBox.setValue(previouslyUsedAddress); + lastSyncedAddress = previouslyUsedAddress; addRenderableWidget(addressBox); ClientScreenStorage.manualUpdate(); diff --git a/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/SavePortableStockTickerAddressPacket.java b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/SavePortableStockTickerAddressPacket.java new file mode 100644 index 00000000..7597babe --- /dev/null +++ b/src/main/java/de/theidler/create_mobile_packages/items/portable_stock_ticker/SavePortableStockTickerAddressPacket.java @@ -0,0 +1,40 @@ +package de.theidler.create_mobile_packages.items.portable_stock_ticker; + +import de.theidler.create_mobile_packages.index.CMPPackets; +import net.createmod.catnip.net.base.ServerboundPacketPayload; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +public class SavePortableStockTickerAddressPacket implements ServerboundPacketPayload { + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, packet -> packet.address, + SavePortableStockTickerAddressPacket::new + ); + + private final String address; + + public SavePortableStockTickerAddressPacket(String address) { + this.address = address; + } + + @Override + public void handle(ServerPlayer player) { + if (player == null) return; + + ItemStack pstStack = PortableStockTicker.find(player.getInventory()); + if (pstStack == null) return; + + PortableStockTicker pst = (PortableStockTicker) pstStack.getItem(); + pst.saveAddressToStack(pstStack, address); + } + + @Override + public PacketTypeProvider getTypeProvider() { + return CMPPackets.SAVE_PORTABLE_STOCK_TICKER_ADDRESS; + } +} + From b7058ec29d3eab6c99fa4632ced44d265cb225f3 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 21:23:49 +0100 Subject: [PATCH 62/70] Update README.md --- README.md | 91 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index c5dbf8ff..595847c1 100644 --- a/README.md +++ b/README.md @@ -10,77 +10,88 @@ A Minecraft mod that adds support for delivering Create Mod Packages directly to ## Requirements -### 1.20.1 Forge -- Forge 47.3.33 or newer -- Create 6.0.8 or newer - ### 1.21.1 NeoForge + - NeoForge 21.1.206 or newer - Create 6.0.9 or newer +### 1.20.1 Forge (no longer supported) +- Forge 47.3.33 or newer +- Create 6.0.8 or newer -## Where to Download? +## Download? - Modrinth: https://modrinth.com/mod/create-mobile-packages - Curseforge: https://www.curseforge.com/minecraft/mc-mods/create-mobile-packages -## Translations +## Overview + +### Logistics Network -[![Crowdin](https://badges.crowdin.net/create-mobile-packages/localized.svg)](https://crowdin.com/project/create-mobile-packages) This project is translated using Crowdin.[https://crowdin.com/project/create-mobile-packages](https://crowdin.com/project/create-mobile-packages) +The core of the mod is the **Logistics Network**. -You're welcome to contribute to the translations or add your language. +- **Linking**: Bee Ports must be linked to a network. Place a new one to create a network, or link to an existing one. +- **Security**: Robo Bees only fly to ports and players within the same network. +- **Membership**: Players can join a network via the Bee Port GUI. View your networks with the `H` hotkey. -## Items ### Bee Port -The **Bee Port** is a specialized block that automates the delivery of Create mod Packages to players or other Bee Ports. +The hub for your logistics network. -Key Features: -- **Package delivery system** that reads address labels and send a bee with the packages to players or other Bee Ports -- **Insert packages manually or automatically** using Funnels, Chutes, or Hoppers -- **Pull packages** from adjacent inventories -- **Push packages** to adjacent inventories if: - - The address matches the Bee Port's configured addresses - - The Bee Port receives a redstone signal +- **Send & Receive**: Automates package delivery to addresses (players or other ports). +- **Requirement**: Requires a **Robo Bee** item in its internal inventory to send packages. +- **Return Mode**: Toggle to have Robo Bees return to this port after delivering to a player. +- **Automation**: By default, it pulls packages from adjacent inventories. When powered by **Redstone**, it pushes items + to adjacent inventories. -![bee Port](https://github.com/user-attachments/assets/3b15287e-44fc-4ebc-9e59-a38fc2a5da49) +![Bee Port](https://github.com/user-attachments/assets/3b15287e-44fc-4ebc-9e59-a38fc2a5da49) -#### Robo Bee -The **Robo Bee** is an entity that delivers Create mod Packages to their destination. -It follows the address on the package, delivering directly to players or between Bee Ports as needed. +### Robo Bee -Key Features: -- **Spawned using the item** -- **Required by Bee Ports** to send packages -- **Carries packages** directly to players or between Bee Ports +The courier entity. -![robo_bee](https://github.com/user-attachments/assets/9b78670f-a2f8-4343-bd58-5936103a9596) +- **Delivery**: Carries packages to their destination address. +- **Spawning**: Right-click with a **Robo Bee** item to spawn. +- **Network**: The bee binds to the network the item is linked to. If the item is unlinked, the bee will target any + available port. -### Portable Stock Ticker +![Robo Bee](https://github.com/user-attachments/assets/9b78670f-a2f8-4343-bd58-5936103a9596) -The **Portable Stock Ticker** is a handheld device that integrates with a Create mod network, allowing players to request packages remotely. +### Portable Stock Ticker -Once linked to a **Stock Ticker** or a **Stock Link**, it provides a **Stockkeeper interface**, enabling players to request items on the go without needing direct access to a Stockkeeper. +A handheld device for remote item management. -Key Features: -- **Remote Item Requesting** via Stockkeeper interface -- **JEI-synchronized search** +- **Request Items**: Access your stock remotely by linking to Create Logistics Network. +- **Send Items**: Use the **Trash Slots** to send items from your inventory to a specific address via Robo Bee. - **Crafting support** within the request interface -- **Category synchronization**: If linked to a Stock Ticker with categories, those categories will be copied to the Portable Stock Ticker +- **JEI Support**: Synchronized item search. -![Controller](https://github.com/user-attachments/assets/d8a85e58-3ffa-4c2a-8b74-48f6c2b76642) +![Stock Ticker](https://github.com/user-attachments/assets/d8a85e58-3ffa-4c2a-8b74-48f6c2b76642) ### Mobile Packager -The **Mobile Packager** is a handheld device allowing players to create or modify Create mod Packages on the go. +A utility for managing packages on the go. -Key Features: -- **Creating Packages** using the device opens a GUI where up to nine Stacks can be placed along with an address. On submission, a new Package is placed in the player's inventory containing the added items. -- **Edit Packages** using the device with the Shift key opens a GUI where an existing package can be placed. On submission, the contents of the package are shown and can be modified. +- **Create**: Pack up to 9 item stacks into an addressed package. +- **Edit**: View and modify existing package contents (Sneak + Use). ![Mobile Packager](https://github.com/user-attachments/assets/9d21daf4-f64e-4df8-9ad3-a689e6f83ab5) +## Commands + +Admin commands for managing logistics networks. + +- `/cmp network list` - Display all networks, player counts, and owners. +- `/cmp network add ` - Force add a player to a network. +- `/cmp network remove ` - Force remove a player from a network. +- `/cmp robos clear` - Remove all Robo Bees from the world. + +## Translations + +[![Crowdin](https://badges.crowdin.net/create-mobile-packages/localized.svg)](https://crowdin.com/project/create-mobile-packages) + +Help translate the mod on [Crowdin](https://crowdin.com/project/create-mobile-packages). ## Gallery -![image](https://github.com/user-attachments/assets/80b6f028-61f9-415a-aa4d-bd911d1d1997) -![image](https://github.com/user-attachments/assets/9c9afb41-4671-4092-9a4f-0e23dbf155bb) +![Gallery 1](https://github.com/user-attachments/assets/80b6f028-61f9-415a-aa4d-bd911d1d1997) +![Gallery 2](https://github.com/user-attachments/assets/9c9afb41-4671-4092-9a4f-0e23dbf155bb) From 39c429fda246ca180df2667483168b06d6f800c0 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 21:44:41 +0100 Subject: [PATCH 63/70] Enhance README with setup instructions and images Added setup instructions and images for Robo Bee and Portable Stock Ticker. --- README.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 595847c1..3340cb09 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ The courier entity. A handheld device for remote item management. - **Request Items**: Access your stock remotely by linking to Create Logistics Network. -- **Send Items**: Use the **Trash Slots** to send items from your inventory to a specific address via Robo Bee. +- **Send Items**: Use the **Trash Slots** to send items from your inventory to a specific address via Robo Bee. (The Bee Port needs to be in the same network as the Portable Stock Ticker) - **Crafting support** within the request interface - **JEI Support**: Synchronized item search. @@ -93,5 +93,20 @@ Help translate the mod on [Crowdin](https://crowdin.com/project/create-mobile-pa ## Gallery -![Gallery 1](https://github.com/user-attachments/assets/80b6f028-61f9-415a-aa4d-bd911d1d1997) -![Gallery 2](https://github.com/user-attachments/assets/9c9afb41-4671-4092-9a4f-0e23dbf155bb) +### Simple Setup +Link the Port and the Stock Link, by clicking with one item on the other block. You can link your Portable Stock Ticker by Shift-Clicking with it on the Stock Link, Port or other Linked Blocks +2026-03-17_21 28 01 + +### Robo Bee on it's way delivering to you +2026-03-17_21 28 22 + +### Robo Bee on it's way picking up your Trash Slot items to deliver them to "Port1" +2026-03-17_21 34 10 + +### Portable Stock Ticker selecting items to be send to you +2026-03-17_21 29 00 + +### Admin Console Command to manage Networks (can also be done via UI) +2026-03-17_21 36 13 + + From 4cae09e212be33900d8dbe09aaabc4fb9583dd9e Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 21:48:44 +0100 Subject: [PATCH 64/70] refactor: Remove debug logging from network player addition and data request --- .../network_settings/AddPlayerToNetworkPackage.java | 3 --- .../network_settings/RequestNetworkDataPacket.java | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/network_settings/AddPlayerToNetworkPackage.java b/src/main/java/de/theidler/create_mobile_packages/network_settings/AddPlayerToNetworkPackage.java index 2809fdb4..0309277b 100644 --- a/src/main/java/de/theidler/create_mobile_packages/network_settings/AddPlayerToNetworkPackage.java +++ b/src/main/java/de/theidler/create_mobile_packages/network_settings/AddPlayerToNetworkPackage.java @@ -49,7 +49,6 @@ public void handle(ServerPlayer player) { } extendedNetwork.create_mobile_packages$addPlayer(playerId); - CreateMobilePackages.LOGGER.debug("Added player {} to network", playerId); // Mark as dirty to persist Create.LOGISTICS.markDirty(); @@ -70,5 +69,3 @@ public PacketTypeProvider getTypeProvider() { return CMPPackets.ADD_PLAYER_TO_NETWORK; } } - - diff --git a/src/main/java/de/theidler/create_mobile_packages/network_settings/RequestNetworkDataPacket.java b/src/main/java/de/theidler/create_mobile_packages/network_settings/RequestNetworkDataPacket.java index 15730430..4c0b6f6a 100644 --- a/src/main/java/de/theidler/create_mobile_packages/network_settings/RequestNetworkDataPacket.java +++ b/src/main/java/de/theidler/create_mobile_packages/network_settings/RequestNetworkDataPacket.java @@ -48,8 +48,6 @@ public void handle(ServerPlayer player) { return; } - CreateMobilePackages.LOGGER.debug("RequestNetworkDataPacket: Sending network data for {} to player {}", networkId, player.getName().getString()); - // Extract data directly from network NBT to avoid mixin issues String name = "Logistics Network " + networkId.toString().substring(0, 4); List players = new ArrayList<>(); @@ -60,7 +58,6 @@ public void handle(ServerPlayer player) { if (extendedNetwork != null) { name = extendedNetwork.create_mobile_packages$getName(); players = new ArrayList<>(extendedNetwork.create_mobile_packages$getPlayers()); - CreateMobilePackages.LOGGER.debug("RequestNetworkDataPacket: Got data from extended network - name: '{}', {} players", name, players.size()); } else { // Fallback: try to read from NBT CreateMobilePackages.LOGGER.debug("RequestNetworkDataPacket: extendedNetwork is null, trying NBT fallback"); From 55b08ac16d2f54f943b961172eda91b7424bc973 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 21:49:06 +0100 Subject: [PATCH 65/70] New Crowdin updates (#306) * New translations en_us.json (French) * New translations en_us.json (French) * New translations en_us.json (German) * New translations en_us.json (Japanese) * New translations en_us.json (Polish) * New translations en_us.json (Russian) * New translations en_us.json (Swedish) * New translations en_us.json (Chinese Simplified) * New translations en_us.json (Portuguese, Brazilian) --- .../create_mobile_packages/lang/de_de.json | 4 +- .../create_mobile_packages/lang/fr_fr.json | 48 ++++++++++--------- .../create_mobile_packages/lang/ja_jp.json | 2 + .../create_mobile_packages/lang/pl_pl.json | 2 + .../create_mobile_packages/lang/pt_br.json | 2 + .../create_mobile_packages/lang/ru_ru.json | 2 + .../create_mobile_packages/lang/sv_se.json | 2 + .../create_mobile_packages/lang/zh_cn.json | 2 + 8 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/main/resources/assets/create_mobile_packages/lang/de_de.json b/src/main/resources/assets/create_mobile_packages/lang/de_de.json index 8d6b9401..4f90a6c2 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/de_de.json +++ b/src/main/resources/assets/create_mobile_packages/lang/de_de.json @@ -57,8 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Platziere, das Item, um eine Robo-Biene zu erzeugen. Wird gebraucht in Robo-Bienen Ports um Pakete zu versenden.", "tooltip.create_mobile_packages.bee_port.jade.network": "Netzwerk: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Du bist Teil dieses Netzwerkes", - "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Bienen-Rückkehrmodus aktivieren", - "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Bienen-Rückkehrmodus deaktivieren", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Bienen-Rückkehrmodus aktivieren", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Bienen-Rückkehrmodus deaktivieren", "tooltip.create_mobile_packages.network.remove_player": "Spieler entfernen", "tooltip.create_mobile_packages.network.add_yourself": "Füge dich hinzu", "tooltip.create_mobile_packages.network.leave": "Verlasse das Netzwerk", diff --git a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json index 6de2efe6..1aa8f26e 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json +++ b/src/main/resources/assets/create_mobile_packages/lang/fr_fr.json @@ -1,7 +1,7 @@ { "itemGroup.create_mobile_packages": "Create : Mobile Packages", - "block.create_mobile_packages.bee_port": "Port de Robeille", - "item.create_mobile_packages.bee_port": "Port de Robeille", + "block.create_mobile_packages.bee_port": "Port Robeille", + "item.create_mobile_packages.bee_port": "Port Robeille", "item.create_mobile_packages.portable_stock_ticker": "Téléscripteur de Stock Portable", "item.create_mobile_packages.portable_stock_ticker.screen_title": "Téléscripteur de Stock Portable", "item.create_mobile_packages.portable_stock_ticker.not_linked": "Non lié au réseau", @@ -22,53 +22,55 @@ "create_mobile_packages.toast.robo_bee_on_the_way": "Robeille est en chemin !", "create_mobile_packages.toast.eta": "%1$s secondes restantes", "create_mobile_packages.keyinfo.open_portable_stock_ticker": "Ouvrir le Téléscripteur de Stock Portable", - "create_mobile_packages.keyinfo.open_player_networks_screen": "Open Network Settings", - "create_mobile_packages.ponder.robo_bee_port.header": "Port de Robeille", + "create_mobile_packages.keyinfo.open_player_networks_screen": "Ouvrir les paramètres réseau", + "create_mobile_packages.ponder.robo_bee_port.header": "Port Robeille", "create_mobile_packages.ponder.robo_bee_port.text_1": "Le Port de Robeille peut envoyer des colis à un joueur.", - "create_mobile_packages.ponder.robo_bee_port.text_2": "Placez un colis avec une adresse correspondant au nom du joueur dans le Port de Robeille.", - "create_mobile_packages.ponder.robo_bee_port.text_3": "Placez une Robeille dans l'emplacement à Robeille du Port de Robeille.", - "create_mobile_packages.ponder.robo_bee_port.text_4": "Le Port de Robeille enverra désormais la Robeille au joueur dont le nom correspond à l'adresse indiquée dans le colis.", + "create_mobile_packages.ponder.robo_bee_port.text_2": "Placez un colis avec une adresse correspondant au nom du joueur dans le Port Robeille.", + "create_mobile_packages.ponder.robo_bee_port.text_3": "Placez une Robeille dans l'emplacement à Robeille du Port Robeille.", + "create_mobile_packages.ponder.robo_bee_port.text_4": "Le Port Robeille enverra désormais la Robeille au joueur dont le nom correspond à l'adresse indiquée dans le colis.", "create_mobile_packages.ponder.pull_from_chest.header": "Prendre depuis un coffre", "create_mobile_packages.ponder.pull_from_chest.text_1": "Met un colis dans le coffre.", - "create_mobile_packages.ponder.pull_from_chest.text_2": "Le Port de Robeille extraira le colis de tout inventaire adjacent et le mettra dedans.", + "create_mobile_packages.ponder.pull_from_chest.text_2": "Le Port Robeille extraira le colis de tout inventaire adjacent et le mettra dedans.", "create_mobile_packages.ponder.simple_setup.header": "Installation simple", "create_mobile_packages.ponder.simple_setup.text_1": "Il s'agit d'une configuration de base pour la gestion automatisée des colis.", "create_mobile_packages.ponder.simple_setup.text_2": "Placez un coffre ou tout autre espace de rangement.", "create_mobile_packages.ponder.simple_setup.text_3": "Placez un Emballeur face au stockage pour créer des colis.", "create_mobile_packages.ponder.simple_setup.text_4": "Connectez une Liaison de Stock à l'Embaleur pour le connecter à un réseau logistique.", - "create_mobile_packages.ponder.simple_setup.text_5": "Enfin, placez un Port de Robeille pour envoyer des colis.", + "create_mobile_packages.ponder.simple_setup.text_5": "Enfin, placez un Port Robeille pour envoyer des colis.", "create_mobile_packages.ponder.push_to_chest.header": "Mettre dans un coffre", - "create_mobile_packages.ponder.push_to_chest.text_1": "Le Port de Robeille peut le pousser vers les inventaires adjacents lorsqu'il est alimenté par de la redstone.", + "create_mobile_packages.ponder.push_to_chest.text_1": "Le Port Robeille peut le pousser vers les inventaires adjacents lorsqu'il est alimenté par de la redstone.", "create_mobile_packages.ponder.push_to_chest.text_2": "Assurez-vous que le Port est alimenté par redstone.", "create_mobile_packages.ponder.push_to_chest.text_3": "Le colis sera poussé dans n'importe quel inventaire adjacent, comme un coffre.", "create_mobile_packages.ponder.crafter_setup.header": "Installation d'établis mécaniques", - "create_mobile_packages.ponder.crafter_setup.text_1": "Il s'agit d'une configuration pour la fabrication automatisée et avec le Port de Robeille.", + "create_mobile_packages.ponder.crafter_setup.text_1": "Il s'agit d'une configuration pour la fabrication automatisée et avec le Port Robeille.", "create_mobile_packages.ponder.crafter_setup.text_2": "Le Réemballeur divise le colis en plusieurs colis plus petits.", "create_mobile_packages.ponder.crafter_setup.text_3": "Les colis sont envoyés via une chute jusqu'à l'Emballeur.", "create_mobile_packages.ponder.crafter_setup.text_4": "L'Emballeur est connecté à un établi mécanique 3x3, qui fabrique les objets.", "create_mobile_packages.ponder.crafter_setup.text_5": "L'objet fabriquée est placée dans un coffre.", "create_mobile_packages.ponder.port_to_port.header": "Port à Port", - "create_mobile_packages.ponder.port_to_port.text_1": "Le Port de Robeille peut également envoyer des colis vers un autre Port.", + "create_mobile_packages.ponder.port_to_port.text_1": "Le Port Robeille peut également envoyer des colis vers un autre Port.", "create_mobile_packages.ponder.port_to_port.text_2": "Définissez une adresse dans le Port de destination.", "create_mobile_packages.ponder.port_to_port.text_3": "Définissez la même adresse que l'adresse du colis et placez le colis dans le premier Port.", "create_mobile_packages.ponder.port_to_port.text_4": "Le colis sera envoyé d'un Port à l'autre.", "create_mobile_packages.ponder.port_to_port.text_5": "Cette fonctionnalité peut être désactivée dans les fichiers de configuration.", "tooltip.create_mobile_packages.robo_bee.package_transport": "Lorsque vous tenez un colis dans la main secondaire, il sera envoyé avec la Robeille.", - "tooltip.create_mobile_packages.robo_bee.robo_bee": "Objet permettant de faire apparaître une Robeille. Nécessaire dans les Ports de Robeille pour envoyer des colis.", - "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", - "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", - "tooltip.create_mobile_packages.network.remove_player": "Remove Player", - "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", - "tooltip.create_mobile_packages.network.leave": "Leave Network", - "tooltip.create_mobile_packages.network.settings": "Network Settings", + "tooltip.create_mobile_packages.robo_bee.robo_bee": "Objet permettant de faire apparaître une Robeille. Nécessaire dans les Ports Robeille pour envoyer des colis.", + "tooltip.create_mobile_packages.bee_port.jade.network": "Réseau : %1$s", + "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Vous faites partie de ce réseau", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", + "tooltip.create_mobile_packages.network.remove_player": "Retirer le Joueur", + "tooltip.create_mobile_packages.network.add_yourself": "S'ajouter", + "tooltip.create_mobile_packages.network.leave": "Quitter le réseau", + "tooltip.create_mobile_packages.network.settings": "Paramètre réseau", "item.create_mobile_packages.mobile_packager": "Emballeur portable", "item.create_mobile_packages.mobile_packager.tooltip.summary": "Emballer des objets à la volée", "item.create_mobile_packages.mobile_packager.tooltip.condition1": "Lorsqu'il est utilisé", "item.create_mobile_packages.mobile_packager.tooltip.behaviour1": "Ouvre un menu pour créer un colis", "item.create_mobile_packages.mobile_packager.tooltip.condition2": "Lorsqu'il est utilisé en étant accroupis", "item.create_mobile_packages.mobile_packager.tooltip.behaviour2": "Ouvre un menu pour modifier un colis", - "config.jade.plugin_create_mobile_packages.bee_port": "Bee Port Info", - "create_mobile_packages.network.players": "Players in Network:", - "create_mobile_packages.network.owner": "Owner: %1$s", - "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Trash Menu" + "config.jade.plugin_create_mobile_packages.bee_port": "Information du Port Robeille", + "create_mobile_packages.network.players": "Joueur dans le réseau :", + "create_mobile_packages.network.owner": "Propriétaire : %1$s", + "item.create_mobile_packages.portable_stock_ticker.trash_menu": "Menu Poubelle" } diff --git a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json index 008d5ae2..6431e617 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ja_jp.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "使用するとロボビーを配置できるアイテム。ビーポートからの搬送に必要です。", "tooltip.create_mobile_packages.bee_port.jade.network": "ネットワーク: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "あなたはこのネットワークに属しています", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "プレイヤーを削除", "tooltip.create_mobile_packages.network.add_yourself": "自分を追加", "tooltip.create_mobile_packages.network.leave": "ネットワークから退出する", diff --git a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json index a5a25529..fcad9b94 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pl_pl.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Item to spawn a Robo Bee. Needed in Robo Bee Ports to send packages.", "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "Remove Player", "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", "tooltip.create_mobile_packages.network.leave": "Leave Network", diff --git a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json index 5aacd4e5..44f67dd3 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/pt_br.json +++ b/src/main/resources/assets/create_mobile_packages/lang/pt_br.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Item para gerar uma Abelha Robô. Necessário nos Portos da Abelha Robô para enviar pacotes.", "tooltip.create_mobile_packages.bee_port.jade.network": "Network: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "You are part of this network", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "Remove Player", "tooltip.create_mobile_packages.network.add_yourself": "Add Yourself", "tooltip.create_mobile_packages.network.leave": "Leave Network", diff --git a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json index c0dc5922..f4403e44 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json +++ b/src/main/resources/assets/create_mobile_packages/lang/ru_ru.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Предмет для создания Пчёлодрона. Необходим в Дронопорте для отправки посылок.", "tooltip.create_mobile_packages.bee_port.jade.network": "Сеть: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Вы часть этой сети", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "Выгнать игрока", "tooltip.create_mobile_packages.network.add_yourself": "Добавить себя", "tooltip.create_mobile_packages.network.leave": "Выйти из сети", diff --git a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json index 47915f96..433f0ea6 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/sv_se.json +++ b/src/main/resources/assets/create_mobile_packages/lang/sv_se.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "Föremål att skapa ett Robot Bi. Används i Robot Bi Portar att skicka paket.", "tooltip.create_mobile_packages.bee_port.jade.network": "Nätverk: %1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "Du är en del av detta nätverk", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "Ta bort Spelare", "tooltip.create_mobile_packages.network.add_yourself": "Lägg till dig själv", "tooltip.create_mobile_packages.network.leave": "Lämna Nätverk", diff --git a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json index 25411fa8..2dc6ac6c 100644 --- a/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json +++ b/src/main/resources/assets/create_mobile_packages/lang/zh_cn.json @@ -57,6 +57,8 @@ "tooltip.create_mobile_packages.robo_bee.robo_bee": "运输蜂的物品形式。运输蜂停泊港发送包裹时需要使用。", "tooltip.create_mobile_packages.bee_port.jade.network": "网络:%1$s", "tooltip.create_mobile_packages.bee_port.jade.part_of_network": "你是此网络的成员之一", + "tooltip.create_mobile_packages.bee_port.enable_return_mode": "Enable Bee Return Mode", + "tooltip.create_mobile_packages.bee_port.disable_return_mode": "Disable Bee Return Mode", "tooltip.create_mobile_packages.network.remove_player": "移除玩家", "tooltip.create_mobile_packages.network.add_yourself": "添加你自己", "tooltip.create_mobile_packages.network.leave": "离开网络", From 34908e8a00def628482ff504c9c6c8d5e0ac1114 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 22:04:32 +0100 Subject: [PATCH 66/70] refactor: use Server logic for command instead of sending a Package --- .../create_mobile_packages/index/CMPCommands.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java b/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java index 9bd61131..55be5904 100644 --- a/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java +++ b/src/main/java/de/theidler/create_mobile_packages/index/CMPCommands.java @@ -5,9 +5,7 @@ import com.mojang.brigadier.context.CommandContext; import com.simibubi.create.Create; import de.theidler.create_mobile_packages.IExtendedLogisticsNetwork; -import de.theidler.create_mobile_packages.network_settings.AddPlayerToNetworkPackage; import de.theidler.create_mobile_packages.network_settings.NetworkHelper; -import de.theidler.create_mobile_packages.network_settings.RemovePlayerFromNetworkPackage; import de.theidler.create_mobile_packages.robo.RoboManager; import de.theidler.create_mobile_packages.toast.RemoveAllToastsOnClientPacket; import de.theidler.create_mobile_packages.toast.ShowToastOnClientPacket; @@ -180,8 +178,9 @@ private static int clearToasts(CommandContext context) { private static int addPlayerToNetwork(CommandContext context, ServerPlayer targetPlayer, UUID networkId) { CommandSourceStack source = context.getSource(); - AddPlayerToNetworkPackage packet = new AddPlayerToNetworkPackage(targetPlayer.getUUID(), networkId); - CatnipServices.NETWORK.sendToServer(packet); + IExtendedLogisticsNetwork network = NetworkHelper.getExtendedLogisticsNetwork(networkId); + if (network == null) return 0; + network.create_mobile_packages$addPlayer(targetPlayer.getUUID()); source.sendSuccess(() -> Component.literal("Added player " + targetPlayer.getName().getString() + " to network " + networkId), true); return 1; @@ -190,8 +189,9 @@ private static int addPlayerToNetwork(CommandContext context private static int removePlayerFromNetwork(CommandContext context, ServerPlayer targetPlayer, UUID networkId) { CommandSourceStack source = context.getSource(); - RemovePlayerFromNetworkPackage packet = new RemovePlayerFromNetworkPackage(targetPlayer.getUUID(), networkId); - CatnipServices.NETWORK.sendToServer(packet); + IExtendedLogisticsNetwork network = NetworkHelper.getExtendedLogisticsNetwork(networkId); + if (network == null) return 0; + network.create_mobile_packages$removePlayer(targetPlayer.getUUID()); source.sendSuccess(() -> Component.literal("Removed player " + targetPlayer.getName().getString() + " from network " + networkId), true); return 1; From ada9e0339c264fa276cb486930127e28c02641da Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 22:09:43 +0100 Subject: [PATCH 67/70] refactor: add distance check and network interaction validation in ToggleBeeReturnModePacket --- .../bee_port/ToggleBeeReturnModePacket.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java index cfad4825..34d2cbb4 100644 --- a/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java +++ b/src/main/java/de/theidler/create_mobile_packages/blocks/bee_port/ToggleBeeReturnModePacket.java @@ -1,6 +1,8 @@ package de.theidler.create_mobile_packages.blocks.bee_port; +import de.theidler.create_mobile_packages.IExtendedLogisticsNetwork; import de.theidler.create_mobile_packages.index.CMPPackets; +import de.theidler.create_mobile_packages.network_settings.NetworkHelper; import net.createmod.catnip.net.base.ServerboundPacketPayload; import net.minecraft.core.BlockPos; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -31,6 +33,18 @@ public void handle(ServerPlayer player) { ServerLevel serverLevel = player.serverLevel(); if (!(serverLevel.getBlockEntity(portPos) instanceof BeePortBlockEntity beePort)) return; + if (player.distanceToSqr(portPos.getCenter()) > 64.0) return; + + if (beePort.behaviour != null) { + IExtendedLogisticsNetwork network = NetworkHelper.getExtendedLogisticsNetwork(beePort.behaviour.freqId); + if (network != null + && !network.create_mobile_packages$getPlayers().contains(player.getUUID()) + && !beePort.behaviour.mayInteractMessage(player) + ) { + return; + } + } + beePort.setBeeReturnModeEnabled(returnModeEnabled); } @@ -39,4 +53,3 @@ public PacketTypeProvider getTypeProvider() { return CMPPackets.TOGGLE_BEE_RETURN_MODE; } } - From 05414240aa6d20c9ed1d8917575e108b6dfda8e8 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 22:12:51 +0100 Subject: [PATCH 68/70] fix: correct spelling errors in BeePortBlockEntityTarget and README --- README.md | 4 ++-- .../create_mobile_packages/robo/BeePortBlockEntityTarget.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3340cb09..bd08c495 100644 --- a/README.md +++ b/README.md @@ -97,10 +97,10 @@ Help translate the mod on [Crowdin](https://crowdin.com/project/create-mobile-pa Link the Port and the Stock Link, by clicking with one item on the other block. You can link your Portable Stock Ticker by Shift-Clicking with it on the Stock Link, Port or other Linked Blocks 2026-03-17_21 28 01 -### Robo Bee on it's way delivering to you +### Robo Bee on its way delivering to you 2026-03-17_21 28 22 -### Robo Bee on it's way picking up your Trash Slot items to deliver them to "Port1" +### Robo Bee on its way picking up your Trash Slot items to deliver them to "Port1" 2026-03-17_21 34 10 ### Portable Stock Ticker selecting items to be send to you diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java b/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java index 130025d4..b2f14fc7 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/BeePortBlockEntityTarget.java @@ -31,9 +31,9 @@ public BeePortBlockEntity asBeePortBlockEntity() { @Override public boolean isValid(VirtualRobo robo) { BeePortBlockEntity be = asBeePortBlockEntity(); - boolean doesBeePortExits = be != null && !be.isRemoved(); + boolean doesBeePortExists = be != null && !be.isRemoved(); boolean hasItemStack = !robo.getItemStack().isEmpty(); - return doesBeePortExits && (hasItemStack ? be.hasSpaceForPackageAndRobo() : be.hasSpaceForRobo()); + return doesBeePortExists && (hasItemStack ? be.hasSpaceForPackageAndRobo() : be.hasSpaceForRobo()); } @Override From 0c31ea8dbbdb4abceac2e69b6e57571d6135f0c7 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 22:22:05 +0100 Subject: [PATCH 69/70] refactor: optimize request handling logic and change roboTrashStores to CopyOnWriteArrayList --- .../theidler/create_mobile_packages/robo/RoboManager.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java index 54570f87..122b3b3d 100644 --- a/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java +++ b/src/main/java/de/theidler/create_mobile_packages/robo/RoboManager.java @@ -220,13 +220,9 @@ private boolean hasActiveTrashRequest(UUID playerId, UUID networkId) { // Check if this is an active request if (request.getStatus() == RoboRequest.Status.PENDING) { - // For PENDING requests, check if there's a robo assigned to it - boolean roboExists = robos.values().stream() - .anyMatch(robo -> robo.getRequest() == request); - if (roboExists) { + if (request.getMission() == RoboRequest.Mission.PICKUP) { return true; } - // If no robo exists for this PENDING request, let it be handled again } if (request.getStatus() == RoboRequest.Status.IN_PROGRESS) { @@ -311,7 +307,7 @@ public List getETAs(BlockPos pos) { private void init() { this.robos = new ConcurrentHashMap<>(); this.beePortRoboRequests = new CopyOnWriteArrayList<>(); - this.roboTrashStores = new ArrayList<>(); + this.roboTrashStores = new CopyOnWriteArrayList<>(); } } From bd8142aa15b51544a651812d7c2431cecece1e88 Mon Sep 17 00:00:00 2001 From: Tim Heidler Date: Tue, 17 Mar 2026 22:30:21 +0100 Subject: [PATCH 70/70] v0.7.0 bump version (#307) --- CHANGELOG.md | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c076b84f..f927bd31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ------------------------------------------------------ -Create: Mobile Packages - v0.7.0 - 1.21.1 - unreleased +Create: Mobile Packages - v0.7.0 - 1.21.1 - 17.03.2026 ------------------------------------------------------ ### Additions diff --git a/gradle.properties b/gradle.properties index 59e0740b..07581aba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ mod_name=Create: Mobile Packages mod_license=MIT License # The mod version. See https://semver.org/ -mod_version=0.6.1 +mod_version=0.7.0 mod_logo=assets/create_mobile_packages/textures/create_mobile_packages.png mod_display_url=https://github.com/timplay33/Create-Mobile-Packages mod_group_id=de.theidler.create_mobile_packages