Помогите [РЕШЕНО] Как заполнить файл конфигурации координатами блоков?

Статус
Закрыто для дальнейших ответов.

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Вот у меня вот такой вид записи данных в файл конфига:
TeamSpawns:
<TeamName>:
x: <int>
y: <int>
z: <int>
yaw: <float>
pitch: <float>
world: <world>
Java:
c.set("TeamSpawns." + teamName + ".x", x);
        c.set("TeamSpawns." + teamName + ".y", y);
        c.set("TeamSpawns." + teamName + ".z", z);
        c.set("TeamSpawns." + teamName + ".yaw", yaw);
        c.set("TeamSpawns." + teamName + ".pitch", pitch);
        c.set("TeamSpawns." + teamName + ".world", world);
        plugin.saveFileTeamSpawns();
Сделал буквально за 5 минут с нуля (делал в первый раз).
Потребовалось записать в другой файл конфигурации координаты блока.

Java:
public void AddBlockToChecking(Player sender, org.bukkit.block.Block block) {
        int x, y, z;

        x = block.getX();
        y = block.getY();
        z = block.getZ();

        FileConfiguration c = plugin.FileCheckingBlocksConfig;
        plugin.reloadFileCheckingBlocks();

        String blockloc = Integer.toString(x) + ":" + (Integer.toString(y) + ":" + (Integer.toString(z)));
    
        //sender.sendMessage("CheckingBlocks." + block.getType() + ".summaXYZ" + blockloc); //для проверки

        if (c.contains("CheckingBlocks." + block.getType() + ".summaXYZ" + blockloc)) {
        
            sender.sendMessage(ChatColor.RED + "Указанный блок уже добавлен в проверку.");
        
        } else {
        
            c.set("CheckingBlocks." + block.getType() + ".loc", blockloc);
        
            plugin.saveFileCheckingBlocks();
            sender.sendMessage(ChatColor.GOLD + "Указанный блок добавлен в проверку.");
        }
    
    }
Не получается, столько вариантов перепробовал.
Просто при записи в файл и последующей проверки не находится совпадение (тип эти координаты вносятся постоянно). Я подозреваю это из-за c.set, но не знаю как добавлять, а не устанавливать.
Есть у кого пример записи в конфиг координат блоков?
 
Я подозреваю это из-за c.set, но не знаю как добавлять, а не устанавливать.
Если передано null, set удалит, во всех других случаях объект будет находиться в конфиге, несмотря на то, был он там или нет.
  1. FileConfiguration c = plugin.FileCheckingBlocksConfig;
  2. plugin.reloadFileCheckingBlocks();
Может быть в твоей логике они должны быть поменяны местами?
Перезагрузил (перечитал) — потом взял новый объект с новым содержимым.
 
В
Если передано null, set удалит, во всех других случаях объект будет находиться в конфиге, несмотря на то, был он там или нет.
  1. FileConfiguration c = plugin.FileCheckingBlocksConfig;
  2. plugin.reloadFileCheckingBlocks();
Может быть в твоей логике они должны быть поменяны местами?
Перезагрузил (перечитал) — потом взял новый объект с новым содержимым.
Сё работает прекрасно. http://joxi.ru/Q2K79OZs9Kj7l2
Что же тогда?
Давайте по другому, как записать координаты нужных мне блоков в файл конфига так, что бы я без проблем мог вытянуть любой, который потребуется?
 
Можно создать отдельный объект для хранения координат и зарегистрировать его в парсере конфига. после чего просто config.set("test", object); и Object object = config.get("test");
 
Можно создать отдельный объект для хранения координат и зарегистрировать его в парсере конфига. после чего просто config.set("test", object); и Object object = config.get("test");
Он уже есть - Location. Вполне таки парсится, емнип.
 
Можно создать отдельный объект для хранения координат и зарегистрировать его в парсере конфига. после чего просто config.set("test", object); и Object object = config.get("test");
Вы предлагаете записывать локацию в Object, а потом Object записывать в конфиг. Я вас правильно понял?
 
