[1.7 | Build 1147+][Туториал]Как сделать конфиг с гуи

771
5
Ну наконец-то, еще одна фишка, достояная внимания! 
Закотите рукава и приготовтесь к какому-то сумашествию, у нас теперь есть конфиг с гуи! 
Это работает как в 1.7.2 (Build 1147), так и в 1.7.10 (Build 1146). 
С его помощью вы сможете настроить свой мод прям внутри Minecraft! 
Теперь не нужно копаться в текстовых файлах!
Это займет достаточно много времени на создание, но поверьте мне, это не трудно.
Что же это такое?
Чтобы получить представление о том, что мы собираемся делать, запустите среду разработки(Eclipse или интеллидж) с последней версией фордж, щелкните на кнопку Mods в главном меню, затем выберите Forge Mod Loader и нажмите кнопку Config - это своего рода конфигурация GUI, которую мы собираемся создавать сегодня. 
Вы можете получить более продвинутые (открыть конфигурационный графический интерфейс для MinecraftForge, например), но я не собираюсь здесь это описывать, чтобы узреть более сложные вещи - вы можете просматривать исходные файлы сами.

Конфиг файл:
Я не буду рассказывать, как работает обычный конфиг, потому что вы и так это знаете =) 
Просто убедитесь, что у вас есть файл конфигурации и убедитесь, что он инициализируется во время стадии PreInit. 
Существует один нюанс: 
Вы должны иметь публичную статическую переменную своего конфига. 
Вот так должен выглядеть ваш код:

Код:
package your_package;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.common.config.Configuration;

@Mod(modid = "testmod", name = "Test Mod", version = "1.0")
public class TestMod {
    
    public static Configuration configFile;
    
    @Mod.Instance("testmod")
    public static TestMod instance;

    public static int myConfigInteger = 32;
    public static String myConfigString = "Hello!";
    public static boolean myConfigBool = false;

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        configFile = new Configuration(event.getSuggestedConfigurationFile());

        syncConfig();
    }

    public static void syncConfig() {
        myConfigInteger = configFile.getInt("My Config Integer", Configuration.CATEGORY_GENERAL, myConfigInteger, 0, Integer.MAX_VALUE, "An Integer!");
        myConfigString = configFile.getString("My Config String", Configuration.CATEGORY_GENERAL, myConfigString, "A String!");
        myConfigBool = configFile.getBoolean("My Config Bool", Configuration.CATEGORY_GENERAL, myConfigBool, "A Boolean!");

        if(configFile.hasChanged())
            configFile.save();
    }

}

Как вы можете видеть, у нас есть три значения (Integer, String и Boolean), которые мы будем загружать с нашего конфигурационного файла. 
Вы можете заметить, что я поместил загрузочные данные конфигурации в отдельный метод.
Это сделано для того, чтобы не писать много раз одно и тоже, так как там это понадобится в будущем.
Обнаружения при изменении конфига:
Итак, как мы узнаем, когда наши данные конфигурации были изменены в игре? 
С помощью ивентов, конечно же! 
Сначала нужно зарегистрировать наш ивент, это делается так:
FMLCommonHandler.instance().bus().register(instance);
Далее напишем сам ивент:
Код:
@SubscribeEvent
public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event){
    if(event.modID.equals("testmod")){
        syncConfig();
    }
}
Здесь мы просто проверяем, что если изменения в конфиге произошли в нашем моде - то синхронизировать их.
Обработчик GUI:
Теперь нам нужно создать обработчик GUI. 
Это то, что отвечает за открытие нашего конфиг GUI, это так же легко настроить. 
Также нужно измененить вашу @Mod аннотацию, что мы сделаем потом. 
Создайте новый класс и реализуйте(implements) в нем IModGuiFactory интерфейс:
Код:
package your_package;

import cpw.mods.fml.client.IModGuiFactory;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;

import java.util.Set;

public class TestModGuiFactory implements IModGuiFactory {
    @Override
    public void initialize(Minecraft minecraftInstance) {

    }

    @Override
    public Class<? extends GuiScreen> mainConfigGuiClass() {
        return TestModConfigGUI.class;
    }

    @Override
    public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() {
        return null;
    }

    @Override
    public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) {
        return null;
    }
}
Единственный метод, о котором мы должны волноваться - это mainConfigGuiClass().
Остальное на не нужно, так как оно еще не доделано и не несет никакого смысла.
Метод mainConfigGuiClass() возвращает класс, который мы собираемся использовать для нашего основного конфига GUI(достаточно просто, не так ли?). 
Теперь, когда мы сделали это, перейдите к скоей @Mod аннотации и добавьте туда параметр:



