package pneumaticCraft.common.thirdparty.fmp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import pneumaticCraft.common.block.Blockss;
import pneumaticCraft.common.config.Config;
import pneumaticCraft.common.network.NetworkHandler;
import pneumaticCraft.common.thirdparty.IThirdParty;
import pneumaticCraft.common.tileentity.TileEntityPressureTube;
import pneumaticCraft.lib.Log;
import codechicken.lib.vec.BlockCoord;
import codechicken.multipart.MultiPartRegistry;
import codechicken.multipart.MultiPartRegistry.IPartConverter;
import codechicken.multipart.MultiPartRegistry.IPartFactory;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
import cpw.mods.fml.relauncher.Side;
public class FMP implements IThirdParty, IPartFactory, IPartConverter{
private final Map<String, Class<? extends TMultiPart>> multiparts = new HashMap<String, Class<? extends TMultiPart>>();
@Override
public void preInit(){
multiparts.put("tile.pressureTube", PartPressureTube.class);
multiparts.put("tile.advancedPressureTube", PartAdvancedPressureTube.class);
for(String part : multiparts.keySet()) {
MultiPartRegistry.registerParts(this, new String[]{part});
}
MultiPartRegistry.registerConverter(this);
// Itemss.pressureTube = new ItemPart("tile.pressureTube").setUnlocalizedName("pressureTube").setCreativeTab(pneumaticCraftTab);
//Itemss.registerItem(Itemss.pressureTube, "part.pressureTube");
MinecraftForge.EVENT_BUS.register(new FMPPlacementListener());
NetworkHandler.INSTANCE.registerMessage(PacketFMPPlacePart.class, PacketFMPPlacePart.class, NetworkHandler.discriminant++, Side.SERVER);
}
public void registerPart(String partName, Class<? extends TMultiPart> part){
multiparts.put(partName, part);
}
@Override
public void init(){}
@Override
public void postInit(){}
@Override
public void clientSide(){}
@Override
public Iterable<Block> blockTypes(){
if(Config.convertMultipartsToBlocks) return new ArrayList<Block>();
return Arrays.asList(new Block[]{Blockss.pressureTube, Blockss.advancedPressureTube});
}
@Override
public TMultiPart convert(World world, BlockCoord pos){
if(!Config.convertMultipartsToBlocks) {
if(world.getBlock(pos.x, pos.y, pos.z) == Blockss.pressureTube) return new PartPressureTube((TileEntityPressureTube)world.getTileEntity(pos.x, pos.y, pos.z));
if(world.getBlock(pos.x, pos.y, pos.z) == Blockss.advancedPressureTube) return new PartAdvancedPressureTube((TileEntityPressureTube)world.getTileEntity(pos.x, pos.y, pos.z));
}
return null;
}
@Override
public TMultiPart createPart(String id, boolean client){
try {
return multiparts.get(id).newInstance();
} catch(Exception e) {
Log.error("Failed to instantiate the multipart with id " + id + ". Is the constructor a parameterless one?");
return null;
}
}
private static TileMultipart getMultipartTile(IBlockAccess access, ChunkPosition pos){
TileEntity te = access.getTileEntity(pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ);
return te instanceof TileMultipart ? (TileMultipart)te : null;
}
/* public static TMultiPart getMultiPart(IBlockAccess w, ChunkPosition bc, int part){
TileMultipart t = getMultipartTile(w, bc);
if(t != null) return t.partMap(part);
return null;
}*/
public static <T> T getMultiPart(IBlockAccess access, ChunkPosition pos, Class<T> searchedClass){
TileMultipart t = getMultipartTile(access, pos);
return t == null ? null : getMultiPart(t, searchedClass);
}
public static <T> T getMultiPart(TileMultipart t, Class<T> searchedClass){
for(TMultiPart part : t.jPartList()) {
if(searchedClass.isAssignableFrom(part.getClass())) return (T)part;
}
return null;
}
public static <T> Iterable<T> getMultiParts(TileMultipart t, Class<T> searchedClass){
List<T> parts = new ArrayList<T>();
for(TMultiPart part : t.jPartList()) {
if(searchedClass.isAssignableFrom(part.getClass())) parts.add((T)part);
}
return parts;
}
@Override
public void clientInit(){}
}