Sort rituals by component count to avoid conflicts (#1070)

Large rituals can now use, for example, the Serenade of the Nether layout if wanted.

(cherry picked from commit 0b93c11)
This commit is contained in:
Nicholas Ignoffo 2017-02-27 17:37:30 -08:00
parent 4e7f0d12f9
commit 3cbfb0a40f
2 changed files with 36 additions and 12 deletions

View file

@ -3,6 +3,7 @@ package WayofTime.bloodmagic;
import java.io.File; import java.io.File;
import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.command.CommandBloodMagic;
import WayofTime.bloodmagic.api.registry.RitualRegistry;
import WayofTime.bloodmagic.meteor.MeteorConfigHandler; import WayofTime.bloodmagic.meteor.MeteorConfigHandler;
import lombok.Getter; import lombok.Getter;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@ -11,12 +12,7 @@ import net.minecraft.launchwrapper.Launch;
import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.*;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.event.FMLModIdMappingEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.NetworkRegistry;
import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.annot.Handler;
import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.Constants;
@ -105,8 +101,6 @@ public class BloodMagic
proxy.preInit(); proxy.preInit();
} }
@Mod.EventHandler @Mod.EventHandler
public void init(FMLInitializationEvent event) public void init(FMLInitializationEvent event)
{ {
@ -133,6 +127,11 @@ public class BloodMagic
proxy.postInit(); proxy.postInit();
} }
@Mod.EventHandler
public void loadComplete(FMLLoadCompleteEvent event) {
RitualRegistry.orderLookupList();
}
@Mod.EventHandler @Mod.EventHandler
public void modMapping(FMLModIdMappingEvent event) public void modMapping(FMLModIdMappingEvent event)
{ {

View file

@ -6,20 +6,21 @@ import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.Map;
public class RitualRegistry public class RitualRegistry
{ {
public static final Map<Ritual, Boolean> enabledRituals = new HashMap<Ritual, Boolean>(); public static final Map<Ritual, Boolean> enabledRituals = new HashMap<Ritual, Boolean>();
private static final BiMap<String, Ritual> registry = HashBiMap.create(); private static final BiMap<String, Ritual> registry = HashBiMap.create();
private static final List<String> lookupList = new ArrayList<String>();
/** /**
* Ordered list for actions that depend on the order that the rituals were * Ordered list for actions that depend on the order that the rituals were
* registered in * registered in
*/ */
private static final ArrayList<String> orderedIdList = new ArrayList<String>(); private static final ArrayList<String> orderedIdList = new ArrayList<String>();
private static boolean locked;
/** /**
* The safe way to register a new Ritual. * The safe way to register a new Ritual.
* *
@ -30,6 +31,13 @@ public class RitualRegistry
*/ */
public static void registerRitual(Ritual ritual, String id, boolean enabled) public static void registerRitual(Ritual ritual, String id, boolean enabled)
{ {
if (locked)
{
BloodMagicAPI.getLogger().error("This registry has been locked. Please register your ritual earlier.");
BloodMagicAPI.getLogger().error("If you reflect this, I will hunt you down. - TehNut");
return;
}
if (ritual != null) if (ritual != null)
{ {
if (registry.containsKey(id)) if (registry.containsKey(id))
@ -109,7 +117,7 @@ public class RitualRegistry
public static ArrayList<String> getIds() public static ArrayList<String> getIds()
{ {
return new ArrayList<String>(registry.keySet()); return new ArrayList<String>(lookupList);
} }
public static ArrayList<String> getOrderedIds() public static ArrayList<String> getOrderedIds()
@ -121,4 +129,21 @@ public class RitualRegistry
{ {
return new ArrayList<Ritual>(registry.values()); return new ArrayList<Ritual>(registry.values());
} }
public static void orderLookupList()
{
locked = true; // Lock registry so no no rituals can be registered
lookupList.clear(); // Make sure it's empty
lookupList.addAll(registry.keySet());
Collections.sort(lookupList, new Comparator<String>()
{
@Override
public int compare(String o1, String o2)
{
Ritual ritual1 = registry.get(o1);
Ritual ritual2 = registry.get(o2);
return ritual1.getComponents().size() > ritual2.getComponents().size() ? -1 : 0; // Put earlier if bigger
}
});
}
} }