- Версия(и) Minecraft
- 1.12.x
Предыстория
Я захотел создать свой конфиг, чтобы игроки могли изменять характеристики у предметов, механизмов и т.д.. Всё получилось, но вот проблема, изменять конфиг можно было только в самом файле конфига, а в игре, кнопка Config была неактивна. (как много слова конфиг)
На форуме я не нашёл туториала по этой теме, поэтому после того как я разобрался в этой теме я и решил написать данный тутор, для будущих поколений так сказать.
Сам тутор
Начнём с прочтения Перевод - Аннотации конфигурации
После создаём класс Configs(название на ваш выбор)
@Config(modid = ExampleMod.MODID) - здесь мы объявляем что данный конфиг именно для нашего мода
P.s. Вы так же можете указать name для файла конфигурации
@Mod.EventBusSubscriber(modid = ExampleMod.MODID) - облегчаем себе жизнь
Дальше тутор можно разделить на две части:
Конец
Надеюсь мой туториал поможет хоть кому-то)
Я захотел создать свой конфиг, чтобы игроки могли изменять характеристики у предметов, механизмов и т.д.. Всё получилось, но вот проблема, изменять конфиг можно было только в самом файле конфига, а в игре, кнопка 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);
}
}
}
Допустим у нас есть такой конструктор предмета (Взято с учебника)
Перейдём в регистрацию (Взято с учебника)
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);
}
}
Конфиг с категориями немного отличается в реализации и в использовании.
В категории можно добавлять ещё и ещё категорий.
В категории можно добавлять ещё и ещё категорий.
Добавим в 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";
}
Позволим игроку самому менять описание предмета
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);
}
}
Конец
Надеюсь мой туториал поможет хоть кому-то)
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);
}
}
}