Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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);
            }
        }
    }
}
 
Во-первых у тебя ошибка будет возникать, если киллер - null, Допиши проверку. После player,
if(player.getKiller() != null) {
for () {
}
}
У тебя ключи не перебираются как тебе нужно, getKeys(true) поменяй на getKeys(false)
 
Во-первых у тебя ошибка будет возникать, если киллер - null, Допиши проверку. После player,
if(player.getKiller() != null) {
for () {
}
}
У тебя ключи не перебираются как тебе нужно, getKeys(true) поменяй на getKeys(false)
Ошибок пока не возникает, просто не работает функционал выдачи ранга при достижении каждого уровня киллов. Насчёт getKeys(false), оно так стояло, не работало, я поменял на тру в надежде
 
Ошибок пока не возникает, просто не работает функционал выдачи ранга при достижении каждого уровня киллов. Насчёт getKeys(false), оно так стояло, не работало, я поменял на тру в надежде
дебаж каждую строку и поставь обратно false.
 
Ошибок пока не возникает, просто не работает функционал выдачи ранга при достижении каждого уровня киллов. Насчёт getKeys(false), оно так стояло, не работало, я поменял на тру в надежде
Ошибка возникнет, если игрок умрет от падения с высоты, например. (Конешно как только у тебя будет рабочий кфг/код (Где у тебя ошибка), дальше сам увидишь ошибку)
 
Ошибка возникнет, если игрок умрет от падения с высоты, например. (Конешно как только у тебя будет рабочий кфг/код (Где у тебя ошибка), дальше сам увидишь ошибку)
я поменял геткейс на фалс, добавил проверку 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);
именно в общем не выполняются
 
я поменял геткейс на фалс, добавил проверку 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);
именно в общем не выполняются
Если не выполняется, значит у тебя это условие false:
Код:
if (killer.getStatistic(Statistic.PLAYER_KILLS) == Main.getInstance().getConfig().getInt("ranks." + m + ".kills")) {
Дебаж почему.
 
Если не выполняется, значит у тебя это условие false:
Код:
if (killer.getStatistic(Statistic.PLAYER_KILLS) == Main.getInstance().getConfig().getInt("ranks." + m + ".kills")) {
Дебаж почему.
В конфиге указано 10, далее 20 и так последовательно, для каждого ранга. Убийства набиваются, но все равно не работает
 
В конфиге указано 10, далее 20 и так последовательно, для каждого ранга. Убийства набиваются, но все равно не работает
Ну так ты выведи в консоль убийства игрока и значение в конфиге - поймёшь в чём причина.
 
Ну так ты выведи в консоль убийства игрока и значение в конфиге - поймёшь в чём причина.
Я походу понял ошибку, но не точно. Плагин берёт все доступные значения kills из каждой секции и приравнивает их сразу все, вроде так. Но вопрос как сделать правильно
 
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);
}
// }
}
}
 
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);
}
// }
}
}
Я немного изменил код и добавил дебаг, при первом выводит 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;
                }
            }
        }
    }
 
Я немного изменил код и добавил дебаг, при первом выводит 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;
                }
            }
        }
    }
Я тебе скинул сверху как нужно сделать, только останется метод реализовать получения ранга.
 
Я тебе скинул сверху как нужно сделать, только останется метод реализовать получения ранга.
Да я делал уже, если конечно ты имел ввиду так, что String m = Main.getInstance().getConfig().getConfigurationSection("ranks").getKeys(false));
 
Да я делал уже, если конечно ты имел ввиду так, что String m = Main.getInstance().getConfig().getConfigurationSection("ranks").getKeys(false));
Это получение рангов из конфига, а Evolum пишет за получение ранга конкретного игрока.
 
Это получение рангов из конфига, а Evolum пишет за получение ранга конкретного игрока.
Это я уже понял, но как я получу его, не понятно. Я не кодер, не особо понимаю как это работает
 
Это я уже понял, но как я получу его, не понятно. Я не кодер, не особо понимаю как это работает
Те нужно реализовать систему тогда самих рангов.
1. Создаешь мапу (В которой будешь хранить активных игроков, те которые подключились к серверу)
2. Пишешь отдельные методы сохранения/загрузки/получения рангов (Опираясь на мапу) (*Про мапу Рангов* хранишь по нику и твоему рангу (Это будет 2 String'a, больше захочешь конструктор создашь))
3. При заходе игрока (Закидываешь в мапу игрока и его ранг (Если игрок впервые зашел на сервер, то default значения какие-то например. Ранг - "default")) Если же игрок есть в базе(Там где сохраняешь), то из нее получить и в мапу записать.
4. И как раз реализуешь метод получения ранга. (map.getOrDefault(player.getName(), "default")); // map - твоя мапа с игроками и рангами.

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

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

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

Назад
Верх