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

  • Автор темы Автор темы ToBlEzZ
  • Дата начала Дата начала

ToBlEzZ

Активный участник
Пользователь
Баллы
76
Всем привет!
Извиняюсь за некорректное название темы.
Суть в следующем: у меня есть конфиг такого вида
Player1:
--warp1:
----X:
----Y:
----Z:
Player2:
--warp2:
----X:
----Y:
----Z:
Как из него получить названия варпов (warp(n)), чтобы потом сделать проверку на существование и прочее?
 
Запиши их как list и все.
Если подразумевается лист названий, то мне это не особо подходит. Потому что мне нужно же ещё будет дать возможность игрокам телепортироваться на чужие варпы, так что опять же понадобится "поиск по уровням".
На форуме видел, что для таких целей используют getKeys(). Примерно что этот метод делает я понял, но не могу интерпретировать под свои нужды.
 
Если подразумевается лист названий, то мне это не особо подходит. Потому что мне нужно же ещё будет дать возможность игрокам телепортироваться на чужие варпы, так что опять же понадобится "поиск по уровням".
На форуме видел, что для таких целей используют getKeys(). Примерно что этот метод делает я понял, но не могу интерпретировать под свои нужды.
Ну юзай getKeys, тоже вариант.
 
Ну юзай getKeys, тоже вариант
С радостью бы использовал, но, как писал выше, мне нужен пример использования. Чтобы сделать метод, который бы получал определенные под уровни, которые не имеют конкретного названия (не warpName: warp1, а warp1: )
 
Код:
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;
}

При выключение сохраняю мапу
При включении загружай ее (просто из конфига)
Писал на скорую руку, возможно есть ошибки.
 
Код:
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;
}

При выключение сохраняю мапу
При включении загружай ее (просто из конфига)
Писал на скорую руку, возможно есть ошибки.
Зачем делать доп.объекты в куче? Обычной хеш-мапы в стиле Name->Location хватит.

PHP:
class WarpProvider {

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

  /**
   * 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 name, Location location) {
   
    //Базовые проверки на валидность локации & стафф.
    if (location.getY () < -1 && name.isNull ()) return false;
   
    //Добавляем варп в мапу & файл.
    warpStorage.put (name, location);
  
    //Запись в файл сам реализуешь. Я уже подзабыл Stream API.
    return true;
  }

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

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

  public HashMap <String, Location> toProvider () {
      return warpStorage;
  }

 
}
 
Последнее редактирование:
Вы не правильно поняли. У меня есть методы создания варпов, сохранения их в конфиг и некоторые проверки. Но мне нужно сделать метод, который бы получал эти варпы.
Код:
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. Простите мою безграмотность в этом деле.
 
Я бы мог сделать команду /warp Jack a, было бы проще, т.к. args[0] содержит раздел, в котором искать этот a, но это не удобно конечному пользователю. Отсюда я и хочу сделать метод, который бы искал варпы с названиями в подуровнях, словно строк с именами владельцев и их счётчиками нет.
 
for (String key: тут_не_помню_что.getKeys(false)) {
// key теперь содержит имя игрока

for (String warp_name: тут_не_помню_что(key).getKeys(false)) {
if (warp_name.equalsIgnoreCase("countOfWarps")) { // Если это не счётчик
какая_нибудь_коллекция.add(warp_name); // Запихиваем имя варпа в коллекцию.
}
}
}
 
warp_name.equalsIgnoreCase("countOfWarps")
Зачем это? countOfWarps содержит целое число, оно нужно для ограничения на количество варпов игрокам с разными пермами. Или вы подразумевали игнор этой строки в конфиге?
какая_нибудь_коллекция.add(warp_name); // Запихиваем имя варпа в коллекцию.
Список варпов?
 
1. Да, его будем пропускать. Вам же варпы нужны?
2. Это как пример. warp_name - имя варпа. Что потом с этим делать, решайте сами.
 
for (String key: тут_не_помню_что.getKeys(false)) {
// key теперь содержит имя игрока

for (String warp_name: тут_не_помню_что(key).getKeys(false)) {
if (warp_name.equalsIgnoreCase("countOfWarps")) { // Если это не счётчик
какая_нибудь_коллекция.add(warp_name); // Запихиваем имя варпа в коллекцию.
}
}
}
Не было возможности испытать ваш метод в тот же день. Пока что нужного результата не добился, но может вы найдёте в чём косяк.
Код:
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
 
Не было возможности испытать ваш метод в тот же день. Пока что нужного результата не добился, но может вы найдёте в чём косяк.
Код:
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

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

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

Кстати, в моём примере именно так и указано.
Ну да, чуток запамятовал. Однако вместо телепортации появляется ошибка "An internal error occurred while attempting to perform this command"
 
Назад
Верх