package openblocks.client.model; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.tileentity.TileEntity; import openblocks.common.tileentity.TileEntityCannon; public class ModelCannon extends ModelBase { private double[] keyframes = new double[] { 0, 0.5, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0 }; ModelRenderer body; ModelRenderer shooter; ModelRenderer base; ModelRenderer wheel; private float deg30 = (float)Math.toRadians(30); private float deg180 = (float)Math.toRadians(180); public ModelCannon() { textureWidth = 64; textureHeight = 32; body = new ModelRenderer(this, 0, 0); body.addBox(-3F, -5F, -3F, 6, 6, 6); body.setRotationPoint(0F, 11F, 3F); body.setTextureSize(64, 32); body.mirror = true; setRotation(body, 0.3490659F, 0F, 0F); shooter = new ModelRenderer(this, 34, 0); shooter.addBox(-2F, -4F, 2F, 4, 4, 6); shooter.setRotationPoint(0F, 11F, 3F); shooter.setTextureSize(64, 32); shooter.mirror = true; setRotation(shooter, 0.3490659F, 0F, 0F); base = new ModelRenderer(this, 14, 19); base.addBox(-6F, 0F, -6F, 12, 1, 12); base.setRotationPoint(0F, 15F, 0F); base.setTextureSize(64, 32); base.mirror = true; setRotation(base, 0F, 0F, 0F); wheel = new ModelRenderer(this, 0, 20); wheel.addBox(3F, -3F, -3F, 1, 6, 6); wheel.setRotationPoint(0F, 11F, 3F); wheel.setTextureSize(64, 32); wheel.mirror = true; setRotation(wheel, 0F, 0F, 0F); } public void render(TileEntity te, float f) { TileEntityCannon cannon = (TileEntityCannon)te; float f5 = 0.0625F; setRotationAngles(te, f); int elapsed = Math.min(12, cannon.getTicksSinceLastFire()); double ease = keyframes[elapsed]; float shooterAnim = -(float)(3.0f * ease); shooter.rotateAngleX = (float)Math.toRadians(cannon.currentPitch); float z = (float)(3 + shooterAnim * Math.cos(shooter.rotateAngleX)); float y = (float)(11 - shooterAnim * Math.sin(shooter.rotateAngleX)); shooter.rotationPointY = y; shooter.rotationPointZ = z; float cannonOffset = (float)ease * 4; body.rotationPointZ = 3f - cannonOffset; shooter.rotationPointZ -= cannonOffset; wheel.rotationPointZ = -cannonOffset; shooter.rotateAngleX += ease / 2; body.rotateAngleX = shooter.rotateAngleX; body.rotateAngleX = shooter.rotateAngleX; body.render(f5); shooter.render(f5); base.render(f5); float startAngleX = (float)ease; wheel.rotateAngleZ = 0; wheel.rotateAngleX = startAngleX; wheel.rotationPointX = 0; wheel.render(f5); wheel.rotateAngleX += deg30; wheel.rotationPointX -= 0.01; wheel.render(f5); wheel.rotateAngleX += deg30; wheel.rotationPointX -= 0.01; wheel.render(f5); wheel.rotateAngleZ = deg180; wheel.rotateAngleX = -startAngleX; wheel.rotationPointX = 0; wheel.render(f5); wheel.rotateAngleX += deg30; wheel.rotationPointX -= 0.01; wheel.render(f5); wheel.rotateAngleX += deg30; wheel.rotationPointX -= 0.01; wheel.render(f5); } private static void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } public void setRotationAngles(TileEntity te, float f) {} }