Skip to content

Commit e2d7dcc

Browse files
committed
Add network tools
1 parent c024c8d commit e2d7dcc

29 files changed

Lines changed: 3444 additions & 21 deletions

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ The format is based on Keep a Changelog and this project adheres to Semantic Ver
88
- Semantic Versioning: https://semver.org/spec/v2.0.0.html
99

1010

11+
## [1.3.0-rc1] - 2026-02-02
12+
### Added
13+
- Add Network Tools as a 6th tab:
14+
- Unique Content Distributor tool to partition unique each cell with a unique content type (from filtered cells) and move the existing content accordingly
15+
- Mass Partition All Cells tool to set all filtered cells' partitions to match their current contents
16+
- Mass Partition Storage Bus tool to set the filter of a Storage Bus to match its current inventory contents
17+
- All tools come with heavy warnings and eager confirmation dialogs to avoid accidental usage
18+
19+
1120
## [1.2.1] - 2026-01-30
1221
### Added
1322
- Add a button to decide the max number of slots to show per cell/storage bus in inventory (8, 32, 64, or all)

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,18 @@ A terminal and wireless terminal for managing storage cells and storage buses ac
2121
- **Cell Partition**: Grid view for quick partition editing
2222
- **Storage Bus Inventory**: View contents accessible through Storage Buses
2323
- **Storage Bus Partition**: Edit Storage Bus filter configurations
24+
- **Network Tools**: Various tools for managing and optimizing the whole network
2425
- **Search & Filter**: Find items across all cells/Storage Buses with inventory/partition search modes
2526
- **In-World Highlighting**: Double-click any storage entry to highlight its block in-world and show coordinates in chat
2627
- **Priority Management**: Set ME Chest/Drive/Storage Bus priority directly from the GUI
2728
- **Quick Partition Keybinds**: Configurable keybinds for quick partitioning with the hovered item
2829

30+
### Network Tools
31+
A set of tools to manage and optimize your ME network storage. All tools can be matched against all available filtering options (search text, advanced search, filter buttons).
32+
- **Attribute Unique Tool**: Redistributes items/fluids/essentia from matching cells to ensure each cell contains 1 unique type. May use free, unpartitioned cells on the network if needed.
33+
- **Partition Storage Cells from Content**: Automatically partitions storage cells that match the filter, based on their current contents.
34+
- **Partition Storage Buses from Content**: Automatically configures Storage Bus filters that match the filter, based on their current accessible contents.
35+
2936

3037
## Building
3138
Run:

build.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ buildscript {
1414

1515
apply plugin: 'net.minecraftforge.gradle.forge'
1616

17-
version = "1.2.1"
17+
version = "1.3.0"
1818
group = "com.cellterminal"
1919
archivesBaseName = "cell-terminal"
2020

@@ -122,6 +122,10 @@ if (cfProjectId) {
122122
optionalDependency 'thaumic-energistics'
123123
// Optional: AE2WUT (Wireless Universal Terminal integration)
124124
optionalDependency 'ae2uel-wireless-universal-terminal'
125+
// Optional: CrazyAE
126+
optionalDependency 'crazyae'
127+
// Optional: ECO AE Extension
128+
// Not on CurseForge
125129
}
126130
}
127131

src/main/java/com/cellterminal/Tags.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
public class Tags {
55
public static final String MODID = "cellterminal";
66
public static final String MODNAME = "Cell Terminal";
7-
public static final String VERSION = "1.2.1";
7+
public static final String VERSION = "1.3.0";
88
}

