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

Получить значения из "под уровня" конфига

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

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

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

    Баллы:
    76
    Всем привет!
    Извиняюсь за некорректное название темы.
    Суть в следующем: у меня есть конфиг такого вида
    Player1:
    --warp1:
    ----X:
    ----Y:
    ----Z:
    Player2:
    --warp2:
    ----X:
    ----Y:
    ----Z:
    Как из него получить названия варпов (warp(n)), чтобы потом сделать проверку на существование и прочее?
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Запиши их как list и все.
     
  3. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Если подразумевается лист названий, то мне это не особо подходит. Потому что мне нужно же ещё будет дать возможность игрокам телепортироваться на чужие варпы, так что опять же понадобится "поиск по уровням".
    На форуме видел, что для таких целей используют getKeys(). Примерно что этот метод делает я понял, но не могу интерпретировать под свои нужды.
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну юзай getKeys, тоже вариант.
     
  5. Tobiezz

    Tobiezz Активный участник

    Баллы:
    61
    С радостью бы использовал, но, как писал выше, мне нужен пример использования. Чтобы сделать метод, который бы получал определенные под уровни, которые не имеют конкретного названия (не warpName: warp1, а warp1: )
     
  6. GreenBoom

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

    Баллы:
    66
    Имя в Minecraft:
    _GreenBoom_
    Код:
    public static HashMap<Player, Warp> warps = new HashMap<Player, Warp>();
    

    Код:
    public class Warp {
    
        private static String name;
        private static Location loc;
    
        public Warp(String name, Location loc) {
            this.loc = loc;
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public Location getLoc() {
            return loc;
        }
    }
    
    Код:
    Main.warps.put(p, new Warp(arg[1], loc)); 
    Код:
     
    public static Location getWarp(String warpName) {
        for(Warp warp : Main.warps.values()) {
            if(warp.getName().equals(warpName)) {
                return warp.getLoc();
            }
        }
        return null;
    }
    

    При выключение сохраняю мапу
    При включении загружай ее (просто из конфига)
    Писал на скорую руку, возможно есть ошибки.
     
  7. Nikolai_Faint

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

    Баллы:
    96
    Зачем делать доп.объекты в куче? Обычной хеш-мапы в стиле Name->Location хватит.

    PHP:
    class WarpProvider {

      
    //Создаём переменные на стеке.
      
    private final File configuration;
      private final 
    HashMap <StringLocationwarpStorage;

      
    /**
       * WarpProvider - простой способ создавать и получать уже существующие варпы.
       *
       * @param input - Конфигурационный файл.
       **/

      
    public WarpProvider (File input) {

         
    //Инициализируем переменную конфигурации.
         
    configuration input;

         
    //Чтение с файла сам реализуешь. Я уже подзабыл Stream API.
         //Алсо тебе нужно будет реализовать "холодный запуск" для первого запуска.
         
    warpStorage todo;

      }

      
    /**
       * Добавить новый варп на сервер.
       *
       * @param name - Имя варпа. (Должно содержать только английские символы)
       * @param location - Валидная локация игрока. (Должна быть не меньше Y:0)
       * @return - Если имя и локация валидные то true.
       **/

      
    public bool add (String nameLocation location) {
       
        
    //Базовые проверки на валидность локации & стафф.
        
    if (location.getY () < -&& name.isNull ()) return false;
       
        
    //Добавляем варп в мапу & файл.
        
    warpStorage.put (namelocation);
      
        
    //Запись в файл сам реализуешь. Я уже подзабыл Stream API.
        
    return true;
      }

      
    /**
       * Получить локацию варпа.
       *
       * @param name - Имя варпа. (Должно содержать только английские символы)
       * @return - Локация варпа для текущего мира.
       **/
     
      
    public Location get (String name) {
          return 
    warpStorage.get (name);
      }

      
    /**
       * Получить хеш-мапу текущих варпов для сторонних манипуляций вне провайдера.
       **/

      
    public HashMap <StringLocationtoProvider () {
          return 
    warpStorage;
      }

     
    }
     
    Последнее редактирование: 20 ноя 2020
  8. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Вы не правильно поняли. У меня есть методы создания варпов, сохранения их в конфиг и некоторые проверки. Но мне нужно сделать метод, который бы получал эти варпы.
    Код:
    if(!new File(this.getDataFolder() + File.separator + "warps.yml").exists()){
                this.saveResource("warps.yml", false);
            }
            Main.fileWarps = new File(this.getDataFolder(), "warps.yml");
            Main.warps = YamlConfiguration.loadConfiguration(new File(this.getDataFolder() + File.separator+ "warps.yml"));
    
     public static FileConfiguration Warps(){
            return Main.warps;
        }
    
        public static void saveWarpConfig(){
            try {
               Warps().save(Main.fileWarps);
            }
            catch (IOException e){
                e.printStackTrace();
            }
        }
    Код:
     protected static void saveWarp( String nameWarp, String name, Location loc){
            Main.Warps().set(name + ".countOfWarps", getCountOfPlayerWarps(name) + 1);
            Main.Warps().set(name + "." + nameWarp + ".World", loc.getWorld().getName());
            Main.Warps().set(name + "." + nameWarp + ".X", loc.getX());
            Main.Warps().set(name + "." + nameWarp + ".Y", loc.getY());
            Main.Warps().set(name + "." + nameWarp + ".Z", loc.getZ());
            Main.Warps().set(name + "." + nameWarp + ".Yaw", loc.getYaw());
            Main.Warps().set(name + "." + nameWarp + ".Pitch", loc.getPitch());
            Main.Warps().set(name + "." + nameWarp + ".Private", true);
            Main.saveWarpConfig();
        }
    Код:
    if (args.length == 1){
                if (!warpUtils.hasPlayerInConfig(p)){
                warpUtils.saveFirstWarp(Main.warps, args[0], p.getName(), p.getLocation());
                p.sendMessage(Main.chat(doneColor) + this.plugin.getConfig().getString("warp-set-message") + Main.chat(infoColor) + args[0]);
                return true;
                }
    
                    warpUtils.saveWarp(args[0], p.getName(), p.getLocation());
                    p.sendMessage(Main.chat(doneColor) + this.plugin.getConfig().getString("warp-set-message") + Main.chat(infoColor) + args[0]);
                    return true;
    
            }
    Конфиг warps.yml выглядит так
    Код:
    Jack:
      countOfWarps: 3
      a:
        World: world
        X: 98.37047400076422
        Y: 87
        Z: 252.4881103455045
        Yaw: 15.017872
        Pitch: 18.819237
        Private: true
      b:
        World: world
        X: 99.37613971383941
        Y: 87
        Z: 248.9753931603597
        Yaw: 16.84817
        Pitch: 18.772308
        Private: true
      c:
        World: world
        X: 100.06067051608015
        Y: 87
        Z: 246.70943067902357
        Yaw: 16.84817
        Pitch: 18.772308
        Private: true
    
    И мне нужно, когда игрок (не Jack), когда писал /warp a, то вызывался метод, который бы получал подстроку 2-ого уровня из игрока Jack. Простите мою безграмотность в этом деле.
     
  9. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Я бы мог сделать команду /warp Jack a, было бы проще, т.к. args[0] содержит раздел, в котором искать этот a, но это не удобно конечному пользователю. Отсюда я и хочу сделать метод, который бы искал варпы с названиями в подуровнях, словно строк с именами владельцев и их счётчиками нет.
     
  10. deadanykey

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

    Баллы:
    96
    for (String key: тут_не_помню_что.getKeys(false)) {
    // key теперь содержит имя игрока

    for (String warp_name: тут_не_помню_что(key).getKeys(false)) {
    if (warp_name.equalsIgnoreCase("countOfWarps")) { // Если это не счётчик
    какая_нибудь_коллекция.add(warp_name); // Запихиваем имя варпа в коллекцию.
    }
    }
    }
     
  11. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Зачем это? countOfWarps содержит целое число, оно нужно для ограничения на количество варпов игрокам с разными пермами. Или вы подразумевали игнор этой строки в конфиге?
    Список варпов?
     
  12. deadanykey

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

    Баллы:
    96
    1. Да, его будем пропускать. Вам же варпы нужны?
    2. Это как пример. warp_name - имя варпа. Что потом с этим делать, решайте сами.
     
  13. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Понял. Попробую что-то сварганить. Спасибо
     
  14. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Не было возможности испытать ваш метод в тот же день. Пока что нужного результата не добился, но может вы найдёте в чём косяк.
    Код:
    for (String key : Main.Warps().getKeys(false)){
                    for (String warpName : Main.Warps().getConfigurationSection(key).getKeys(false)){
                        if (warpName == arg){
                            Location warp = warpUtils.getWarp(warpName);
                            p.teleport(warp);
                            p.sendMessage("Телепортирован");
                            return true;
                        }
                    }
                }
    Warps() возвращает конфиг с варпами. getWarp() возвращает координаты варпа из конфига. arg - аргумент команды warp
     
  15. deadanykey

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

    Баллы:
    96
    String не сравнивается знаком "==". Нужно использовать warpName.equalsIgnoreCase(arg).

    Кстати, в моём примере именно так и указано.
     
  16. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Ну да, чуток запамятовал. Однако вместо телепортации появляется ошибка "An internal error occurred while attempting to perform this command"
     
  17. deadanykey

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

    Баллы:
    96
    Консоль что говорит в этот момент?
     
  18. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Много чего
     

    Вложения:

  19. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Это происходит именно в случае, если был найден варп с таким названием. В противном случае (пока не предусмотрено) ничего не происходит и ошибок нет.
     
  20. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Мир не может быть пустым.
     

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