Skip to content

Commit 51c851a

Browse files
authored
Merge 381c89f into d12ae85
2 parents d12ae85 + 381c89f commit 51c851a

File tree

1 file changed

+66
-36
lines changed
  • src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands

1 file changed

+66
-36
lines changed

src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java

Lines changed: 66 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)