From b5a1f82db681bc008c20fd8c987fd257093de14e Mon Sep 17 00:00:00 2001 From: Calclavia Date: Tue, 7 Jan 2014 21:49:26 +0800 Subject: [PATCH] Added purifier rotor --- .../resonantinduction/ResonantInduction.java | 7 +- .../machine/grinder/BlockGrinderWheel.java | 2 +- .../machine/grinder/TileGrinderWheel.java | 16 +- .../machine/grinder/TilePurifier.java | 159 ++++++++++++++++++ .../machine/purifier/BlockPurifier.java | 79 +++++++++ .../languages/en_US.properties | 1 + 6 files changed, 255 insertions(+), 9 deletions(-) create mode 100644 src/main/java/resonantinduction/machine/grinder/TilePurifier.java create mode 100644 src/main/java/resonantinduction/machine/purifier/BlockPurifier.java diff --git a/src/main/java/resonantinduction/ResonantInduction.java b/src/main/java/resonantinduction/ResonantInduction.java index 48055f9d..4f836e9d 100644 --- a/src/main/java/resonantinduction/ResonantInduction.java +++ b/src/main/java/resonantinduction/ResonantInduction.java @@ -31,9 +31,11 @@ import resonantinduction.machine.furnace.BlockAdvancedFurnace; import resonantinduction.machine.furnace.TileAdvancedFurnace; import resonantinduction.machine.grinder.BlockGrinderWheel; import resonantinduction.machine.grinder.TileGrinderWheel; +import resonantinduction.machine.grinder.TilePurifier; import resonantinduction.machine.item.ItemDust; import resonantinduction.machine.liquid.BlockFluidMixture; import resonantinduction.machine.liquid.TileFluidMixture; +import resonantinduction.machine.purifier.BlockPurifier; import resonantinduction.transport.LinkEvent; import resonantinduction.transport.battery.BlockBattery; import resonantinduction.transport.battery.ItemBlockBattery; @@ -165,7 +167,7 @@ public class ResonantInduction // Blocks public static Block blockTesla, blockEMContractor, blockBattery, blockAdvancedFurnace, - blockMachinePart, blockGrinderWheel, blockFluidMixture; + blockMachinePart, blockGrinderWheel, blockPurifier, blockFluidMixture; public static Fluid MIXTURE; @@ -209,6 +211,7 @@ public class ResonantInduction blockBattery = new BlockBattery(getNextBlockID()); blockMachinePart = new BlockMachinePart(getNextBlockID()); blockGrinderWheel = new BlockGrinderWheel(getNextBlockID()); + blockPurifier = new BlockPurifier(getNextBlockID()); MIXTURE = new Fluid("mixture"); FluidRegistry.registerFluid(MIXTURE); @@ -228,6 +231,7 @@ public class ResonantInduction GameRegistry.registerItem(itemDust, itemDust.getUnlocalizedName()); GameRegistry.registerBlock(blockGrinderWheel, blockGrinderWheel.getUnlocalizedName()); + GameRegistry.registerBlock(blockPurifier, blockPurifier.getUnlocalizedName()); GameRegistry.registerBlock(blockFluidMixture, blockFluidMixture.getUnlocalizedName()); GameRegistry.registerBlock(blockMachinePart, blockMachinePart.getUnlocalizedName()); GameRegistry.registerBlock(blockTesla, blockTesla.getUnlocalizedName()); @@ -235,6 +239,7 @@ public class ResonantInduction GameRegistry.registerBlock(blockBattery, ItemBlockBattery.class, blockBattery.getUnlocalizedName()); // Tiles + GameRegistry.registerTileEntity(TilePurifier.class, blockPurifier.getUnlocalizedName()); GameRegistry.registerTileEntity(TileGrinderWheel.class, blockGrinderWheel.getUnlocalizedName()); GameRegistry.registerTileEntity(TileTesla.class, blockTesla.getUnlocalizedName()); GameRegistry.registerTileEntity(TileEMLevitator.class, blockEMContractor.getUnlocalizedName()); diff --git a/src/main/java/resonantinduction/machine/grinder/BlockGrinderWheel.java b/src/main/java/resonantinduction/machine/grinder/BlockGrinderWheel.java index f8f85bba..982195f1 100644 --- a/src/main/java/resonantinduction/machine/grinder/BlockGrinderWheel.java +++ b/src/main/java/resonantinduction/machine/grinder/BlockGrinderWheel.java @@ -96,7 +96,7 @@ public class BlockGrinderWheel extends BlockRotatableBase implements ITileEntity ForgeDirection dir = this.getDirection(world, x, y, z); entity.motionX += dir.offsetX * 0.1; entity.motionZ += dir.offsetZ * 0.1; - entity.motionY += 0.3; + entity.motionY += 0.1; entity.isAirBorne = true; } } diff --git a/src/main/java/resonantinduction/machine/grinder/TileGrinderWheel.java b/src/main/java/resonantinduction/machine/grinder/TileGrinderWheel.java index a992d5ec..e3ec1cee 100644 --- a/src/main/java/resonantinduction/machine/grinder/TileGrinderWheel.java +++ b/src/main/java/resonantinduction/machine/grinder/TileGrinderWheel.java @@ -21,16 +21,17 @@ import cpw.mods.fml.relauncher.Side; */ public class TileGrinderWheel extends TileElectrical { + public static final long POWER = 500000; public static final int DEFAULT_TIME = 20 * 20; /** A map of ItemStacks and their remaining grind-time left. */ - private static final HashMap clientGrinderTimer = new HashMap(); - private static final HashMap serverGrinderTimer = new HashMap(); + private static final HashMap clientTimer = new HashMap(); + private static final HashMap serverTimer = new HashMap(); public EntityItem grindingItem = null; public TileGrinderWheel() { - this.energy = new EnergyStorageHandler(100000); + this.energy = new EnergyStorageHandler(POWER * 2); } @Override @@ -57,7 +58,7 @@ public class TileGrinderWheel extends TileElectrical if (grindingItem != null) { - if (getTimer().containsKey(grindingItem) && !grindingItem.isDead && new Vector3(this).add(0.5).distance(new Vector3(grindingItem)) < 1) + if (getTimer().containsKey(grindingItem) && !grindingItem.isDead && new Vector3(this).add(0.5).distance(grindingItem) < 1) { int timeLeft = getTimer().get(grindingItem) - 1; getTimer().put(grindingItem, timeLeft); @@ -97,11 +98,12 @@ public class TileGrinderWheel extends TileElectrical if (didWork) { - // TODO: Consume energy. if (this.ticks % 20 == 0) { this.worldObj.playSoundEffect(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, ResonantInduction.PREFIX + "grinder", 0.5f, 1); } + + this.energy.extractEnergy(POWER / 20, true); } } @@ -141,9 +143,9 @@ public class TileGrinderWheel extends TileElectrical { if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { - return serverGrinderTimer; + return serverTimer; } - return clientGrinderTimer; + return clientTimer; } } diff --git a/src/main/java/resonantinduction/machine/grinder/TilePurifier.java b/src/main/java/resonantinduction/machine/grinder/TilePurifier.java new file mode 100644 index 00000000..65fb4229 --- /dev/null +++ b/src/main/java/resonantinduction/machine/grinder/TilePurifier.java @@ -0,0 +1,159 @@ +package resonantinduction.machine.grinder; + +import java.util.HashMap; +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import resonantinduction.ResonantInduction; +import resonantinduction.api.MachineRecipes; +import resonantinduction.api.MachineRecipes.RecipeType; +import resonantinduction.api.RecipeUtils.ItemStackResource; +import resonantinduction.api.RecipeUtils.Resource; +import resonantinduction.machine.item.ItemDust; +import universalelectricity.api.energy.EnergyStorageHandler; +import universalelectricity.api.vector.Vector3; +import calclavia.lib.prefab.tile.TileElectrical; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; + +/** + * @author Calclavia + * + */ +public class TilePurifier extends TileElectrical +{ + public static final long POWER = 500000; + public static final int DEFAULT_TIME = 10 * 20; + /** A map of ItemStacks and their remaining grind-time left. */ + private static final HashMap clientTimer = new HashMap(); + private static final HashMap serverTimer = new HashMap(); + + public EntityItem processingItem = null; + + public TilePurifier() + { + this.energy = new EnergyStorageHandler(POWER * 2); + } + + @Override + public void updateEntity() + { + super.updateEntity(); + + if (canWork()) + { + doWork(); + } + } + + /** + * Can this machine work this tick? + * + * @return + */ + public boolean canWork() + { + // TODO: Add electricity support. + return true; + } + + public void doWork() + { + boolean didWork = false; + + // Search for an item to "process" + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.xCoord - 1, this.yCoord, this.zCoord - 1, this.xCoord + 1, this.yCoord, this.zCoord + 1); + List entities = this.worldObj.getEntitiesWithinAABB(Entity.class, aabb); + + for (Entity entity : entities) + { + /** + * Rotate entities around purifier + */ + double speed = 0.1; + + Vector3 originalPosition = new Vector3(this); + Vector3 relativePosition = originalPosition.clone().subtract(new Vector3(this)); + relativePosition.rotate(speed, 0, 0); + Vector3 newPosition = new Vector3(this).add(relativePosition); + + if (this.processingItem == null && entity instanceof EntityItem) + { + if (((EntityItem) entity).getEntityItem().getItem() instanceof ItemDust) + { + this.processingItem = (EntityItem) entity; + } + } + } + + if (processingItem != null) + { + if (getTimer().containsKey(processingItem) && !processingItem.isDead && new Vector3(this).add(0.5).distance(processingItem) < 1) + { + int timeLeft = getTimer().get(processingItem) - 1; + getTimer().put(processingItem, timeLeft); + + if (timeLeft <= 0) + { + if (this.doneWork(processingItem)) + { + if (--processingItem.getEntityItem().stackSize <= 0) + { + processingItem.setDead(); + getTimer().remove(processingItem); + processingItem = null; + } + else + { + processingItem.setEntityItemStack(processingItem.getEntityItem()); + // Reset timer + getTimer().put(processingItem, DEFAULT_TIME); + } + } + } + else + { + processingItem.delayBeforeCanPickup = 20; + this.worldObj.spawnParticle("bubble", processingItem.posX, processingItem.posY, processingItem.posZ, (Math.random() - 0.5f) * 3, (Math.random() - 0.5f) * 3, (Math.random() - 0.5f) * 3); + } + + didWork = true; + } + else + { + getTimer().remove(processingItem); + processingItem = null; + } + } + + if (didWork) + { + if (this.ticks % 20 == 0) + { + this.worldObj.playSoundEffect(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, ResonantInduction.PREFIX + "grinder", 0.5f, 1); + } + + this.energy.extractEnergy(POWER / 20, true); + } + } + + private boolean doneWork(EntityItem entity) + { + ItemStack itemStack = entity.getEntityItem(); + entity.setDead(); + return false; + } + + public static HashMap getTimer() + { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) + { + return serverTimer; + } + + return clientTimer; + } +} diff --git a/src/main/java/resonantinduction/machine/purifier/BlockPurifier.java b/src/main/java/resonantinduction/machine/purifier/BlockPurifier.java new file mode 100644 index 00000000..f5d52276 --- /dev/null +++ b/src/main/java/resonantinduction/machine/purifier/BlockPurifier.java @@ -0,0 +1,79 @@ +package resonantinduction.machine.purifier; + +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import resonantinduction.core.base.BlockRotatableBase; +import resonantinduction.machine.grinder.TilePurifier; +import universalelectricity.api.vector.VectorWorld; + +/** + * A block used to build machines. + * + * @author Calclavia + * + */ +public class BlockPurifier extends BlockRotatableBase implements ITileEntityProvider +{ + public BlockPurifier(int id) + { + super("purifier", id); + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + this.checkConflicts(world, x, y, z); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, int par5) + { + this.checkConflicts(world, x, y, z); + } + + /** + * Checks for any conflicting directions with other grinders. + */ + private void checkConflicts(World world, int x, int y, int z) + { + ForgeDirection facing = this.getDirection(world, x, y, z); + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + if (dir != facing && dir != facing.getOpposite()) + { + VectorWorld checkPos = (VectorWorld) new VectorWorld(world, x, y, z).modifyPositionFromSide(dir); + TileEntity tileEntity = checkPos.getTileEntity(); + + if (tileEntity instanceof TilePurifier) + { + if (this.getDirection(world, checkPos.intX(), checkPos.intY(), checkPos.intZ()) == facing) + { + this.dropBlockAsItem(world, x, y, z, 0, 0); + world.setBlockToAir(x, y, z); + } + } + } + } + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TilePurifier(); + } +} diff --git a/src/main/resources/assets/resonantinduction/languages/en_US.properties b/src/main/resources/assets/resonantinduction/languages/en_US.properties index b7dec100..4969f068 100644 --- a/src/main/resources/assets/resonantinduction/languages/en_US.properties +++ b/src/main/resources/assets/resonantinduction/languages/en_US.properties @@ -15,6 +15,7 @@ tile.resonantinduction\:levitator.name=Electromagnetic Levitator tile.resonantinduction\:battery.name=Battery tile.resonantinduction\:machinePart.name=Machine Part tile.resonantinduction\:grindingWheel.name=Grinder Wheel +tile.resonantinduction\:purifier.name=Purifier Rotor tile.resonantinduction\:filter.name=Filter ## Items