package openblocks.enchantments.flimflams;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.minecraftforge.common.MinecraftForge;
import openblocks.Config;
import openblocks.api.FlimFlamDescriptionSimple;
import openblocks.api.IFlimFlamAction;
import openblocks.api.IFlimFlamDescription;
import openblocks.api.IFlimFlamRegistry;
import openmods.Log;
import openmods.access.ApiSingleton;
import openmods.config.properties.ConfigurationChange;
@ApiSingleton
public class FlimFlamRegistry implements IFlimFlamRegistry {
public static FlimFlamRegistry instance = new FlimFlamRegistry();
private static final List<IFlimFlamDescription> FLIM_FLAMS = Lists.newArrayList();
private static final List<IFlimFlamDescription> UNMODIFIABLE_VIEW = Collections.unmodifiableList(FLIM_FLAMS);
private static final Map<String, IFlimFlamDescription> FLIM_FLAMS_BY_NAME = Maps.newHashMap();
public static final FlimFlamChecker BLACKLIST = new FlimFlamChecker();
public static class FlimFlamChecker {
private Set<String> flimFlamList;
private void loadList() {
flimFlamList = Sets.newHashSet();
Set<String> validNames = Sets.newHashSet(FlimFlamRegistry.instance.getAllFlimFlamsNames());
for (String s : Config.flimFlamList) {
if (validNames.contains(s)) {
flimFlamList.add(s);
} else Log.warn("Trying to blacklist unknown flimflam name '%s'", s);
}
Log.debug("Blacklisting/Whitelisting flim-flams %s", flimFlamList);
}
public boolean isBlacklisted(IFlimFlamDescription effect) {
if (Config.safeFlimFlams && !effect.isSafe()) return true;
if (flimFlamList == null) loadList();
final boolean onList = flimFlamList.contains(effect.name());
return Config.flimFlamWhitelist ^ onList;
}
@SubscribeEvent
public void onReconfig(ConfigurationChange.Post evt) {
if (evt.check("tomfoolery", "flimFlamBlacklist")) flimFlamList = null;
}
public void init() {
loadList();
MinecraftForge.EVENT_BUS.register(this);
}
}
@Override
public FlimFlamDescriptionSimple registerFlimFlam(String name, int cost, int weight, IFlimFlamAction effect) {
final FlimFlamDescriptionSimple meta = new FlimFlamDescriptionSimple(name, cost, weight, effect);
registerFlimFlam(name, meta);
return meta;
}
@Override
public void registerFlimFlam(String name, IFlimFlamDescription meta) {
FLIM_FLAMS.add(meta);
FLIM_FLAMS_BY_NAME.put(name, meta);
}
@Override
public List<IFlimFlamDescription> getFlimFlams() {
return UNMODIFIABLE_VIEW;
}
@Override
public IFlimFlamDescription getFlimFlamByName(String name) {
return FLIM_FLAMS_BY_NAME.get(name);
}
@Override
public List<String> getAllFlimFlamsNames() {
return ImmutableList.copyOf(FLIM_FLAMS_BY_NAME.keySet());
}
}