User: Сделаем папку Bank, а в ней класс MaxMoneyPlayer. Мы ставим ограничение, игрок не может держать больше 1000 долларов Vault на аккаунте. Если, у него 999 долларов, лимит 1000, а ему приходит 100 долларов, то 1 доллар мы переводим ему, а 99 долларов мы переводим игроку Oluni_Official. Данный лимит не работает на игрока Oluni_Official. При том, когда игрок теряет деньги от лимита, как было в примере выше, мы пишем ему в чат: "&#A7F6FF[🎣 ғɪsʜɪɴɢ | Банк] &rХей! Вы только что потеряли &#A7F6FF(Сколько игрок потерял при получении денег, как в примере)$&r. Может, лучше откроете карту в нашем банке и не будете терять ваши доллары? &7(Вы можете изначально носить только 1000 долларов, для большего нужно открыть карту)"

package oluni.official.fishcore;

import net.milkbowl.vault.economy.Economy;
import oluni.official.fishcore.Admins.AdminChat;
import oluni.official.fishcore.Admins.ReportManager;
import oluni.official.fishcore.Admins.ReportReplyManager;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Objects;

public class FishCore extends JavaPlugin implements Listener {
    private static Economy econ = null;

    @Override
    public void onEnable() {
        if (!setupEconomy()) {
            getLogger().severe("Vault не найден! Отключение плагина...");
            getServer().getPluginManager().disablePlugin(this);
            return;
        }
        // Регистрируем событие на присоединение игрока
        Bukkit.getPluginManager().registerEvents(this, this);
        getLogger().info("FishCore плагин успешно включен!");
        getServer().getPluginManager().registerEvents(new MoneyTransferListener(), this);
        getServer().getPluginManager().registerEvents(new KillRewards(), this);
        getServer().getPluginManager().registerEvents(new HelloMoney(), this);
        Objects.requireNonNull(getCommand("wiki")).setExecutor(new WikiCommand());
        Objects.requireNonNull(getCommand("tutorial")).setExecutor(new TutorialManage());
        Objects.requireNonNull(getCommand("a")).setExecutor(new AdminChat(this));
        ReportManager reportManager = new ReportManager(this);
        Objects.requireNonNull(getCommand("report")).setExecutor(reportManager);

        // Создание экземпляра ReportReplyManager и его регистрация
        ReportReplyManager reportReplyManager = new ReportReplyManager(reportManager);
        Objects.requireNonNull(getCommand("reports")).setExecutor(reportReplyManager);

        // Регистрация других слушателей команд и событий, если необходимо
    }

    @Override
    public void onDisable() {
        getLogger().info("FishCore плагин успешно отключен!");
    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        // Сообщение при заходе игрока
        String tutorialMessage = "&#A7F6FF[🎣 | ғɪsʜɪɴɢ] &fПриветствую вас, уважаемый игрок. " +
                "Для того что бы лучше разобраться в нашем режиме, можете заглянуть на вики &7(TAB)&f, " +
                "или же пропишите &#72F2A1/tutorial &fдля краткого туториала по режиму.";
        event.getPlayer().sendMessage(colorizeHex(tutorialMessage));
    }

    // Метод для обработки HEX-кодов
    private String colorizeHex(String message) {
        StringBuilder result = new StringBuilder();
        char[] chars = message.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (i + 7 < chars.length && chars[i] == '&' && chars[i + 1] == '#' && isHexCode(message.substring(i + 2, i + 8))) {
                result.append("§x");
                for (int j = i + 2; j < i + 8; j++) {
                    result.append("§").append(chars[j]);
                }
                i += 7; // Пропускаем обработанный HEX-код
            } else if (chars[i] == '&') {
                result.append("§");
            } else {
                result.append(chars[i]);
            }
        }
        return result.toString();
    }

    // Проверяем, является ли строка HEX-кодом
    private boolean isHexCode(String code) {
        return code.matches("[A-Fa-f0-9]{6}");
    }
    private boolean setupEconomy() {
        RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
        if (rsp == null) {
            return false;
        }
        econ = rsp.getProvider();
        return true;
    }

    public static Economy getEconomy() {
        return econ;
    }
}

Assistant: Чтобы реализовать класс `MaxMoneyPlayer` с ограничением на количество денег, которые игрок может хранить на своем аккаунте, вам нужно следовать следующим шагам:

