package advancedsystemsmanager.helpers;
import advancedsystemsmanager.AdvancedSystemsManager;
import advancedsystemsmanager.blocks.BlockTileElement;
import advancedsystemsmanager.reference.Mods;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.reference.Reference;
import advancedsystemsmanager.registry.BlockRegistry;
import advancedsystemsmanager.registry.ItemRegistry;
import advancedsystemsmanager.tileentities.*;
import cpw.mods.fml.common.ObfuscationReflectionHelper;
import cpw.mods.fml.common.event.FMLMissingMappingsEvent;
import cpw.mods.fml.common.registry.FMLControlledNamespacedRegistry;
import cpw.mods.fml.common.registry.GameData;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class RemapHelper
{
private static Map<String, String> tileFactoryRemap = new HashMap<String, String>();
private static Map<String, Remap> remapRegistry = new HashMap<String, Remap>();
private static Map<String,Class<?>> teMappings = ObfuscationReflectionHelper.getPrivateValue(TileEntity.class, null, "field_" + "145855_i", "nameToClassMap");
//##############################################
// DEPRECATED
//##############################################
public static final String OLD_PREFIX = "system_";
public static final String OLD_MANAGER = OLD_PREFIX + "manager";
public static final String OLD_CABLE = OLD_PREFIX + "cable";
public static final String OLD_CABLE_RELAY = OLD_CABLE + "_relay";
public static final String OLD_CABLE_OUTPUT = OLD_CABLE + "_output";
public static final String OLD_CABLE_INPUT = OLD_CABLE + "_input";
public static final String OLD_CABLE_CREATIVE = OLD_CABLE + "_creative";
public static final String OLD_CABLE_VALVE = OLD_CABLE + "_valve";
public static final String OLD_CABLE_VOID = OLD_CABLE + "_void";
public static final String OLD_CABLE_BUD = OLD_CABLE + "_bud";
public static final String OLD_CABLE_BLOCK_GATE = OLD_CABLE + "_block_gate";
public static final String OLD_CABLE_FLUID_GATE = OLD_CABLE + "_fluid_gate";
public static final String OLD_CABLE_CLUSTER = OLD_CABLE + "_cluster";
public static final String OLD_CABLE_CAMO = OLD_CABLE + "_camo";
public static final String OLD_CABLE_SIGN = OLD_CABLE + "_sign";
public static final String OLD_CABLE_QUANTUM = OLD_CABLE + "_quantum";
public static final String OLD_CABLE_RF = OLD_CABLE + "_rf";
public static final String OLD_CABLE_AE = OLD_CABLE + "_ae";
public static final String OLD_DUPLICATOR = OLD_PREFIX + "duplicator";
public static final String OLD_LABELER = OLD_PREFIX + "labeler";
public static final String OLD_REMOTE_ACCESS = OLD_PREFIX + "remote_access";
private static final String NBT_PROTOCOL_VERSION = "ProtocolVersion";
private static final String MANAGER_TILE_ENTITY_TAG = "TileEntityMachineManagerName";
private static final String MANAGER_NAME_TAG = "BlockMachineManagerName";
private static final String CABLE_NAME_TAG = "BlockCableName";
private static final String CABLE_RELAY_TILE_ENTITY_TAG = "TileEntityCableRelayName";
private static final String CABLE_RELAY_NAME_TAG = "BlockCableRelayName";
private static final String CABLE_OUTPUT_TILE_ENTITY_TAG = "TileEntityCableOutputName";
private static final String CABLE_OUTPUT_NAME_TAG = "BlockCableOutputName";
private static final String CABLE_INPUT_TILE_ENTITY_TAG = "TileEntityCableInputName";
private static final String CABLE_INPUT_NAME_TAG = "BlockCableInputName";
private static final String CABLE_CREATIVE_TILE_ENTITY_TAG = "TileEntityCableCreativeName";
private static final String CABLE_CREATIVE_NAME_TAG = "BlockCableCreativeName";
private static final String CABLE_INTAKE_TILE_ENTITY_TAG = "TileEntityCableIntakeName";
private static final String CABLE_INTAKE_NAME_TAG = "BlockCableIntakeName";
private static final String CABLE_BUD_TILE_ENTITY_TAG = "TileEntityCableBUDName";
private static final String CABLE_BUD_NAME_TAG = "BlockCableBUDName";
private static final String CABLE_BREAKER_TILE_ENTITY_TAG = "TileEntityCableBreakerName";
private static final String CABLE_BREAKER_NAME_TAG = "BlockCableBreakerName";
private static final String CABLE_CLUSTER_TILE_ENTITY_TAG = "TileEntityCableClusterName";
private static final String CABLE_CLUSTER_NAME_TAG = "BlockCableClusterName";
private static final String CABLE_CAMOUFLAGE_TILE_ENTITY_TAG = "TileEntityCableCamouflageName";
private static final String CABLE_CAMOUFLAGE_NAME_TAG = "BlockCableCamouflageName";
private static final String CABLE_SIGN_TILE_ENTITY_TAG = "TileEntityCableSignName";
private static final String CABLE_SIGN_NAME_TAG = "BlockCableSignName";
private static final String DRIVE = "duplicator";
private static final String LABELER = "labeler";
private static final String CABLE_RF = "cable_rf";
private static final String CABLE_AE = "cable_ae";
public static void registerMappings()
{
registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + MANAGER_NAME_TAG, MANAGER_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.MANAGER));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_NAME_TAG, BlockRegistry.cableElements[0], Names.CABLE_BLOCK));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_RELAY_NAME_TAG, CABLE_RELAY_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_RELAY));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_OUTPUT_NAME_TAG, CABLE_OUTPUT_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_OUTPUT));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_INPUT_NAME_TAG, CABLE_INPUT_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_INPUT));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_CREATIVE_NAME_TAG, CABLE_CREATIVE_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_CREATIVE));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_INTAKE_NAME_TAG, CABLE_INTAKE_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_VALVE));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_BUD_NAME_TAG, CABLE_BUD_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_BUD));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_BREAKER_NAME_TAG, CABLE_BREAKER_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_BLOCK_GATE));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_CLUSTER_NAME_TAG, CABLE_CLUSTER_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_CLUSTER));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_CAMOUFLAGE_NAME_TAG, CABLE_CAMOUFLAGE_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_CAMO));
// registerMapping(new Remap(Mods.STEVESFACTORYMANAGER + ':' + CABLE_SIGN_NAME_TAG, CABLE_SIGN_TILE_ENTITY_TAG, BlockRegistry.cableElements[0], Names.CABLE_SIGN));
// registerMapping(new Remap(Mods.STEVESADDONS + ':' + CABLE_RF, CABLE_RF, BlockRegistry.cableElements[0], Names.CABLE_RF));
// registerMapping(new Remap(Mods.STEVESADDONS + ':' + CABLE_AE, CABLE_AE, BlockRegistry.cableElements[0], Names.CABLE_AE));
registerMapping(new Remap(Mods.STEVESADDONS + ':' + DRIVE, ItemRegistry.duplicator));
registerMapping(new Remap(Mods.STEVESADDONS + ':' + LABELER, ItemRegistry.labeler));
registerMapping(new Remap(Reference.ID + ':' + OLD_MANAGER, OLD_MANAGER, BlockRegistry.cableElements[0], Names.MANAGER));
// registerMapping(Reference.ID + ':' + OLD_CABLE, null, BlockRegistry.cableElements[0], Names.CABLE_BLOCK);
// registerMapping(Reference.ID + ':' + OLD_CABLE_RELAY, OLD_CABLE_RELAY, BlockRegistry.cableElements[0], Names.CABLE_RELAY);
// registerMapping(Reference.ID + ':' + OLD_CABLE_OUTPUT, OLD_CABLE_OUTPUT, BlockRegistry.cableElements[0], Names.CABLE_OUTPUT);
// registerMapping(Reference.ID + ':' + OLD_CABLE_INPUT, OLD_CABLE_INPUT, BlockRegistry.cableElements[0], Names.CABLE_INPUT);
// registerMapping(Reference.ID + ':' + OLD_CABLE_CREATIVE, OLD_CABLE_CREATIVE, BlockRegistry.cableElements[0], Names.CABLE_CREATIVE);
// registerMapping(Reference.ID + ':' + OLD_CABLE_VALVE, OLD_CABLE_VALVE, BlockRegistry.cableElements[0], Names.CABLE_VALVE);
// registerMapping(Reference.ID + ':' + OLD_CABLE_BUD, OLD_CABLE_BUD, BlockRegistry.cableElements[0], Names.CABLE_BUD);
// registerMapping(Reference.ID + ':' + OLD_CABLE_BLOCK_GATE, OLD_CABLE_BLOCK_GATE, BlockRegistry.cableElements[0], Names.CABLE_BLOCK_GATE);
// registerMapping(Reference.ID + ':' + OLD_CABLE_CLUSTER, OLD_CABLE_CLUSTER, BlockRegistry.cableElements[0], Names.CABLE_CLUSTER);
// registerMapping(Reference.ID + ':' + OLD_CABLE_CAMO, OLD_CABLE_CAMO, BlockRegistry.cableElements[0], Names.CABLE_CAMO);
// registerMapping(Reference.ID + ':' + OLD_CABLE_SIGN, OLD_CABLE_SIGN, BlockRegistry.cableElements[0], Names.CABLE_SIGN);
// registerMapping(Reference.ID + ':' + OLD_CABLE_RF, OLD_CABLE_RF, BlockRegistry.cableElements[0], Names.CABLE_RF);
// registerMapping(Reference.ID + ':' + OLD_CABLE_AE, OLD_CABLE_AE, BlockRegistry.cableElements[0], Names.CABLE_AE);
// registerMapping(Reference.ID + ':' + OLD_CABLE_VOID, OLD_CABLE_VOID, BlockRegistry.cableElements[0], Names.CABLE_VOID);
// registerMapping(Reference.ID + ':' + OLD_CABLE_FLUID_GATE, OLD_CABLE_FLUID_GATE, BlockRegistry.cableElements[0], Names.CABLE_FLUID_GATE);
// registerMapping(Reference.ID + ':' + OLD_CABLE_QUANTUM, OLD_CABLE_QUANTUM, BlockRegistry.cableElements[0], Names.CABLE_QUANTUM);
registerMapping(new Remap(Reference.ID + ':' + OLD_DUPLICATOR, ItemRegistry.duplicator));
registerMapping(new Remap(Reference.ID + ':' + OLD_LABELER, ItemRegistry.labeler));
registerMapping(new Remap(Reference.ID + ':' + OLD_REMOTE_ACCESS, ItemRegistry.remoteAccessor));
}
public static void registerMapping(Remap thing)
{
remapRegistry.put(thing.getName(), thing);
}
public static void handleRemap(FMLMissingMappingsEvent event)
{
for (FMLMissingMappingsEvent.MissingMapping mapping : event.getAll())
{
Remap remap = remapRegistry.get(mapping.name);
if (remap != null)
{
remap.remap(mapping);
}
}
}
public static String getNewTile(String oldName)
{
return tileFactoryRemap.get(oldName);
}
private static class Remap
{
private String oldName;
private String oldTEName;
private Block newBlock;
private Item newItem;
private String newTile;
private Remap(String oldName, Block newBlock, String newTileEntity)
{
this(oldName, oldName, newBlock, null, newTileEntity);
}
private Remap(String oldName, String oldTEName, Block newBlock, String newTileEntity)
{
this(oldName, oldTEName, newBlock, null, newTileEntity);
}
private Remap(String oldName, Item newItem)
{
this(oldName, null, null, newItem, null);
}
private Remap(String oldName, String oldTEName, Block newBlock, Item newItem, String newTile)
{
this.oldName = oldName;
this.oldTEName = oldTEName;
this.newBlock = newBlock;
this.newItem = newItem;
this.newTile = newTile;
tileFactoryRemap.put(oldTEName, newTile);
}
public String getName()
{
return oldName;
}
public void remap(FMLMissingMappingsEvent.MissingMapping mapping)
{
if (newBlock != null)
{
if (mapping.type == GameRegistry.Type.BLOCK)
{
mapping.remap(newBlock);
if (newTile != null)
{
AdvancedSystemsManager.log.info(String.format("remapping %s to %s", oldName, newTile));
teMappings.put(oldTEName, TileEntityRemapping.class);
}
} else
{
mapping.skipItemBlock();
}
} else if (newItem != null && mapping.type == GameRegistry.Type.ITEM)
{
mapping.remap(newItem);
} else
{
mapping.ignore();
}
}
}
}