From 17108484f92bf3c990b7aebda15c33885f02c430 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Tue, 28 Jan 2014 13:42:52 +0800 Subject: [PATCH] Added gear shaft --- .../core/render/RenderRIItem.java | 6 + .../mechanical/ClientProxy.java | 1 + .../mechanical/Mechanical.java | 4 +- .../mechanical/MultipartMechanical.java | 7 +- .../mechanical/gear/ItemGearShaft.java | 32 ++++ .../mechanical/gear/PartGear.java | 73 ++++++--- .../mechanical/gear/PartGearShaft.java | 152 ++++++++++++++++++ .../mechanical/gear/RenderGearShaft.java | 46 ++++++ .../mechanical/network/PartMechanical.java | 59 +++---- .../mechanical/trait/TraitMechanical.java | 1 + 10 files changed, 324 insertions(+), 57 deletions(-) create mode 100644 src/main/java/resonantinduction/mechanical/gear/ItemGearShaft.java create mode 100644 src/main/java/resonantinduction/mechanical/gear/PartGearShaft.java create mode 100644 src/main/java/resonantinduction/mechanical/gear/RenderGearShaft.java diff --git a/src/main/java/resonantinduction/core/render/RenderRIItem.java b/src/main/java/resonantinduction/core/render/RenderRIItem.java index 975babc9..5192006d 100644 --- a/src/main/java/resonantinduction/core/render/RenderRIItem.java +++ b/src/main/java/resonantinduction/core/render/RenderRIItem.java @@ -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); diff --git a/src/main/java/resonantinduction/mechanical/ClientProxy.java b/src/main/java/resonantinduction/mechanical/ClientProxy.java index 13a5f7aa..34b4726c 100644 --- a/src/main/java/resonantinduction/mechanical/ClientProxy.java +++ b/src/main/java/resonantinduction/mechanical/ClientProxy.java @@ -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 diff --git a/src/main/java/resonantinduction/mechanical/Mechanical.java b/src/main/java/resonantinduction/mechanical/Mechanical.java index 58583785..a1afaa35 100644 --- a/src/main/java/resonantinduction/mechanical/Mechanical.java +++ b/src/main/java/resonantinduction/mechanical/Mechanical.java @@ -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); diff --git a/src/main/java/resonantinduction/mechanical/MultipartMechanical.java b/src/main/java/resonantinduction/mechanical/MultipartMechanical.java index 7257afdb..72932a46 100644 --- a/src/main/java/resonantinduction/mechanical/MultipartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/MultipartMechanical.java @@ -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(); diff --git a/src/main/java/resonantinduction/mechanical/gear/ItemGearShaft.java b/src/main/java/resonantinduction/mechanical/gear/ItemGearShaft.java new file mode 100644 index 00000000..e889adb0 --- /dev/null +++ b/src/main/java/resonantinduction/mechanical/gear/ItemGearShaft.java @@ -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; + } +} diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index d017381e..86e012bd 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -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 { + 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 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()]; + } } \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGearShaft.java b/src/main/java/resonantinduction/mechanical/gear/PartGearShaft.java new file mode 100644 index 00000000..362c8479 --- /dev/null +++ b/src/main/java/resonantinduction/mechanical/gear/PartGearShaft.java @@ -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 getOcclusionBoxes() + { + return Arrays.asList(sides); + } + + @Override + public Cuboid6 getBounds() + { + return new Cuboid6(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + } + +} \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/gear/RenderGearShaft.java b/src/main/java/resonantinduction/mechanical/gear/RenderGearShaft.java new file mode 100644 index 00000000..9f1cd14a --- /dev/null +++ b/src/main/java/resonantinduction/mechanical/gear/RenderGearShaft.java @@ -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(); + } +} \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java index b1301a02..96e264cb 100644 --- a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java @@ -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 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()); + } } \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java index 91d8c79c..83e42637 100644 --- a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java +++ b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java @@ -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;