88import org .bukkit .inventory .PlayerInventory ;
99
1010import java .util .ArrayList ;
11+ import java .util .Collections ;
1112import java .util .List ;
13+ import java .util .stream .Collectors ;
1214
1315public final class InventoryUtils {
1416
@@ -29,57 +31,69 @@ public static boolean addItem(Inventory inventory, ItemStack item) {
2931 }
3032
3133 private static boolean addItem (Inventory inventory , ItemStack item , int amount ) {
32- ItemStack [] items = new ItemStack [inventory .getSize ()];
34+ ItemStack i = item .clone ();
35+ i .setAmount (amount );
36+ return addItems (inventory , Collections .singletonList (i ));
37+ }
38+
39+ public static boolean addItems (Inventory inventory , List <ItemStack > items ) {
40+ return _addItems (inventory , items .stream ().filter (i -> i != null && i .getType () != Material .AIR ).map (ItemStack ::clone ).collect (Collectors .toList ()));
41+ }
42+
43+ private static boolean _addItems (Inventory inventory , List <ItemStack > items ) {
44+ ItemStack [] tmpInv = new ItemStack [inventory .getSize ()];
3345 for (int i = 0 ; i < inventory .getSize (); i ++) {
3446 if (i >= 36 && i <= 39 && inventory instanceof PlayerInventory ) {
35- items [i ] = null ;
47+ tmpInv [i ] = null ;
3648 continue ;
3749 }
3850 if (inventory .getItem (i ) != null && inventory .getItem (i ).getType () != Material .AIR ) {
39- items [i ] = inventory .getItem (i ).clone ();
51+ tmpInv [i ] = inventory .getItem (i ).clone ();
4052 } else {
41- items [i ] = new ItemStack (Material .AIR );
53+ tmpInv [i ] = new ItemStack (Material .AIR );
4254 }
4355 }
44- boolean success = false ;
45- for (int slot = 0 ; slot < items .length ; slot ++) {
46- ItemStack tmp = items [slot ];
47- if (tmp == null ) {
48- continue ;
49- }
50- if (item .isSimilar (tmp ) && tmp .getAmount () < item .getMaxStackSize ()) {
51- if ((tmp .getAmount () + amount ) <= item .getMaxStackSize ()) {
52- tmp .setAmount (amount + tmp .getAmount ());
53- items [slot ] = tmp ;
54- success = true ;
55- break ;
56- } else {
57- amount = amount - (item .getMaxStackSize () - tmp .getAmount ());
58- tmp .setAmount (item .getMaxStackSize ());
59- items [slot ] = tmp ;
56+ for (ItemStack item : items ) {
57+ int amount = item .getAmount ();
58+ for (int slot = 0 ; slot < tmpInv .length ; slot ++) {
59+ ItemStack tmp = tmpInv [slot ];
60+ if (tmp == null ) {
6061 continue ;
6162 }
63+ if (tmp .getAmount () < item .getMaxStackSize () && item .isSimilar (tmp )) {
64+ if ((tmp .getAmount () + amount ) <= item .getMaxStackSize ()) {
65+ tmp .setAmount (amount + tmp .getAmount ());
66+ amount = 0 ;
67+ tmpInv [slot ] = tmp ;
68+ break ;
69+ } else {
70+ amount = amount - (item .getMaxStackSize () - tmp .getAmount ());
71+ tmp .setAmount (item .getMaxStackSize ());
72+ tmpInv [slot ] = tmp ;
73+ continue ;
74+ }
75+ }
6276 }
63- }
64- if (! success ) {
65- for ( int i = 0 ; i < items . length ; i ++ ) {
66- if ( items [ i ] != null && items [ i ]. getType () == Material . AIR ) {
67- item .setAmount ( amount );
68- items [ i ] = item ;
69- success = true ;
70- break ;
77+ if ( amount > 0 ) {
78+ for ( int i = 0 ; i < tmpInv . length ; i ++ ) {
79+ if ( tmpInv [ i ] != null && tmpInv [ i ]. getType () == Material . AIR ) {
80+ item . setAmount ( amount );
81+ tmpInv [ i ] = item .clone ( );
82+ amount = 0 ;
83+ break ;
84+ }
7185 }
7286 }
87+ if (amount > 0 ) {
88+ return false ;
89+ }
7390 }
74- if (success ) {
75- for (int i = 0 ; i < items .length ; i ++) {
76- if (items [i ] != null && !items [i ].equals (inventory .getItem (i ))) {
77- inventory .setItem (i , items [i ]);
78- }
91+ for (int i = 0 ; i < tmpInv .length ; i ++) {
92+ if (tmpInv [i ] != null && !tmpInv [i ].equals (inventory .getItem (i ))) {
93+ inventory .setItem (i , tmpInv [i ]);
7994 }
80- return true ;
8195 }
82- return false ;
96+ return true ;
8397 }
8498
8599 public static boolean removeItem (Player player , ItemStack item , int amount ) {
0 commit comments