Dateien nach "src/main/java/vpd/bowandaero12/furnacelv/commands" hochladen

This commit is contained in:
2025-11-26 15:44:15 +00:00
parent 426be58460
commit d7539e23bf

View File

@@ -0,0 +1,170 @@
package vpd.bowandaero12.furnacelv.commands;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import vpd.bowandaero12.furnacelv.FurnaceLevels;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GiveCommand implements CommandExecutor {
private final FurnaceLevels plugin;
public GiveCommand(FurnaceLevels plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
// --- Fall 1: Keine Argumente (/flgive) ---
if (args.length == 0) {
if (!(sender instanceof Player)) {
sender.sendMessage("Dieser Befehl kann nur von einem Spieler ausgeführt werden.");
return true;
}
Player player = (Player) sender;
if (!player.hasPermission("furnacelevels.give")) {
player.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, diesen Befehl zu verwenden.");
return true;
}
giveItem(sender, 1, player); // Gib 1 Item an sich selbst
return true;
}
// --- Fall 2: Ein Argument (/flgive <Menge> oder /flgive <Spieler>) ---
if (args.length == 1) {
try {
// Versuche, das Argument als Zahl (Menge) zu interpretieren
int amount = Integer.parseInt(args[0]);
if (amount <= 0) {
sender.sendMessage(ChatColor.RED + "Die Menge muss eine positive Zahl sein.");
return true;
}
if (!(sender instanceof Player)) {
sender.sendMessage("Dieser Befehl kann nur von einem Spieler ausgeführt werden.");
return true;
}
Player player = (Player) sender;
if (!player.hasPermission("furnacelevels.give")) {
player.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, diesen Befehl zu verwenden.");
return true;
}
giveItem(player, amount, player); // Gib <Menge> Items an sich selbst
return true;
} catch (NumberFormatException e) {
// Argument war keine Zahl, also ist es ein Spielername
Player target = Bukkit.getPlayer(args[0]);
if (target == null) {
sender.sendMessage(ChatColor.RED + "Der Spieler '" + args[0] + "' ist nicht online.");
return true;
}
if (!sender.hasPermission("furnacelevels.give.other")) {
sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, anderen Spielern Items zu geben.");
return true;
}
giveItem(sender, 1, target); // Gib 1 Item an den anderen Spieler
return true;
}
}
// --- Fall 3: Zwei Argumente (/flgive <Spieler> <Menge>) ---
if (args.length == 2) {
Player target = Bukkit.getPlayer(args[0]);
if (target == null) {
sender.sendMessage(ChatColor.RED + "Der Spieler '" + args[0] + "' ist nicht online.");
return true;
}
if (!sender.hasPermission("furnacelevels.give.other")) {
sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, anderen Spielern Items zu geben.");
return true;
}
try {
int amount = Integer.parseInt(args[1]);
if (amount <= 0) {
sender.sendMessage(ChatColor.RED + "Die Menge muss eine positive Zahl sein.");
return true;
}
giveItem(sender, amount, target); // Gib <Menge> Items an den anderen Spieler
return true;
} catch (NumberFormatException e) {
sender.sendMessage(ChatColor.RED + "'" + args[1] + "' ist keine gültige Zahl.");
return true;
}
}
// --- Fall 4: Zu viele Argumente ---
sender.sendMessage(ChatColor.RED + "Falsche Verwendung! Benutze: /flgive [Spieler] [Menge]");
return true;
}
/**
* Erstellt das Upgrade-Item und gibt es dem Ziel-Spieler.
*
* @param sender Der, der den Befehl ausführt.
* @param amount Die Menge des Items.
* @param target Der Spieler, der das Item erhält.
*/
private void giveItem(CommandSender sender, int amount, Player target) {
ItemStack upgradeItem = createUpgradeItem();
if (upgradeItem == null) {
sender.sendMessage(ChatColor.RED + "Das Upgrade-Item konnte aufgrund eines Fehlers in der Config nicht erstellt werden.");
return;
}
upgradeItem.setAmount(amount);
// Füge das Item zum Inventar hinzu und prüfe, ob es voll ist
// Die Map 'leftover' enthält die Items, die NICHT ins Inventar gepasst haben.
Map<Integer, ItemStack> leftover = target.getInventory().addItem(upgradeItem);
// KORREKTUR: Die Logik war hier vertauscht.
// Wenn 'leftover' NICHT leer ist, war das Inventar voll.
if (!leftover.isEmpty()) {
sender.sendMessage(ChatColor.RED + "Das Inventar von " + target.getName() + " ist voll! Die restlichen Items wurden am Boden fallengelassen.");
for (ItemStack item : leftover.values()) {
target.getWorld().dropItem(target.getLocation(), item);
}
} else {
// Erfolgsmeldung
if (sender.equals(target)) {
target.sendMessage(ChatColor.GREEN + "Du hast " + amount + " Ofen-Upgrade-Token erhalten.");
} else {
sender.sendMessage(ChatColor.GREEN + "Du hast " + amount + " Ofen-Upgrade-Token an " + target.getName() + " gegeben.");
target.sendMessage(ChatColor.GREEN + "Du hast " + amount + " Ofen-Upgrade-Token von " + sender.getName() + " erhalten.");
}
}
}
private ItemStack createUpgradeItem() {
String configMaterialName = plugin.getConfig().getString("item.material-type", "SUNFLOWER").toUpperCase();
String configDisplayName = ChatColor.translateAlternateColorCodes('&', plugin.getConfig().getString("item.displayname", "&6&lOfen-Upgrade-Token"));
List<String> configLore = plugin.getConfig().getStringList("item.lore").stream()
.map(line -> ChatColor.translateAlternateColorCodes('&', line))
.collect(Collectors.toList());
Material configMaterial;
try {
configMaterial = Material.valueOf(configMaterialName);
} catch (IllegalArgumentException e) {
return null;
}
ItemStack item = new ItemStack(configMaterial);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName(configDisplayName);
meta.setLore(configLore);
item.setItemMeta(meta);
}
return item;
}
}