Тогда включу дурачка, и попрошу пожалуйсто дать пример кода, записывающий в конфиг координаты блока.
Много просишь.
Пример класса для сериализации. - http://www.programcreek.com/java-ap...r/src/main/java/be/Balor/Kit/KitInstance.java

Внести в список сериализируемых классов - org.bukkit.configuration.serialization.ConfigurationSerialization.registerClass(Your.class);
Вносить класс надо ДО загрузки конфига.

Ссылка на запрос гуглу - https://www.google.com/search?q=yaml+serialization+bukkit
 
Много просишь.
Пример класса для сериализации. - http://www.programcreek.com/java-ap...r/src/main/java/be/Balor/Kit/KitInstance.java

Внести в список сериализируемых классов - org.bukkit.configuration.serialization.ConfigurationSerialization.registerClass(Your.class);
Вносить класс надо ДО загрузки конфига.

Ссылка на запрос гуглу - https://www.google.com/search?q=yaml serialization bukkit
Не сталкивался я ранее с этой сериализацией. Буду читать и изучать. Спасибо за наводку. Надеюсь это поможет решить мою задачу.
Много просишь.
Ссылка на запрос гуглу - https://www.google.com/search?q=yaml serialization bukkit
Я вот смотрел пример который вы кинули, до сих пор понять не могу, это что то типо расширенной работы с конфиг файлами? Мне лично не понятно. =(
 
Не сталкивался я ранее с этой сериализацией. Буду читать и изучать. Спасибо за наводку. Надеюсь это поможет решить мою задачу.

Я вот смотрел пример который вы кинули, до сих пор понять не могу, это что то типо расширенной работы с конфиг файлами? Мне лично не понятно. =(
Окей.
Java:
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.serialization.ConfigurationSerializable;

/**
 * Исходный файл класса PlayerPosition
 * 
 * @author Dereku
 * @email [email protected]
 * @date 28.08.2016
 * @time 9:10:25
 * @version 1.0
 */
public class PlayerPosition implements ConfigurationSerializable {

    private final String world;
    private final double posX;
    private final double posY;
    private final double posZ;
    private final float pitch;
    private final float yaw;
   
    public PlayerPosition(Location loc) {
        this.world = loc.getWorld().getName();
        this.posX = loc.getX();
        this.posY = loc.getY();
        this.posZ = loc.getZ();
        this.pitch = loc.getPitch();
        this.yaw = loc.getYaw();
    }
   
    public PlayerPosition(Map<String, Object> args) {
        this.world = (String) args.get("world");
        this.posX = (double) args.get("posX");
        this.posY = (double) args.get("posY");
        this.posZ = (double) args.get("posZ");
        this.pitch = (float) args.get("pitch");
        this.yaw = (float) args.get("yaw");
    }
   
    public PlayerPosition(String world, double posX, double posY, double posZ, float yaw, float pitch) {
        this.world = world;
        this.posX = posX;
        this.posY = posY;
        this.posZ = posZ;
        this.pitch = pitch;
        this.yaw = yaw;
    }

    /**
     * @return the world
     */
    public World getWorld() {
        return Bukkit.getWorld(world);
    }

    /**
     * @return the posX
     */
    public double getPosX() {
        return posX;
    }

    /**
     * @return the posY
     */
    public double getPosY() {
        return posY;
    }

    /**
     * @return the posZ
     */
    public double getPosZ() {
        return posZ;
    }

    /**
     * @return the pitch
     */
    public float getPitch() {
        return pitch;
    }

    /**
     * @return the yaw
     */
    public float getYaw() {
        return yaw;
    }
   
    public Location toLocation() {
        return new Location(
                this.getWorld(), this.getPosX(), this.getPosY(), 
                this.getPosZ(), this.getYaw(), this.getPitch()
        );
    }
   
    @Override
    public Map<String, Object> serialize() {
        Map<String, Object> map = new HashMap<>();
        map.put("world", world);
        map.put("posX", posX);
        map.put("posY", posY);
        map.put("posZ", posZ);
        map.put("yaw", yaw);
        map.put("pitch", pitch);
        return map;
    }

    public static PlayerPosition deserialize(final Map<String, Object> args) {
        return new PlayerPosition(args);
    }
}

Но хочу ещё раз напомнить, что в конфиг можно передавать сам объект Location.
 
Окей.
Java:
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.serialization.ConfigurationSerializable;

/**
* Исходный файл класса PlayerPosition
*
* @author Dereku
* @email [email protected]
* @date 28.08.2016
* @time 9:10:25
* @version 1.0
*/
public class PlayerPosition implements ConfigurationSerializable {

    private final String world;
    private final double posX;
    private final double posY;
    private final double posZ;
    private final float pitch;
    private final float yaw;

    public PlayerPosition(Location loc) {
        this.world = loc.getWorld().getName();
        this.posX = loc.getX();
        this.posY = loc.getY();
        this.posZ = loc.getZ();
        this.pitch = loc.getPitch();
        this.yaw = loc.getYaw();
    }

    public PlayerPosition(Map<String, Object> args) {
        this.world = (String) args.get("world");
        this.posX = (double) args.get("posX");
        this.posY = (double) args.get("posY");
        this.posZ = (double) args.get("posZ");
        this.pitch = (float) args.get("pitch");
        this.yaw = (float) args.get("yaw");
    }

    public PlayerPosition(String world, double posX, double posY, double posZ, float yaw, float pitch) {
        this.world = world;
        this.posX = posX;
        this.posY = posY;
        this.posZ = posZ;
        this.pitch = pitch;
        this.yaw = yaw;
    }

    /**
     * @return the world
     */
    public World getWorld() {
        return Bukkit.getWorld(world);
    }

    /**
     * @return the posX
     */
    public double getPosX() {
        return posX;
    }

    /**
     * @return the posY
     */
    public double getPosY() {
        return posY;
    }

    /**
     * @return the posZ
     */
    public double getPosZ() {
        return posZ;
    }

    /**
     * @return the pitch
     */
    public float getPitch() {
        return pitch;
    }

    /**
     * @return the yaw
     */
    public float getYaw() {
        return yaw;
    }

    public Location toLocation() {
        return new Location(
                this.getWorld(), this.getPosX(), this.getPosY(),
                this.getPosZ(), this.getYaw(), this.getPitch()
        );
    }

    @Override
    public Map<String, Object> serialize() {
        Map<String, Object> map = new HashMap<>();
        map.put("world", world);
        map.put("posX", posX);
        map.put("posY", posY);
        map.put("posZ", posZ);
        map.put("yaw", yaw);
        map.put("pitch", pitch);
        return map;
    }

    public static PlayerPosition deserialize(final Map<String, Object> args) {
        return new PlayerPosition(args);
    }
}

Но хочу ещё раз напомнить, что в конфиг можно передавать сам объект Location.

Окей. По коду понятно, что в этом классе мы храним координаты.

Мы передаём на хранения координаты игрока (мне нужно передавать координаты блока, но думаю сути дела это не меняет).
Пользователь Jampire выше писал следующее:
Можно создать отдельный объект для хранения координат и зарегистрировать его в парсере конфига. после чего просто config.set("test", object); и Object object = config.get("test");

Он говорил о регистрации объекта в конфиге. Допустим я внёс его в конфиг способом выше. Но таких объектов у меня будет куча, как же мне сверять новоприбывшие данные блока, со всеми записями в конфиге?

Из этого у меня созревает вопрос, если "послать" нужные координаты на хранения я могу, то как мне узнать, были ли занесены данные, которые я хочу добавить на хранения уже ранее? Да и в случае, если мне нужно удалить их из хранилища, опять же, мне нужно получить нужный экземпляр (а там наверное отправить null на все точки, или есть другой вариант?) .
 
Мы передаём на хранения координаты игрока (мне нужно передавать координаты блока, но думаю сути дела это не меняет).
Можно спокойно изменить на координаты блока.
Пользователь Jampire выше писал следующее:
Можно создать отдельный объект для хранения координат и зарегистрировать его в парсере конфига. после чего просто config.set("test", object); и Object object = config.get("test");

Он говорил о регистрации объекта в конфиге. Допустим я внёс его в конфиг способом выше. Но таких объектов у меня будет куча, как же мне сверять новоприбывшие данные блока, со всеми записями в конфиге?
В данном случае в роли Object как раз таки выступает PlayerPosition (Можно использовать Location, т.к. он тоже сериализуется).
Как сверять - дописывай метод equals (для Location не нужно - он уже там есть). После уже проверяешь сей объект где хочешь.
 
Можно спокойно изменить на координаты блока.
В данном случае в роли Object как раз таки выступает PlayerPosition (Можно использовать Location, т.к. он тоже сериализуется).
Как сверять - дописывай метод equals (для Location не нужно - он уже там есть). После уже проверяешь сей объект где хочешь.
Хорошо, идём дальше. Из Вашего класса я убрал всё, что связано с Pitch и Yaw (у меня как бы блок, мне эти переменные не нужны).

Вот мой метод.
Java:
public void AddBlockToChecking(Player sender, org.bukkit.block.Block block) {

        //int x, y, z;
        //x = block.getX();
        //y = block.getY();
        //z = block.getZ();
     
        FileConfiguration c = plugin.testConfig;
        plugin.reloadtestConfig();

        BlockPosition blockPos = new BlockPosition(block.getLocation());
     
        c.set("path.to.blockloc", blockPos);

        plugin.savetestConfig();

    }

В файл конфига записывается следующее: http://joxi.ru/KAx9lykC4kw3Or
Извините меня, но что дальше? Как проверять если такой или нет, если есть, то как удалить?
Как записать ещё нужные координаты, если он каждый раз заменяет старые?
Я не понимаю как взаимодействовать с этим классом. Объясните...
 
Хорошо, идём дальше. Из Вашего класса я убрал всё, что связано с Pitch и Yaw (у меня как бы блок, мне эти переменные не нужны).

Вот мой метод.
Java:
public void AddBlockToChecking(Player sender, org.bukkit.block.Block block) {

        //int x, y, z;
        //x = block.getX();
        //y = block.getY();
        //z = block.getZ();
    
        FileConfiguration c = plugin.testConfig;
        plugin.reloadtestConfig();

        BlockPosition blockPos = new BlockPosition(block.getLocation());
    
        c.set("path.to.blockloc", blockPos);

        plugin.savetestConfig();

    }

В файл конфига записывается следующее: http://joxi.ru/KAx9lykC4kw3Or
Извините меня, но что дальше? Как проверять если такой или нет, если есть, то как удалить?
Как записать ещё нужные координаты, если он каждый раз заменяет старые?
Я не понимаю как взаимодействовать с этим классом. Объясните...
Ну так в чем проблема получить то корды? Bukkit.getWorld(c.get("path.to.blockloc.world").getBlockAt(c.get("path.to.blockloc.posX"), posY, posX) а дальше делать то что нужно?
 
Допустим я вытащу информацию о 1м блоке из конфига, но это всего лишь 1 блок. Что если там их будет 10-15 ?
Хотя я до сих пор не понял, как добавлять блоки больше одного, ибо c.set заменят уже существующий.
 
Java:
    ArrayList<Block> a = new ArrayList<Block>();
    @Override
    public void onEnable() {
        this.saveDefaultConfig();
        c = getConfig();
        for (String b : c.getConfigurationSection("blocks").getKeys(false)) {
            a.add(Bukkit.getWorld("blocks."+b+"world").getBlockAt(c.getInt("blocks."+b+"x"), c.getInt("blocks."+b+"y"), c.getInt("blocks."+b+"z")));
        }
    }
    private void addToList(Block b) {
        a.add(b);
    }
    public void onDisable() {
        for (String b : c.getConfigurationSection("blocks").getKeys(false)) {
            c.set("blocks."+b, null);
        }
        for (int i=0;i<a.size();i++) {
            Block b = a.get(i);
            String w = b.getWorld().getName();
            int x = b.getX();
            int y = b.getY();
            int z = b.getZ();
            c.set("blocks."+i+".world", w);
            c.set("blocks."+i+".x", x);
            c.set("blocks."+i+".y", y);
            c.set("blocks."+i+".z", z);
            saveConfig();
        }
    }
потом работай с ArrayList.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх