Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

Статус темы:
Закрыта.
  1. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Вот у меня вот такой вид записи данных в файл конфига:
    TeamSpawns:
    <TeamName>:
    x: <int>
    y: <int>
    z: <int>
    yaw: <float>
    pitch: <float>
    world: <world>
    Код:
    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 минут с нуля (делал в первый раз).
    Потребовалось записать в другой файл конфигурации координаты блока.

    Код:
    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, но не знаю как добавлять, а не устанавливать.
    Есть у кого пример записи в конфиг координат блоков?
     
  2. Хостинг MineCraft
    <
  3. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Если передано null, set удалит, во всех других случаях объект будет находиться в конфиге, несмотря на то, был он там или нет.
    1. FileConfiguration c = plugin.FileCheckingBlocksConfig;
    2. plugin.reloadFileCheckingBlocks();
    Может быть в твоей логике они должны быть поменяны местами?
    Перезагрузил (перечитал) — потом взял новый объект с новым содержимым.
     
  4. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    В
    Сё работает прекрасно. http://joxi.ru/Q2K79OZs9Kj7l2
    Что же тогда?[DOUBLEPOST=1472122535,1472050324][/DOUBLEPOST]Давайте по другому, как записать координаты нужных мне блоков в файл конфига так, что бы я без проблем мог вытянуть любой, который потребуется?
     
  5. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Можно создать отдельный объект для хранения координат и зарегистрировать его в парсере конфига. после чего просто config.set("test", object); и Object object = config.get("test");
     
  6. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Он уже есть - Location. Вполне таки парсится, емнип.
     
  7. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    как минимум до 1.8 Location не зареган в конфиге
     
  8. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Вы предлагаете записывать локацию в Object, а потом Object записывать в конфиг. Я вас правильно понял?
     
  9. _MediaNik_

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

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Location уже унаследовало Object..
     
  10. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Тогда включу дурачка, и попрошу пожалуйсто дать пример кода, записывающий в конфиг координаты блока.
     
  11. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Много просишь.
    Пример класса для сериализации. - 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
     
  12. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Не сталкивался я ранее с этой сериализацией. Буду читать и изучать. Спасибо за наводку. Надеюсь это поможет решить мою задачу.[DOUBLEPOST=1472322504,1472319861][/DOUBLEPOST]
    Я вот смотрел пример который вы кинули, до сих пор понять не могу, это что то типо расширенной работы с конфиг файлами? Мне лично не понятно. =(
     
  13. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Окей.
    Код:
    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 dereku@default.im
     * @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.
     
  14. Автор темы
    Exception_Prototype

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

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

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

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

    Из этого у меня созревает вопрос, если "послать" нужные координаты на хранения я могу, то как мне узнать, были ли занесены данные, которые я хочу добавить на хранения уже ранее? Да и в случае, если мне нужно удалить их из хранилища, опять же, мне нужно получить нужный экземпляр (а там наверное отправить null на все точки, или есть другой вариант?) .
     
  15. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Можно спокойно изменить на координаты блока.
    В данном случае в роли Object как раз таки выступает PlayerPosition (Можно использовать Location, т.к. он тоже сериализуется).
    Как сверять - дописывай метод equals (для Location не нужно - он уже там есть). После уже проверяешь сей объект где хочешь.
     
  16. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Хорошо, идём дальше. Из Вашего класса я убрал всё, что связано с Pitch и Yaw (у меня как бы блок, мне эти переменные не нужны).

    Вот мой метод.
    Код:
    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
    Извините меня, но что дальше? Как проверять если такой или нет, если есть, то как удалить?
    Как записать ещё нужные координаты, если он каждый раз заменяет старые?
    Я не понимаю как взаимодействовать с этим классом. Объясните...
     
  17. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Ну так в чем проблема получить то корды? Bukkit.getWorld(c.get("path.to.blockloc.world").getBlockAt(c.get("path.to.blockloc.posX"), posY, posX) а дальше делать то что нужно?
     
  18. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Что так что так жалуется, мол так нельзя и так нельзя.
    http://joxi.ru/zANV9x3IlDxv5A
     
  19. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    getString*
    getInt*
     
  20. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Допустим я вытащу информацию о 1м блоке из конфига, но это всего лишь 1 блок. Что если там их будет 10-15 ?
    Хотя я до сих пор не понял, как добавлять блоки больше одного, ибо c.set заменят уже существующий.
     
  21. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
        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.
     
Статус темы:
Закрыта.

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