1. Создать папку `Bank` и в ней разместить класс `MaxMoneyPlayer`.
2. Реализовать логику обработки получения денег с учетом ограничения.
3. Обработать передачу остатка денег Oluni_Official в случае превышения лимита.
4. Вывести сообщение игроку о том, сколько денег он потерял.

Вот примерный код для реализации вышеуказанного класса. Предполагается, что для работы с деньгами уже используется система Vault.

### Класс MaxMoneyPlayer

Создайте класс `MaxMoneyPlayer` в папке `Bank`:

```java
package oluni.official.fishcore.Bank;

import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

public class MaxMoneyPlayer {
    private static final double MAX_LIMIT = 1000.0;
    private Economy econ;

    public MaxMoneyPlayer(Economy economy) {
        this.econ = economy;
    }

    public void addMoney(Player player, double amount) {
        double currentBalance = econ.getBalance(player);
        
        if(currentBalance + amount > MAX_LIMIT) {
            double overflowAmount = (currentBalance + amount) - MAX_LIMIT;
            // Устанавливаем игроку только лимит
            econ.depositPlayer(player, MAX_LIMIT - currentBalance);
            
            // Переводим остальные деньги Oluni_Official
            Player oluniOfficial = Bukkit.getPlayer("Oluni_Official");
            if (oluniOfficial != null) {
                econ.depositPlayer(oluniOfficial, overflowAmount);
            }

            // Сообщаем игроку о потере денег
            player.sendMessage(colorizeHex("&#A7F6FF[🎣 ғɪsʜɪɴɢ | Банк] &rХей! Вы только что потеряли &#A7F6FF" + overflowAmount + "$&r. " +
                    "Может, лучше откроете карту в нашем банке и не будете терять ваши доллары? &7(Вы можете изначально носить только 1000 долларов, для большего нужно открыть карту)"));
        } else {
            // Если лимит не превышен, просто добавляем деньги
            econ.depositPlayer(player, amount);
        }
    }

    private String colorizeHex(String message) {
        StringBuilder result = new StringBuilder();
        char[] chars = message.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (i + 7 < chars.length && chars[i] == '&' && chars[i + 1] == '#' && isHexCode(message.substring(i + 2, i + 8))) {
                result.append("§x");
                for (int j = i + 2; j < i + 8; j++) {
                    result.append("§").append(chars[j]);
                }
                i += 7; // Пропускаем обработанный HEX-код
            } else if (chars[i] == '&') {
                result.append("§");
            } else {
                result.append(chars[i]);
            }
        }
        return result.toString();
    }

    private boolean isHexCode(String code) {
        return code.matches("[A-Fa-f0-9]{6}");
    }
}
```

### Как использовать MaxMoneyPlayer

Теперь вы можете использовать `MaxMoneyPlayer` в вашем плагине, чтобы добавлять деньги игрокам, учитывая ограничения. Пример того, как использовать `MaxMoneyPlayer`:

```java
public class MoneyTransferListener implements Listener {
    private MaxMoneyPlayer maxMoneyPlayer = new MaxMoneyPlayer(FishCore.getEconomy());

    @EventHandler
    public void onPlayerReceiveMoney(PlayerReceiveMoneyEvent event) {
        Player player = event.getPlayer();
        double amountReceived = event.getAmount();
        
        // Добавляем деньги с учетом ограничения
        maxMoneyPlayer.addMoney(player, amountReceived);
    }
}
```

Обратите внимание, что данный код подразумевает наличие события `PlayerReceiveMoneyEvent`, которое должно быть реализовано для определения момента, когда игрок получает деньги. 

Это просто пример, и вам может понадобиться адаптировать его под вашу систему событий или методы получения и передачи денег.
User: Добавь проверку на сумму перевода, если она больше 1000, перевод не будет совершен. И при переводе, мы проверяем баланс игрока которому переводят деньги, если переводят ему 700, а на балансе у игрока 500, то перевести получиться только 500, 200 отправляем снова игроку, и эти 500 мы проводим через комиссию.

package oluni.official.fishcore;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

public class MoneyTransferListener implements Listener {

    private final String dbPath;

    public MoneyTransferListener() {
        this.dbPath = "plugins/FishCore/goal.db";
    }

    @EventHandler(priority = EventPriority.HIGHEST)
    public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
        String command = event.getMessage();
        Player sender = event.getPlayer();

