/* * Minecraft Forge * Copyright (c) 2016-2019. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package net.minecraftforge.fml.config; import com.electronwill.nightconfig.core.CommentedConfig; import com.electronwill.nightconfig.core.file.CommentedFileConfig; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.loading.StringUtils; import java.nio.file.Path; import java.util.concurrent.Callable; public class ModConfig { private final Type type; private final ForgeConfigSpec spec; private final String fileName; private final ModContainer container; private final ConfigFileTypeHandler configHandler; private CommentedConfig configData; private Callable saveHandler; public ModConfig(final Type type, final ForgeConfigSpec spec, final ModContainer container, final String fileName) { this.type = type; this.spec = spec; this.fileName = fileName; this.container = container; this.configHandler = ConfigFileTypeHandler.TOML; ConfigTracker.INSTANCE.trackConfig(this); } public ModConfig(final Type type, final ForgeConfigSpec spec, final ModContainer activeContainer) { this(type, spec, activeContainer, defaultConfigName(type, activeContainer.getModId())); } private static String defaultConfigName(Type type, String modId) { // config file name would be "forge-client.toml" and "forge-server.toml" return String.format("%s-%s.toml", modId, type.extension()); } public Type getType() { return type; } public String getFileName() { return fileName; } public ConfigFileTypeHandler getHandler() { return configHandler; } public ForgeConfigSpec getSpec() { return spec; } public String getModId() { return container.getModId(); } public CommentedConfig getConfigData() { return this.configData; } void setConfigData(final CommentedConfig configData) { this.configData = configData; this.spec.setConfig(this.configData); } void fireEvent(final ModConfigEvent configEvent) { this.container.dispatchConfigEvent(configEvent); } public void save() { ((CommentedFileConfig)this.configData).save(); } public Path getFullPath() { return ((CommentedFileConfig)this.configData).getNioPath(); } public enum Type { /** * Common mod config for configuration that needs to be loaded on both environments. * Loaded on both servers and clients. * Stored in the global config directory. * Not synced. * Suffix is "-common" by default. */ COMMON, /** * Client config is for configuration affecting the ONLY client state such as graphical options. * Only loaded on the client side. * Stored in the global config directory. * Not synced. * Suffix is "-client" by default. */ CLIENT, // /** // * Player type config is configuration that is associated with a player. // * Preferences around machine states, for example. // */ // PLAYER, /** * Server type config is configuration that is associated with a server instance. * Only loaded during server startup. * Stored in a server/save specific "serverconfig" directory. * Synced to clients during connection. * Suffix is "-server" by default. */ SERVER; public String extension() { return StringUtils.toLowerCase(name()); } } public static class ModConfigEvent extends Event { private final ModConfig config; ModConfigEvent(final ModConfig config) { this.config = config; } public ModConfig getConfig() { return config; } } public static class Loading extends ModConfigEvent { Loading(final ModConfig config) { super(config); } } public static class Reloading extends ModConfigEvent { Reloading(final ModConfig config) { super(config); } } }