Initial commit: LoChat v1.0.0 with Gradient module
This commit is contained in:
commit
252b0a60db
86 changed files with 8922 additions and 0 deletions
244
surce/gradientnick/commands/ColorCommand.java
Normal file
244
surce/gradientnick/commands/ColorCommand.java
Normal file
|
|
@ -0,0 +1,244 @@
|
|||
package ru.lovar.gradientnick.commands;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
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.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.lovar.gradientnick.GradientNick;
|
||||
import ru.lovar.gradientnick.config.ConfigManager;
|
||||
import ru.lovar.gradientnick.config.MessagesManager;
|
||||
import ru.lovar.gradientnick.data.PlayerData;
|
||||
import ru.lovar.gradientnick.gui.ConfirmGUI;
|
||||
import ru.lovar.gradientnick.util.Constants;
|
||||
import ru.lovar.gradientnick.util.DisplayNameUtil;
|
||||
import ru.lovar.gradientnick.util.FoliaUtil;
|
||||
import ru.lovar.gradientnick.util.GradientUtil;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class ColorCommand implements CommandExecutor, TabCompleter {
|
||||
|
||||
private final GradientNick plugin;
|
||||
private final Map<String, BiFunction<Player, String[], Boolean>> subCommands = new HashMap<>();
|
||||
|
||||
private static final List<String> PRESET_COLORS = List.of(
|
||||
"#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#9400D3",
|
||||
"#FF69B4", "#00FFFF", "#FFD700", "#FFFFFF", "#000000"
|
||||
);
|
||||
private static final Set<String> SUB_COMMANDS = Set.of("on", "off", "reset", "copy");
|
||||
|
||||
public ColorCommand(GradientNick plugin) {
|
||||
this.plugin = plugin;
|
||||
registerSubCommands();
|
||||
}
|
||||
|
||||
private void registerSubCommands() {
|
||||
subCommands.put("on", this::handleOn);
|
||||
subCommands.put("off", this::handleOff);
|
||||
subCommands.put("reset", this::handleReset);
|
||||
subCommands.put("copy", this::handleCopy);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String label, @NotNull String[] args) {
|
||||
if (!(sender instanceof Player player)) {
|
||||
sender.sendMessage(plugin.getMessagesManager().get("only-player"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!player.hasPermission("gradient.color")) {
|
||||
player.sendMessage(plugin.getMessagesManager().get("no-permission"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0) {
|
||||
player.sendMessage(plugin.getMessagesManager().get("color-help"));
|
||||
return true;
|
||||
}
|
||||
|
||||
String subCommand = args[0].toLowerCase();
|
||||
var handler = subCommands.get(subCommand);
|
||||
if (handler != null) {
|
||||
return handler.apply(player, args);
|
||||
}
|
||||
|
||||
return handleSetColors(player, args);
|
||||
}
|
||||
|
||||
private boolean handleOn(Player player, String[] args) {
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
|
||||
if (!data.hasColors()) {
|
||||
player.sendMessage(msg.get("color-no-colors"));
|
||||
return true;
|
||||
}
|
||||
|
||||
data.setColorEnabled(true);
|
||||
saveAndUpdate(player, data);
|
||||
player.sendMessage(msg.get("color-enabled"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleOff(Player player, String[] args) {
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
data.setColorEnabled(false);
|
||||
saveAndUpdate(player, data);
|
||||
player.sendMessage(plugin.getMessagesManager().get("color-disabled"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleReset(Player player, String[] args) {
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
|
||||
if (!data.hasColors()) {
|
||||
player.sendMessage(msg.get("color-no-colors"));
|
||||
return true;
|
||||
}
|
||||
|
||||
data.setColors(new ArrayList<>());
|
||||
data.setColorEnabled(false);
|
||||
saveAndUpdate(player, data);
|
||||
player.sendMessage(msg.get("color-reset"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleCopy(Player player, String[] args) {
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
ConfigManager cfg = plugin.getConfigManager();
|
||||
|
||||
if (args.length < 2) {
|
||||
player.sendMessage(msg.get("color-copy-usage"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player target = Bukkit.getPlayer(args[1]);
|
||||
if (target == null) {
|
||||
player.sendMessage(msg.get("player-not-found"));
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerData targetData = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
if (!targetData.hasColors()) {
|
||||
player.sendMessage(msg.get("color-copy-no-colors", "player", target.getName()));
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
|
||||
if (!player.hasPermission("gradient.bypass.cooldown") && !checkCooldown(player, cfg.getColorCooldown(), data.getLastColorChange())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
List<String> colors = new ArrayList<>(targetData.getColors());
|
||||
int price = player.hasPermission("gradient.bypass.cost") ? 0 : colors.size() * cfg.getPricePerColor();
|
||||
|
||||
if (price > 0 && !checkBalance(player, price)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
ConfirmGUI gui = new ConfirmGUI(plugin, player, ConfirmGUI.ConfirmType.COLOR, colors, data.getPrefix(), price);
|
||||
FoliaUtil.runEntityTask(plugin, player, gui::open);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleSetColors(Player player, String[] args) {
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
ConfigManager cfg = plugin.getConfigManager();
|
||||
|
||||
if (args.length > cfg.getMaxColors()) {
|
||||
player.sendMessage(msg.get("too-many-colors", "max", String.valueOf(cfg.getMaxColors())));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length < cfg.getMinColors()) {
|
||||
player.sendMessage(msg.get("not-enough-colors", "min", String.valueOf(cfg.getMinColors())));
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
|
||||
if (!player.hasPermission("gradient.bypass.cooldown") && !checkCooldown(player, cfg.getColorCooldown(), data.getLastColorChange())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
List<String> colors = new ArrayList<>();
|
||||
for (String arg : args) {
|
||||
String color = arg.startsWith("#") ? arg : "#" + arg;
|
||||
if (!GradientUtil.isValidHex(color)) {
|
||||
player.sendMessage(msg.get("invalid-color", "color", arg));
|
||||
return true;
|
||||
}
|
||||
colors.add(color.toUpperCase());
|
||||
}
|
||||
|
||||
int price = player.hasPermission("gradient.bypass.cost") ? 0 : colors.size() * cfg.getPricePerColor();
|
||||
|
||||
if (price > 0 && !checkBalance(player, price)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
ConfirmGUI gui = new ConfirmGUI(plugin, player, ConfirmGUI.ConfirmType.COLOR, colors, data.getPrefix(), price);
|
||||
FoliaUtil.runEntityTask(plugin, player, gui::open);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean checkCooldown(Player player, int cooldownSec, long lastChange) {
|
||||
long cooldownMs = cooldownSec * Constants.MILLIS_PER_SECOND;
|
||||
long timePassed = System.currentTimeMillis() - lastChange;
|
||||
if (timePassed < cooldownMs) {
|
||||
long remaining = (cooldownMs - timePassed) / Constants.MILLIS_PER_SECOND;
|
||||
player.sendMessage(plugin.getMessagesManager().get("cooldown", "time", String.valueOf(remaining)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean checkBalance(Player player, int price) {
|
||||
int balance = plugin.getPlayerPointsAPI().look(player.getUniqueId());
|
||||
if (balance < price) {
|
||||
player.sendMessage(plugin.getMessagesManager().get("not-enough-points-color", "price", String.valueOf(price)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void saveAndUpdate(Player player, PlayerData data) {
|
||||
FoliaUtil.runEntityTask(plugin, player, () -> DisplayNameUtil.updateDisplayName(plugin, player, data));
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(player.getUniqueId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String alias, @NotNull String[] args) {
|
||||
if (args.length == 1) {
|
||||
String input = args[0].toLowerCase();
|
||||
List<String> completions = new ArrayList<>(SUB_COMMANDS);
|
||||
completions.addAll(PRESET_COLORS);
|
||||
return completions.stream().filter(s -> s.toLowerCase().startsWith(input)).toList();
|
||||
}
|
||||
|
||||
String firstArg = args[0].toLowerCase();
|
||||
|
||||
if (args.length == 2 && firstArg.equals("copy")) {
|
||||
return Bukkit.getOnlinePlayers().stream().map(Player::getName)
|
||||
.filter(s -> s.toLowerCase().startsWith(args[1].toLowerCase())).toList();
|
||||
}
|
||||
|
||||
// Для цветов — показываем пресеты
|
||||
if (!SUB_COMMANDS.contains(firstArg) && args.length <= plugin.getConfigManager().getMaxColors()) {
|
||||
return PRESET_COLORS.stream()
|
||||
.filter(s -> s.toLowerCase().startsWith(args[args.length - 1].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
347
surce/gradientnick/commands/GradientCommand.java
Normal file
347
surce/gradientnick/commands/GradientCommand.java
Normal file
|
|
@ -0,0 +1,347 @@
|
|||
package ru.lovar.gradientnick.commands;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
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.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.lovar.gradientnick.GradientNick;
|
||||
import ru.lovar.gradientnick.config.ConfigManager;
|
||||
import ru.lovar.gradientnick.config.MessagesManager;
|
||||
import ru.lovar.gradientnick.data.PlayerData;
|
||||
import ru.lovar.gradientnick.util.DisplayNameUtil;
|
||||
import ru.lovar.gradientnick.util.FoliaUtil;
|
||||
import ru.lovar.gradientnick.util.GradientUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class GradientCommand implements CommandExecutor, TabCompleter {
|
||||
|
||||
private final GradientNick plugin;
|
||||
private static final List<String> PRESET_COLORS = Arrays.asList(
|
||||
"#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#9400D3"
|
||||
);
|
||||
|
||||
public GradientCommand(GradientNick plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String label, @NotNull String[] args) {
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
ConfigManager cfg = plugin.getConfigManager();
|
||||
|
||||
if (!sender.hasPermission("gradient.admin")) {
|
||||
sender.sendMessage(msg.get("no-permission"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0) {
|
||||
sendHelp(sender);
|
||||
return true;
|
||||
}
|
||||
|
||||
String subCommand = args[0].toLowerCase();
|
||||
|
||||
switch (subCommand) {
|
||||
case "reload" -> {
|
||||
plugin.reload();
|
||||
sender.sendMessage(msg.get("reload-success"));
|
||||
}
|
||||
case "info" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix info <игрок>");
|
||||
return true;
|
||||
}
|
||||
handleInfo(sender, args[1], msg);
|
||||
}
|
||||
case "setcolor" -> {
|
||||
if (args.length < 3) {
|
||||
sender.sendMessage("§cИспользование: /aprefix setcolor <игрок> <цвет1> [цвет2] ...");
|
||||
return true;
|
||||
}
|
||||
handleSetColor(sender, args, msg, cfg);
|
||||
}
|
||||
case "setprefix" -> {
|
||||
if (args.length < 3) {
|
||||
sender.sendMessage("§cИспользование: /aprefix setprefix <игрок> <префикс>");
|
||||
return true;
|
||||
}
|
||||
handleSetPrefix(sender, args, msg, cfg);
|
||||
}
|
||||
case "coloron" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix coloron <игрок>");
|
||||
return true;
|
||||
}
|
||||
handleColorToggle(sender, args[1], true, msg);
|
||||
}
|
||||
case "coloroff" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix coloroff <игрок>");
|
||||
return true;
|
||||
}
|
||||
handleColorToggle(sender, args[1], false, msg);
|
||||
}
|
||||
case "prefixon" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix prefixon <игрок>");
|
||||
return true;
|
||||
}
|
||||
handlePrefixToggle(sender, args[1], true, msg);
|
||||
}
|
||||
case "prefixoff" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix prefixoff <игрок>");
|
||||
return true;
|
||||
}
|
||||
handlePrefixToggle(sender, args[1], false, msg);
|
||||
}
|
||||
case "resetcolor" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix resetcolor <игрок>");
|
||||
return true;
|
||||
}
|
||||
handleResetColor(sender, args[1], msg);
|
||||
}
|
||||
case "resetprefix" -> {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("§cИспользование: /aprefix resetprefix <игрок>");
|
||||
return true;
|
||||
}
|
||||
handleResetPrefix(sender, args[1], msg);
|
||||
}
|
||||
default -> sendHelp(sender);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void sendHelp(CommandSender sender) {
|
||||
sender.sendMessage("§e=== LoPreff Admin ===");
|
||||
sender.sendMessage("§e/aprefix reload §7— перезагрузить конфиг");
|
||||
sender.sendMessage("§e/aprefix info <игрок> §7— информация об игроке");
|
||||
sender.sendMessage("§e/aprefix setcolor <игрок> <цвета> §7— установить цвет");
|
||||
sender.sendMessage("§e/aprefix setprefix <игрок> <префикс> §7— установить префикс");
|
||||
sender.sendMessage("§e/aprefix coloron/coloroff <игрок> §7— вкл/выкл цвет");
|
||||
sender.sendMessage("§e/aprefix prefixon/prefixoff <игрок> §7— вкл/выкл префикс");
|
||||
sender.sendMessage("§e/aprefix resetcolor <игрок> §7— сбросить цвет");
|
||||
sender.sendMessage("§e/aprefix resetprefix <игрок> §7— сбросить префикс");
|
||||
}
|
||||
|
||||
private void handleInfo(CommandSender sender, String playerName, MessagesManager msg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(playerName);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
|
||||
sender.sendMessage(msg.get("info-header", "player", playerName));
|
||||
sender.sendMessage(msg.get("info-prefix", "prefix", data.hasPrefix() ? data.getPrefix() : "нет"));
|
||||
sender.sendMessage(msg.get("info-prefix-enabled", "enabled", data.isPrefixEnabled() ? "да" : "нет"));
|
||||
sender.sendMessage(msg.get("info-colors", "colors", data.hasColors() ? String.join(", ", data.getColors()) : "нет"));
|
||||
sender.sendMessage(msg.get("info-color-enabled", "enabled", data.isColorEnabled() ? "да" : "нет"));
|
||||
sender.sendMessage(msg.get("info-prefix-purchased", "purchased", data.isPrefixPurchased() ? "да" : "нет"));
|
||||
}
|
||||
|
||||
private void handleSetColor(CommandSender sender, String[] args, MessagesManager msg, ConfigManager cfg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(args[1]);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> colors = new ArrayList<>();
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
String color = args[i].startsWith("#") ? args[i] : "#" + args[i];
|
||||
if (!GradientUtil.isValidHex(color)) {
|
||||
sender.sendMessage(msg.get("invalid-color", "color", args[i]));
|
||||
return;
|
||||
}
|
||||
colors.add(color.toUpperCase());
|
||||
}
|
||||
|
||||
if (colors.size() > cfg.getMaxColors()) {
|
||||
sender.sendMessage(msg.get("too-many-colors", "max", String.valueOf(cfg.getMaxColors())));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
data.setColors(colors);
|
||||
data.setColorEnabled(true);
|
||||
|
||||
Player onlineTarget = target.getPlayer();
|
||||
if (onlineTarget != null) {
|
||||
FoliaUtil.runEntityTask(plugin, onlineTarget, () -> DisplayNameUtil.updateDisplayName(plugin, onlineTarget, data));
|
||||
}
|
||||
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(target.getUniqueId()));
|
||||
|
||||
sender.sendMessage("§aЦвет для игрока §f" + args[1] + " §aустановлен: §f" + String.join(" ", colors));
|
||||
}
|
||||
|
||||
private void handleSetPrefix(CommandSender sender, String[] args, MessagesManager msg, ConfigManager cfg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(args[1]);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder prefixBuilder = new StringBuilder();
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
if (i > 2) prefixBuilder.append(" ");
|
||||
prefixBuilder.append(args[i]);
|
||||
}
|
||||
String prefix = prefixBuilder.toString();
|
||||
|
||||
if (prefix.length() > cfg.getMaxPrefixLength()) {
|
||||
sender.sendMessage(msg.get("prefix-too-long", "max", String.valueOf(cfg.getMaxPrefixLength())));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
data.setPrefix(prefix);
|
||||
data.setPrefixEnabled(true);
|
||||
data.setPrefixPurchased(true);
|
||||
|
||||
plugin.getLuckPermsHook().setPrefix(target.getUniqueId(), DisplayNameUtil.buildColoredPrefix(plugin, data));
|
||||
|
||||
Player onlineTarget = target.getPlayer();
|
||||
if (onlineTarget != null) {
|
||||
FoliaUtil.runEntityTask(plugin, onlineTarget, () -> DisplayNameUtil.updateDisplayName(plugin, onlineTarget, data));
|
||||
}
|
||||
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(target.getUniqueId()));
|
||||
|
||||
sender.sendMessage("§aПрефикс для игрока §f" + args[1] + " §aустановлен: §f" + prefix);
|
||||
}
|
||||
|
||||
private void handleColorToggle(CommandSender sender, String playerName, boolean enable, MessagesManager msg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(playerName);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
data.setColorEnabled(enable);
|
||||
|
||||
Player onlineTarget = target.getPlayer();
|
||||
if (onlineTarget != null) {
|
||||
FoliaUtil.runEntityTask(plugin, onlineTarget, () -> DisplayNameUtil.updateDisplayName(plugin, onlineTarget, data));
|
||||
}
|
||||
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(target.getUniqueId()));
|
||||
|
||||
sender.sendMessage("§aЦвет для игрока §f" + playerName + (enable ? " §aвключён" : " §cвыключен"));
|
||||
}
|
||||
|
||||
private void handlePrefixToggle(CommandSender sender, String playerName, boolean enable, MessagesManager msg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(playerName);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
data.setPrefixEnabled(enable);
|
||||
|
||||
if (enable && data.hasPrefix()) {
|
||||
plugin.getLuckPermsHook().setPrefix(target.getUniqueId(), DisplayNameUtil.buildColoredPrefix(plugin, data));
|
||||
} else {
|
||||
plugin.getLuckPermsHook().removePrefix(target.getUniqueId());
|
||||
}
|
||||
|
||||
Player onlineTarget = target.getPlayer();
|
||||
if (onlineTarget != null) {
|
||||
FoliaUtil.runEntityTask(plugin, onlineTarget, () -> DisplayNameUtil.updateDisplayName(plugin, onlineTarget, data));
|
||||
}
|
||||
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(target.getUniqueId()));
|
||||
|
||||
sender.sendMessage("§aПрефикс для игрока §f" + playerName + (enable ? " §aвключён" : " §cвыключен"));
|
||||
}
|
||||
|
||||
private void handleResetColor(CommandSender sender, String playerName, MessagesManager msg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(playerName);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
data.setColors(new ArrayList<>());
|
||||
data.setColorEnabled(false);
|
||||
|
||||
Player onlineTarget = target.getPlayer();
|
||||
if (onlineTarget != null) {
|
||||
FoliaUtil.runEntityTask(plugin, onlineTarget, () -> DisplayNameUtil.updateDisplayName(plugin, onlineTarget, data));
|
||||
}
|
||||
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(target.getUniqueId()));
|
||||
|
||||
sender.sendMessage("§aЦвет для игрока §f" + playerName + " §aсброшен");
|
||||
}
|
||||
|
||||
private void handleResetPrefix(CommandSender sender, String playerName, MessagesManager msg) {
|
||||
OfflinePlayer target = Bukkit.getOfflinePlayer(playerName);
|
||||
if (!target.hasPlayedBefore() && !target.isOnline()) {
|
||||
sender.sendMessage(msg.get("player-not-found"));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(target.getUniqueId());
|
||||
data.setPrefix(null);
|
||||
data.setPrefixEnabled(false);
|
||||
|
||||
plugin.getLuckPermsHook().removePrefix(target.getUniqueId());
|
||||
|
||||
Player onlineTarget = target.getPlayer();
|
||||
if (onlineTarget != null) {
|
||||
FoliaUtil.runEntityTask(plugin, onlineTarget, () -> DisplayNameUtil.updateDisplayName(plugin, onlineTarget, data));
|
||||
}
|
||||
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(target.getUniqueId()));
|
||||
|
||||
sender.sendMessage("§aПрефикс для игрока §f" + playerName + " §aсброшен");
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String alias, @NotNull String[] args) {
|
||||
if (!sender.hasPermission("gradient.admin")) return new ArrayList<>();
|
||||
|
||||
if (args.length == 1) {
|
||||
return Arrays.asList("reload", "info", "setcolor", "setprefix", "coloron", "coloroff", "prefixon", "prefixoff", "resetcolor", "resetprefix").stream()
|
||||
.filter(s -> s.startsWith(args[0].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
|
||||
if (args.length == 2) {
|
||||
String sub = args[0].toLowerCase();
|
||||
if (Arrays.asList("info", "setcolor", "setprefix", "coloron", "coloroff", "prefixon", "prefixoff", "resetcolor", "resetprefix").contains(sub)) {
|
||||
return Bukkit.getOnlinePlayers().stream()
|
||||
.map(Player::getName)
|
||||
.filter(s -> s.toLowerCase().startsWith(args[1].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
if (args.length >= 3 && args[0].equalsIgnoreCase("setcolor")) {
|
||||
return PRESET_COLORS.stream()
|
||||
.filter(s -> s.toLowerCase().startsWith(args[args.length - 1].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
199
surce/gradientnick/commands/PrefixCommand.java
Normal file
199
surce/gradientnick/commands/PrefixCommand.java
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
package ru.lovar.gradientnick.commands;
|
||||
|
||||
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.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import ru.lovar.gradientnick.GradientNick;
|
||||
import ru.lovar.gradientnick.config.ConfigManager;
|
||||
import ru.lovar.gradientnick.config.MessagesManager;
|
||||
import ru.lovar.gradientnick.data.PlayerData;
|
||||
import ru.lovar.gradientnick.gui.ConfirmGUI;
|
||||
import ru.lovar.gradientnick.util.Constants;
|
||||
import ru.lovar.gradientnick.util.DisplayNameUtil;
|
||||
import ru.lovar.gradientnick.util.FoliaUtil;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class PrefixCommand implements CommandExecutor, TabCompleter {
|
||||
|
||||
private final GradientNick plugin;
|
||||
private final Map<String, BiFunction<Player, String[], Boolean>> subCommands = new HashMap<>();
|
||||
|
||||
private static final Pattern COLOR_CODE_PATTERN = Pattern.compile("(?i)(&[0-9a-fk-or]|§[0-9a-fk-or]|#[0-9a-f]{6}|&#[0-9a-f]{6}|<#[0-9a-f]{6}>)");
|
||||
private static final Pattern ALLOWED_PREFIX_PATTERN = Pattern.compile("^[a-zA-Zа-яА-ЯёЁ0-9 _\\-]+$");
|
||||
private static final Set<String> SUB_COMMANDS = Set.of("on", "off", "reset");
|
||||
|
||||
public PrefixCommand(GradientNick plugin) {
|
||||
this.plugin = plugin;
|
||||
registerSubCommands();
|
||||
}
|
||||
|
||||
private void registerSubCommands() {
|
||||
subCommands.put("on", this::handleOn);
|
||||
subCommands.put("off", this::handleOff);
|
||||
subCommands.put("reset", this::handleReset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String label, @NotNull String[] args) {
|
||||
if (!(sender instanceof Player player)) {
|
||||
sender.sendMessage(plugin.getMessagesManager().get("only-player"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!player.hasPermission("gradient.prefix")) {
|
||||
player.sendMessage(plugin.getMessagesManager().get("no-permission"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0) {
|
||||
player.sendMessage(plugin.getMessagesManager().get("prefix-help"));
|
||||
return true;
|
||||
}
|
||||
|
||||
String subCommand = args[0].toLowerCase();
|
||||
var handler = subCommands.get(subCommand);
|
||||
if (handler != null) {
|
||||
return handler.apply(player, args);
|
||||
}
|
||||
|
||||
return handleSetPrefix(player, args);
|
||||
}
|
||||
|
||||
private boolean handleOn(Player player, String[] args) {
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
|
||||
if (!data.hasPrefix()) {
|
||||
player.sendMessage(msg.get("prefix-no-prefix"));
|
||||
return true;
|
||||
}
|
||||
|
||||
data.setPrefixEnabled(true);
|
||||
plugin.getLuckPermsHook().setPrefix(player, DisplayNameUtil.buildColoredPrefix(plugin, data));
|
||||
saveAndUpdate(player, data);
|
||||
player.sendMessage(msg.get("prefix-enabled"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleOff(Player player, String[] args) {
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
data.setPrefixEnabled(false);
|
||||
plugin.getLuckPermsHook().removePrefix(player);
|
||||
saveAndUpdate(player, data);
|
||||
player.sendMessage(plugin.getMessagesManager().get("prefix-disabled"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleReset(Player player, String[] args) {
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
|
||||
if (!data.hasPrefix()) {
|
||||
player.sendMessage(msg.get("prefix-no-prefix"));
|
||||
return true;
|
||||
}
|
||||
|
||||
data.setPrefix(null);
|
||||
data.setPrefixEnabled(false);
|
||||
plugin.getLuckPermsHook().removePrefix(player);
|
||||
saveAndUpdate(player, data);
|
||||
player.sendMessage(msg.get("prefix-reset-success"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean handleSetPrefix(Player player, String[] args) {
|
||||
MessagesManager msg = plugin.getMessagesManager();
|
||||
ConfigManager cfg = plugin.getConfigManager();
|
||||
String prefix = String.join(" ", args);
|
||||
|
||||
if (prefix.trim().isEmpty()) {
|
||||
player.sendMessage(msg.get("prefix-help"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (COLOR_CODE_PATTERN.matcher(prefix).find()) {
|
||||
player.sendMessage(msg.get("prefix-no-colors"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!ALLOWED_PREFIX_PATTERN.matcher(prefix).matches()) {
|
||||
player.sendMessage(msg.get("prefix-invalid-chars"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (cfg.isPrefixBlacklisted(prefix)) {
|
||||
player.sendMessage(msg.get("prefix-blacklisted"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (prefix.length() > cfg.getMaxPrefixLength()) {
|
||||
player.sendMessage(msg.get("prefix-too-long", "max", String.valueOf(cfg.getMaxPrefixLength())));
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.getDataManager().getPlayerData(player.getUniqueId());
|
||||
|
||||
if (!player.hasPermission("gradient.bypass.cooldown") && !checkCooldown(player, cfg.getPrefixCooldown(), data.getLastPrefixChange())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int price = calculatePrice(player, cfg, data);
|
||||
|
||||
if (price > 0 && !checkBalance(player, price, "not-enough-points-prefix")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
ConfirmGUI gui = new ConfirmGUI(plugin, player, ConfirmGUI.ConfirmType.PREFIX, data.getColors(), prefix, price);
|
||||
FoliaUtil.runEntityTask(plugin, player, gui::open);
|
||||
return true;
|
||||
}
|
||||
|
||||
private int calculatePrice(Player player, ConfigManager cfg, PlayerData data) {
|
||||
if (player.hasPermission("gradient.bypass.cost")) return 0;
|
||||
return (cfg.isPrefixOneTimePurchase() && data.isPrefixPurchased()) ? 0 : cfg.getPrefixPrice();
|
||||
}
|
||||
|
||||
private boolean checkCooldown(Player player, int cooldownSec, long lastChange) {
|
||||
long cooldownMs = cooldownSec * Constants.MILLIS_PER_SECOND;
|
||||
long timePassed = System.currentTimeMillis() - lastChange;
|
||||
if (timePassed < cooldownMs) {
|
||||
long remaining = (cooldownMs - timePassed) / Constants.MILLIS_PER_SECOND;
|
||||
player.sendMessage(plugin.getMessagesManager().get("cooldown", "time", String.valueOf(remaining)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean checkBalance(Player player, int price, String msgKey) {
|
||||
int balance = plugin.getPlayerPointsAPI().look(player.getUniqueId());
|
||||
if (balance < price) {
|
||||
player.sendMessage(plugin.getMessagesManager().get(msgKey, "price", String.valueOf(price)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void saveAndUpdate(Player player, PlayerData data) {
|
||||
FoliaUtil.runEntityTask(plugin, player, () -> DisplayNameUtil.updateDisplayName(plugin, player, data));
|
||||
FoliaUtil.runAsync(plugin, () -> plugin.getDataManager().savePlayerData(player.getUniqueId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String alias, @NotNull String[] args) {
|
||||
if (args.length == 1) {
|
||||
return SUB_COMMANDS.stream()
|
||||
.filter(s -> s.startsWith(args[0].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue