diff --git a/archaic/src/main/java/resonantinduction/archaic/Archaic.java b/archaic/src/main/java/resonantinduction/archaic/Archaic.java index 6cace077..3ed16db5 100644 --- a/archaic/src/main/java/resonantinduction/archaic/Archaic.java +++ b/archaic/src/main/java/resonantinduction/archaic/Archaic.java @@ -28,7 +28,7 @@ import resonantinduction.core.ResonantInduction; import resonantinduction.core.Settings; import resonantinduction.core.TabRI; import resonantinduction.core.prefab.imprint.ItemImprint; -import resonantinduction.mechanical.gear.ItemHandCrank; +import resonantinduction.core.resource.ItemHandCrank; import calclavia.lib.content.ContentRegistry; import calclavia.lib.network.PacketAnnotation; import calclavia.lib.network.PacketHandler; diff --git a/archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java b/archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java deleted file mode 100644 index 3404924c..00000000 --- a/archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java +++ /dev/null @@ -1,52 +0,0 @@ -package resonantinduction.archaic.piston; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import resonantinduction.core.Reference; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderPiston extends TileEntitySpecialRenderer -{ - public static ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "piston.png"); - - @Override - public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float f) - { - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - - // Angle in radians of the rotor. - float angle = 0; - float radius = 0; - // Length of piston arm - float length = 0.8f; - - double beta = Math.asin((radius * Math.sin(angle)) / length); - - /** - * Render Piston Arm - */ - GL11.glPushMatrix(); - double pistonTranslateX = 2 * length * Math.cos(beta); - double pistonTranslateY = 2 * length * Math.sin(beta); - - GL11.glTranslated(pistonTranslateX, 0, pistonTranslateY); - GL11.glRotated(Math.toDegrees(beta), 0, 0, 1); - GL11.glPopMatrix(); - - /** - * Render Piston Rotor - */ - GL11.glPushMatrix(); - GL11.glRotated(Math.toDegrees(angle), 0, 0, 1); - GL11.glPopMatrix(); - - GL11.glPopMatrix(); - } -} \ No newline at end of file diff --git a/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java b/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java index dd42a193..3e451c7e 100644 --- a/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java +++ b/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java @@ -9,7 +9,7 @@ import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import resonantinduction.core.Reference; -import resonantinduction.mechanical.gear.ItemHandCrank; +import resonantinduction.core.resource.ItemHandCrank; import universalelectricity.api.vector.Vector3; import calclavia.lib.prefab.block.BlockTile; import calclavia.lib.utility.inventory.InventoryUtility; diff --git a/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java index 102b7c78..89db4854 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java @@ -23,7 +23,6 @@ import resonantinduction.mechanical.fluid.transport.TileGrate; import resonantinduction.mechanical.fluid.transport.TilePump; import resonantinduction.mechanical.gear.ItemGear; import resonantinduction.mechanical.gear.ItemGearShaft; -import resonantinduction.mechanical.gear.ItemHandCrank; import resonantinduction.mechanical.logistic.belt.BlockDetector; import resonantinduction.mechanical.logistic.belt.BlockManipulator; import resonantinduction.mechanical.logistic.belt.BlockRejector; @@ -33,6 +32,8 @@ import resonantinduction.mechanical.logistic.belt.TileRejector; import resonantinduction.mechanical.network.PacketNetwork; import resonantinduction.mechanical.process.BlockFilter; import resonantinduction.mechanical.process.TileFilter; +import resonantinduction.mechanical.process.crusher.BlockMechanicalPiston; +import resonantinduction.mechanical.process.crusher.TileMechanicalPiston; import resonantinduction.mechanical.process.grinder.BlockGrindingWheel; import resonantinduction.mechanical.process.grinder.TileGrinderWheel; import resonantinduction.mechanical.process.purifier.BlockMixer; @@ -104,6 +105,7 @@ public class Mechanical public static Block blockGrinderWheel; public static Block blockPurifier; public static Block blockFilter; + public static Block blockMechanicalPiston; public static final PacketNetwork PACKET_NETWORK = new PacketNetwork(IMechanical.class, Reference.CHANNEL); @@ -134,6 +136,7 @@ public class Mechanical blockGrinderWheel = contentRegistry.createTile(BlockGrindingWheel.class, TileGrinderWheel.class); blockPurifier = contentRegistry.createTile(BlockMixer.class, TileMixer.class); blockFilter = contentRegistry.createTile(BlockFilter.class, TileFilter.class); + blockMechanicalPiston = contentRegistry.createTile(BlockMechanicalPiston.class, TileMechanicalPiston.class); OreDictionary.registerOre("gear", itemGear); proxy.preInit(); diff --git a/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java index 36823c79..5b4de9c0 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -14,6 +14,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import resonantinduction.api.mechanical.IMechanical; import resonantinduction.core.Reference; +import resonantinduction.core.resource.ItemHandCrank; import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.network.PartMechanical; import calclavia.lib.multiblock.reference.IMultiBlockStructure; diff --git a/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index e9ac2e87..da756f28 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -46,6 +46,12 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical angle += angularVelocity / 20; + if (angle % (Math.PI * 2) != angle) + { + revolve(angle <= Math.PI * 2 || angle >= Math.PI * 2); + angle = (float) (angle % (Math.PI * 2)); + } + if (!worldObj.isRemote) { torque *= getLoad(); @@ -65,6 +71,11 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical } } + protected void revolve(boolean isAmplitude) + { + + } + public long getPower() { return (long) (torque * angularVelocity); diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java new file mode 100644 index 00000000..b589a0eb --- /dev/null +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java @@ -0,0 +1,51 @@ +package resonantinduction.mechanical.process.crusher; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import resonantinduction.core.Reference; +import resonantinduction.core.render.RIBlockRenderingHandler; +import calclavia.lib.prefab.block.BlockRotatable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** + * A block used to build machines. + * + * @author Calclavia + * + */ +public class BlockMechanicalPiston extends BlockRotatable +{ + public BlockMechanicalPiston(int id) + { + super(id, Material.wood); + setTextureName(Reference.PREFIX + "material_steel_dark"); + rotationMask = Byte.parseByte("111111", 2); + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderType() + { + return RIBlockRenderingHandler.ID; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileMechanicalPiston(); + } +} diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java new file mode 100644 index 00000000..4d9031fe --- /dev/null +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java @@ -0,0 +1,65 @@ +package resonantinduction.mechanical.process.crusher; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import calclavia.lib.render.RenderUtility; +import resonantinduction.core.Reference; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderMechanicalPiston extends TileEntitySpecialRenderer +{ + public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "rejector.tcn"); + public static ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "rejector.png"); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) + { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + TileMechanicalPiston tile = (TileMechanicalPiston) tileEntity; + GL11.glRotated(-90, 0, 1, 0); + + if (tile.worldObj != null) + RenderUtility.rotateBlockBasedOnDirection(tile.getDirection()); + + RenderUtility.bind(TEXTURE); + + // Angle in radians of the rotor. + float angle = tile.angle; + float radius = 0.5f; + // Length of piston arm + float length = 1f; + + double beta = Math.asin((radius * Math.sin(angle)) / length); + + /** + * Render Piston Rod + */ + GL11.glPushMatrix(); + double pistonTranslateX = 2 * length * Math.cos(beta); + double pistonTranslateY = 2 * length * Math.sin(beta); + + GL11.glTranslated(pistonTranslateX, 0, pistonTranslateY); + GL11.glRotated(Math.toDegrees(beta), 0, 0, 1); + GL11.glPopMatrix(); + + /** + * Render Piston Rotor + */ + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, (0.5 * Math.cos(angle)) - 0.5); + MODEL.renderOnly("PistonShaft", "PistonFace", "PistonFace2"); + GL11.glPopMatrix(); + + MODEL.renderAllExcept("PistonShaft", "PistonFace", "PistonFace2"); + GL11.glPopMatrix(); + } +} \ No newline at end of file diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java new file mode 100644 index 00000000..92205d99 --- /dev/null +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java @@ -0,0 +1,170 @@ +package resonantinduction.mechanical.process.crusher; + +import java.lang.reflect.Method; + +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import resonantinduction.mechanical.network.TileMechanical; +import universalelectricity.api.vector.Vector3; +import calclavia.lib.utility.MovementUtility; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.relauncher.ReflectionHelper; + +public class TileMechanicalPiston extends TileMechanical +{ + @Override + public void updateEntity() + { + super.updateEntity(); + + Vector3 movePosition = new Vector3(this).translate(getDirection()); + Vector3 moveNewPosition = movePosition.clone().translate(getDirection()); + + if (!canMove(movePosition, moveNewPosition)) + angle = 0; + } + + @Override + protected void revolve(boolean isAmplitude) + { + if (!worldObj.isRemote && isAmplitude) + { + Vector3 movePosition = new Vector3(this).translate(getDirection()); + Vector3 moveNewPosition = movePosition.clone().translate(getDirection()); + + if (canMove(movePosition, moveNewPosition)) + move(movePosition, moveNewPosition); + } + } + + public boolean canMove(Vector3 from, Vector3 to) + { + TileEntity tileEntity = from.getTileEntity(worldObj); + + if (to.getTileEntity(worldObj) == this) + { + return false; + } + + /** Check Target */ + int targetBlockID = to.getBlockID(worldObj); + + if (!(worldObj.isAirBlock(to.intX(), to.intY(), to.intZ()) || (targetBlockID > 0 && (Block.blocksList[targetBlockID].isBlockReplaceable(worldObj, to.intX(), to.intY(), to.intZ()))))) + { + return false; + } + + return true; + } + + public void move(Vector3 from, Vector3 to) + { + int blockID = from.getBlockID(worldObj); + int blockMetadata = from.getBlockMetadata(worldObj); + + TileEntity tileEntity = from.getTileEntity(worldObj); + + NBTTagCompound tileData = new NBTTagCompound(); + + if (tileEntity != null) + { + tileEntity.writeToNBT(tileData); + } + + MovementUtility.setBlockSneaky(worldObj, from, 0, 0, null); + + if (tileEntity != null && tileData != null) + { + /** + * Forge Multipart Support. Use FMP's custom TE creator. + */ + boolean isMultipart = tileData.getString("id").equals("savedMultipart"); + + TileEntity newTile = null; + + if (isMultipart) + { + try + { + Class multipart = Class.forName("codechicken.multipart.MultipartHelper"); + Method m = multipart.getMethod("createTileFromNBT", World.class, NBTTagCompound.class); + newTile = (TileEntity) m.invoke(null, worldObj, tileData); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + else + { + newTile = TileEntity.createAndLoadEntity(tileData); + } + + MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, newTile); + + if (newTile != null && isMultipart) + { + try + { + // Send the description packet of the TE after moving it. + Class multipart = Class.forName("codechicken.multipart.MultipartHelper"); + multipart.getMethod("sendDescPacket", World.class, TileEntity.class).invoke(null, worldObj, newTile); + + // Call onMoved event. + Class tileMultipart = Class.forName("codechicken.multipart.TileMultipart"); + tileMultipart.getMethod("onMoved").invoke(newTile); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + else + { + MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, null); + } + + notifyChanges(from); + notifyChanges(to); + } + + public void notifyChanges(Vector3 pos) + { + worldObj.notifyBlocksOfNeighborChange(pos.intX(), pos.intY(), pos.intZ(), pos.getBlockID(worldObj)); + + TileEntity newTile = pos.getTileEntity(worldObj); + + if (newTile != null) + { + if (Loader.isModLoaded("BuildCraft|Factory")) + { + /** + * Special quarry compatibility code. + */ + try + { + Class clazz = Class.forName("buildcraft.factory.TileQuarry"); + + if (clazz == newTile.getClass()) + { + ReflectionHelper.setPrivateValue(clazz, newTile, true, "isAlive"); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } + + @Override + public boolean canConnect(ForgeDirection from, Object source) + { + return from != getDirection(); + } +} diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java b/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java index a56e55fc..1709bae0 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java @@ -8,6 +8,7 @@ import static org.lwjgl.opengl.GL11.glTranslatef; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.client.model.obj.WavefrontObject; import net.minecraftforge.common.ForgeDirection; import resonantinduction.core.Reference; @@ -22,7 +23,7 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderGrinderWheel extends TileEntitySpecialRenderer { - public static final WavefrontObject MODEL = (WavefrontObject) AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "grinder.obj"); + public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "grinder.obj"); @Override public void renderTileEntityAt(TileEntity t, double x, double y, double z, float f) diff --git a/mechanical/src/main/java/resonantinduction/mechanical/gear/ItemHandCrank.java b/src/main/java/resonantinduction/core/resource/ItemHandCrank.java similarity index 74% rename from mechanical/src/main/java/resonantinduction/mechanical/gear/ItemHandCrank.java rename to src/main/java/resonantinduction/core/resource/ItemHandCrank.java index d45f8493..9eb29466 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/gear/ItemHandCrank.java +++ b/src/main/java/resonantinduction/core/resource/ItemHandCrank.java @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.gear; +package resonantinduction.core.resource; import net.minecraft.item.Item; diff --git a/src/main/models/Archive/Machines/Armbot.tcn b/src/main/models/Archive/Armbot.tcn similarity index 100% rename from src/main/models/Archive/Machines/Armbot.tcn rename to src/main/models/Archive/Armbot.tcn diff --git a/src/main/models/Archive/ConstructionPump.tcn b/src/main/models/Archive/ConstructionPump.tcn deleted file mode 100644 index b48de938..00000000 Binary files a/src/main/models/Archive/ConstructionPump.tcn and /dev/null differ diff --git a/src/main/models/Archive/Machines/CrusherSingleBlock.tcn b/src/main/models/Archive/CrusherSingleBlock.tcn similarity index 100% rename from src/main/models/Archive/Machines/CrusherSingleBlock.tcn rename to src/main/models/Archive/CrusherSingleBlock.tcn diff --git a/src/main/models/Archive/Machines/GrinderSingleBlock.tcn b/src/main/models/Archive/GrinderSingleBlock.tcn similarity index 100% rename from src/main/models/Archive/Machines/GrinderSingleBlock.tcn rename to src/main/models/Archive/GrinderSingleBlock.tcn diff --git a/src/main/models/Archive/rejected/Pump3.tcn b/src/main/models/Archive/rejected/Pump3.tcn deleted file mode 100644 index 36082c36..00000000 Binary files a/src/main/models/Archive/rejected/Pump3.tcn and /dev/null differ diff --git a/src/main/models/Archive/rejected/PumpV2.tcn b/src/main/models/Archive/rejected/PumpV2.tcn deleted file mode 100644 index ba009bf9..00000000 Binary files a/src/main/models/Archive/rejected/PumpV2.tcn and /dev/null differ diff --git a/src/main/models/Archive/rejected/something.tcn b/src/main/models/Archive/rejected/something.tcn deleted file mode 100644 index 080d6348..00000000 Binary files a/src/main/models/Archive/rejected/something.tcn and /dev/null differ diff --git a/src/main/models/incomplete/battery box.tcn b/src/main/models/incomplete/battery box.tcn deleted file mode 100644 index d8e3c81b..00000000 Binary files a/src/main/models/incomplete/battery box.tcn and /dev/null differ diff --git a/src/main/models/incomplete/battery.tcn b/src/main/models/incomplete/battery.tcn deleted file mode 100644 index 89f2eaf3..00000000 Binary files a/src/main/models/incomplete/battery.tcn and /dev/null differ diff --git a/src/main/models/incomplete/batteryBox.tcn b/src/main/models/incomplete/batteryBox.tcn deleted file mode 100644 index 3054edfa..00000000 Binary files a/src/main/models/incomplete/batteryBox.tcn and /dev/null differ diff --git a/src/main/models/mechanical/Rejector.tcn b/src/main/models/mechanical/Rejector.tcn index 84d265ed..f086939d 100644 Binary files a/src/main/models/mechanical/Rejector.tcn and b/src/main/models/mechanical/Rejector.tcn differ diff --git a/src/main/resources/assets/resonantinduction/languages/en_US.properties b/src/main/resources/assets/resonantinduction/languages/en_US.properties index 72115575..d188cd7c 100644 --- a/src/main/resources/assets/resonantinduction/languages/en_US.properties +++ b/src/main/resources/assets/resonantinduction/languages/en_US.properties @@ -108,6 +108,7 @@ tile.resonantinduction\:fluidPipe.16.name=White Wood Trough ## Machines and Processing tile.resonantinduction\:mixer.name=Mixer tile.resonantinduction\:mixer.tooltip=The mixer mixes dusts with water to wash and refine the ore dust. Mixer prefers more angular velocity (spin) to process dusts. +tile.resonantinduction\:mechanicalPiston.name=Mechanical Piston tile.resonantinduction\:grindingWheel.name=Grinder Wheel tile.resonantinduction\:grindingWheel.tooltip=The grinding wheel grinds ores into rubble and dust. Larger torque allows faster grinding. tile.resonantinduction\:filter.name=Filter diff --git a/src/main/resources/assets/resonantinduction/models/rejector.tcn b/src/main/resources/assets/resonantinduction/models/rejector.tcn new file mode 100644 index 00000000..f086939d Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/rejector.tcn differ