Added gear shaft

This commit is contained in:
Calclavia 2014-01-28 13:42:52 +08:00
parent 73ddd6ff18
commit 17108484f9
10 changed files with 324 additions and 57 deletions

View file

@ -12,7 +12,9 @@ import resonantinduction.electrical.multimeter.RenderMultimeter;
import resonantinduction.electrical.transformer.ItemTransformer; import resonantinduction.electrical.transformer.ItemTransformer;
import resonantinduction.electrical.transformer.RenderTransformer; import resonantinduction.electrical.transformer.RenderTransformer;
import resonantinduction.mechanical.gear.ItemGear; import resonantinduction.mechanical.gear.ItemGear;
import resonantinduction.mechanical.gear.ItemGearShaft;
import resonantinduction.mechanical.gear.RenderGear; import resonantinduction.mechanical.gear.RenderGear;
import resonantinduction.mechanical.gear.RenderGearShaft;
import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@ -51,6 +53,10 @@ public class RenderRIItem implements IItemRenderer
{ {
RenderGear.INSTANCE.renderInventory(null, 0, 0, null); RenderGear.INSTANCE.renderInventory(null, 0, 0, null);
} }
else if (item.getItem() instanceof ItemGearShaft)
{
RenderGearShaft.INSTANCE.renderInventory(null, 0, 0, null);
}
else if (item.getItem() instanceof ItemMultimeter) else if (item.getItem() instanceof ItemMultimeter)
{ {
GL11.glRotatef(180, 0, 1, 0); GL11.glRotatef(180, 0, 1, 0);

View file

@ -14,6 +14,7 @@ public class ClientProxy extends CommonProxy
public void preInit() public void preInit()
{ {
MinecraftForgeClient.registerItemRenderer(Mechanical.itemGear.itemID, RenderRIItem.INSTANCE); MinecraftForgeClient.registerItemRenderer(Mechanical.itemGear.itemID, RenderRIItem.INSTANCE);
MinecraftForgeClient.registerItemRenderer(Mechanical.itemGearShaft.itemID, RenderRIItem.INSTANCE);
} }
@Override @Override

View file

@ -18,6 +18,7 @@ import resonantinduction.mechanical.fluid.pump.TileGrate;
import resonantinduction.mechanical.fluid.tank.BlockTank; import resonantinduction.mechanical.fluid.tank.BlockTank;
import resonantinduction.mechanical.fluid.tank.TileTank; import resonantinduction.mechanical.fluid.tank.TileTank;
import resonantinduction.mechanical.gear.ItemGear; import resonantinduction.mechanical.gear.ItemGear;
import resonantinduction.mechanical.gear.ItemGearShaft;
import resonantinduction.mechanical.item.ItemPipeGauge; import resonantinduction.mechanical.item.ItemPipeGauge;
import resonantinduction.mechanical.logistic.BlockDetector; import resonantinduction.mechanical.logistic.BlockDetector;
import resonantinduction.mechanical.logistic.BlockManipulator; import resonantinduction.mechanical.logistic.BlockManipulator;
@ -72,7 +73,7 @@ public class Mechanical
// Energy // Energy
public static Item itemGear; public static Item itemGear;
public static Block itemGearShaft; public static Item itemGearShaft;
// Transport // Transport
public static Block blockConveyorBelt; public static Block blockConveyorBelt;
@ -101,6 +102,7 @@ public class Mechanical
Settings.load(); Settings.load();
NetworkRegistry.instance().registerGuiHandler(this, proxy); NetworkRegistry.instance().registerGuiHandler(this, proxy);
itemGear = contentRegistry.createItem(ItemGear.class); itemGear = contentRegistry.createItem(ItemGear.class);
itemGearShaft = contentRegistry.createItem(ItemGearShaft.class);
blockConveyorBelt = contentRegistry.createTile(BlockConveyorBelt.class, TileConveyorBelt.class); blockConveyorBelt = contentRegistry.createTile(BlockConveyorBelt.class, TileConveyorBelt.class);
blockManipulator = contentRegistry.createTile(BlockManipulator.class, TileManipulator.class); blockManipulator = contentRegistry.createTile(BlockManipulator.class, TileManipulator.class);

View file

@ -2,6 +2,7 @@ package resonantinduction.mechanical;
import resonantinduction.mechanical.fluid.pipe.PartPipe; import resonantinduction.mechanical.fluid.pipe.PartPipe;
import resonantinduction.mechanical.gear.PartGear; import resonantinduction.mechanical.gear.PartGear;
import resonantinduction.mechanical.gear.PartGearShaft;
import codechicken.multipart.MultiPartRegistry; import codechicken.multipart.MultiPartRegistry;
import codechicken.multipart.MultiPartRegistry.IPartFactory; import codechicken.multipart.MultiPartRegistry.IPartFactory;
import codechicken.multipart.MultipartGenerator; import codechicken.multipart.MultipartGenerator;
@ -11,7 +12,7 @@ public class MultipartMechanical implements IPartFactory
{ {
public static MultipartMechanical INSTANCE; public static MultipartMechanical INSTANCE;
public static final String[] PART_TYPES = { "resonant_induction_gear", "resonant_induction_pipe" }; public static final String[] PART_TYPES = { "resonant_induction_gear", "resonant_induction_gear_shaft", "resonant_induction_pipe" };
public MultipartMechanical() public MultipartMechanical()
{ {
@ -27,6 +28,10 @@ public class MultipartMechanical implements IPartFactory
{ {
return new PartGear(); return new PartGear();
} }
else if (name.equals("resonant_induction_gear_shaft"))
{
return new PartGearShaft();
}
else if (name.equals("resonant_induction_pipe")) else if (name.equals("resonant_induction_pipe"))
{ {
return new PartPipe(); return new PartPipe();

View file

@ -0,0 +1,32 @@
package resonantinduction.mechanical.gear;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import resonantinduction.core.Settings;
import resonantinduction.core.prefab.part.ItemMultipartBase;
import codechicken.lib.vec.BlockCoord;
import codechicken.lib.vec.Vector3;
import codechicken.multipart.MultiPartRegistry;
import codechicken.multipart.TMultiPart;
public class ItemGearShaft extends ItemMultipartBase
{
public ItemGearShaft()
{
super("gearShaft", Settings.getNextItemID());
}
@Override
public TMultiPart newPart(ItemStack itemStack, EntityPlayer player, World world, BlockCoord pos, int side, Vector3 hit)
{
PartGearShaft part = (PartGearShaft) MultiPartRegistry.createPart("resonant_induction_gear_shaft", false);
if (part != null)
{
part.preparePlacement(side, itemStack.getItemDamage());
}
return part;
}
}

View file

@ -1,5 +1,6 @@
package resonantinduction.mechanical.gear; package resonantinduction.mechanical.gear;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -16,8 +17,11 @@ import resonantinduction.mechanical.network.PartMechanical;
import calclavia.lib.multiblock.reference.IMultiBlockStructure; import calclavia.lib.multiblock.reference.IMultiBlockStructure;
import calclavia.lib.multiblock.reference.MultiBlockHandler; import calclavia.lib.multiblock.reference.MultiBlockHandler;
import calclavia.lib.prefab.block.BlockAdvanced; import calclavia.lib.prefab.block.BlockAdvanced;
import codechicken.lib.vec.Cuboid6;
import codechicken.lib.vec.Rotation; import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Transformation;
import codechicken.lib.vec.Vector3; import codechicken.lib.vec.Vector3;
import codechicken.microblock.FaceMicroClass;
import codechicken.multipart.ControlKeyModifer; import codechicken.multipart.ControlKeyModifer;
import codechicken.multipart.TMultiPart; import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart; import codechicken.multipart.TileMultipart;
@ -32,6 +36,20 @@ import cpw.mods.fml.relauncher.SideOnly;
*/ */
public class PartGear extends PartMechanical implements IMechanical, IMultiBlockStructure<PartGear> public class PartGear extends PartMechanical implements IMechanical, IMultiBlockStructure<PartGear>
{ {
public static Cuboid6[][] oBoxes = new Cuboid6[6][2];
static
{
oBoxes[0][0] = new Cuboid6(1 / 8D, 0, 0, 7 / 8D, 1 / 8D, 1);
oBoxes[0][1] = new Cuboid6(0, 0, 1 / 8D, 1, 1 / 8D, 7 / 8D);
for (int s = 1; s < 6; s++)
{
Transformation t = Rotation.sideRotations[s].at(Vector3.center);
oBoxes[s][0] = oBoxes[0][0].copy().apply(t);
oBoxes[s][1] = oBoxes[0][1].copy().apply(t);
}
}
private int manualCrankTime = 0; private int manualCrankTime = 0;
@Override @Override
@ -82,13 +100,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
@Override @Override
public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item) public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item)
{ {
if (!world().isRemote)
{
// System.out.println(this + ":" + getNetwork());
// for(Object obj : connections)
// System.out.println(obj);
}
if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), x(), y(), z())) if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), x(), y(), z()))
{ {
if (player.isSneaking()) if (player.isSneaking())
@ -112,7 +123,7 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
return true; return true;
} }
return false; return super.activate(player, hit, item);
} }
@Override @Override
@ -159,14 +170,21 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
ForgeDirection checkDir = ForgeDirection.getOrientation(i); ForgeDirection checkDir = ForgeDirection.getOrientation(i);
IMechanical instance = ((IMechanical) tile()).getInstance(checkDir);
if (connections[checkDir.ordinal()] == null && checkDir != placementSide && checkDir != placementSide.getOpposite() && instance != null && instance.canConnect(checkDir.getOpposite(), this)) /**
* If we're checking for the block that is opposite to the gear's placement side
* (the center), then we try to look for a gear shaft in the center.
*/
IMechanical instance = ((IMechanical) tile()).getInstance(checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir);
if (connections[checkDir.ordinal()] == null && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this))
{ {
connections[checkDir.ordinal()] = instance; connections[checkDir.ordinal()] = instance;
getNetwork().merge(instance.getNetwork()); getNetwork().merge(instance.getNetwork());
} }
} }
} }
int displaceCheck = 1; int displaceCheck = 1;
@ -338,12 +356,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
return multiBlock; return multiBlock;
} }
@Override
public universalelectricity.api.vector.Vector3 getPosition()
{
return new universalelectricity.api.vector.Vector3(x(), y(), z());
}
@Override @Override
public float getRatio(ForgeDirection dir) public float getRatio(ForgeDirection dir)
{ {
@ -377,9 +389,13 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
*/ */
if (from == placementSide.getOpposite()) if (from == placementSide.getOpposite())
{ {
if (source instanceof PartGear) if (source instanceof PartGear || source instanceof PartGearShaft)
{ {
if (((PartGear) source).tile() == tile() && !getMultiBlock().isConstructed()) if (source instanceof PartGearShaft)
{
return true;
}
else if (((PartGear) source).tile() == tile() && !getMultiBlock().isConstructed())
{ {
return true; return true;
} }
@ -422,4 +438,25 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
return false; return false;
} }
/**
* Multipart Bounds
*/
@Override
public Iterable<Cuboid6> getOcclusionBoxes()
{
return Arrays.asList(oBoxes[this.placementSide.ordinal()]);
}
@Override
public int getSlotMask()
{
return 1 << this.placementSide.ordinal();
}
@Override
public Cuboid6 getBounds()
{
return FaceMicroClass.aBounds()[0x10 | this.placementSide.ordinal()];
}
} }

View file

@ -0,0 +1,152 @@
package resonantinduction.mechanical.gear;
import java.util.Arrays;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.PartMechanical;
import codechicken.lib.raytracer.IndexedCuboid6;
import codechicken.lib.vec.Cuboid6;
import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Vector3;
import codechicken.multipart.PartMap;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* We assume all the force acting on the gear is 90 degrees.
*
* @author Calclavia
*
*/
public class PartGearShaft extends PartMechanical
{
public static Cuboid6[] sides = new Cuboid6[7];
static
{
sides[0] = new IndexedCuboid6(0, new Cuboid6(0.36, 0.000, 0.36, 0.64, 0.36, 0.64));
sides[1] = new IndexedCuboid6(1, new Cuboid6(0.36, 0.64, 0.36, 0.64, 1.000, 0.64));
sides[2] = new IndexedCuboid6(2, new Cuboid6(0.36, 0.36, 0.000, 0.64, 0.64, 0.36));
sides[3] = new IndexedCuboid6(3, new Cuboid6(0.36, 0.36, 0.64, 0.64, 0.64, 1.000));
sides[4] = new IndexedCuboid6(4, new Cuboid6(0.000, 0.36, 0.36, 0.36, 0.64, 0.64));
sides[5] = new IndexedCuboid6(5, new Cuboid6(0.64, 0.36, 0.36, 1.000, 0.64, 0.64));
sides[6] = new IndexedCuboid6(6, new Cuboid6(0.36, 0.36, 0.36, 0.64, 0.64, 0.64));
}
@Override
public void update()
{
super.update();
if (!this.world().isRemote)
{
// Decelerate the gear.
torque *= 0.95f;
angularVelocity *= 0.95f;
}
}
/**
* Refresh should be called sparingly.
*/
public void refresh()
{
connections = new Object[6];
/** Check for internal connections, the FRONT and BACK. */
for (int i = 0; i < 6; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
if (checkDir == placementSide || checkDir == placementSide.getOpposite())
{
IMechanical instance = ((IMechanical) tile()).getInstance(checkDir);
System.out.println("FOUND POSSIBLE CHECK"+instance);
if (instance != null && instance.canConnect(checkDir.getOpposite(), this))
{
connections[checkDir.ordinal()] = instance;
getNetwork().merge(instance.getNetwork());
}
}
}
/** Look for connections outside this block space, the relative FRONT and BACK */
for (int i = 0; i < 4; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(this.placementSide.ordinal(), i));
if (connections[checkDir.ordinal()] == null && (checkDir == placementSide || checkDir == placementSide.getOpposite()))
{
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
if (checkTile instanceof IMechanical)
{
IMechanical instance = (IMechanical) ((IMechanical) checkTile).getInstance(placementSide);
if (instance != null && instance.canConnect(checkDir.getOpposite(), this))
{
connections[checkDir.ordinal()] = instance;
getNetwork().merge(instance.getNetwork());
}
}
}
}
getNetwork().reconstruct();
}
@Override
protected ItemStack getItem()
{
return new ItemStack(Mechanical.itemGearShaft);
}
@Override
@SideOnly(Side.CLIENT)
public void renderDynamic(Vector3 pos, float frame, int pass)
{
if (pass == 0)
{
RenderGearShaft.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z, frame);
}
}
@Override
public String getType()
{
return "resonant_induction_gear_shaft";
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
return from == placementSide || from == placementSide.getOpposite();
}
/**
* Multipart Bounds
*/
@Override
public int getSlotMask()
{
return PartMap.CENTER.mask;
}
@Override
public Iterable<Cuboid6> getOcclusionBoxes()
{
return Arrays.asList(sides);
}
@Override
public Cuboid6 getBounds()
{
return new Cuboid6(0.375, 0.375, 0.375, 0.625, 0.625, 0.625);
}
}

