571 lines
29 KiB
Java
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;
|
|
}
|
|
}
|