        // Проверяем, является ли команда переводом денег
        if (command.startsWith("/pay")) {
            String[] args = command.split(" ");
            if (args.length != 3) return;

            Player recipient = Bukkit.getPlayer(args[1]);
            if (recipient == null || !recipient.isOnline()) {
                sender.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Ошибка] &rИгрок не найден или не в сети!"));
                return;
            }

            double amount;
            try {
                amount = Double.parseDouble(args[2]);
            } catch (NumberFormatException e) {
                sender.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Ошибка] &rСумма должна быть числом!"));
                return;
            }

            double commission = amount * 0.02;
            double finalAmount = amount - commission;

            if (finalAmount <= 0 || FishCore.getEconomy().getBalance(sender) < amount) {
                sender.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Ошибка] &rНедостаточно средств для перевода!"));
                return;
            }

            // Списываем деньги у отправителя
            FishCore.getEconomy().withdrawPlayer(sender, amount);

            // Зачисляем деньги получателю
            FishCore.getEconomy().depositPlayer(recipient, finalAmount);

            // Логируем перевод
            logTransfer(sender, recipient, amount, finalAmount);
            logReception(recipient, sender, finalAmount);

            // Обработка комиссии
            if (!processCommission(commission)) {
                sender.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rНе удалось обработать комиссию. Проверьте настройки."));
            }

            // Отправляем сообщения
            sender.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rВы перевели деньги игроку, и от окончательной суммы наша система отняла &l2%&r. Итоговая сумма, которая была отправлена: &#A7F6FF" + finalAmount + "&r."));
            recipient.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rВы получили деньги от игрока: &#A7F6FF" + finalAmount + "&r."));
        }
    }

    private boolean processCommission(double commission) {
        String targetPlayerName = "Oluni_Official";

        // Проверяем наличие игрока в экономической системе
        if (FishCore.getEconomy().hasAccount(targetPlayerName)) {
            // Зачисляем комиссию на счет игрока Oluni_Official
            FishCore.getEconomy().depositPlayer(targetPlayerName, commission);
            Bukkit.getLogger().info("Комиссия в размере " + commission + " была зачислена игроку " + targetPlayerName + ".");
            return true;
        } else {
            // Логируем ошибку
            Bukkit.getLogger().severe("Ошибка: не удалось найти аккаунт для игрока " + targetPlayerName + " в экономической системе.");
            return false;
        }
    }

    private void logTransfer(Player sender, Player recipient, double amount, double finalAmount) {
        // Логируем отправку
        File logFile = new File(Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("FishCore")).getDataFolder() + "/Logs", sender.getName() + ".yml");

        if (!logFile.exists()) {
            try {
                logFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        FileConfiguration config = YamlConfiguration.loadConfiguration(logFile);
        String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        String logEntry = String.format("[%s] %s перевел деньги игроку %s в размере %.2f $.", timestamp, sender.getName(), recipient.getName(), finalAmount);
        config.set("transfers." + System.currentTimeMillis(), logEntry);

        try {
            config.save(logFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void logReception(Player recipient, Player sender, double finalAmount) {
        // Логируем получение
        File logFile = new File(Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("FishCore")).getDataFolder() + "/Logs", recipient.getName() + ".yml");

        if (!logFile.exists()) {
            try {
                logFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        FileConfiguration config = YamlConfiguration.loadConfiguration(logFile);
        String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        String logEntry = String.format("[%s] %s получил деньги от игрока %s в размере %.2f $.", timestamp, recipient.getName(), sender.getName(), finalAmount);
        config.set("receipts." + System.currentTimeMillis(), logEntry);

        try {
            config.save(logFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // Метод для обработки HEX-кодов
    private String colorizeHex(String message) {
        StringBuilder result = new StringBuilder();
        char[] chars = message.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (i + 7 < chars.length && chars[i] == '&' && chars[i + 1] == '#' && isHexCode(message.substring(i + 2, i + 8))) {
                result.append("§x");
                for (int j = i + 2; j < i + 8; j++) {
                    result.append("§").append(chars[j]);
                }
                i += 7; // Пропускаем обработанный HEX-код
            } else if (chars[i] == '&') {
                result.append("§");
            } else {
                result.append(chars[i]);
            }
        }
        return result.toString();
    }

    // Проверяем, является ли строка HEX-кодом
    private boolean isHexCode(String code) {
        return code.matches("[A-Fa-f0-9]{6}");
    }
}
Assistant: