From 8f14af4bb77d5db4c77ef3c768321a95299cbec1 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Wed, 12 Mar 2014 19:52:16 +0800 Subject: [PATCH] Resolved #432, #317 - Wind turbines now can be powered to blow items --- .../energy/turbine/RenderWindTurbine.java | 2 +- .../energy/turbine/TileMechanicalTurbine.java | 35 ++++++++++- .../energy/turbine/TileWindTurbine.java | 60 +++++++++++++++++-- .../mechanical/fluid/pipe/RenderPipe.java | 1 - .../process/grinder/TileGrindingWheel.java | 2 +- .../process/purifier/TileMixer.java | 2 +- .../java/resonantinduction/core}/Timer.java | 2 +- 7 files changed, 93 insertions(+), 11 deletions(-) rename {archaic/src/main/java/resonantinduction/archaic/filter => src/main/java/resonantinduction/core}/Timer.java (95%) diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java index df07da9c..430188e0 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java @@ -33,7 +33,7 @@ public class RenderWindTurbine extends TileEntitySpecialRenderer implements ISim RenderUtility.rotateBlockBasedOnDirectionUp(tile.getDirection()); GL11.glTranslatef(0, -0.35f, 0); - GL11.glRotatef((float) Math.toDegrees(tile.rotation), 0, 1, 0); + GL11.glRotatef((float) Math.toDegrees(tile.renderAngle), 0, 1, 0); render(tile.tier, tile.multiBlockRadius, tile.getMultiBlock().isConstructed()); diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java index c8b20103..938cd5c5 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java @@ -8,13 +8,18 @@ import resonantinduction.core.grid.INode; import resonantinduction.core.grid.INodeProvider; import resonantinduction.mechanical.energy.grid.MechanicalNode; import universalelectricity.api.energy.EnergyStorageHandler; +import calclavia.lib.network.Synced; import calclavia.lib.network.Synced.SyncedInput; import calclavia.lib.network.Synced.SyncedOutput; import calclavia.lib.prefab.turbine.TileTurbine; +//TODO: MC 1.7, merge turbines in. public class TileMechanicalTurbine extends TileTurbine implements INodeProvider { protected MechanicalNode mechanicalNode; + @Synced(1) + protected double renderAngularVelocity; + protected double renderAngle; public TileMechanicalTurbine() { @@ -70,11 +75,37 @@ public class TileMechanicalTurbine extends TileTurbine implements INodeProvider super.invalidate(); } + @Override + public void updateEntity() + { + if (!worldObj.isRemote) + { + renderAngularVelocity = (double) mechanicalNode.angularVelocity; + } + else + { + renderAngle = (renderAngle + renderAngularVelocity / 20) % (Math.PI * 2); + + // TODO: Make this neater + onProduce(); + } + + super.updateEntity(); + } + @Override public void onProduce() { - mechanicalNode.torque += (torque - mechanicalNode.torque) / 10; - mechanicalNode.angularVelocity += (angularVelocity - mechanicalNode.angularVelocity) / 10; + if (!worldObj.isRemote) + { + if (mechanicalNode.torque < 0) + torque = -torque; + + if (mechanicalNode.angularVelocity < 0) + angularVelocity = -angularVelocity; + + mechanicalNode.apply((torque - mechanicalNode.torque) / 10, (angularVelocity - mechanicalNode.angularVelocity) / 10); + } } @Override diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java index afd41777..d293a77b 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java @@ -1,6 +1,9 @@ package resonantinduction.mechanical.energy.turbine; +import java.util.List; + import net.minecraft.block.Block; +import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.biome.BiomeGenBase; @@ -8,6 +11,7 @@ import net.minecraft.world.biome.BiomeGenOcean; import net.minecraft.world.biome.BiomeGenPlains; import net.minecraftforge.common.ForgeDirection; import universalelectricity.api.vector.Vector3; +import calclavia.lib.prefab.vector.Cuboid; import calclavia.lib.utility.inventory.InventoryUtility; /** @@ -49,7 +53,7 @@ public class TileWindTurbine extends TileMechanicalTurbine */ if (getDirection().offsetY == 0) { - maxPower = 120; + maxPower = 3000; if (ticks % 20 == 0 && !worldObj.isRemote) computePower(); @@ -58,17 +62,65 @@ public class TileWindTurbine extends TileMechanicalTurbine } else { - maxPower = 1000; + maxPower = 10000; } if (getMultiBlock().isConstructed()) - torque = (long) (defaultTorque / (2.5f / multiBlockRadius)); + torque = (long) (defaultTorque / (.52f / multiBlockRadius)); else torque = defaultTorque / 12; super.updateEntity(); } + @Override + public void onProduce() + { + super.onProduce(); + + /** + * Blow entities if greater than max power. + */ + double velocity = !worldObj.isRemote ? mechanicalNode.getAngularVelocity() : renderAngularVelocity; + + if (velocity != 0) + { + ForgeDirection dir = getDirection(); + + double affectRange = Math.abs(velocity * 2); + + Cuboid effect = Cuboid.full().translate(new Vector3(this).translate(dir)); + + if (getMultiBlock().isConstructed()) + { + double xMulti = dir.offsetX != 0 ? affectRange : 1; + double yMulti = dir.offsetY != 0 ? affectRange : 1; + double zMulti = dir.offsetZ != 0 ? affectRange : 1; + + effect.expand(new Vector3(multiBlockRadius * xMulti, multiBlockRadius * yMulti, multiBlockRadius * zMulti)); + } + else + { + double xMulti = dir.offsetX != 0 ? affectRange : 0; + double yMulti = dir.offsetY != 0 ? affectRange : 0; + double zMulti = dir.offsetZ != 0 ? affectRange : 0; + + effect.expand(new Vector3(xMulti, yMulti, zMulti)); + } + + List entities = worldObj.getEntitiesWithinAABB(Entity.class, effect.toAABB()); + + velocity = Math.min(Math.max(velocity, -0.3), 0.3); + + for (Entity entity : entities) + { + entity.motionX += dir.offsetX * velocity / 20; + entity.motionY += dir.offsetY * velocity / 20; + entity.motionZ += dir.offsetZ * velocity / 20; + } + } + } + private void computePower() { int checkSize = 10; @@ -116,6 +168,6 @@ public class TileWindTurbine extends TileMechanicalTurbine boolean hasBonus = biome instanceof BiomeGenOcean || biome instanceof BiomeGenPlains || biome == BiomeGenBase.river; float windSpeed = (worldObj.rand.nextFloat() / 8) + (yCoord / 256f) * (hasBonus ? 1.2f : 1) + worldObj.getRainStrength(1.5f); - windPower = (long) (materialMultiplier * multiblockMultiplier * windSpeed * efficiency * 0.01f) * maxPower; + windPower = (long) Math.min(materialMultiplier * multiblockMultiplier * windSpeed * efficiency, maxPower); } } diff --git a/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/RenderPipe.java b/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/RenderPipe.java index 5475bcfc..575e3240 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/RenderPipe.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/fluid/pipe/RenderPipe.java @@ -170,7 +170,6 @@ public class RenderPipe implements ISimpleItemRenderer public void renderInventoryItem(ItemStack itemStack) { GL11.glPushMatrix(); - GL11.glTranslatef(0.5f, 0.5f, 0.5f); render(itemStack.getItemDamage(), -1, Byte.parseByte("001100", 2)); GL11.glPopMatrix(); } diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java b/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java index 0414950c..7401f9c1 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java @@ -14,9 +14,9 @@ import resonantinduction.api.IMechanicalNode; import resonantinduction.api.recipe.MachineRecipes; import resonantinduction.api.recipe.MachineRecipes.RecipeType; import resonantinduction.api.recipe.RecipeResource; -import resonantinduction.archaic.filter.Timer; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; +import resonantinduction.core.Timer; import resonantinduction.mechanical.energy.grid.TileMechanical; import universalelectricity.api.vector.Vector3; import calclavia.lib.prefab.tile.IRotatable; diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/purifier/TileMixer.java b/mechanical/src/main/java/resonantinduction/mechanical/process/purifier/TileMixer.java index fdd3a233..ea4ed191 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/process/purifier/TileMixer.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/purifier/TileMixer.java @@ -15,8 +15,8 @@ import net.minecraftforge.common.ForgeDirection; import resonantinduction.api.IMechanicalNode; import resonantinduction.api.recipe.MachineRecipes; import resonantinduction.api.recipe.MachineRecipes.RecipeType; -import resonantinduction.archaic.filter.Timer; import resonantinduction.core.Reference; +import resonantinduction.core.Timer; import resonantinduction.core.resource.ResourceGenerator; import resonantinduction.core.resource.fluid.BlockFluidMixture; import resonantinduction.mechanical.energy.grid.TileMechanical; diff --git a/archaic/src/main/java/resonantinduction/archaic/filter/Timer.java b/src/main/java/resonantinduction/core/Timer.java similarity index 95% rename from archaic/src/main/java/resonantinduction/archaic/filter/Timer.java rename to src/main/java/resonantinduction/core/Timer.java index 10ac2ddf..9709e3c7 100644 --- a/archaic/src/main/java/resonantinduction/archaic/filter/Timer.java +++ b/src/main/java/resonantinduction/core/Timer.java @@ -1,4 +1,4 @@ -package resonantinduction.archaic.filter; +package resonantinduction.core; import java.util.HashMap;