package de.mviper.adventskalender.christmas; import de.mviper.adventskalender.RewardUtil; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** Verarbeitet /christmas und /cracker. */ public final class ChristmasCommand implements CommandExecutor, TabCompleter { private final ChristmasManager mgr; ChristmasCommand(ChristmasManager mgr) { this.mgr = mgr; } @Override public boolean onCommand(CommandSender s, Command cmd, String label, String[] a) { if (cmd.getName().equalsIgnoreCase("cracker")) return cracker(s, a); if (a.length == 0) { s.sendMessage(mgr.msg("info", "%status%", mgr.raw(mgr.trees().isEnded() ? "status-ended" : "status-active"), "%trees%", String.valueOf(mgr.trees().treeCount()))); return true; } switch (a[0].toLowerCase()) { case "help" -> mgr.rawList("help").forEach(s::sendMessage); case "snow" -> snow(s, a); case "santa" -> santa(s, a); case "snowman" -> snowman(s, a); case "countdown" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return true; } s.sendMessage(mgr.msg(mgr.countdown().toggle(p) ? "countdown-on" : "countdown-off")); if (!mgr.countdown().visible()) { s.sendMessage(mgr.msg("countdown-not-yet", "%days%", String.valueOf(mgr.countdown().daysLeft()), "%in%", String.valueOf(mgr.countdown().daysUntilVisible()))); } else { s.sendMessage(mgr.prefixed(mgr.countdown().text())); } } case "cookie" -> cookie(s, a); case "wichteln" -> wichteln(s, a); case "wreath" -> wreath(s, a); case "snowball" -> snowball(s, a); case "deco" -> deco(s, a); case "stocking" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return true; } String sub = a.length > 1 ? a[1].toLowerCase() : ""; switch (sub) { case "place" -> mgr.stockings().place(p); case "remove" -> mgr.stockings().removeNearest(p); case "flight" -> { if (!admin(s)) return true; s.sendMessage(mgr.msg(mgr.stockings().flight().launch(true) ? "stocking-flight-ok" : "stocking-flight-none")); } default -> mgr.stockings().use(p); } } case "hat" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return true; } mgr.hats().give(p); } case "quiz" -> quiz(s, a); case "wish" -> wish(s, a); case "wishes" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return true; } if (!admin(s)) return true; mgr.wishes().openMenu(p, 0); } case "market" -> market(s, a); case "portal" -> portal(s, a); case "give" -> giveCrystal(s, a); case "gifts" -> { if (!admin(s)) return true; mgr.trees().spawnPresentsEverywhere(); Bukkit.broadcastMessage(mgr.prefixed(mgr.raw("gifts-spawned"))); } case "addhand" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return true; } if (!admin(s)) return true; s.sendMessage(mgr.msg(mgr.trees().addGift(p.getInventory().getItemInMainHand()) ? "addhand-ok" : "addhand-empty")); } case "end" -> { if (!admin(s)) return true; mgr.trees().setEnded(true); s.sendMessage(mgr.msg("end-set")); } case "reload" -> { if (!s.hasPermission("christmasplus.christmas.reload") && !s.hasPermission("xmas.admin")) { s.sendMessage(mgr.msg("no-permission")); return true; } ChristmasManager.reload(); s.sendMessage(mgr.msg("reloaded")); } default -> s.sendMessage(mgr.msg("usage")); } return true; } // ---------- Plaetzchen ---------- private void cookie(CommandSender s, String[] a) { if (!admin(s)) return; CookieManager cm = mgr.cookies(); if (a.length >= 2 && a[1].equalsIgnoreCase("list")) { s.sendMessage(mgr.prefixed(String.join(", ", cm.ids()))); return; } if (a.length < 4 || !a[1].equalsIgnoreCase("give")) { s.sendMessage(mgr.msg("cookie-usage")); return; } Player t = Bukkit.getPlayerExact(a[2]); if (t == null) { s.sendMessage(mgr.msg("player-offline")); return; } int amount = a.length > 4 ? Math.max(1, Math.min(64, ChristmasManager.toInt(a[4], 1))) : 1; ItemStack it = cm.create(a[3], amount); if (it == null) { s.sendMessage(mgr.msg("cookie-unknown", "%id%", a[3])); return; } RewardUtil.give(t, it); t.sendMessage(mgr.msg("cookie-given", "%amount%", String.valueOf(amount), "%id%", a[3])); } // ---------- Wichteln ---------- private void wichteln(CommandSender s, String[] a) { WichtelnManager w = mgr.wichteln(); String sub = a.length > 1 ? a[1].toLowerCase() : "status"; boolean adminCmd = sub.equals("open") || sub.equals("draw") || sub.equals("deliver") || sub.equals("reset"); if (adminCmd && !admin(s)) return; if (!adminCmd && !perm(s, "xmas.use")) return; switch (sub) { case "open" -> { if (!w.open()) { s.sendMessage(mgr.msg("wi-wrong-state")); return; } Bukkit.broadcastMessage(mgr.msg("wi-open")); } case "draw" -> { if (w.state() != WichtelnManager.State.OPEN) { s.sendMessage(mgr.msg("wi-wrong-state")); return; } if (!w.draw()) { s.sendMessage(mgr.msg("wi-too-few")); return; } Bukkit.broadcastMessage(mgr.msg("wi-drawn")); } case "deliver" -> { int n = w.deliver(); if (n < 0) { s.sendMessage(mgr.msg("wi-wrong-state")); return; } Bukkit.broadcastMessage(mgr.msg("wi-delivered", "%count%", String.valueOf(n))); } case "reset" -> { w.reset(); s.sendMessage(mgr.msg("wi-reset")); } case "join" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (w.state() != WichtelnManager.State.OPEN) { s.sendMessage(mgr.msg("wi-wrong-state")); return; } boolean already = w.joined(p.getUniqueId()); w.join(p); s.sendMessage(mgr.msg(already ? "wi-already" : "wi-joined")); } case "leave" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } s.sendMessage(mgr.msg(w.leave(p) ? "wi-left" : "wi-not-joined")); } case "who" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } String name = w.targetName(p.getUniqueId()); s.sendMessage(name.isEmpty() ? mgr.msg("wi-not-joined") : mgr.msg("wi-who", "%name%", name)); } case "gift" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } String key = w.setGift(p); s.sendMessage(mgr.msg(key, "%name%", w.targetName(p.getUniqueId()))); } default -> s.sendMessage(mgr.msg("wi-status", "%state%", w.state().name(), "%count%", String.valueOf(w.participantCount()), "%gifts%", String.valueOf(w.giftCount()))); } } // ---------- Adventskranz ---------- private void wreath(CommandSender s, String[] a) { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!admin(s)) return; org.bukkit.block.Block target = p.getTargetBlockExact(8); if (target == null) { s.sendMessage(mgr.msg("deco-look")); return; } String sub = a.length > 1 ? a[1].toLowerCase() : ""; if (sub.equals("create")) { mgr.wreaths().create(target); s.sendMessage(mgr.msg("wreath-created")); } else if (sub.equals("remove")) { s.sendMessage(mgr.msg(mgr.wreaths().removeNear(target) ? "wreath-removed" : "wreath-none")); } else { s.sendMessage(mgr.msg("wreath-usage")); } } // ---------- Schneeball-Spiel ---------- private void snowball(CommandSender s, String[] a) { SnowballGame g = mgr.snowball(); String sub = a.length > 1 ? a[1].toLowerCase() : "top"; if (sub.equals("top")) { List lines = g.topLines(5); if (lines.isEmpty()) s.sendMessage(mgr.msg("sb-no-scores")); else lines.forEach(s::sendMessage); return; } if (!admin(s)) return; switch (sub) { case "arena" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } int r = a.length > 2 ? ChristmasManager.toInt(a[2], 15) : 15; g.setArena(p.getLocation(), r); s.sendMessage(mgr.msg("sb-arena-set", "%radius%", String.valueOf(Math.max(3, r)))); } case "start" -> { if (!g.hasArena()) { s.sendMessage(mgr.msg("sb-no-arena")); return; } int time = mgr.cfg().getInt("snowball.duration", 180); if (a.length > 2 && ChristmasManager.parseDuration(a[2]) > 0) time = ChristmasManager.parseDuration(a[2]); if (!g.start(time)) s.sendMessage(mgr.msg("sb-already")); } case "stop" -> { if (!g.isActive()) { s.sendMessage(mgr.msg("sb-not-active")); return; } g.stop(true); } default -> s.sendMessage(mgr.msg("sb-usage")); } } // ---------- Deko ---------- private void deco(CommandSender s, String[] a) { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!admin(s)) return; if (a.length > 1 && a[1].equalsIgnoreCase("undo")) mgr.deco().undoLast(p); else mgr.deco().open(p); } // ---------- Quiz ---------- private void quiz(CommandSender s, String[] a) { if (!admin(s)) return; QuizManager q = mgr.quiz(); String sub = a.length > 1 ? a[1].toLowerCase() : ""; switch (sub) { case "start" -> { int idx = a.length > 2 ? ChristmasManager.toInt(a[2], 0) - 1 : -1; if (q.isActive()) { s.sendMessage(mgr.msg("quiz-already")); return; } if (!q.ask(idx)) s.sendMessage(mgr.msg("quiz-none")); } case "skip", "stop" -> s.sendMessage(mgr.msg(q.skip() ? "quiz-stopped" : "quiz-not-active")); case "count" -> s.sendMessage(mgr.prefixed(String.valueOf(q.questionCount()))); default -> s.sendMessage(mgr.msg("quiz-usage")); } } // ---------- Wunschzettel ---------- private void wish(CommandSender s, String[] a) { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!perm(s, "xmas.use")) return; if (a.length < 2) { s.sendMessage(mgr.msg("wish-usage")); return; } if (a[1].equalsIgnoreCase("list")) { mgr.wishes().list(p); return; } if (a[1].equalsIgnoreCase("clear")) { s.sendMessage(mgr.msg("wish-cleared", "%count%", String.valueOf(mgr.wishes().clearOwn(p)))); return; } String text = String.join(" ", Arrays.copyOfRange(a, 1, a.length)); s.sendMessage(mgr.msg(mgr.wishes().add(p, text), "%max%", String.valueOf(mgr.cfg().getInt("wishes.max-length", 120)))); } // ---------- Marktstaende ---------- private void market(CommandSender s, String[] a) { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } String sub = a.length > 1 ? a[1].toLowerCase() : ""; if (sub.equals("back")) { // fuer alle Spieler s.sendMessage(mgr.msg(mgr.portals().back(p))); return; } if (!admin(s)) return; switch (sub) { case "list" -> s.sendMessage(mgr.prefixed(String.join(", ", mgr.market().stallIds()))); case "remove" -> s.sendMessage(mgr.msg(mgr.market().removeNearest(p, 6) ? "market-removed" : "market-none")); case "set" -> { mgr.market().setSpawn(p.getLocation()); s.sendMessage(mgr.msg("market-set")); } case "unset" -> { mgr.market().clearSpawn(); s.sendMessage(mgr.msg("market-unset")); } case "tp" -> { Location dest = mgr.market().spawn(); if (dest == null) { s.sendMessage(mgr.msg("portal-no-market")); return; } p.teleport(dest); } case "santa" -> { String op = a.length > 2 ? a[2].toLowerCase() : ""; switch (op) { case "set" -> { mgr.marketLife().setSanta(p.getLocation()); s.sendMessage(mgr.msg("market-santa-set")); } case "remove" -> { mgr.marketLife().removeSantaSpot(); s.sendMessage(mgr.msg("market-santa-removed")); } case "reset" -> { mgr.marketLife().resetClaims(); s.sendMessage(mgr.msg("market-santa-reset")); } default -> s.sendMessage(mgr.msg("market-usage")); } } case "spawn" -> { if (a.length < 3) { s.sendMessage(mgr.msg("market-usage")); return; } if (!mgr.market().spawn(p.getLocation(), a[2])) { s.sendMessage(mgr.msg("market-unknown", "%id%", a[2])); return; } s.sendMessage(mgr.msg("market-spawned")); } default -> s.sendMessage(mgr.msg("market-usage")); } } // ---------- Portale ---------- private void portal(CommandSender s, String[] a) { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!perm(s, "xmas.use")) return; String sub = a.length > 1 ? a[1].toLowerCase() : ""; org.bukkit.block.Block target = p.getTargetBlockExact(6); switch (sub) { case "create" -> { if (target == null) { s.sendMessage(mgr.msg("deco-look")); return; } s.sendMessage(mgr.msg(mgr.portals().create(p, target), "%cost%", String.join(", ", mgr.cfg().getStringList("portal.cost")), "%limit%", String.valueOf(mgr.cfg().getInt("portal.limit-per-player", 1)))); } case "remove" -> { if (target == null) { s.sendMessage(mgr.msg("portal-none")); return; } s.sendMessage(mgr.msg(mgr.portals().remove(p, target))); } case "info" -> s.sendMessage(mgr.msg("portal-info", "%cost%", String.join(", ", mgr.cfg().getStringList("portal.cost")), "%count%", String.valueOf(mgr.portals().countOf(p.getUniqueId())), "%limit%", String.valueOf(mgr.cfg().getInt("portal.limit-per-player", 1)))); default -> s.sendMessage(mgr.msg("portal-usage")); } } private void snowman(CommandSender s, String[] a) { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!admin(s)) return; if (a.length < 2) { s.sendMessage(mgr.msg("snowman-usage")); return; } switch (a[1].toLowerCase()) { case "spawn" -> { int from = 2; Boolean walk = null; if (a.length > 2) { String m = a[2].toLowerCase(); if (m.equals("walk") || m.equals("laufen")) { walk = true; from = 3; } else if (m.equals("stand") || m.equals("stehen")) { walk = false; from = 3; } } String name = a.length > from ? String.join(" ", Arrays.copyOfRange(a, from, a.length)) : ""; mgr.snowmen().spawnDeco(p.getLocation(), name, walk); s.sendMessage(mgr.msg("snowman-spawned")); } case "remove" -> s.sendMessage(mgr.msg(mgr.snowmen().removeNearestDeco(p, 6) ? "snowman-removed" : "snowman-none")); default -> s.sendMessage(mgr.msg("snowman-usage")); } } private boolean admin(CommandSender s) { return perm(s, "xmas.admin"); } private void giveCrystal(CommandSender s, String[] a) { if (!admin(s)) return; if (a.length < 2) { s.sendMessage(mgr.msg("usage")); return; } Player t = Bukkit.getPlayerExact(a[1]); if (t == null) { s.sendMessage(mgr.msg("player-offline")); return; } int amount = 1; if (a.length > 2 && a[2].matches("\\d+")) amount = Math.max(1, Math.min(64, Integer.parseInt(a[2]))); RewardUtil.give(t, mgr.trees().crystal(amount)); t.sendMessage(mgr.msg("crystal-given", "%amount%", String.valueOf(amount))); if (s != t) s.sendMessage(mgr.msg("crystal-gave", "%player%", t.getName(), "%amount%", String.valueOf(amount))); } private boolean perm(CommandSender s, String p) { if (s.hasPermission(p)) return true; s.sendMessage(mgr.msg("no-permission")); return false; } // ---------- Snow ---------- private void snow(CommandSender s, String[] a) { if (a.length > 1 && a[1].equalsIgnoreCase("world")) { snowWorld(s, a); return; } if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!perm(s, "christmasplus.christmas.snow")) return; if (!mgr.cfg().getBoolean("snow.enable", true)) { s.sendMessage(mgr.msg("snow-disabled-global")); return; } s.sendMessage(mgr.msg(mgr.toggleSnow(p) ? "snow-on" : "snow-off")); } /** /xmas snow world add|remove|list [Welt]: Schnee-Blacklist der Welten. */ private void snowWorld(CommandSender s, String[] a) { if (!admin(s)) return; String op = a.length > 2 ? a[2].toLowerCase() : "list"; if (op.equals("list")) { List l = mgr.snowBlockedWorlds(); s.sendMessage(mgr.msg("snow-world-list", "%worlds%", l.isEmpty() ? "-" : String.join(", ", l))); return; } if (a.length < 4 || !(op.equals("add") || op.equals("remove"))) { s.sendMessage(mgr.msg("snow-world-usage")); return; } String name = a[3]; org.bukkit.World w = Bukkit.getWorld(name); if (op.equals("add")) { if (w == null) { s.sendMessage(mgr.msg("snow-world-unknown", "%world%", name)); return; } mgr.setSnowWorldBlocked(w.getName(), true); s.sendMessage(mgr.msg("snow-world-added", "%world%", w.getName())); } else { mgr.setSnowWorldBlocked(w != null ? w.getName() : name, false); s.sendMessage(mgr.msg("snow-world-removed", "%world%", w != null ? w.getName() : name)); } } // ---------- Santa ---------- private void santa(CommandSender s, String[] a) { if (!perm(s, "christmasplus.christmas.santa")) return; if (a.length < 2) { s.sendMessage(mgr.msg("santa-usage")); return; } SantaEvent santa = mgr.santa(); switch (a[1].toLowerCase()) { case "stop" -> { if (!santa.isActive()) s.sendMessage(mgr.msg("santa-not-active")); else santa.stop(true); } case "teleport" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return; } if (!santa.isActive()) { s.sendMessage(mgr.msg("santa-not-active")); return; } p.teleport(santa.getLocation()); p.sendMessage(mgr.msg("santa-teleported")); } case "start" -> { if (santa.isActive()) { s.sendMessage(mgr.msg("santa-already")); return; } int time = mgr.cfg().getInt("santa.duration", 300); int i = 2; if (a.length > i && ChristmasManager.parseDuration(a[i]) > 0) time = ChristmasManager.parseDuration(a[i++]); Location where = null; if (a.length > i && a[i].equalsIgnoreCase("random")) { where = santa.randomLocation(); if (where == null) { s.sendMessage(mgr.msg("santa-no-locations")); return; } } else if (a.length >= i + 4) { World w = Bukkit.getWorld(a[i]); try { if (w != null) where = new Location(w, Double.parseDouble(a[i + 1]), Double.parseDouble(a[i + 2]), Double.parseDouble(a[i + 3])); } catch (NumberFormatException ignored) { } } else if (s instanceof Player p) { where = p.getLocation(); } if (where == null) { s.sendMessage(mgr.msg("santa-usage")); return; } santa.start(time, where); s.sendMessage(mgr.msg("santa-started-sender", "%duration%", SantaEvent.formatDuration(time))); } default -> s.sendMessage(mgr.msg("santa-usage")); } } // ---------- Cracker ---------- private boolean cracker(CommandSender s, String[] a) { CrackerManager cm = mgr.crackers(); if (a.length == 0) { s.sendMessage(mgr.msg("cracker-usage")); return true; } switch (a[0].toLowerCase()) { case "list" -> { if (!perm(s, "christmasplus.cracker.list")) return true; s.sendMessage(mgr.prefixed(String.join(", ", cm.ids()))); } case "get" -> { if (!(s instanceof Player p)) { s.sendMessage(mgr.msg("player-only")); return true; } if (!perm(s, "christmasplus.cracker.get")) return true; String id = cm.firstId(); int amount = 1; for (int i = 1; i < a.length; i++) { if (a[i].matches("\\d+")) amount = Integer.parseInt(a[i]); else id = a[i]; } if (amount > 1 && !perm(s, "christmasplus.cracker.get.multiple")) return true; giveCracker(s, p, id, amount); } case "give" -> { if (!perm(s, "christmasplus.cracker.give")) return true; if (a.length < 2) { s.sendMessage(mgr.msg("cracker-usage")); return true; } Player t = Bukkit.getPlayerExact(a[1]); if (t == null) { s.sendMessage(mgr.msg("player-not-found")); return true; } String id = cm.firstId(); int amount = 1; for (int i = 2; i < a.length; i++) { if (a[i].matches("\\d+")) amount = Integer.parseInt(a[i]); else id = a[i]; } giveCracker(s, t, id, amount); } default -> s.sendMessage(mgr.msg("cracker-usage")); } return true; } private void giveCracker(CommandSender s, Player target, String id, int amount) { amount = Math.max(1, Math.min(amount, 64)); ItemStack it = id == null ? null : mgr.crackers().create(id, amount); if (it == null) { s.sendMessage(mgr.msg("cracker-unknown", "%id%", String.valueOf(id))); return; } RewardUtil.give(target, it); target.sendMessage(mgr.msg("cracker-given", "%amount%", String.valueOf(amount), "%id%", id)); if (s != target) s.sendMessage(mgr.msg("cracker-gave", "%player%", target.getName(), "%amount%", String.valueOf(amount), "%id%", id)); } // ---------- Tab ---------- @Override public List onTabComplete(CommandSender s, Command cmd, String label, String[] a) { List out = new ArrayList<>(); if (cmd.getName().equalsIgnoreCase("cracker")) { if (a.length == 1) out.addAll(Arrays.asList("list", "get", "give")); else if (a[0].equalsIgnoreCase("give") && a.length == 2) Bukkit.getOnlinePlayers().forEach(p -> out.add(p.getName())); else out.addAll(mgr.crackers().ids()); } else if (a.length == 1) { out.addAll(Arrays.asList("help", "snow", "santa", "give", "gifts", "addhand", "snowman", "countdown", "cookie", "wichteln", "wreath", "snowball", "deco", "stocking", "hat", "quiz", "wish", "wishes", "market", "portal", "end", "reload")); } else if (a.length == 2 && a[0].equalsIgnoreCase("santa")) { out.addAll(Arrays.asList("start", "stop", "teleport")); } else if (a.length == 3 && a[0].equalsIgnoreCase("market") && a[1].equalsIgnoreCase("santa")) { out.addAll(Arrays.asList("set", "remove", "reset")); } else if (a.length == 2 && a[0].equalsIgnoreCase("snow")) { out.add("world"); } else if (a.length == 3 && a[0].equalsIgnoreCase("snow") && a[1].equalsIgnoreCase("world")) { out.addAll(Arrays.asList("add", "remove", "list")); } else if (a.length == 4 && a[0].equalsIgnoreCase("snow") && a[1].equalsIgnoreCase("world")) { if (a[2].equalsIgnoreCase("remove")) out.addAll(mgr.snowBlockedWorlds()); else Bukkit.getWorlds().forEach(w -> out.add(w.getName())); } else if (a.length == 2 && a[0].equalsIgnoreCase("stocking")) { out.addAll(Arrays.asList("place", "remove", "flight")); } else if (a.length == 2 && a[0].equalsIgnoreCase("snowman")) { out.addAll(Arrays.asList("spawn", "remove")); } else if (a.length == 3 && a[0].equalsIgnoreCase("snowman") && a[1].equalsIgnoreCase("spawn")) { out.addAll(Arrays.asList("stand", "walk")); } else if (a.length == 2 && a[0].equalsIgnoreCase("cookie")) { out.addAll(Arrays.asList("give", "list")); } else if (a.length == 4 && a[0].equalsIgnoreCase("cookie")) { out.addAll(mgr.cookies().ids()); } else if (a.length == 3 && a[0].equalsIgnoreCase("cookie")) { Bukkit.getOnlinePlayers().forEach(p -> out.add(p.getName())); } else if (a.length == 2 && a[0].equalsIgnoreCase("wichteln")) { out.addAll(Arrays.asList("join", "leave", "who", "gift", "status", "open", "draw", "deliver", "reset")); } else if (a.length == 2 && a[0].equalsIgnoreCase("wreath")) { out.addAll(Arrays.asList("create", "remove")); } else if (a.length == 2 && a[0].equalsIgnoreCase("snowball")) { out.addAll(Arrays.asList("top", "arena", "start", "stop")); } else if (a.length == 2 && a[0].equalsIgnoreCase("deco")) { out.add("undo"); } else if (a.length == 2 && a[0].equalsIgnoreCase("portal")) { out.addAll(Arrays.asList("create", "remove", "info")); } else if (a.length == 2 && a[0].equalsIgnoreCase("quiz")) { out.addAll(Arrays.asList("start", "skip", "count")); } else if (a.length == 2 && a[0].equalsIgnoreCase("wish")) { out.addAll(Arrays.asList("list", "clear")); } else if (a.length == 2 && a[0].equalsIgnoreCase("market")) { out.addAll(Arrays.asList("spawn", "remove", "list", "set", "unset", "tp", "back")); } else if (a.length == 3 && a[0].equalsIgnoreCase("market") && a[1].equalsIgnoreCase("spawn")) { out.addAll(mgr.market().stallIds()); } else if (a.length == 2 && a[0].equalsIgnoreCase("give")) { Bukkit.getOnlinePlayers().forEach(p -> out.add(p.getName())); } else { return Collections.emptyList(); } String last = a[a.length - 1].toLowerCase(); out.removeIf(x -> !x.toLowerCase().startsWith(last)); return out; } }