package net.t7seven7t.craftfx.trigger;
import net.t7seven7t.craftfx.CraftFX;
import net.t7seven7t.craftfx.effect.Effect;
import net.t7seven7t.craftfx.effect.EffectLoader;
import net.t7seven7t.craftfx.item.ItemDefinition;
import org.bukkit.configuration.ConfigurationSection;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
*
*/
public class TriggerLoader {
/**
* Creates new Triggers from a config
*
* @param item item definition
* @param config backing config
* @return list of triggers
*/
public List<Trigger> loadTriggers(ItemDefinition item,
ConfigurationSection config) throws Exception {
final List<Trigger> triggerList = new ArrayList<>();
final List<Effect> effectList = new EffectLoader().loadEffects(config);
triggerList.addAll(loadTriggers(item, config, effectList, false));
if (config.isConfigurationSection("cancel-trigger")) {
triggerList.addAll(loadTriggers(item, config.getConfigurationSection("cancel-trigger"),
effectList, true));
}
return triggerList;
}
private List<Trigger> loadTriggers(ItemDefinition item, ConfigurationSection config,
List<Effect> effectList,
boolean cancellers) throws Exception {
final List<Trigger> triggerList = new ArrayList<>();
if (config.isList("type")) {
for (String key : config.getStringList("type")) {
triggerList.add(loadTrigger(key, item, config, effectList, cancellers));
}
} else if (config.isString("type")) {
triggerList.add(loadTrigger(config.getString("type"), item, config, effectList,
cancellers));
} else {
throw new Exception("No trigger types specified at '" + config.getCurrentPath() + "'");
}
return triggerList;
}
/**
* Creates a new Trigger and registers it with the specified TriggerSpec type.
*
* @param type the {@link TriggerSpec} type
* @param config backing config
* @return the trigger
* @throws Exception an exception if the trigger type isn't registered
*/
private Trigger loadTrigger(String type, ItemDefinition item,
ConfigurationSection config,
List<Effect> effectList, boolean canceller) throws Exception {
final Optional<TriggerSpec> opt = CraftFX.instance().getTriggerRegistry().getSpec(type);
if (!opt.isPresent()) throw new Exception("Trigger type '" + type + "' isn't registered.");
final Trigger trigger = new Trigger(opt.get(), item, config, effectList, canceller);
return trigger;
}
}