User: Напиши класс для плагина майнкрафт.
Он будет работать с плагином Vault. И перехватывать любые переводы денег другому игроку. Когда перевод другому игроку состоялся, то мы забираем 2% от суммы перевода. И при этом, пишем игроку который передал деньги в чат: "&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rВы перевели деньги игроку, и от окончательной суммы наша система отняла &l2%&r. Итоговая сумма, которая была отправлена: &#A7F6FF(Сумма, с учетом комиссии)&r. И помните - все ваши деньги, которые забирает комиссия, уходят на благо сервера!". И тому игроку, кто получил деньги: "&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rВы получили деньги от игрока, и от окончательной суммы наша система отняла &l2%&r. Итоговая сумма, которая была отправлена: &#A7F6FF(Сумма, с учетом комиссии)&r. И помните - все ваши деньги, которые забирает комиссия, уходят на благо сервера!".

Главный файл:

package oluni.official.fishcore;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class FishCore extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        // Регистрируем событие на присоединение игрока
        Bukkit.getPluginManager().registerEvents(this, this);
        getLogger().info("FishCore плагин успешно включен!");
    }

    @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}");
    }
}

Assistant: Для реализации плагина, который будет перехватывать переводы денег между игроками и удерживать 2% от этой суммы, мы можем использовать события, предоставляемые плагином Vault. Для этого нам понадобится добавить обработчик событий для перевода денег и сообщить игрокам нужную информацию. 

Ниже представлен код pлагина, включая новую функциональность:

```java
package oluni.official.fishcore;

import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.RegisteredServiceProvider;

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

    @Override
    public void onEnable() {
        // Регистрируем события и инициализируем эконмическую систему
        Bukkit.getPluginManager().registerEvents(this, this);

        if (!setupEconomy()) {
            getLogger().severe("Не удалось загрузить Vault и систему экономики!");
            Bukkit.getPluginManager().disablePlugin(this);
            return;
        }

        getLogger().info("FishCore плагин успешно включен!");
    }

    @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));
    }
    
    // Обработчик команды перевода денег
    @EventHandler
    public void onPlayerTransferMoney(PlayerCommandPreprocessEvent event) {
        String[] args = event.getMessage().split(" ");
        
        // Предположим, что команда перевода денег выглядит как "/pay <игрок> <сумма>"
        if (args[0].equalsIgnoreCase("/pay") && args.length == 3) {
            String playerName = args[1];
            double amount;
            try {
                amount = Double.parseDouble(args[2]);
            } catch (NumberFormatException e) {
                return; // Не корректная сумма
            }

            // Получаем игрока, которому переводят деньги
            var senderPlayer = event.getPlayer();
            var receiverPlayer = Bukkit.getPlayer(playerName);
            if (receiverPlayer == null) {
                senderPlayer.sendMessage(colorizeHex("&#A7F6FF[🎣 | ғɪsʜɪɴɢ] &cИгрок не найден."));
                return;
            }

            // Расчитываем сумму комиссии
            double commission = amount * 0.02;
            double finalAmount = amount - commission;

            // Снимаем деньги у отправителя и добавляем к получателю
            if (economy.has(senderPlayer, amount)) {
                economy.withdrawPlayer(senderPlayer, amount);
                economy.depositPlayer(receiverPlayer, finalAmount);

                // Сообщаем игрокам о комиссии
                senderPlayer.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rВы перевели деньги игроку, и от окончательной суммы наша система отняла &l2%&r. Итоговая сумма, которая была отправлена: &#A7F6FF" + finalAmount + "&r. И помните - все ваши деньги, которые забирает комиссия, уходят на благо сервера!"));
                receiverPlayer.sendMessage(colorizeHex("&#A7F6FF[ғɪsʜɪɴɢ | Комиссия] &rВы получили деньги от игрока, и от окончательной суммы наша система отняла &l2%&r. Итоговая сумма, которая была отправлена: &#A7F6FF" + finalAmount + "&r. И помните - все ваши деньги, которые забирает комиссия, уходят на благо сервера!"));
            } else {
                // Если недостаточно денег у отправителя
                senderPlayer.sendMessage(colorizeHex("&#A7F6FF[🎣 | ғɪsʜɪɴɢ] &cНедостаточно денег для перевода."));
            }

            // Отменяем выполнение команды, чтобы не было двойного действия
            event.setCancelled(true);
        }
    }

    // Метод для обработки 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() {
        if (getServer().getPluginManager().getPlugin("Vault") == null) {
            return false;
        }
        RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
        economy = rsp.getProvider();
        return economy != null;
    }
}
```

### Объяснение кода:
1. **Интеграция с Vault:** Мы начинаем с проверки, доступен ли Vault, и инициализируем провайдер экономики.
2. **Обработчик события перевода денег:** В методе `onPlayerTransferMoney` мы обрабатываем команду `/pay`, которая предполагается как команда перевода денег, проверяя её на наличие аргументов (имя игрока и сумма).
3. **Расчет комиссии и выполнение транзакции:** Мы рассчитываем комиссию (2% от суммы), и если у отправителя достаточно средств, то списываем деньги и переводим их получателю.
4. **Оповещения игроков:** Если транзакция совершена, игроки получают уведомление о переводе с учетом комиссии.
5. **Поддержка HEX-цветов:** В методах `colorizeHex` и `isHexCode` реализована поддержка печати сообщений с HEX-цветами.

### Установка:
1. Убедитесь, что Vault и поддерживаемый вами экономический плагин установлены на сервере.
2. Скомпилируйте этот код как Java-плагин и поместите JAR-файл в папку `plugins` вашего сервера Minecraft.
3. Перезапустите сервер. 

Теперь ваш плагин будет перехватывать переводы денег и удерживать 2% комиссии!
User: Теперь добавь в тот же файл, я отвел комиссию в другой файл. Мы сделаем команду /sbor (start|delete|check|get|send|commision) (Если аргумент start, требуем имя, если аргумент delete, требуем айди, если аргумент check, требуем айди, если аргумент get, требуем число и айди, если аргумент send, требуем число, если commision, требуем айди).

Эта команда реализовывает систему сборов. Мы создаем датабазу sbors.db. Вообще, сам класс реализовывает сборы. Говорю сразу, перед каждым сообщением данной команды, должен стоять префикс "&#A7F6FF[ғɪsʜɪɴɢ | Сборы] &f". Что-бы запустить сбор, есть аргумент create. Он требует имя, имя - чисто формальность. Привязываем к введеному имени айди. Айди генерируеться случайно, в диапазоне 100-300. Удалить сбор можно по айди с помощью аргумента delete. Если аргумент check, то мы проверяем баланс сбора по айди. Если аргумент get, то игрок, который эту команду пишет, может забрать некую сумму из сбора. Если же send, то наоборот положить.

А вот commision - это аргумент, где можно настроить как раз ту комиссию, которую мы делали только что. У аргумента есть еще пару аргументов. А именно, процент комисии, и на какой айди сбора она идет, если аргумент сборка - это -1, то тогда комиссия просто уничтожаеться. Если же какой то другой, то все деньги с комисии за перевод игроков, идет на той или иной сбор.
package oluni.official.fishcore;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
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;

public class MoneyTransferListener implements Listener {
    @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);

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

    // Метод для обработки 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: