package jas.common;
import jas.common.global.BiomeBlacklist;
import jas.common.global.GlobalSettings;
import jas.common.global.ImportedSpawnList;
import jas.common.helper.FileUtilities;
import jas.common.helper.GsonHelper;
import jas.common.helper.ReflectionHelper;
import jas.spawner.modern.DefaultProps;
import jas.spawner.modern.MVELProfile;
import jas.spawner.modern.proxy.CommonProxy;
import jas.spawner.modern.spawner.biome.structure.StructureInterpreterHelper;
import jas.spawner.refactor.ExperimentalProfile;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import net.minecraft.world.GameRules;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry;
import net.minecraft.world.gen.ChunkProviderHell;
import net.minecraft.world.gen.structure.MapGenNetherBridge;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.WorldEvent;
import com.google.common.collect.ArrayTable;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import com.google.gson.Gson;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
@Mod(modid = DefaultProps.MODID, name = DefaultProps.MODNAME, dependencies = "after:*", useMetadata = true)
public class JustAnotherSpawner {
@Instance(DefaultProps.MODID)
public static JustAnotherSpawner modInstance;
@SidedProxy(clientSide = "jas.spawner.modern.proxy.ClientProxy", serverSide = "jas.spawner.modern.proxy.CommonProxy")
public static CommonProxy proxy;
/* Only Populated after {@link#FMLPreInitializationEvent} */
private static File modConfigDirectoryFile;
public static File getModConfigDirectory() {
return modConfigDirectoryFile;
}
private static ImportedSpawnList importedSpawnList;
public static ImportedSpawnList importedSpawnList() {
return importedSpawnList;
}
private static GlobalSettings globalSettings;
public static GlobalSettings globalSettings() {
return globalSettings;
}
private static Profile currentProfile;
public static Profile profile() {
return currentProfile;
}
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
modConfigDirectoryFile = event.getModConfigurationDirectory();
Gson gson = GsonHelper.createGson(true);
File globalSettingsFile = new File(modConfigDirectoryFile, DefaultProps.MODDIR + "GlobalProperties.cfg");
globalSettings = GsonHelper.readOrCreateFromGson(FileUtilities.createReader(globalSettingsFile, false),
GlobalSettings.class, gson);
GsonHelper.writeToGson(FileUtilities.createWriter(globalSettingsFile, true), globalSettings, gson);
File loggingSettings = new File(modConfigDirectoryFile, DefaultProps.MODDIR + "LoggingProperties.cfg");
JASLog jasLog = GsonHelper.readOrCreateFromGson(FileUtilities.createReader(loggingSettings, false),
JASLog.class, gson);
JASLog.setLogger(jasLog);
GsonHelper.writeToGson(FileUtilities.createWriter(loggingSettings, true), jasLog, gson);
MinecraftForge.EVENT_BUS.register(this);
}
@EventHandler
public void load(FMLInitializationEvent event) {
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
BiomeDictionary.registerAllBiomes();
BiomeBlacklist biomeBlacklist = new BiomeBlacklist(modConfigDirectoryFile);
importedSpawnList = new ImportedSpawnList(biomeBlacklist, globalSettings.emptyVanillaSpawnLists);
importedSpawnList.exportImportedSpawnlistToFile(modConfigDirectoryFile);
// if (globalSettings.spawningProfile.trim().equalsIgnoreCase(GlobalSettings.profileTAGS)) {
// currentProfile = new TAGProfile(biomeBlacklist, importedSpawnList);
// } else if (globalSettings.spawningProfile.trim().equalsIgnoreCase(GlobalSettings.profileMVEL)) {
currentProfile = new MVELProfile(biomeBlacklist, importedSpawnList);
// currentProfile = new ExperimentalProfile(biomeBlacklist, importedSpawnList);
// } else {
// throw new IllegalArgumentException(String.format(
// "Unknown Spawning Profile [%s]. Current modes are %s or %s", globalSettings.spawningProfile,
// GlobalSettings.profileTAGS, GlobalSettings.profileMVEL));
// }
currentProfile.init();
}
@EventHandler
public void serverStart(FMLServerStartingEvent event) {
currentProfile.serverStart(event);
if (JustAnotherSpawner.globalSettings().emptyVanillaSpawnLists) {
JASLog.log().info("Removing Netherbridge spawnlist");
ChunkProviderHell chunkProviderHell = StructureInterpreterHelper.getInnerChunkProvider(
event.getServer().worldServers[1], ChunkProviderHell.class);
if (chunkProviderHell != null) {
List<?> netherSpawnList;
MapGenNetherBridge genNetherBridge;
try {
genNetherBridge = ReflectionHelper.getCatchableFieldFromReflection("field_73172_c",
chunkProviderHell, MapGenNetherBridge.class);
netherSpawnList = ReflectionHelper.getCatchableFieldFromReflection("field_75060_e",
genNetherBridge, List.class);
} catch (NoSuchFieldException e) {
genNetherBridge = ReflectionHelper.getFieldFromReflection("genNetherBridge", chunkProviderHell,
MapGenNetherBridge.class);
netherSpawnList = ReflectionHelper.getFieldFromReflection("spawnList", genNetherBridge, List.class);
}
Iterator<?> spawnIterator = netherSpawnList.iterator();
while (spawnIterator.hasNext()) {
Object spawn = spawnIterator.next();
spawnIterator.remove();
}
}
}
}
@SubscribeEvent
public void worldLoad(WorldEvent.Load event) {
GameRules gameRule = event.world.getGameRules();
if (gameRule != null && globalSettings.turnGameruleSpawningOff) {
JASLog.log().info("Setting GameRule doMobSpawning for %s-%s to false",
event.world.getWorldInfo().getWorldName(), event.world.provider.dimensionId);
gameRule.setOrCreateGameRule("doMobSpawning", "false");
}
String ruleName = "doCustomMobSpawning";
if (!gameRule.hasRule(ruleName)) {
gameRule.addGameRule(ruleName, "true");
}
}
}