package codechicken.nei.config;
import codechicken.lib.config.ConfigTag;
import codechicken.nei.config.GuiOptionList.OptionScrollSlot;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import java.util.List;
public abstract class Option {
public static void playClickSound() {
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F));
}
public OptionScrollSlot slot;
public String namespace = null;
public final String name;
public OptionList parent;
public Option(String name) {
this.name = name;
}
public String fullName() {
return namespaced(name);
}
public String configName() {
return fullName().substring(configBase().fullName().length() + 1);
}
public String namespaced(String name) {
return namespace == null ? name : (namespace + "." + name);
}
public String translateN(String s, Object... args) {
return StatCollector.translateToLocalFormatted(namespaced(s), args);
}
public int getHeight() {
return 20;
}
private <T> T assertParentOverride(T elem) {
if (elem == null) {
throw new IllegalStateException("Option " + fullName() + " does not have a defined parent list. Use OptionList.setOptionList to insert a parent");
}
return elem;
}
public ConfigSet globalConfigSet() {
return assertParentOverride(parent.globalConfigSet());
}
public ConfigSet worldConfigSet() {
return assertParentOverride(parent.worldConfigSet());
}
public OptionList configBase() {
return assertParentOverride(parent.configBase());
}
/**
* @return true if the world config contains a tag with this name
*/
public boolean worldSpecific() {
return worldSpecific(configName());
}
/**
* @return true if the world config contains a tag with this name
*/
public boolean worldSpecific(String s) {
ConfigTag tag = worldConfigSet().config.getTag(s, false);
return tag != null && tag.value != null;
}
/**
* @return The currently config set for the gui based on the world/global button
*/
public ConfigSet configSet() {
return worldConfig() ? worldConfigSet() : globalConfigSet();
}
/**
* @return The tag to render, world if world override, otherwise global
*/
public ConfigTag renderTag() {
return renderTag(configName());
}
/**
* @return The tag to render, world if world override, otherwise global
*/
public ConfigTag renderTag(String s) {
return (worldConfig() && worldSpecific(s) ? worldConfigSet() : globalConfigSet()).config.getTag(s);
}
/**
* @return The tag with this name from the current configSet
*/
public ConfigTag getTag() {
return getTag(configName());
}
/**
* @return The tag with this name from the current configSet
*/
public ConfigTag getTag(String s) {
return configSet().config.getTag(s);
}
/**
* @return The tag currently being used ingame, world if a world override exists, otherwise global
*/
public ConfigTag activeTag() {
return activeTag(configName());
}
/**
* @return The tag currently being used ingame, world if a world override exists, otherwise global
*/
public ConfigTag activeTag(String s) {
return (worldSpecific() ? worldConfigSet() : globalConfigSet()).config.getTag(s);
}
/**
* @return true if the gui is in world config mode
*/
public boolean worldConfig() {
return slot.getGui().worldConfig();
}
/**
* @return true if in world mode, but this tag has no world override. Changes should not be made in this mode
*/
public boolean defaulting() {
return defaulting(configName());
}
/**
* @return true if in world mode, but this tag has no world override. Changes should not be made in this mode
*/
public boolean defaulting(String s) {
return worldConfig() && !worldSpecific(s);
}
/**
* Called when world specific is disabled for this option. Should delete all world specific overrides
*/
public void useGlobals() {
useGlobal(configName());
}
/**
* Deletes a specific named tag from the worldConfig
*/
public void useGlobal(String s) {
if (worldConfig()) {
worldConfigSet().config.removeTag(s);
}
}
/**
* Called when world specific is activated for this option. Should copy the global value into a world specific override
*/
public void copyGlobals() {
copyGlobal(configName(), true);
}
/**
* Copies the global value into a world specific override
*/
public void copyGlobal(String s) {
copyGlobal(s, false);
}
public void copyGlobal(String s, boolean recursive) {
if (!worldConfig()) {
return;
}
ConfigTag tag = globalConfigSet().config.getTag(s);
worldConfigSet().config.getTag(s).setValue(tag.getValue());
if (recursive) {
for (String s2 : tag.childTagMap().keySet()) {
copyGlobal(s + "." + s2);
}
}
}
public void onAdded(OptionScrollSlot slot) {
this.slot = slot;
}
public void onAdded(OptionList list) {
parent = list;
}
/**
* Mouse coordinates are relative to screen
*/
public void onMouseClicked(int mx, int my, int button) {
}
public void mouseClicked(int mx, int my, int button) {
}
public void update() {
}
public void draw(int mx, int my, float frame) {
}
public void keyTyped(char c, int keycode) {
}
public List<String> handleTooltip(int mx, int my, List<String> currenttip) {
return currenttip;
}
public boolean showWorldSelector() {
return true;
}
public boolean hasWorldOverride() {
return worldSpecific();
}
}