package net.knarcraft.blacksmith.config.scrapper; import net.citizensnpcs.api.util.DataKey; import net.knarcraft.blacksmith.config.SettingValueType; import net.knarcraft.blacksmith.config.TraitSettings; import net.knarcraft.blacksmith.util.ConfigHelper; import java.util.HashMap; import java.util.Map; public class ScrapperNPCSettings implements TraitSettings { private final Map currentValues = new HashMap<>(); private final GlobalScrapperSettings globalScrapperSettings; /** * Instantiates a new scrapper NPC settings object * * @param globalScrapperSettings

The global settings object to get default values from

*/ public ScrapperNPCSettings(GlobalScrapperSettings globalScrapperSettings) { this.globalScrapperSettings = globalScrapperSettings; } /** * Loads variables from the given data key * * @param key

The data key to load variables from

*/ public void loadVariables(DataKey key) { for (ScrapperSetting setting : ScrapperSetting.values()) { if (key.keyExists(setting.getChildPath())) { currentValues.put(setting, key.getRaw(setting.getChildPath())); } } } /** * Saves variables to the given data key * * @param key

The data key to save variables to

*/ public void saveVariables(DataKey key) { for (ScrapperSetting setting : ScrapperSetting.values()) { key.setRaw(setting.getChildPath(), currentValues.get(setting)); } } /** * Changes one setting to the given value * * @param setting

The setting to change

* @param newValue

The new value of the setting

*/ public void changeValue(ScrapperSetting setting, Object newValue) { if (setting.getValueType() == SettingValueType.STRING_LIST || setting.getValueType() == SettingValueType.REFORGE_ABLE_ITEMS) { //Workaround to make sure it's treated as the correct type currentValues.put(setting, newValue == null ? null : ConfigHelper.asStringList(newValue)); } else { currentValues.put(setting, newValue); } } /** * Gets the raw current value of a setting * * @param setting

The setting to get the value of

* @return

The current value of the setting

*/ public Object getRawValue(ScrapperSetting setting) { return currentValues.get(setting); } @Override public String getBusyWithPlayerMessage() { return asString(ScrapperSetting.BUSY_WITH_PLAYER_MESSAGE); } @Override public String getBusyWorkingMessage() { return asString(ScrapperSetting.BUSY_WITH_SALVAGE_MESSAGE); } @Override public String getStartWorkingMessage() { return asString(ScrapperSetting.START_SALVAGE_MESSAGE); } /** * Gets the message to display when a blacksmith has successfully repaired an item * * @return

The reforge success message

*/ public String getSuccessMessage() { return asString(ScrapperSetting.SUCCESS_SALVAGE_MESSAGE); } @Override public String getCoolDownUnexpiredMessage() { return asString(ScrapperSetting.COOL_DOWN_UNEXPIRED_MESSAGE); } /** * The message displayed if a player presents a different item after seeing the price to salvage an item */ public String getItemChangedMessage() { return asString(ScrapperSetting.ITEM_UNEXPECTEDLY_CHANGED_MESSAGE); } /** * Gets the minimum delay used to wait for a salvaging to finish. * * @return

The minimum salvage delay

*/ public int getMinSalvageDelay() { return asInt(ScrapperSetting.MIN_SALVAGE_DELAY); } /** * Gets the maximum delay used to wait for a salvaging to finish * * @return

The maximum salvage delay

*/ public int getMaxSalvageDelay() { return asInt(ScrapperSetting.MAX_SALVAGE_DELAY); } /** * Gets the cool-down between each salvaging * * @return

The salvage cool-down

*/ public int getSalvageCoolDown() { return asInt(ScrapperSetting.SALVAGE_COOL_DOWN); } /** * Gets whether an item should be dropped on the ground instead of being given to the player * * @return

Whether to drop reforged items on the ground

*/ public boolean getDropItem() { return ConfigHelper.asBoolean(getValue(ScrapperSetting.DROP_ITEM)); } @Override public boolean getDisableCoolDown() { return asInt(ScrapperSetting.SALVAGE_COOL_DOWN) <= 0; } /** * Gets whether to disable the delay between starting reforging and the reforging finishing * * @return

Whether to disable the reforge delay

*/ public boolean getDisableDelay() { return asInt(ScrapperSetting.MAX_SALVAGE_DELAY) <= 0; } /** * Gets the given value as an integer * *

This will throw an exception if used for a non-integer setting

* * @param setting

The setting to get the value of

* @return

The value of the given setting as an integer

*/ private int asInt(ScrapperSetting setting) { return ConfigHelper.asInt(getValue(setting)); } /** * Gets the string value of the given setting * * @param setting

The setting to get the value of

* @return

The value of the given setting as a string

*/ private String asString(ScrapperSetting setting) { return getValue(setting).toString(); } /** * Gets the value of a setting, using the default if not set * * @param setting

The setting to get the value of

* @return

The current value

*/ private Object getValue(ScrapperSetting setting) { Object value = currentValues.get(setting); //If not set, use the default value from the config.yml file if (value == null) { Map defaultNPCSettings = globalScrapperSettings.getDefaultNPCSettings(); if (defaultNPCSettings.containsKey(setting)) { value = defaultNPCSettings.get(setting); } } //If not set in config.yml, use the default value from the enum if (value == null) { value = setting.getDefaultValue(); } return value; } }