Внутриигровое изменение конфига

Внутриигровое изменение конфига

Версия(и) Minecraft
1.12.x
Предыстория
Я захотел создать свой конфиг, чтобы игроки могли изменять характеристики у предметов, механизмов и т.д.. Всё получилось, но вот проблема, изменять конфиг можно было только в самом файле конфига, а в игре, кнопка Config была неактивна. (как много слова конфиг)
На форуме я не нашёл туториала по этой теме, поэтому после того как я разобрался в этой теме я и решил написать данный тутор, для будущих поколений так сказать.

Сам тутор
Начнём с прочтения Перевод - Аннотации конфигурации

После создаём класс Configs(название на ваш выбор)
Configs:
package com.example.examplemod;

import net.minecraftforge.common.config.Config;
import net.minecraftforge.fml.common.Mod;

@Config(modid = ExampleMod.MODID) // Данная аннотация отвечает за создание гуи конфига
@Mod.EventBusSubscriber(modid = ExampleMod.MODID)
public class Configs {

    // Данное событие нужно для того, чтобы все значения которые были изменены в игре, перезаписывались в самом конфиг файле
    @SubscribeEvent
    public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) {
        if (event.getModID().equals(ExampleMod.MODID)) {
            ConfigManager.sync(ExampleMod.MODID, Config.Type.INSTANCE);
        }
    }
}

@Config(modid = ExampleMod.MODID) - здесь мы объявляем что данный конфиг именно для нашего мода
P.s. Вы так же можете указать name для файла конфигурации @Config(modid = ExampleMod.MODID, name = "exampleCFG"), если name не указан, файл получит название такое же, как modid который вы указали.

@Mod.EventBusSubscriber(modid = ExampleMod.MODID) - облегчаем себе жизнь

Дальше тутор можно разделить на две части:
Добавим пункт, например int значения
Configs:
package com.example.examplemod;

import net.minecraftforge.common.config.Config;
import net.minecraftforge.common.config.ConfigManager;
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Config(modid = ExampleMod.MODID)
@Mod.EventBusSubscriber(modid = ExampleMod.MODID)
public class Configs {
    @Config.LangKey(ExampleMod.MODID + ".cfg.item1_maxstack") // Локализированное имя пункта (Если не будет указано, пункт будет именть название переменной)
    @Config.Comment("How many maximum items will be in the stack") // Описание которое выводится при наведении на пункт
    @Config.RangeInt(min = 1, max = 64) // Ограничиваем игрока в значениях
    @Config.RequiresMcRestart // Говорим, чтобы изменения вступили в силу, нужно перезапустить майнкрафт
    public static int item1_maxstack = 64;

    // Данное событие нужно для того, чтобы все значения которые были изменены в игре, перезаписывались в самом конфиг файле
    @SubscribeEvent
    public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) {
        if (event.getModID().equals(ExampleMod.MODID)) {
            ConfigManager.sync(ExampleMod.MODID, Config.Type.INSTANCE);
        }
    }
}
Заходим в игру и видим заветную кнопку Config
1616232419415.png

В Config видим наш локализованный пункт
UVuUB3E0.png
и всё, что мы указывали в аннотациях
1616233150460.png
Допустим у нас есть такой конструктор предмета (Взято с учебника)
ItemList:
package com.example.examplemod.item;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;

public class ItemList extends Item {
    public ItemList(String name, int setMaxStack, CreativeTabs setTab) { // второй аргумент отвечает за максимальный стак
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setCreativeTab(setTab);
        this.setMaxStackSize(setMaxStack);
    }
}
Перейдём в регистрацию (Взято с учебника)
ItemsRegistry:
package com.example.examplemod.misc.registr;

import com.example.examplemod.Configs;
import com.example.examplemod.ExampleMod;
import com.example.examplemod.item.ItemList;
import com.example.examplemod.misc.tabs.TabsList;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

@GameRegistry.ObjectHolder(ExampleMod.MODID)
@Mod.EventBusSubscriber
public class ItemsRegistry {
    @GameRegistry.ObjectHolder("key")
    public static final Item KEY = null;

    @SubscribeEvent
    public static void onRegistryItem(RegistryEvent.Register<Item> e) {
        e.getRegistry().register(new ItemList("key", Configs.item1_maxstack, TabsList.EXtabs)); // Во втором аргументе мы используем значение которое берём из конфига
    }

    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public static void onRegistryModel(ModelRegistryEvent e) {
        registryModel(KEY);
    }