View file

@ -0,0 +1,46 @@
package resonantinduction.mechanical.gear;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;
import org.lwjgl.opengl.GL11;
import resonantinduction.core.Reference;
import calclavia.lib.render.RenderUtility;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class RenderGearShaft
{
public static final RenderGearShaft INSTANCE = new RenderGearShaft();
public final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "gears.obj");
public void renderInventory(Block block, int metadata, int modelID, RenderBlocks renderer)
{
GL11.glRotatef(90, 1, 0, 0);
RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "planks_oak.png");
MODEL.renderOnly("Shaft");
}
public void renderDynamic(PartGearShaft part, double x, double y, double z, float frame)
{
GL11.glPushMatrix();
// Center the model first.
GL11.glTranslatef((float) x + 0.5f, (float) y + 0.5f, (float) z + 0.5f);
GL11.glTranslatef(0, 0.5f, 0);
GL11.glPushMatrix();
RenderUtility.rotateFaceBlockToSide(part.placementSide);
GL11.glRotatef((float) Math.toDegrees(part.angle), 0, 1, 0);
RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "planks_oak.png");
MODEL.renderOnly("Shaft");
GL11.glPopMatrix();
GL11.glPopMatrix();
}
}

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition;
@ -28,19 +29,6 @@ import codechicken.multipart.TMultiPart;
*/ */
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanical public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanical
{ {
public static Cuboid6[][] oBoxes = new Cuboid6[6][2];
static
{
oBoxes[0][0] = new Cuboid6(1 / 8D, 0, 0, 7 / 8D, 1 / 8D, 1);
oBoxes[0][1] = new Cuboid6(0, 0, 1 / 8D, 1, 1 / 8D, 7 / 8D);
for (int s = 1; s < 6; s++)
{
Transformation t = Rotation.sideRotations[s].at(Vector3.center);
oBoxes[s][0] = oBoxes[0][0].copy().apply(t);
oBoxes[s][1] = oBoxes[0][1].copy().apply(t);
}
}
private IMechanicalNetwork network; private IMechanicalNetwork network;
@ -68,12 +56,25 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1)); this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1));
} }
@Override
public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item)
{
if (!world().isRemote)
{
System.out.println(this + ":" + getNetwork());
for(Object obj : connections)
System.out.println(obj);
}
return false;
}
@Override @Override
public void update() public void update()
{ {
// TODO: Fix gear network somehow tick while network is invalid. // TODO: Fix gear network somehow tick while network is invalid.
getNetwork().addConnector(this); getNetwork().addConnector(this);
ticks++; ticks++;
angle += angularVelocity / 20; angle += angularVelocity / 20;
@ -183,18 +184,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
// read(packet, packet.readUByte()); // read(packet, packet.readUByte());
} }
@Override
public int getSlotMask()
{
return 1 << this.placementSide.ordinal();
}
@Override
public Cuboid6 getBounds()
{
return FaceMicroClass.aBounds()[0x10 | this.placementSide.ordinal()];
}
@Override @Override
public int redstoneConductionMap() public int redstoneConductionMap()
{ {
@ -207,16 +196,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
return true; return true;
} }
/**
* Multipart Methods
*/
@Override
public Iterable<Cuboid6> getOcclusionBoxes()
{
return Arrays.asList(oBoxes[this.placementSide.ordinal()]);
}
@Override @Override
public void load(NBTTagCompound nbt) public void load(NBTTagCompound nbt)
{ {
@ -265,7 +244,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
@Override @Override
public void setNetwork(IMechanicalNetwork network) public void setNetwork(IMechanicalNetwork network)
{ {
network = network; this.network = network;
} }
@Override @Override
@ -312,4 +291,10 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
{ {
return this; return this;
} }
@Override
public universalelectricity.api.vector.Vector3 getPosition()
{
return new universalelectricity.api.vector.Vector3(x(), y(), z());
}
} }

View file

@ -7,6 +7,7 @@ import net.minecraftforge.common.ForgeDirection;
import resonantinduction.mechanical.network.IMechanical; import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.IMechanicalNetwork; import resonantinduction.mechanical.network.IMechanicalNetwork;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import codechicken.multipart.PartMap;
import codechicken.multipart.TMultiPart; import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart; import codechicken.multipart.TileMultipart;