package com.amadornes.framez.movement.handler;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import uk.co.qmunity.lib.vec.Vec3i;
import codechicken.lib.vec.BlockCoord;
import codechicken.microblock.CommonMicroblock;
import codechicken.microblock.FaceMicroblock;
import codechicken.microblock.HollowMicroblock;
import codechicken.multipart.PartMap;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TSlottedPart;
import codechicken.multipart.TileMultipart;
import com.amadornes.framez.api.Priority;
import com.amadornes.framez.api.Priority.PriorityEnum;
import com.amadornes.framez.api.movement.BlockMovementType;
import com.amadornes.framez.api.movement.IFrame;
import com.amadornes.framez.api.movement.IMovement;
import com.amadornes.framez.api.movement.IMovementHandler;
import com.amadornes.framez.api.movement.IMovingBlock;
import com.amadornes.framez.api.movement.ISticky;
import com.amadornes.framez.api.movement.IStickyProvider;
public class MovementHandlerFMP implements IMovementHandler, IStickyProvider {
@Override
@Priority(PriorityEnum.OVERRIDE)
public BlockMovementType getMovementType(World world, int x, int y, int z, ForgeDirection side, IMovement movement) {
TileMultipart tmp = TileMultipart.getTile(world, new BlockCoord(x, y, z));
if (tmp == null)
return null;
for (TMultiPart p : tmp.jPartList()) {
if (p instanceof TSlottedPart) {
int slot = ((TSlottedPart) p).getSlotMask();
if (slot == PartMap.face(side.ordinal()).mask && (p instanceof FaceMicroblock || p instanceof HollowMicroblock)) {
if (((CommonMicroblock) p).getSize() == 1)
return BlockMovementType.UNMOVABLE;
}
}
}
return null;
}
@Override
public boolean startMoving(IMovingBlock block) {
TileMultipart tmp = (TileMultipart) block.getTileEntity();
if (!block.getWorld().isRemote)
for (TMultiPart p : tmp.jPartList())
p.onWorldSeparate();
block.startMoving(true, false);
if (!block.getWorld().isRemote) {
for (TMultiPart p : tmp.jPartList()) {
p.onWorldJoin();
p.onMoved();
}
}
return true;
}
@Override
public boolean finishMoving(IMovingBlock block) {
TileMultipart tmp = (TileMultipart) block.getTileEntity();
if (!block.getWorld().isRemote)
for (TMultiPart p : tmp.jPartList())
p.onWorldSeparate();
if (!block.getWorld().isRemote) {
List<TMultiPart> l = new ArrayList<TMultiPart>(tmp.jPartList());
if (tmp != null)
tmp.clearParts();
Vec3i v = block.getStructure().getMovement().transform(new Vec3i(block));
for (TMultiPart p : l) {
p.onWorldSeparate();
TileMultipart.addPart(block.getWorld(), new BlockCoord(v.getX(), v.getY(), v.getZ()), p);
p.onMoved();
}
}
return true;
}
@Override
public boolean canHandle(World world, int x, int y, int z) {
return TileMultipart.getTile(world, new BlockCoord(x, y, z)) != null;
}
@Override
public ISticky getStickyAt(World world, int x, int y, int z) {
TileMultipart tmp = TileMultipart.getTile(world, new BlockCoord(x, y, z));
if (tmp != null)
return StickyHandlerFMP.instance();
return null;
}
@Override
public IFrame getFrameAt(World world, int x, int y, int z) {
// TileMultipart tmp = TileMultipart.getTile(world, new BlockCoord(x, y, z));
// if (tmp != null)
// return StickyHandlerFMP.instance();
return null;
}
}