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

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

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

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

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

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

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

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

    Лист:
    Код:
    public static ArrayList<String> WLWorlds = new ArrayList<>();
    Код дефолт конфига:
    Код:
    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("====================================================");
            }
        }
    }
    Проверка на миры:
    Код:
                if (!this.ml.WLWorlds.contains(p.getWorld().getName())) {
                    return;
                }
     
  2. Хостинг MineCraft
    <
  3. Reality_SC

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

    Баллы:
    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 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    А как тогда без методов-то?[DOUBLEPOST=1471280331][/DOUBLEPOST]
    Код:
    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 Старожил Пользователь

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

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

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

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    А не надо его там получать. Вообще нигде не пиши static.
    Лучше создавай инстанс класса, который делает рецепты в главном классе и передавай this через конструктор.
    Поясню.
    Код:
    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);
        }
    
    }
    Код:
    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-ов даже никаких не надо...
     
    Последнее редактирование: 15 авг 2016
  8. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Вот так?
    Код:
    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() {}
    }
    Код:
    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 Старожил Пользователь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Я же говорю, что там я храню хешы и листы:
    Код:
    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<>();
    }
    
    
    
     
    Последнее редактирование: 16 авг 2016
  17. Reality_SC

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

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

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

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

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

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Не работают крафты. Вот сам код с крафтами:
    Код:
    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 Старожил Пользователь

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

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

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