    @SideOnly(Side.CLIENT)
    private static void registryModel(Item item) {
        final ResourceLocation regName = item.getRegistryName();
        final ModelResourceLocation mrl = new ModelResourceLocation(regName, "inventory");
        ModelBakery.registerItemVariants(item, mrl);
        ModelLoader.setCustomModelResourceLocation(item, 0, mrl);
    }
}
В конфиге выставлено значение 64В конфиге выставлено значение 25
Конфиг с категориями немного отличается в реализации и в использовании.
В категории можно добавлять ещё и ещё категорий.
Добавим в Configs:
@Config.LangKey(ExampleMod.MODID + ".cfg.sub.other") // Локализированное имя категории (Если не будет указано, пункт будет именть название переменной)
    @Config.Comment("Here you can change item description") // Описание которое выводится при наведении на категорию
    public static OtherSettings OtherSettings = new OtherSettings(); // Создаём категорию

    public static class OtherSettings {
        @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other.item1_description") // Локализированное имя пункта (Если не будет указано, пункт будет именть название переменной)
        public String item1_description = "Default description";

        @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other.item1_description2_status")
        public boolean item1_statusdecription2 = false;

        @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other.item1_description2") // Локализированное имя пункта (Если не будет указано, пункт будет именть название переменной)
        public String item1_description2 = "Secret description";
    }
1616235384448.png
1616235404038.png
Позволим игроку самому менять описание предмета
ItemList:
package com.example.examplemod.item;

import com.example.examplemod.Configs;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

import javax.annotation.Nullable;
import java.util.List;

public class ItemList extends Item {
    public ItemList(String name, int setMaxStack, CreativeTabs setTab) {
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setCreativeTab(setTab);
        this.setMaxStackSize(setMaxStack);
    }

    @Override
    public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
        tooltip.add(Configs.OtherSettings.item1_description);
        if(Configs.OtherSettings.item1_statusdecription2)
            tooltip.add(Configs.OtherSettings.item1_description2);
    }
}
1616235571375.png

Конец
Надеюсь мой туториал поможет хоть кому-то)

Configs:
package com.example.examplemod;

import net.minecraftforge.common.config.Config;
import net.minecraftforge.common.config.ConfigManager;
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Config(modid = ExampleMod.MODID)
@Mod.EventBusSubscriber(modid = ExampleMod.MODID)
public class Configs {
    @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other") // Локализированное имя категории (Если не будет указано, пункт будет именть название переменной)
    @Config.Comment("Here you can change item description") // Описание которое выводится при наведении на категорию
    public static OtherSettings OtherSettings = new OtherSettings(); // Создаём категорию

    public static class OtherSettings {
        @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other.item1_description") // Локализированное имя пункта (Если не будет указано, пункт будет именть название переменной)
        public String item1_description = "Default description";

        @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other.item1_description2_status")
        public boolean item1_statusdecription2 = false;

        @Config.LangKey(ExampleMod.MODID + ".cfg.sub.other.item1_description2") // Локализированное имя пункта (Если не будет указано, пункт будет именть название переменной)
        public String item1_description2 = "Secret description";
    }

    @Config.LangKey(ExampleMod.MODID + ".cfg.item1_maxstack") // Локализированное имя пункта (Если не будет указано, пункт будет именть название переменной)
    @Config.Comment("How many maximum items will be in the stack") // Описание которое выводится при наведении на пункт
    @Config.RangeInt(min = 1, max = 64) // Ограничиваем игрока в значениях
    @Config.RequiresMcRestart // Говорим, чтобы изменения вступили в силу, нужно перезапустить майнкрафт
    public static int item1_maxstack = 64;

    // Данное событие нужно для того, чтобы все значения которые были изменены в игре, перезаписывались в самом конфиг файле
    @SubscribeEvent
    public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) {
        if (event.getModID().equals(ExampleMod.MODID)) {
            ConfigManager.sync(ExampleMod.MODID, Config.Type.INSTANCE);
        }
    }
}
  • 1616235152806.png
    1616235152806.png
    7.5 KB · Просмотры: 233
  • Like
Реакции: AidenFox и hohserg
Автор
N0kergui
Просмотры
2,633
Первый выпуск
Обновление
Оценка
5.00 звёзд 3 оценок

Последние рецензии

Даже в самых крутых модах такого нету
Достаточно полезная статья. Аннотации куда проще :) Давно пора отказаться от старого-доброго Configuration
Сверху