Код:
guiFactory = "your_package.TestModGuiFactory"
Создаем конфиг GUI:
Пришло время для создания самого гуи! 
Предупреждение: Это будет очень легко! =) 
Наш класс конфиг GUI нужно только наследовать от класса GuiConfig, и мы просто передадим в конструктор некоторые вещи, чтобы он знал, из какой категории брать информацию (примечание: Если вы хотите использовать несколько категорий, смотрите реализацию класса Forge GUI выше):
Код:
package your_package;

import cpw.mods.fml.client.config.GuiConfig;
import net.minecraft.client.gui.GuiScreen;
import net.minecraftforge.common.config.ConfigElement;
import net.minecraftforge.common.config.Configuration;

public class TestModConfigGUI extends GuiConfig {
    public TestModConfigGUI(GuiScreen parent) {
        super(parent,
                new ConfigElement(TestMod.configFile.getCategory(Configuration.CATEGORY_GENERAL)).getChildElements(),
                "TestMod", false, false, GuiConfig.getAbridgedConfigPath(TestMod.configFile.toString()));
    }
}
После того как вы сделали это, компилируйте, запускайте и изменять конфигурацию вашего мода сколько душе угодно! ^-^

Оригинальная статься на английском:
Тык.
 

Nao

138
3
Найс :) Давно было интересно, как это в коде (хоть мне и не требовалось пока). Спасибо!
А в заголовок хорошо бы вынести [1.7+], чтобы не надеялись попусту :D
 
Подчеркивает
Код:
ConfigElement(TestMod.configFile.getCategory(Configuration.CATEGORY_GENERAL)).getChildElements(),
                "TestMod", false, false, GuiConfig.getAbridgedConfigPath(TestMod.configFile.toString()));
, говорит что данные аргументы не могут быть применены к GuiScreen.  все изменил под себя, естественно.
решено, наследовал не тот класс.
 
771
5
Перенесите в туториалы, полезно же.
P.S Прочитав у Вани в группе, что делаешь конфиг с гуи, сразу понял, что по "моему" тутору :D
 

Nao

138
3
Majestic, задам вопрос около темы (друг параллельно ты и эту штуку попробовать успел). :)
Как сделать рабочей клавишу "Disable" в меню "Mods" для своего мода? :3
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
В @Mod найди параметр.
Отловить нажатие по ней - есть FMLЧто-то-тамEvent, но он не вызывается ибо этого еще не сделали разрабы.
 

Nao

138
3
anti344, печалька. Но всё равно спасибо.

Ещё есть вопрос (уже по теме): как легально несколько категорий из конфига добавить? Слить всё в один List я уже пробовал - работает, но лицо ощущает легкий ветерок велосипедной прогулки.
 

Nao

138
3
Majestic, в TestModConfigGUI юзаем конструктор родителя:

Код:
super(parent, new ConfigElement(
TestMod.configFile.getCategory(Configuration.CATEGORY_GENERAL)).getChildElements()


Если использовать Configuration.CATEGORY_GENERAL то он не выдаст параметров из категорий, созданных мной. А у меня их три и все надо вывести.

В итоге я вывожу вот так:
Код:
public class ConfigurationGUI extends GuiConfig
{
    public ConfigurationGUI(GuiScreen parent)
    {
        super(parent, getAllCategory(), ModInfo.MOD_ID, false, true, GuiConfig.getAbridgedConfigPath(SoulkeeperCore.config.toString()));
        this.title = "Soulkeeper Core Configuration";
    }
    
    static List<IConfigElement> configElementList;
    
    static List<IConfigElement> getAllCategory()
    {
        if(configElementList == null)
        {
            configElementList = new ConfigElement(SoulkeeperCore.config.getCategory("common settings")).getChildElements();
            configElementList.addAll(new ConfigElement(SoulkeeperCore.config.getCategory("generate settings")).getChildElements());
            configElementList.addAll(new ConfigElement(SoulkeeperCore.config.getCategory("visual settings")).getChildElements());
        }
        
        return configElementList;
    }
    
}
 
Измените ссылку на исходный туториал, того сайта больше нет)
http://web.archive.org/web/20141107060005/http://minalien.com/minecraft-forge-feature-spotlight-config-guis
 
344
1
47
Интересненько)
 
5,018
47
783
Извините, тутор лажа. Не работает ничего. В Mods, если выбрать мой мод, даже кнопок не появляется
 
5,018
47
783
Конфиг окей, работает. Вот гуи-конфиг не работает, если вы не поняли. Я честно все по тутору сделал
 

timaxa007

Модератор
5,831
409
672
В Mods, если выбрать мой мод, даже кнопок не появляется
Обязательно нужен "mcmod.info" для этого мода. (Ага, ответил через много времени, пока сам не столкнулся с этой проблемой и сам решил её.)
 
Сверху