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.RenderTransformer;
import resonantinduction.mechanical.gear.ItemGear;
import resonantinduction.mechanical.gear.ItemGearShaft;
import resonantinduction.mechanical.gear.RenderGear;
import resonantinduction.mechanical.gear.RenderGearShaft;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -51,6 +53,10 @@ public class RenderRIItem implements IItemRenderer
{
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)
{
GL11.glRotatef(180, 0, 1, 0);

View file

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

View file

@ -18,6 +18,7 @@ import resonantinduction.mechanical.fluid.pump.TileGrate;
import resonantinduction.mechanical.fluid.tank.BlockTank;
import resonantinduction.mechanical.fluid.tank.TileTank;
import resonantinduction.mechanical.gear.ItemGear;
import resonantinduction.mechanical.gear.ItemGearShaft;
import resonantinduction.mechanical.item.ItemPipeGauge;
import resonantinduction.mechanical.logistic.BlockDetector;
import resonantinduction.mechanical.logistic.BlockManipulator;
@ -72,7 +73,7 @@ public class Mechanical
// Energy
public static Item itemGear;
public static Block itemGearShaft;
public static Item itemGearShaft;
// Transport
public static Block blockConveyorBelt;
@ -101,6 +102,7 @@ public class Mechanical
Settings.load();
NetworkRegistry.instance().registerGuiHandler(this, proxy);
itemGear = contentRegistry.createItem(ItemGear.class);
itemGearShaft = contentRegistry.createItem(ItemGearShaft.class);
blockConveyorBelt = contentRegistry.createTile(BlockConveyorBelt.class, TileConveyorBelt.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.gear.PartGear;
import resonantinduction.mechanical.gear.PartGearShaft;
import codechicken.multipart.MultiPartRegistry;
import codechicken.multipart.MultiPartRegistry.IPartFactory;
import codechicken.multipart.MultipartGenerator;
@ -11,7 +12,7 @@ public class MultipartMechanical implements IPartFactory
{
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()
{
@ -27,6 +28,10 @@ public class MultipartMechanical implements IPartFactory
{
return new PartGear();
}
else if (name.equals("resonant_induction_gear_shaft"))
{
return new PartGearShaft();
}
else if (name.equals("resonant_induction_pipe"))
{
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;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@ -16,8 +17,11 @@ import resonantinduction.mechanical.network.PartMechanical;
import calclavia.lib.multiblock.reference.IMultiBlockStructure;
import calclavia.lib.multiblock.reference.MultiBlockHandler;
import calclavia.lib.prefab.block.BlockAdvanced;
import codechicken.lib.vec.Cuboid6;
import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Transformation;
import codechicken.lib.vec.Vector3;
import codechicken.microblock.FaceMicroClass;
import codechicken.multipart.ControlKeyModifer;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
@ -32,6 +36,20 @@ import cpw.mods.fml.relauncher.SideOnly;
*/
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;
@Override
@ -82,13 +100,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
@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);
}
if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), x(), y(), z()))
{
if (player.isSneaking())
@ -112,7 +123,7 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
return true;
}
return false;
return super.activate(player, hit, item);
}
@Override
@ -159,14 +170,21 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
for (int i = 0; i < 6; 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;
getNetwork().merge(instance.getNetwork());
}
}
}
int displaceCheck = 1;
@ -338,12 +356,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
return multiBlock;
}
@Override
public universalelectricity.api.vector.Vector3 getPosition()
{
return new universalelectricity.api.vector.Vector3(x(), y(), z());
}
@Override
public float getRatio(ForgeDirection dir)
{
@ -377,9 +389,13 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
*/
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;
}
@ -422,4 +438,25 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
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.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MovingObjectPosition;
@ -28,19 +29,6 @@ import codechicken.multipart.TMultiPart;
*/
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;
@ -68,12 +56,25 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
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
public void update()
{
// TODO: Fix gear network somehow tick while network is invalid.
getNetwork().addConnector(this);
ticks++;
angle += angularVelocity / 20;
@ -183,18 +184,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
// 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
public int redstoneConductionMap()
{
@ -207,16 +196,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
return true;
}
/**
* Multipart Methods
*/
@Override
public Iterable<Cuboid6> getOcclusionBoxes()
{
return Arrays.asList(oBoxes[this.placementSide.ordinal()]);
}
@Override
public void load(NBTTagCompound nbt)
{
@ -265,7 +244,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
@Override
public void setNetwork(IMechanicalNetwork network)
{
network = network;
this.network = network;
}
@Override
@ -312,4 +291,10 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
{
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.IMechanicalNetwork;
import universalelectricity.api.vector.Vector3;
import codechicken.multipart.PartMap;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;