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

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

Lisenochek

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

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

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

Лист:
JavaScript:
public static ArrayList<String> WLWorlds = new ArrayList<>();

Код дефолт конфига:
JavaScript:
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("====================================================");
        }
    }
}

Проверка на миры:
JavaScript:
            if (!this.ml.WLWorlds.contains(p.getWorld().getName())) {
                return;
            }
 
Удали, удали их от греха подальше.

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

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

Ладно, жги сюда ещё код API и главного класса, попробую разгавнобраться.
 
Удали, удали их от греха подальше.

Посмотреть вложение 42541

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

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

А как тогда без методов-то?
JavaScript:
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() {}
}
 
А как тогда без методов-то?
Я зачеркнул static, так-то.
Значит, по коду:
  • Режем эту строку целиком.
    upload_2016-8-16_0-12-40.png
    А вместе с ней и plugin = this;
  • saveDefaultConfig(); вполне можно перенести в самое начало onEnable.
  • Ну и в общем-то у тебя логика такова: если нет файла config.yml то ты из него добавляешь список миров в ml (его код?), а потом сохраняешь конфиг по умолчанию; а если он есть -- не делаешь ничего.
    Бредятина какая-то ))
Я понимаю, что ты в соседних темах спрашивал помощи и рассказывал что ты хочешь, можно ещё раз с самого начал и внятно? С кодом MinectaftList.
 
Я зачеркнул static, так-то.
Значит, по коду:
  • Режем эту строку целиком.
    Посмотреть вложение 42542
    А вместе с ней и plugin = this;
  • saveDefaultConfig(); вполне можно перенести в самое начало onEnable.
  • Ну и в общем-то у тебя логика такова: если нет файла config.yml то ты из него добавляешь список миров в ml (его код?), а потом сохраняешь конфиг по умолчанию; а если он есть -- не делаешь ничего.
    Бредятина какая-то ))
Я понимаю, что ты в соседних темах спрашивал помощи и рассказывал что ты хочешь, можно ещё раз с самого начал и внятно? С кодом MinectaftList.

Там хеши и листы, а this = plugin не работают крафты в другом классе. С помощью public static API plugin я получаю инстанс ГК.
 
А не надо его там получать. Вообще нигде не пиши static.
Лучше создавай инстанс класса, который делает рецепты в главном классе и передавай this через конструктор.
Поясню.
Java:
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);
    }

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

}
Java:
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-ов даже никаких не надо...

Вот так?
JavaScript:
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() {}
}

JavaScript:
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);
    }
}
 
Проверяй. И раз последовал совету и передаёшь plugin в ml конструктором, можно убрать
upload_2016-8-16_1-11-56.png
 
Желаю скорейшей смерти тем, кто что-то имеет против статиков и думает, что они вызывают какие-то непонятно откуда берущиеся ошибки. Аминь
 
Присоединяюсь к человеку выше. Тоже не понимаю, чем он не угодил @Reality_SC...
Не потребуется передавать никакие instanc'ы, можно без лишних действий использовать функционал в сторонних плагинах. Если понимать, как работает static, то и никаких ошибок не бывает.
 
Желаю скорейшей смерти тем, кто что-то имеет против статиков и думает, что они вызывают какие-то непонятно откуда берущиеся ошибки. Аминь
2 чая, услышали от пары олдфагов такую вещь и везде пихают.
Но код реальное дерьмо.
 
В статиках в основном происходят ошибки у тех, кто не особо понимают суть статика либо не знают что такое инициализация, и под ошибками, как правило, понимается лишь исключение - всем известный NullPointerException. На счет памяти могу сказать, что статик поля занимают ничуть не больше места, чем не статик. Статик для того и создан, чтобы разработчикам было удобнее взаимодействовать с полями объекта, которые не требуют обязательной инициализации оного. Наши же гении пытаются наоборот усложнить весь этот процесс, создавая лишние instanc'ы и решая вопрос где же их хранить.

По поводу данной проблемы. Прошу автора показать как и в какой последовательности вызываются методы configMain и configSet, и было бы неплохо если бы вы также выложили содержимое класса MinecraftList. Будем пытаться решить вашу проблему.
 
В статиках в основном происходят ошибки у тех, кто не особо понимают суть статика либо не знают что такое инициализация, и под ошибками, как правило, понимается лишь исключение - всем известный NullPointerException. На счет памяти могу сказать, что статик поля занимают ничуть не больше места, чем не статик. Статик для того и создан, чтобы разработчикам было удобнее взаимодействовать с полями объекта, которые не требуют обязательной инициализации оного. Наши же гении пытаются наоборот усложнить весь этот процесс, создавая лишние instanc'ы и решая вопрос где же их хранить.

По поводу данной проблемы. Прошу автора показать как и в какой последовательности вызываются методы configMain и configSet, и было бы неплохо если бы вы также выложили содержимое класса MinecraftList. Будем пытаться решить вашу проблему.
Я же говорю, что там я храню хешы и листы:
JavaScript:
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<>();
}
 
Последнее редактирование:
думает, что они вызывают какие-то непонятно откуда берущиеся ошибки
Если понимать, как работает static, то и никаких ошибок не бывает.
Нельзя присоединиться, потому что вы противоречите друг другу.
Человек либо понимает, как использовать статики, либо не понимает.
Человек либо их использует, либо нет.
Если использует, и не понимает — это не есть хорошая практика, потому что те, кто понимают — знают, какие неуловимые (опять же на первый взгляд) ошибки можно с ними словить.

Я нигде не утверждал, что у ТСа ошибка в том, что он использует статики, и ошибку я ему выше даже исправил, по крайней мере в тех кусках кода, которые он привёл, но дополнительно хотелось бы, чтобы ТС начал использовать чуть более лучшие практики написания кода и не попадал в такие ситуации, когда форумчанам опять придётся ему искать и исправлять ошибки.
 
Нельзя присоединиться, потому что вы противоречите друг другу.
Человек либо понимает, как использовать статики, либо не понимает.
Человек либо их использует, либо нет.
Если использует, и не понимает — это не есть хорошая практика, потому что те, кто понимают — знают, какие неуловимые (опять же на первый взгляд) ошибки можно с ними словить.

Я нигде не утверждал, что у ТСа ошибка в том, что он использует статики, и ошибку я ему выше даже исправил, по крайней мере в тех кусках кода, которые он привёл, но дополнительно хотелось бы, чтобы ТС начал использовать чуть более лучшие практики написания кода и не попадал в такие ситуации, когда форумчанам опять придётся ему искать и исправлять ошибки.
Возможно. что ты прав. Я пытался сделать инстанс в крафтах по аналогии с конфигом, но получал краш.
 
Ладно, раз в крафтах ничего и только хешкарты, пусть там всё будет статик, убедили.
В чем сейчас неработоспособность?
Можешь скинуть мне исходник в ЛС, чтобы я попробовал разобраться сам?
 
Ладно, раз в крафтах ничего и только хешкарты, пусть там всё будет статик, убедили.
В чем сейчас неработоспособность?
Можешь скинуть мне исходник в ЛС, чтобы я попробовал разобраться сам?
Не работают крафты. Вот сам код с крафтами:
JavaScript:
package com.realistic.api;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.*********ventory.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);
    }
}
 
Не работают крафты. Вот сам код с крафтами:
То есть в консоль ничего не выскакивает, никаких исключений?
Плагин грузится, включается и просто ничего не делает?
При этом в config.yml у тебя заполнен список миров (например):
YAML:
whitelist_worlds:
- world
и ты находишься в мире из этого списка (например, world), правильно?

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