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

Помогите Конфиг на "один раз"

Discussion in 'Разработка плагинов для новичков' started by Lisenochek, Aug 15, 2016.

Thread Status:
Not open for further replies.
  1. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    Сделал я проверку на мир, если он есть в списке - функционал плагина работает, но эта проверка работает только один раз, а именно:

    1) Я удаляю каталог плагина.
    2) Плагин создает заново каталог с конфигами.
    3) Все работает!
    4) Перезагружаю сервер.
    5) Уже не работает.

    Решается все обычным удалением каталога, но мне это не надо. Помогите мне пожалуйста.

    Лист:
    Code:
    public static ArrayList<String> WLWorlds = new ArrayList<>();
    Код дефолт конфига:
    Code:
    package com.realistic.config;
    
    import java.io.File;
    
    import com.realistic.api.API;
    import com.realistic.list.MinecraftList;
    
    public class configMain {
    
        private static MinecraftList ml;
    
        public configMain(MinecraftList ml) {
            this.ml = ml;
        }
    
        public static void configSet() {
    
            File config = new File(API.plugin.getDataFolder() + File.separator + "config.yml");
    
            if (!config.exists()) {
                System.out.println("====================================================");
                System.out.println("[Realistic file loader] File config.yml not found. Creating new file");
                System.out.println("====================================================");
               
                ml.WLWorlds.addAll(API.plugin.getConfig().getStringList("whitelist_worlds"));
                API.plugin.saveDefaultConfig();
            }
           
            if(config.exists()) {
                System.out.println("====================================================");
                System.out.println("[Realistic loading] Success loading config.yml");
                System.out.println("====================================================");
            }
        }
    }
    Проверка на миры:
    Code:
                if (!this.ml.WLWorlds.contains(p.getWorld().getName())) {
                    return;
                }
     
  2. Хостинг MineCraft
    <
  3. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Удали, удали их от греха подальше.

    upload_2016-8-16_0-2-34.png

    Это не связано с вопросом, но может быть и связано, я даже не хочу разбираться.[DOUBLEPOST=1471280131,1471279949][/DOUBLEPOST]Замени + File.separator + на ,
    Не используй exist(), используй более конкретные isFile() или isDirectory().

    Ладно, жги сюда ещё код API и главного класса, попробую разгавнобраться.
     
  4. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    А как тогда без методов-то?[DOUBLEPOST=1471280331][/DOUBLEPOST]
    Code:
    package com.realistic.api;
    
    import org.bukkit.Bukkit;
    import org.bukkit.event.Listener;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import com.realistic.config.configMain;
    import com.realistic.config.configMessage;
    import com.realistic.events.Events;
    import com.realistic.timers.Blood_Effect;
    import com.realistic.timers.Blooding;
    import com.realistic.timers.Broken_Bones_Messages;
    import com.realistic.timers.Cold;
    import com.realistic.timers.Disease_Cold;
    import com.realistic.timers.Disease_Pneumonia;
    import com.realistic.timers.Spawn_Crate;
    import com.realistic.timers.Spawn_Crate_Particles;
    
    public class API extends JavaPlugin implements Listener {
    
        // Инстансы классов
    
        public static API plugin;
       
        private ItemList il;
        private BlockList bl;
        private configMessage cm;
        private configMain cMain;
    
        public void onEnable() {
           
            plugin = this;
    
            this.bl = new BlockList();
            this.il = new ItemList();
            this.cm = new configMessage();
           
            configMain.configSet();
            Items_Recipes.recipe_Bandage();
            Items_Recipes.recipe_Infusion();
            Items_Recipes.recipe_Planks();
            Items_Recipes.recipe_Splint();
           
            Bukkit.getPluginManager().registerEvents(new Events(this), this);
    
            Bukkit.getScheduler().runTaskTimer(this, new Blood_Effect(this), 1, 1);
            Bukkit.getScheduler().runTaskTimer(this, new Spawn_Crate_Particles(this), 1, 1);
            Bukkit.getScheduler().runTaskTimer(this, new Spawn_Crate(this), 2500, 2500);
            Bukkit.getScheduler().runTaskTimer(this, new Blooding(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Broken_Bones_Messages(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Disease_Cold(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Disease_Pneumonia(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Cold(this), 200, 200);
    
            getCommand("realistic").setExecutor(new CommandAPI());
            getCommand("realistic-guide").setExecutor(new CommandAPI());
            getCommand("realistic-help").setExecutor(new CommandAPI());
            getCommand("realistic-items").setExecutor(new CommandAPI());
            getCommand("realistic-spawncrate").setExecutor(new CommandAPI());
        }
    
        public void onDisable() {}
    }
     
  5. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Я зачеркнул static, так-то.
    Значит, по коду:
    • Режем эту строку целиком.
      upload_2016-8-16_0-12-40.png
      А вместе с ней и plugin = this;
    • saveDefaultConfig(); вполне можно перенести в самое начало onEnable.
    • Ну и в общем-то у тебя логика такова: если нет файла config.yml то ты из него добавляешь список миров в ml (его код?), а потом сохраняешь конфиг по умолчанию; а если он есть -- не делаешь ничего.
      Бредятина какая-то ))
    Я понимаю, что ты в соседних темах спрашивал помощи и рассказывал что ты хочешь, можно ещё раз с самого начал и внятно? С кодом MinectaftList.
     
  6. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    Там хеши и листы, а this = plugin не работают крафты в другом классе. С помощью public static API plugin я получаю инстанс ГК.
     
  7. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    А не надо его там получать. Вообще нигде не пиши static.
    Лучше создавай инстанс класса, который делает рецепты в главном классе и передавай this через конструктор.
    Поясню.
    Code:
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class ShitPlugin extends JavaPlugin {
    
        public final ConfigManager config = new ConfigManager(this);
        public final MinecraftList ml = new MinecraftList(this);
    
        @Override
        public void onLoad() {
        }
    
        @Override
        public void onEnable() {
            config.onEnable();
        }
    
        @Override
        public void onDisable() {
            getServer().getServicesManager().unregisterAll(this);
            getServer().getScheduler().cancelTasks(this);
        }
    
    }
    Code:
    public class ConfigManager {
    
        private final ShitPlugin plugin;
    
        public ConfigManager(ShitPlugin main) {
            this.plugin = main;
        }
    
        public void onEnable() {
            plugin.saveDefaultConfig();
    
            FileConfiguration config = plugin.getConfig();
            List<String> worlds = config.getStringList("whitelist_worlds");
            plugin.ml.WLWorlds.addAll(worlds);
        }
    
    }
    И никаких static. Сейчас допишу тебе дальше.

    Блин, тебе и if-ов даже никаких не надо...
     
    Last edited: Aug 15, 2016
  8. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    Вот так?
    Code:
    package com.realistic.api;
    
    import org.bukkit.Bukkit;
    import org.bukkit.event.Listener;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import com.realistic.config.configMain;
    import com.realistic.config.configMessage;
    import com.realistic.events.Events;
    import com.realistic.list.MinecraftList;
    import com.realistic.timers.Blood_Effect;
    import com.realistic.timers.Blooding;
    import com.realistic.timers.Broken_Bones_Messages;
    import com.realistic.timers.Cold;
    import com.realistic.timers.Disease_Cold;
    import com.realistic.timers.Disease_Pneumonia;
    import com.realistic.timers.Spawn_Crate;
    import com.realistic.timers.Spawn_Crate_Particles;
    
    public class API extends JavaPlugin implements Listener {
       
        public final configMain config = new configMain(this);
        public final MinecraftList ml = new MinecraftList(this);
    
        public static API plugin;
        private ItemList il;
        private BlockList bl;
        private configMessage cm;
        private configMain cMain;
    
        public void onEnable() {
           
            plugin = this;
    
            this.bl = new BlockList();
            this.il = new ItemList();
            this.cm = new configMessage();
       
            config.onEnable();
            Items_Recipes.recipe_Bandage();
            Items_Recipes.recipe_Infusion();
            Items_Recipes.recipe_Planks();
            Items_Recipes.recipe_Splint();
           
            Bukkit.getPluginManager().registerEvents(new Events(this), this);
    
            Bukkit.getScheduler().runTaskTimer(this, new Blood_Effect(this), 1, 1);
            Bukkit.getScheduler().runTaskTimer(this, new Spawn_Crate_Particles(this), 1, 1);
            Bukkit.getScheduler().runTaskTimer(this, new Spawn_Crate(this), 2500, 2500);
            Bukkit.getScheduler().runTaskTimer(this, new Blooding(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Broken_Bones_Messages(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Disease_Cold(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Disease_Pneumonia(this), 200, 200);
            Bukkit.getScheduler().runTaskTimer(this, new Cold(this), 200, 200);
    
            getCommand("realistic").setExecutor(new CommandAPI());
            getCommand("realistic-guide").setExecutor(new CommandAPI());
            getCommand("realistic-help").setExecutor(new CommandAPI());
            getCommand("realistic-items").setExecutor(new CommandAPI());
            getCommand("realistic-spawncrate").setExecutor(new CommandAPI());
        }
    
        public void onDisable() {}
    }
    Code:
    package com.realistic.config;
    
    import java.util.List;
    
    import org.bukkit.configuration.file.FileConfiguration;
    
    import com.realistic.api.API;
    
    public class configMain {
        
        private final API plugin;
        public configMain(API main) {
            this.plugin = main;
        }
        public void onEnable() {
            plugin.saveDefaultConfig();
            FileConfiguration config = plugin.getConfig();
            List<String> worlds = config.getStringList("whitelist_worlds");
            plugin.ml.WLWorlds.addAll(worlds);
        }
    }
     
  9. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Проверяй. И раз последовал совету и передаёшь plugin в ml конструктором, можно убрать
    upload_2016-8-16_1-11-56.png
     
  10. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    А в крафтах как тогда указать ГК? Ведь я удалил инстанс, а конструктором что-то не выходит.
     
  11. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Что сложного сделать по аналогии с конфигом?!?
    Всё, меня нет до завтра.
     
  12. Pihanya

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

    Trophy Points:
    61
    Skype:
    pihanya
    Имя в Minecraft:
    Pihanya
    Желаю скорейшей смерти тем, кто что-то имеет против статиков и думает, что они вызывают какие-то непонятно откуда берущиеся ошибки. Аминь
     
  13. Dymeth

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

    Trophy Points:
    76
    Присоединяюсь к человеку выше. Тоже не понимаю, чем он не угодил @Reality_SC...
    Не потребуется передавать никакие instanc'ы, можно без лишних действий использовать функционал в сторонних плагинах. Если понимать, как работает static, то и никаких ошибок не бывает.
     
  14. Larin

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

    Trophy Points:
    103
    2 чая, услышали от пары олдфагов такую вещь и везде пихают.
    Но код реальное дерьмо.
     
  15. Pihanya

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

    Trophy Points:
    61
    Skype:
    pihanya
    Имя в Minecraft:
    Pihanya
    В статиках в основном происходят ошибки у тех, кто не особо понимают суть статика либо не знают что такое инициализация, и под ошибками, как правило, понимается лишь исключение - всем известный NullPointerException. На счет памяти могу сказать, что статик поля занимают ничуть не больше места, чем не статик. Статик для того и создан, чтобы разработчикам было удобнее взаимодействовать с полями объекта, которые не требуют обязательной инициализации оного. Наши же гении пытаются наоборот усложнить весь этот процесс, создавая лишние instanc'ы и решая вопрос где же их хранить.

    По поводу данной проблемы. Прошу автора показать как и в какой последовательности вызываются методы configMain и configSet, и было бы неплохо если бы вы также выложили содержимое класса MinecraftList. Будем пытаться решить вашу проблему.
     
  16. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    Я же говорю, что там я храню хешы и листы:
    Code:
    package com.realistic.list;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import org.bukkit.Material;
    
    import com.realistic.api.API;
    
    public class MinecraftList {
    
        private API plugin;
       
        public MinecraftList(API plugin) {
            this.plugin = plugin;
        }
    
        public static HashMap<Material, String> blocks = new HashMap<Material, String>();
        public static HashMap<Material, String> tools = new HashMap<Material, String>();
        public static HashMap<String, Boolean> bloodingPlayers = new HashMap<String, Boolean>();
        public static HashMap<String, Boolean> Disease_Cold = new HashMap<String, Boolean>();
        public static HashMap<String, Boolean> Disease_Pneumonia = new HashMap<String, Boolean>();
        public static HashMap<String, Boolean> Broken_Bones = new HashMap<String, Boolean>();
    
        public static ArrayList<String> WLWorlds = new ArrayList<>();
    }
    
    
    
     
    Last edited: Aug 16, 2016
  17. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Нельзя присоединиться, потому что вы противоречите друг другу.
    Человек либо понимает, как использовать статики, либо не понимает.
    Человек либо их использует, либо нет.
    Если использует, и не понимает — это не есть хорошая практика, потому что те, кто понимают — знают, какие неуловимые (опять же на первый взгляд) ошибки можно с ними словить.

    Я нигде не утверждал, что у ТСа ошибка в том, что он использует статики, и ошибку я ему выше даже исправил, по крайней мере в тех кусках кода, которые он привёл, но дополнительно хотелось бы, чтобы ТС начал использовать чуть более лучшие практики написания кода и не попадал в такие ситуации, когда форумчанам опять придётся ему искать и исправлять ошибки.
     
  18. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    Возможно. что ты прав. Я пытался сделать инстанс в крафтах по аналогии с конфигом, но получал краш.
     
  19. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Ладно, раз в крафтах ничего и только хешкарты, пусть там всё будет статик, убедили.
    В чем сейчас неработоспособность?
    Можешь скинуть мне исходник в ЛС, чтобы я попробовал разобраться сам?
     
  20. Автор темы
    Lisenochek

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

    Trophy Points:
    76
    Имя в Minecraft:
    Lisenochek
    Не работают крафты. Вот сам код с крафтами:
    Code:
    package com.realistic.api;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.inventory.ShapedRecipe;
    import org.bukkit.plugin.Plugin;
    
    public class Items_Recipes {
       
        private static API plugin;
       
        public Items_Recipes(API plugin) {
            this.plugin = plugin;
        }
    
        public static void recipe_Planks() {
    
            // Крафт гнилого материала
            ShapedRecipe planksRecipe = new ShapedRecipe(Items_Meta.planks);
            planksRecipe.shape("@@", "@@");
            planksRecipe.setIngredient('@', Items_Meta.stick.getData());
           
            plugin.getServer().addRecipe(planksRecipe);
        }
    
        public static void recipe_Bandage() {
    
            // Крафт бинта
            ShapedRecipe bandageRecipe = new ShapedRecipe(Items_Meta.bandage);
            bandageRecipe.shape("@@", "@@");
            bandageRecipe.setIngredient('@', Material.PAPER);
            Bukkit.getServer().addRecipe(bandageRecipe);
    
            plugin.getServer().addRecipe(bandageRecipe);
        }
    
        public static void recipe_Splint() {
    
            // Крафт шины
            ShapedRecipe splintRecipe = new ShapedRecipe(Items_Meta.splint);
            splintRecipe.shape("@/", "@/");
            splintRecipe.setIngredient('/', Material.STICK);
            splintRecipe.setIngredient('@', Material.PAPER);
    
            plugin.getServer().addRecipe(splintRecipe);
        }
    
        public static void recipe_Infusion() {
           
            // Крафт цветочного отвара
            ShapedRecipe infusionRecipe = new ShapedRecipe(Items_Meta.infusion);
            infusionRecipe.shape("@#", "!/");
            infusionRecipe.setIngredient('@', Material.YELLOW_FLOWER);
            infusionRecipe.setIngredient('!', Material.YELLOW_FLOWER);
            infusionRecipe.setIngredient('#', Material.YELLOW_FLOWER);
    
            infusionRecipe.setIngredient('/', Material.BOWL);
    
            plugin.getServer().addRecipe(infusionRecipe);
        }
    }
    
     
  21. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    То есть в консоль ничего не выскакивает, никаких исключений?
    Плагин грузится, включается и просто ничего не делает?
    При этом в config.yml у тебя заполнен список миров (например):
    Code:
    whitelist_worlds:
    - world
    и ты находишься в мире из этого списка (например, world), правильно?

    Ты прописал / [не потёр случайно] в момент включения плагина и чтения конфига добавление миров из конфига в твой ml.WLWorlds.addAll(worlds); ?
     
Thread Status:
Not open for further replies.

Share This Page