@@ -57,14 +57,15 @@ public sealed abstract class Inventory permits VirtualInventory, CompositeInvent
57
57
private @ Nullable List <Consumer <InventoryClickEvent >> clickHandlers ;
58
58
private @ Nullable List <Consumer <ItemPreUpdateEvent >> preUpdateHandlers ;
59
59
private @ Nullable List <Consumer <ItemPostUpdateEvent >> postUpdateHandlers ;
60
- private int guiPriority = 0 ;
61
- private final Map <IterationOrderCategory , int []> iterationOrders ;
60
+ private final Map < OperationCategory , int []> iterationOrders ;
61
+ private final Map <OperationCategory , Integer > guiPriorities ;
62
62
63
63
@ SuppressWarnings ("unchecked" )
64
64
public Inventory (int size ) {
65
65
this .size = size ;
66
66
viewers = new Set [size ];
67
- iterationOrders = CollectionUtils .newEnumMap (IterationOrderCategory .class , k -> IntStream .range (0 , size ).toArray ());
67
+ iterationOrders = CollectionUtils .newEnumMap (OperationCategory .class , k -> IntStream .range (0 , size ).toArray ());
68
+ guiPriorities = CollectionUtils .newEnumMap (OperationCategory .class , k -> 0 );
68
69
}
69
70
70
71
/**
@@ -81,7 +82,7 @@ public int getSize() {
81
82
*
82
83
* @param iterationOrder The new iteration order. Must include all slots and no duplicates.
83
84
*/
84
- public void setIterationOrder (IterationOrderCategory category , int [] iterationOrder ) {
85
+ public void setIterationOrder (OperationCategory category , int [] iterationOrder ) {
85
86
if (iterationOrder .length != size )
86
87
throw new IllegalArgumentException ("Iteration order size must match inventory size" );
87
88
@@ -102,7 +103,7 @@ public void setIterationOrder(IterationOrderCategory category, int[] iterationOr
102
103
* @param category The category of iteration operations
103
104
* @return The current iteration order.
104
105
*/
105
- public int [] getIterationOrder (IterationOrderCategory category ) {
106
+ public int [] getIterationOrder (OperationCategory category ) {
106
107
return iterationOrders .get (category ).clone ();
107
108
}
108
109
@@ -111,7 +112,7 @@ public int[] getIterationOrder(IterationOrderCategory category) {
111
112
* such as {@link #addItem(UpdateReason, ItemStack)} or {@link #collectSimilar(UpdateReason, ItemStack, int)}.
112
113
*/
113
114
public void reverseIterationOrder () {
114
- for (var category : IterationOrderCategory .values ()) {
115
+ for (var category : OperationCategory .values ()) {
115
116
reverseIterationOrder (category );
116
117
}
117
118
}
@@ -121,7 +122,7 @@ public void reverseIterationOrder() {
121
122
*
122
123
* @param category The category of operations where the iteration order should be reversed
123
124
*/
124
- public void reverseIterationOrder (IterationOrderCategory category ) {
125
+ public void reverseIterationOrder (OperationCategory category ) {
125
126
setIterationOrder (category , ArrayUtils .reversed (getIterationOrder (category )));
126
127
}
127
128
@@ -511,25 +512,37 @@ public void callPostUpdateEvent(@Nullable UpdateReason updateReason, int slot, @
511
512
}
512
513
513
514
/**
514
- * Gets the priority for click actions in a {@link Gui}, such as shift clicking or cursor collection
515
- * with multiple {@link Inventory VirtualInventories} .
515
+ * Gets the gui priority for operations of the given category.
516
+ * This priority is used to determine the order in which operations are applied to gui-embedded inventories .
516
517
*
517
518
* @return The priority for click actions, {@link Inventory VirtualInventories} with
518
519
* a higher priority get prioritized.
519
520
*/
520
- public int getGuiPriority () {
521
- return guiPriority ;
521
+ public int getGuiPriority (OperationCategory category ) {
522
+ return guiPriorities . get ( category ) ;
522
523
}
523
524
524
525
/**
525
- * Sets the priority for click actions in a {@link Gui}, such as shift-clicking or cursor collection
526
- * with multiple {@link Inventory VirtualInventories} .
526
+ * Sets the gui priority for all operation types.
527
+ * This priority is used to determine the order in which operations are applied to gui-embedded inventories .
527
528
*
528
- * @param guiPriority The priority for click actions, {@link Inventory VirtualInventories} with
529
- * a higher priority get prioritized.
529
+ * @param priority The priority
530
530
*/
531
- public void setGuiPriority (int guiPriority ) {
532
- this .guiPriority = guiPriority ;
531
+ public void setGuiPriority (int priority ) {
532
+ for (var category : OperationCategory .values ()) {
533
+ setGuiPriority (category , priority );
534
+ }
535
+ }
536
+
537
+ /**
538
+ * Sets the gui priority for operations of the given category.
539
+ * This priority is used to determine the order in which operations are applied to gui-embedded inventories.
540
+ *
541
+ * @param category The category of operations to set the priority for.
542
+ * @param priority The priority
543
+ */
544
+ public void setGuiPriority (OperationCategory category , int priority ) {
545
+ guiPriorities .put (category , priority );
533
546
}
534
547
535
548
/**
@@ -1016,7 +1029,7 @@ private int addToPartialSlots(
1016
1029
int amountLeft ,
1017
1030
@ Nullable ItemStack [] items
1018
1031
) {
1019
- for (int slot : getIterationOrder (IterationOrderCategory .ADD )) {
1032
+ for (int slot : getIterationOrder (OperationCategory .ADD )) {
1020
1033
if (amountLeft <= 0 )
1021
1034
break ;
1022
1035
@@ -1059,7 +1072,7 @@ private int addToEmptySlots(
1059
1072
int amountLeft ,
1060
1073
@ Nullable ItemStack [] items
1061
1074
) {
1062
- for (int slot : getIterationOrder (IterationOrderCategory .ADD )) {
1075
+ for (int slot : getIterationOrder (OperationCategory .ADD )) {
1063
1076
if (amountLeft <= 0 )
1064
1077
break ;
1065
1078
@@ -1177,7 +1190,7 @@ public int simulateSingleAdd(@Nullable ItemStack itemStack) {
1177
1190
int amountLeft = itemStack .getAmount ();
1178
1191
1179
1192
// find all slots where the item partially fits
1180
- for (int slot : getIterationOrder (IterationOrderCategory .ADD )) {
1193
+ for (int slot : getIterationOrder (OperationCategory .ADD )) {
1181
1194
if (amountLeft == 0 )
1182
1195
break ;
1183
1196
@@ -1194,7 +1207,7 @@ public int simulateSingleAdd(@Nullable ItemStack itemStack) {
1194
1207
}
1195
1208
1196
1209
// remaining items would be added to empty slots
1197
- for (int slot : getIterationOrder (IterationOrderCategory .ADD )) {
1210
+ for (int slot : getIterationOrder (OperationCategory .ADD )) {
1198
1211
if (amountLeft == 0 )
1199
1212
break ;
1200
1213
@@ -1256,7 +1269,7 @@ public int collectSimilar(@Nullable UpdateReason updateReason, ItemStack templat
1256
1269
@ Nullable ItemStack [] items = getUnsafeItems ();
1257
1270
1258
1271
// find partial slots and take items from there
1259
- for (int slot : getIterationOrder (IterationOrderCategory .COLLECT )) {
1272
+ for (int slot : getIterationOrder (OperationCategory .COLLECT )) {
1260
1273
ItemStack currentStack = items [slot ];
1261
1274
if (currentStack == null || currentStack .getAmount () >= maxStackSize || !template .isSimilar (currentStack ))
1262
1275
continue ;
@@ -1267,7 +1280,7 @@ public int collectSimilar(@Nullable UpdateReason updateReason, ItemStack templat
1267
1280
}
1268
1281
1269
1282
// only taking from partial stacks wasn't enough, take from a full slot
1270
- for (int slot : getIterationOrder (IterationOrderCategory .COLLECT )) {
1283
+ for (int slot : getIterationOrder (OperationCategory .COLLECT )) {
1271
1284
ItemStack currentStack = items [slot ];
1272
1285
if (currentStack == null || currentStack .getAmount () < maxStackSize || !template .isSimilar (currentStack ))
1273
1286
continue ;
@@ -1292,7 +1305,7 @@ public int removeIf(@Nullable UpdateReason updateReason, Predicate<ItemStack> pr
1292
1305
@ Nullable ItemStack [] items = getUnsafeItems ();
1293
1306
1294
1307
int removed = 0 ;
1295
- for (int slot : getIterationOrder (IterationOrderCategory .OTHER )) {
1308
+ for (int slot : getIterationOrder (OperationCategory .OTHER )) {
1296
1309
ItemStack item = items [slot ];
1297
1310
if (item != null && predicate .test (item .clone ()) && setItem (updateReason , slot , null )) {
1298
1311
removed += item .getAmount ();
@@ -1314,7 +1327,7 @@ public int removeFirst(@Nullable UpdateReason updateReason, int amount, Predicat
1314
1327
@ Nullable ItemStack [] items = getUnsafeItems ();
1315
1328
1316
1329
int leftOver = amount ;
1317
- for (int slot : getIterationOrder (IterationOrderCategory .OTHER )) {
1330
+ for (int slot : getIterationOrder (OperationCategory .OTHER )) {
1318
1331
ItemStack item = items [slot ];
1319
1332
if (item != null && predicate .test (item .clone ())) {
1320
1333
leftOver -= takeFrom (updateReason , slot , leftOver );
@@ -1336,7 +1349,7 @@ public int removeSimilar(@Nullable UpdateReason updateReason, ItemStack itemStac
1336
1349
@ Nullable ItemStack [] items = getUnsafeItems ();
1337
1350
1338
1351
int removed = 0 ;
1339
- for (int slot : getIterationOrder (IterationOrderCategory .OTHER )) {
1352
+ for (int slot : getIterationOrder (OperationCategory .OTHER )) {
1340
1353
ItemStack item = items [slot ];
1341
1354
if (item != null && item .isSimilar (itemStack ) && setItem (updateReason , slot , null )) {
1342
1355
removed += item .getAmount ();
@@ -1358,7 +1371,7 @@ public int removeFirstSimilar(@Nullable UpdateReason updateReason, int amount, I
1358
1371
@ Nullable ItemStack [] items = getUnsafeItems ();
1359
1372
1360
1373
int leftOver = amount ;
1361
- for (int slot : getIterationOrder (IterationOrderCategory .OTHER )) {
1374
+ for (int slot : getIterationOrder (OperationCategory .OTHER )) {
1362
1375
ItemStack item = items [slot ];
1363
1376
if (item != null && item .isSimilar (itemStack )) {
1364
1377
leftOver -= takeFrom (updateReason , slot , leftOver );
0 commit comments