@@ -32,51 +32,81 @@ class GiveCommand extends SubCommand {
3232
3333 @ Override
3434 public void onExecute (CommandSender sender , String [] args ) {
35- if (sender .hasPermission ("slimefun.cheat.items" ) || !(sender instanceof Player )) {
36- if (args .length > 2 ) {
37- Optional <Player > player = PlayerList .findByName (args [1 ]);
38-
39- if (player .isPresent ()) {
40- Player p = player .get ();
41-
42- SlimefunItem sfItem = SlimefunItem .getById (args [2 ].toUpperCase (Locale .ROOT ));
43-
44- if (sfItem != null ) {
45- giveItem (sender , p , sfItem , args );
46- } else {
47- Slimefun .getLocalization ().sendMessage (sender , "messages.invalid-item" , true , msg -> msg .replace (PLACEHOLDER_ITEM , args [2 ]));
48- }
49- } else {
50- Slimefun .getLocalization ().sendMessage (sender , "messages.not-online" , true , msg -> msg .replace (PLACEHOLDER_PLAYER , args [1 ]));
51- }
52- } else {
53- Slimefun .getLocalization ().sendMessage (sender , "messages.usage" , true , msg -> msg .replace ("%usage%" , "/sf give <Player> <Slimefun Item> [Amount]" ));
54- }
55- } else {
35+ if (!sender .hasPermission ("slimefun.cheat.items" ) && sender instanceof Player ) {
5636 Slimefun .getLocalization ().sendMessage (sender , "messages.no-permission" , true );
37+ return ;
38+ }
39+
40+ if (args .length <= 2 ) {
41+ Slimefun .getLocalization ().sendMessage (sender , "messages.usage" , true , msg -> msg .replace ("%usage%" , "/sf give <Player> <Slimefun Item> [Amount]" ));
42+ return ;
43+ }
44+
45+ Optional <Player > player = PlayerList .findByName (args [1 ]);
46+
47+ if (player .isEmpty ()) {
48+ Slimefun .getLocalization ().sendMessage (sender , "messages.not-online" , true , msg -> msg .replace (PLACEHOLDER_PLAYER , args [1 ]));
49+ return ;
50+ }
51+
52+ Player p = player .get ();
53+
54+ SlimefunItem sfItem = SlimefunItem .getById (args [2 ].toUpperCase (Locale .ROOT ));
55+
56+ if (sfItem != null ) {
57+ giveItem (sender , p , sfItem , args );
58+ } else {
59+ Slimefun .getLocalization ().sendMessage (sender , "messages.invalid-item" , true , msg -> msg .replace (PLACEHOLDER_ITEM , args [2 ]));
5760 }
5861 }
5962
6063 private void giveItem (CommandSender sender , Player p , SlimefunItem sfItem , String [] args ) {
6164 if (sfItem instanceof MultiBlockMachine ) {
6265 Slimefun .getLocalization ().sendMessage (sender , "guide.cheat.no-multiblocks" );
63- } else {
64- int amount = parseAmount (args );
65-
66- if (amount > 0 ) {
67- Slimefun .getLocalization ().sendMessage (p , "messages.given-item" , true , msg -> msg .replace (PLACEHOLDER_ITEM , sfItem .getItemName ()).replace (PLACEHOLDER_AMOUNT , String .valueOf (amount )));
68- Map <Integer , ItemStack > excess = p .getInventory ().addItem (new CustomItemStack (sfItem .getItem (), amount ));
69- if (Slimefun .getCfg ().getBoolean ("options.drop-excess-sf-give-items" ) && !excess .isEmpty ()) {
70- for (ItemStack is : excess .values ()) {
71- p .getWorld ().dropItem (p .getLocation (), is );
72- }
73- }
74-
75- Slimefun .getLocalization ().sendMessage (sender , "messages.give-item" , true , msg -> msg .replace (PLACEHOLDER_PLAYER , args [1 ]).replace (PLACEHOLDER_ITEM , sfItem .getItemName ()).replace (PLACEHOLDER_AMOUNT , String .valueOf (amount )));
76- } else {
77- Slimefun .getLocalization ().sendMessage (sender , "messages.invalid-amount" , true , msg -> msg .replace (PLACEHOLDER_AMOUNT , args [3 ]));
66+ return ;
67+ }
68+
69+ int amount = parseAmount (args );
70+
71+ if (amount <= 0 ) {
72+ Slimefun .getLocalization ().sendMessage (sender , "messages.invalid-amount" , true , msg -> msg .replace (PLACEHOLDER_AMOUNT , args [3 ]));
73+ return ;
74+ }
75+
76+ Slimefun .getLocalization ().sendMessage (p , "messages.given-item" , true , msg -> msg .replace (PLACEHOLDER_ITEM , sfItem .getItemName ()).replace (PLACEHOLDER_AMOUNT , String .valueOf (amount )));
77+ ItemStack [] items = parseStackArray (sfItem .getItem (), amount );
78+ Map <Integer , ItemStack > excess = p .getInventory ().addItem (items );
79+ if (Slimefun .getCfg ().getBoolean ("options.drop-excess-sf-give-items" ) && !excess .isEmpty ()) {
80+ for (ItemStack is : excess .values ()) {
81+ p .getWorld ().dropItem (p .getLocation (), is );
7882 }
7983 }
84+
85+ Slimefun .getLocalization ().sendMessage (sender , "messages.give-item" , true , msg -> msg .replace (PLACEHOLDER_PLAYER , args [1 ]).replace (PLACEHOLDER_ITEM , sfItem .getItemName ()).replace (PLACEHOLDER_AMOUNT , String .valueOf (amount )));
86+ }
87+
88+ private ItemStack [] parseStackArray (ItemStack itemStack , int amount ) {
89+ int stackSize = itemStack .getMaxStackSize ();
90+ int stackAmount = amount / stackSize ;
91+ int excess = amount - stackAmount * stackSize ;
92+
93+ int totalSize = stackAmount ;
94+ if (excess != 0 ) {
95+ totalSize ++;
96+ }
97+
98+ ItemStack [] toGive = new ItemStack [totalSize ];
99+ for (int i = 0 ; i < stackAmount ; i ++) {
100+ toGive [i ] = itemStack .clone ();
101+ toGive [i ].setAmount (stackSize );
102+ }
103+
104+ if (excess != 0 ) {
105+ toGive [stackAmount ] = itemStack .clone ();
106+ toGive [stackAmount ].setAmount (excess );
107+ }
108+
109+ return toGive ;
80110 }
81111
82112 private int parseAmount (String [] args ) {
0 commit comments