package mekanism.common.multipart;
import static mekanism.common.block.states.BlockStateMachine.MachineBlock.MACHINE_BLOCK_1;
import static mekanism.common.block.states.BlockStateMachine.MachineBlock.MACHINE_BLOCK_2;
import mcmultipart.multipart.IMultipart;
import mcmultipart.multipart.IPartFactory;
import mcmultipart.multipart.Multipart;
import mcmultipart.multipart.MultipartRegistry;
import mekanism.common.MekanismBlocks;
import mekanism.common.Tier;
import mekanism.common.block.states.BlockStateMachine.MachineType;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.fml.common.event.FMLInterModComms;
public class MultipartMekanism implements IPartFactory
{
public MultipartMekanism()
{
init();
}
public void init()
{
MultipartRegistry.registerPartFactory(this, "mekanism:universal_cable_basic",
"mekanism:universal_cable_advanced", "mekanism:universal_cable_elite",
"mekanism:universal_cable_ultimate", "mekanism:mechanical_pipe",
"mekanism:mechanical_pipe_basic", "mekanism:mechanical_pipe_advanced",
"mekanism:mechanical_pipe_elite", "mekanism:mechanical_pipe_ultimate",
"mekanism:pressurized_tube_basic", "mekanism:pressurized_tube_advanced",
"mekanism:pressurized_tube_elite", "mekanism:pressurized_tube_ultimate",
"mekanism:logistical_transporter_basic", "mekanism:logistical_transporter_advanced",
"mekanism:logistical_transporter_elite", "mekanism:logistical_transporter_ultimate",
"mekanism:restrictive_transporter", "mekanism:diversion_transporter",
"mekanism:thermodynamic_conductor_basic", "mekanism:thermodynamic_conductor_advanced",
"mekanism:thermodynamic_conductor_elite", "mekanism:thermodynamic_conductor_ultimate",
"mekanism:glow_panel");
registerMicroMaterials();
}
@Override
public IMultipart createPart(ResourceLocation resource, boolean client)
{
String name = resource.toString();
if(name.equals("mekanism:universal_cable"))
{
return new PartUniversalCable(Tier.CableTier.BASIC);
}
else if(name.equals("mekanism:universal_cable_basic"))
{
return new PartUniversalCable(Tier.CableTier.BASIC);
}
else if(name.equals("mekanism:universal_cable_advanced"))
{
return new PartUniversalCable(Tier.CableTier.ADVANCED);
}
else if(name.equals("mekanism:universal_cable_elite"))
{
return new PartUniversalCable(Tier.CableTier.ELITE);
}
else if(name.equals("mekanism:universal_cable_ultimate"))
{
return new PartUniversalCable(Tier.CableTier.ULTIMATE);
}
else if(name.equals("mekanism:mechanical_pipe"))
{
return new PartMechanicalPipe(Tier.PipeTier.BASIC);
}
else if(name.equals("mekanism:mechanical_pipe_basic"))
{
return new PartMechanicalPipe(Tier.PipeTier.BASIC);
}
else if(name.equals("mekanism:mechanical_pipe_advanced"))
{
return new PartMechanicalPipe(Tier.PipeTier.ADVANCED);
}
else if(name.equals("mekanism:mechanical_pipe_elite"))
{
return new PartMechanicalPipe(Tier.PipeTier.ELITE);
}
else if(name.equals("mekanism:mechanical_pipe_ultimate"))
{
return new PartMechanicalPipe(Tier.PipeTier.ULTIMATE);
}
else if(name.equals("mekanism:pressurized_tube_basic") || name.equals("mekanism:pressurized_tube"))
{
return new PartPressurizedTube(Tier.TubeTier.BASIC);
}
else if(name.equals("mekanism:pressurized_tube_advanced"))
{
return new PartPressurizedTube(Tier.TubeTier.ADVANCED);
}
else if(name.equals("mekanism:pressurized_tube_elite"))
{
return new PartPressurizedTube(Tier.TubeTier.ELITE);
}
else if(name.equals("mekanism:pressurized_tube_ultimate"))
{
return new PartPressurizedTube(Tier.TubeTier.ULTIMATE);
}
else if(name.equals("mekanism:logistical_transporter_basic") || name.equals("mekanism:logistical_transporter"))
{
return new PartLogisticalTransporter(Tier.TransporterTier.BASIC);
}
else if(name.equals("mekanism:logistical_transporter_advanced"))
{
return new PartLogisticalTransporter(Tier.TransporterTier.ADVANCED);
}
else if(name.equals("mekanism:logistical_transporter_elite"))
{
return new PartLogisticalTransporter(Tier.TransporterTier.ELITE);
}
else if(name.equals("mekanism:logistical_transporter_ultimate"))
{
return new PartLogisticalTransporter(Tier.TransporterTier.ULTIMATE);
}
else if(name.equals("mekanism:restrictive_transporter"))
{
return new PartRestrictiveTransporter();
}
else if(name.equals("mekanism:diversion_transporter"))
{
return new PartDiversionTransporter();
}
else if(name.equals("mekanism:thermodynamic_conductor_basic"))
{
return new PartThermodynamicConductor(Tier.ConductorTier.BASIC);
}
else if(name.equals("mekanism:thermodynamic_conductor_advanced"))
{
return new PartThermodynamicConductor(Tier.ConductorTier.ADVANCED);
}
else if(name.equals("mekanism:thermodynamic_conductor_elite"))
{
return new PartThermodynamicConductor(Tier.ConductorTier.ELITE);
}
else if(name.equals("mekanism:thermodynamic_conductor_ultimate"))
{
return new PartThermodynamicConductor(Tier.ConductorTier.ULTIMATE);
}
else if(name.equals("mekanism:glow_panel"))
{
return new PartGlowPanel();
}
return null;
}
public void registerMicroMaterials()
{
for(int i = 0; i < 16; i++)
{
// MicroblockRegistry.registerMaterial(new PlasticMicroMaterial(MekanismBlocks.PlasticBlock, i), BlockMicroMaterial.materialKey(MekanismBlocks.PlasticBlock, i));
// MicroMaterialRegistry.registerMaterial(new PlasticMicroMaterial(MekanismBlocks.GlowPlasticBlock, i), BlockMicroMaterial.materialKey(MekanismBlocks.GlowPlasticBlock, i));
// MicroMaterialRegistry.registerMaterial(new PlasticMicroMaterial(MekanismBlocks.SlickPlasticBlock, i), BlockMicroMaterial.materialKey(MekanismBlocks.SlickPlasticBlock, i));
// MicroMaterialRegistry.registerMaterial(new PlasticMicroMaterial(MekanismBlocks.ReinforcedPlasticBlock, i), BlockMicroMaterial.materialKey(MekanismBlocks.ReinforcedPlasticBlock, i));
// MicroMaterialRegistry.registerMaterial(new PlasticMicroMaterial(MekanismBlocks.RoadPlasticBlock, i), BlockMicroMaterial.materialKey(MekanismBlocks.RoadPlasticBlock, i));
FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(MekanismBlocks.BasicBlock, 1, i));
if(!MachineType.get(MACHINE_BLOCK_1, i).hasModel)
{
FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(MekanismBlocks.MachineBlock, 1, i));
}
if(!MachineType.get(MACHINE_BLOCK_2, i).hasModel)
{
FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(MekanismBlocks.MachineBlock2, 1, i));
}
}
FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(MekanismBlocks.BasicBlock2, 1, 0));
FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(MekanismBlocks.CardboardBox));
}
public static void dropItem(ItemStack stack, Multipart multipart)
{
EntityItem item = new EntityItem(multipart.getWorld(), multipart.getPos().getX()+0.5, multipart.getPos().getY()+0.5, multipart.getPos().getZ()+0.5, stack);
item.motionX = multipart.getWorld().rand.nextGaussian() * 0.05;
item.motionY = multipart.getWorld().rand.nextGaussian() * 0.05 + 0.2;
item.motionZ = multipart.getWorld().rand.nextGaussian() * 0.05;
item.setDefaultPickupDelay();
multipart.getWorld().spawnEntityInWorld(item);
}
public static void dropItems(Multipart multipart)
{
for(ItemStack stack : multipart.getDrops())
{
dropItem(stack, multipart);
}
}
public static AxisAlignedBB rotate(AxisAlignedBB aabb, EnumFacing side)
{
Vec3d v1 = rotate(new Vec3d(aabb.minX, aabb.minY, aabb.minZ), side);
Vec3d v2 = rotate(new Vec3d(aabb.maxX, aabb.maxY, aabb.maxZ), side);
return new AxisAlignedBB(v1.xCoord, v1.yCoord, v1.zCoord, v2.xCoord, v2.yCoord, v2.zCoord);
}
public static Vec3d rotate(Vec3d vec, EnumFacing side)
{
switch(side)
{
case DOWN:
return new Vec3d(vec.xCoord, vec.yCoord, vec.zCoord);
case UP:
return new Vec3d(vec.xCoord, -vec.yCoord, -vec.zCoord);
case NORTH:
return new Vec3d(vec.xCoord, -vec.zCoord, vec.yCoord);
case SOUTH:
return new Vec3d(vec.xCoord, vec.zCoord, -vec.yCoord);
case WEST:
return new Vec3d(vec.yCoord, -vec.xCoord, vec.zCoord);
case EAST:
return new Vec3d(-vec.yCoord, vec.xCoord, vec.zCoord);
}
return null;
}
}