package com.pahimar.ee3.emc; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import com.google.common.collect.ImmutableSortedMap; import com.pahimar.ee3.item.CustomWrappedStack; public class EmcRegistry { private static EmcRegistry emcRegistry = null; private ImmutableSortedMap stackMappings; private ImmutableSortedMap> valueMappings; private static void lazyInit() { if (emcRegistry == null) { emcRegistry = new EmcRegistry(); emcRegistry.init(); } } private void init() { ImmutableSortedMap.Builder stackMappingsBuilder = ImmutableSortedMap.naturalOrder(); ImmutableSortedMap.Builder> valueMappingsBuilder = ImmutableSortedMap.naturalOrder(); Map defaultValues = EmcDefaultValues.getDefaultValueMap(); // Handle the stack mappings stackMappingsBuilder.putAll(defaultValues); stackMappings = stackMappingsBuilder.build(); // Handle the value mappings SortedMap> tempValueMappings = new TreeMap>(); for (CustomWrappedStack stack : defaultValues.keySet()) { EmcValue value = defaultValues.get(stack); if (tempValueMappings.containsKey(value)) { if (!(tempValueMappings.get(value).contains(stack))) { tempValueMappings.get(value).add(stack); } } else { tempValueMappings.put(value, Arrays.asList(stack)); } } valueMappingsBuilder.putAll(tempValueMappings); valueMappings = valueMappingsBuilder.build(); } public static boolean hasEmcValue(CustomWrappedStack stack) { lazyInit(); return emcRegistry.stackMappings.containsKey(new CustomWrappedStack(stack.getWrappedStack())); } public static EmcValue getEmcValue(CustomWrappedStack stack) { lazyInit(); return emcRegistry.stackMappings.get(new CustomWrappedStack(stack.getWrappedStack())); } public static List getStacksInRange(EmcValue start, EmcValue finish) { lazyInit(); List stacksInRange = new ArrayList(); SortedMap> tailMap = emcRegistry.valueMappings.tailMap(start); SortedMap> headMap = emcRegistry.valueMappings.headMap(finish); SortedMap> smallerMap; SortedMap> biggerMap; if (!tailMap.isEmpty() && !headMap.isEmpty()) { if (tailMap.size() <= headMap.size()) { smallerMap = tailMap; biggerMap = headMap; } else { smallerMap = headMap; biggerMap = tailMap; } for (EmcValue value : smallerMap.keySet()) { if (biggerMap.containsKey(value)) { stacksInRange.addAll(emcRegistry.valueMappings.get(value)); } } } return stacksInRange; } }