src/main/java/com/cellterminal/config/CellTerminalServerConfig.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ public class CellTerminalServerConfig {
3636
private final Property tabPartitionEnabledProperty;
3737
private final Property tabStorageBusInventoryEnabledProperty;
3838
private final Property tabStorageBusPartitionEnabledProperty;
39+
private final Property tabNetworkToolsEnabledProperty;
3940

4041
private boolean tabTerminalEnabled = true;
4142
private boolean tabInventoryEnabled = true;
4243
private boolean tabPartitionEnabled = true;
4344
private boolean tabStorageBusInventoryEnabled = true;
4445
private boolean tabStorageBusPartitionEnabled = true;
46+
private boolean tabNetworkToolsEnabled = true;
4547

4648
// Polling settings
4749
private final Property storageBusPollingEnabledProperty;
@@ -110,6 +112,11 @@ private CellTerminalServerConfig(File configDir) {
110112
this.tabStorageBusPartitionEnabledProperty.setLanguageKey("config.cellterminal.config.server.tabs.storage_bus_partition");
111113
this.tabStorageBusPartitionEnabled = this.tabStorageBusPartitionEnabledProperty.getBoolean();
112114

115+
this.tabNetworkToolsEnabledProperty = config.get(CATEGORY_TABS, "networkToolsTabEnabled", true,
116+
"Enable the Network Tools tab (mass operations on cells and storage buses)");
117+
this.tabNetworkToolsEnabledProperty.setLanguageKey("config.cellterminal.config.server.tabs.network_tools");
118+
this.tabNetworkToolsEnabled = this.tabNetworkToolsEnabledProperty.getBoolean();
119+
113120
// Polling settings
114121
config.setCategoryComment(CATEGORY_POLLING,
115122
"Storage bus polling settings.\n" +
@@ -233,6 +240,7 @@ public void syncFromConfig() {
233240
this.tabPartitionEnabled = this.tabPartitionEnabledProperty.getBoolean();
234241
this.tabStorageBusInventoryEnabled = this.tabStorageBusInventoryEnabledProperty.getBoolean();
235242
this.tabStorageBusPartitionEnabled = this.tabStorageBusPartitionEnabledProperty.getBoolean();
243+
this.tabNetworkToolsEnabled = this.tabNetworkToolsEnabledProperty.getBoolean();
236244

237245
this.storageBusPollingEnabled = this.storageBusPollingEnabledProperty.getBoolean();
238246
this.pollingInterval = this.pollingIntervalProperty.getInt();
@@ -310,9 +318,13 @@ public boolean isTabStorageBusPartitionEnabled() {
310318
return tabStorageBusPartitionEnabled;
311319
}
312320

321+
public boolean isTabNetworkToolsEnabled() {
322+
return tabNetworkToolsEnabled;
323+
}
324+
313325
/**
314326
* Check if a specific tab is enabled by its index.
315-
* @param tabIndex The tab index (0-4)
327+
* @param tabIndex The tab index (0-5)
316328
* @return true if the tab is enabled
317329
*/
318330
public boolean isTabEnabled(int tabIndex) {
@@ -327,6 +339,8 @@ public boolean isTabEnabled(int tabIndex) {
327339
return tabStorageBusInventoryEnabled;
328340
case 4:
329341
return tabStorageBusPartitionEnabled;
342+
case 5:
343+
return tabNetworkToolsEnabled;
330344
default:
331345
return false;
332346
}

src/main/java/com/cellterminal/container/ContainerCellTerminalBase.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@
3636
import appeng.util.Platform;
3737

3838
import com.cellterminal.CellTerminal;
39+
import com.cellterminal.client.CellFilter;
3940
import com.cellterminal.config.CellTerminalServerConfig;
4041
import com.cellterminal.container.handler.CellActionHandler;
4142
import com.cellterminal.container.handler.CellDataHandler;
43+
import com.cellterminal.container.handler.NetworkToolActionHandler;
4244
import com.cellterminal.container.handler.StorageBusDataHandler;
4345
import com.cellterminal.container.handler.StorageBusDataHandler.StorageBusTracker;
4446
import com.cellterminal.gui.overlay.MessageHelper;
@@ -716,10 +718,23 @@ protected Comparator<StorageTracker> createTrackerComparator(BlockPos terminalPo
716718
};
717719
}
718720

719-
protected static class StorageTracker {
720-
protected final long id;
721-
protected final TileEntity tile;
722-
protected final IChestOrDrive storage;
721+
/**
722+
* Handle network tool action from client.
723+
* This executes batch operations on cells and storage buses based on filters.
724+
*/
725+
public void handleNetworkToolAction(String toolId, Map<CellFilter, CellFilter.State> activeFilters) {
726+
EntityPlayer player = this.getPlayerInv().player;
727+
NetworkToolActionHandler.handleAction(toolId, activeFilters, byId, storageBusById, grid, player);
728+
729+
// Trigger refresh after tool execution
730+
this.needsFullRefresh = true;
731+
this.needsStorageBusRefresh = true;
732+
}
733+
734+
public static class StorageTracker {
735+
public final long id;
736+
public final TileEntity tile;
737+
public final IChestOrDrive storage;
723738

724739
public StorageTracker(long id, TileEntity tile, IChestOrDrive storage) {
725740
this.id = id;

0 commit comments

Comments
 (0)