1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Не работает функционал для рангов

Тема в разделе "Разработка плагинов для новичков", создана пользователем DackZz2, 30 апр 2024.

  1. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Я переписываю один плагин для себя, плагин на ранги за убийства игроков. Если игрок достигает указанное кол-во убийств то выдается ранг. Но этот функционал не работает, подскажите что и как
    Main:
    Код:
    import org.bukkit.Bukkit;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.plugin.java.JavaPlugin;
    import static com.example.EventListener.rank;
    
    public final class Main extends JavaPlugin {
        private static Main instance;
    
        public static FileConfiguration config;
    
        public static Plugin plugin;
    
        public void onEnable() {
            instance = this;
            plugin = (Plugin)this;
            config = getConfig();
            saveDefaultConfig();
            getCommand("ranks").setExecutor(new Commands());
            Bukkit.getPluginManager().registerEvents(new EventListener(), (Plugin)this);
            if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
                new PHExpansion().register();
            }
        }
    
        public static Main getInstance() {
            return instance;
        }
        public static void setRank(String newRank) {
            rank = newRank;
        }
    }
    EventListener:

    Код:
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Statistic;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    
    public class EventListener implements Listener {
        private FileConfiguration config;
        static String rank;
    
        @EventHandler
        public void onPlayerKill(PlayerDeathEvent event) {
            Player player = event.getEntity();
            Player killer = player.getKiller();
            for (String m : Main.getInstance().getConfig().getConfigurationSection("ranks").getKeys(true)) {
                if (killer.getStatistic(Statistic.PLAYER_KILLS) == Main.getInstance().getConfig().getInt("ranks." + m + ".kills")) {
                    killer.sendMessage(ChatColor.translateAlternateColorCodes('&', Main.getInstance().getConfig().getString("messages.up").replace("%rank%", rank)));
                    Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), Main.getInstance().getConfig().getString("ranks." + m + ".reward"));
                    Main.setRank(rank);
                }
            }
        }
    }
    
     
  2. Evolum

    Evolum Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Во-первых у тебя ошибка будет возникать, если киллер - null, Допиши проверку. После player,
    if(player.getKiller() != null) {
    for () {
    }
    }
    У тебя ключи не перебираются как тебе нужно, getKeys(true) поменяй на getKeys(false)
     
  3. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Ошибок пока не возникает, просто не работает функционал выдачи ранга при достижении каждого уровня киллов. Насчёт getKeys(false), оно так стояло, не работало, я поменял на тру в надежде
     
  4. Evolum

    Evolum Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    дебаж каждую строку и поставь обратно false.
     
  5. Evolum

    Evolum Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Ошибка возникнет, если игрок умрет от падения с высоты, например. (Конешно как только у тебя будет рабочий кфг/код (Где у тебя ошибка), дальше сам увидишь ошибку)
     
  6. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    я поменял геткейс на фалс, добавил проверку null, все равно не работает. Кстати, все эти
    Код:
    killer.sendMessage(ChatColor.translateAlternateColorCodes('&', Main.getInstance().getConfig().getString("messages.up").replace("%rank%", rank)));
                    Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), Main.getInstance().getConfig().getString("ranks." + m + ".reward"));
                    Main.setRank(rank);
    именно в общем не выполняются
     
  7. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Если не выполняется, значит у тебя это условие false:
    Код:
    if (killer.getStatistic(Statistic.PLAYER_KILLS) == Main.getInstance().getConfig().getInt("ranks." + m + ".kills")) {
    Дебаж почему.
     
  8. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    В конфиге указано 10, далее 20 и так последовательно, для каждого ранга. Убийства набиваются, но все равно не работает
     
  9. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Ну так ты выведи в консоль убийства игрока и значение в конфиге - поймёшь в чём причина.
     
  10. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Можно без загадок? Как именно вывести
     
  11. mirrerror

    mirrerror Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    System.out.println();
    plugin.getLogger().info();
     
  12. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Я походу понял ошибку, но не точно. Плагин берёт все доступные значения kills из каждой секции и приравнивает их сразу все, вроде так. Но вопрос как сделать правильно
     
  13. Evolum

    Evolum Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Statistic;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;

    public class EventListener implements Listener {
    private FileConfiguration config;
    static String rank;

    @EventHandler
    public void onPlayerKill(PlayerDeathEvent event) {
    Player player = event.getEntity();
    Player killer = player.getKiller();
    // for (String m : Main.getInstance().getConfig().getConfigurationSection("ranks").getKeys(true)) {
    String m = (Получаешь ранг игрока)
    if (killer.getStatistic(Statistic.PLAYER_KILLS) == Main.getInstance().getConfig().getInt("ranks." + m + ".kills")) {
    killer.sendMessage(ChatColor.translateAlternateColorCodes('&', Main.getInstance().getConfig().getString("messages.up").replace("%rank%", rank)));
    Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), Main.getInstance().getConfig().getString("ranks." + m + ".reward"));
    Main.setRank(rank);
    }
    // }
    }
    }
     
  14. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Я немного изменил код и добавил дебаг, при первом выводит one, при втором выводит two
    ranks:
    one:
    prefix: "&6Первый"
    kills: 10
    reward: "eco give %player% 1000"
    two:
    prefix: "&6Второй"
    kills: 20
    reward: "eco give %player% 2000"
    Код:
    @EventHandler
        public void onPlayerDeath(PlayerDeathEvent event) {
            Player player = event.getEntity();
            Player killer = player.getKiller();
            if (killer != null) {
                for (String key : Main.getInstance().getConfig().getConfigurationSection("ranks").getKeys(false)) {
                    Bukkit.getLogger().info("Checking key: " + key);
                    if (killer.getStatistic(Statistic.PLAYER_KILLS) == Main.getInstance().getConfig().getInt("ranks." + key + ".kills")) {
                        killer.sendMessage(ChatColor.translateAlternateColorCodes('&', Main.getInstance().getConfig().getString("messages.up").replace("%rank%", rank)));
                        Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), Main.getInstance().getConfig().getString("ranks." + key + ".reward"));
                        Main.setRank(Main.getInstance().getConfig().getString("ranks." + key + ".prefix"));
                        Bukkit.getLogger().info("Action performed for key: " + key);
                        break;
                    }
                }
            }
        }
     
  15. Evolum

    Evolum Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Я тебе скинул сверху как нужно сделать, только останется метод реализовать получения ранга.
     
  16. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Да я делал уже, если конечно ты имел ввиду так, что String m = Main.getInstance().getConfig().getConfigurationSection("ranks").getKeys(false));
     
  17. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Это получение рангов из конфига, а Evolum пишет за получение ранга конкретного игрока.
     
  18. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Это я уже понял, но как я получу его, не понятно. Я не кодер, не особо понимаю как это работает
     
  19. Evolum

    Evolum Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Те нужно реализовать систему тогда самих рангов.
    1. Создаешь мапу (В которой будешь хранить активных игроков, те которые подключились к серверу)
    2. Пишешь отдельные методы сохранения/загрузки/получения рангов (Опираясь на мапу) (*Про мапу Рангов* хранишь по нику и твоему рангу (Это будет 2 String'a, больше захочешь конструктор создашь))
    3. При заходе игрока (Закидываешь в мапу игрока и его ранг (Если игрок впервые зашел на сервер, то default значения какие-то например. Ранг - "default")) Если же игрок есть в базе(Там где сохраняешь), то из нее получить и в мапу записать.
    4. И как раз реализуешь метод получения ранга. (map.getOrDefault(player.getName(), "default")); // map - твоя мапа с игроками и рангами.

    Если ты не поймешь, что я написал, то тогда лучше Java подучить.
     
  20. Автор темы
    DackZz2

    DackZz2 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    deni9078
    Абсолютно ничего не понял, но все равно спасибо.
     

Поделиться этой страницей