Files
Advenskalender/src/main/java/de/mviper/adventskalender/christmas/ChristmasCommand.java
T
2026-11-13 17:46:26 +00:00

571 lines
29 KiB
Java

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<String> 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<String> 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<String> onTabComplete(CommandSender s, Command cmd, String label, String[] a) {
List<String> 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;
}
}