diff --git a/build.properties b/build.properties index 2b172ecc..96407d9a 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ # -#Thu Apr 16 11:30:08 EDT 2015 +#Thu Apr 16 16:19:02 EDT 2015 mod_name=BloodMagic forge_version=10.13.2.1232 ccc_version=1.0.4.29 @@ -8,5 +8,5 @@ nei_version=1.0.3.64 package_group=com.wayoftime.bloodmagic mod_version=1.3.2 minetweaker_version=Dev-1.7.10-3.0.9B -build_number=1 mc_version=1.7.10 +build_number=2 diff --git a/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index a98d16e2..c231435b 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -164,6 +164,7 @@ import WayofTime.alchemicalWizardry.common.rituals.RitualEffectOmegaStalling; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectOmegaTest; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSoulBound; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSpawnWard; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSphereCreator; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSummonMeteor; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSupression; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectUnbinding; @@ -1393,6 +1394,8 @@ public class AlchemicalWizardry Rituals.registerRitual("AW034Crafting", 1, 15000, new RitualEffectCrafting(), "Rhythm of the Beating Anvil"); Rituals.registerRitual("AW035", 1, 10000, new RitualEffectItemRouting(), "Orchestra of the Phantom Hands"); + + Rituals.registerRitual("AW036SphereIsland", 2, 10000, new RitualEffectSphereCreator(), "Birth of the Bastion"); //Rituals.registerRitual(1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java index 07b1f628..e969f1ba 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java @@ -154,8 +154,18 @@ public class BlockTeleposer extends BlockContainer { return new TETeleposer(); } - + public static boolean swapBlocks(Object caller, World worldI, World worldF, int xi, int yi, int zi, int xf, int yf, int zf) + { + return swapBlocks(caller, worldI, worldF, xi, yi, zi, xf, yf, zf, true, 3); + } + + public static boolean swapBlocksWithoutSound(Object caller, World worldI, World worldF, int xi, int yi, int zi, int xf, int yf, int zf) + { + return swapBlocks(caller, worldI, worldF, xi, yi, zi, xf, yf, zf, false, 3); + } + + public static boolean swapBlocks(Object caller, World worldI, World worldF, int xi, int yi, int zi, int xf, int yf, int zf, boolean doSound, int flag) { TileEntity tileEntityI = worldI.getTileEntity(xi, yi, zi); TileEntity tileEntityF = worldF.getTileEntity(xf, yf, zf); @@ -196,10 +206,11 @@ public class BlockTeleposer extends BlockContainer if (MinecraftForge.EVENT_BUS.post(evt)) return false; - worldI.playSoundEffect(xi, yi, zi, "mob.endermen.portal", 1.0F, 1.0F); - worldF.playSoundEffect(xf, yf, zf, "mob.endermen.portal", 1.0F, 1.0F); - - + if(doSound) + { + worldI.playSoundEffect(xi, yi, zi, "mob.endermen.portal", 1.0F, 1.0F); + worldF.playSoundEffect(xf, yf, zf, "mob.endermen.portal", 1.0F, 1.0F); + } //CLEAR TILES Block finalBlock = blockF; @@ -221,7 +232,7 @@ public class BlockTeleposer extends BlockContainer } //TILES CLEARED - worldF.setBlock(xf, yf, zf, initialBlock, metaI, 3); + worldF.setBlock(xf, yf, zf, initialBlock, metaI, flag); if (tileEntityI != null) { @@ -244,7 +255,7 @@ public class BlockTeleposer extends BlockContainer } } - worldI.setBlock(xi, yi, zi, finalBlock, metaF, 3); + worldI.setBlock(xi, yi, zi, finalBlock, metaF, flag); if (tileEntityF != null) { diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSphereCreator.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSphereCreator.java new file mode 100644 index 00000000..00f6580c --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSphereCreator.java @@ -0,0 +1,221 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.api.Int3; +import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectSphereCreator extends RitualEffect +{ +// private static final int potentiaDrain = 10; + public static int MAX_RADIUS = 32; + private static final int terraeDrain = 1; + + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + + int currentEssence = SoulNetworkHandler.getCurrentEssence(owner); + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + +// boolean hasPotentia = this.canDrainReagent(ritualStone, ReagentRegistry.potentiaReagent, potentiaDrain, false); + + if (world.getWorldTime() % 1 != 0) + { + return; + } + + if (currentEssence < this.getCostPerRefresh()) + { + SoulNetworkHandler.causeNauseaToPlayer(owner); + } else + { + TileEntity tile = world.getTileEntity(x, y+1, z); + if(!(tile instanceof IInventory)) + { + return; + } + + int negYOffset = 0; + int radius = 0; + IInventory inv = (IInventory)tile; + + int invSize = inv.getSizeInventory(); + if(invSize < 1) + { + return; + }else + { + if(invSize >= 2) + { + ItemStack invStack2 = inv.getStackInSlot(1); + if(invStack2 != null) + { + negYOffset = invStack2.stackSize; + } + } + + ItemStack invStack1 = inv.getStackInSlot(0); + if(invStack1 == null) + { + return; + } + + radius = invStack1.stackSize; + } + + if(radius <= 0) + { + return; + } + + radius = Math.min(radius, MAX_RADIUS); + + if(negYOffset < radius + 3) + { + negYOffset = radius + 3; + } + + Int3 lastPos = this.getLastPosition(ritualStone.getCustomRitualTag(), radius); + + int j = -radius; + int i = -radius; + int k = -radius; + + if(lastPos != null) + { + j = Math.min(radius, Math.max(-radius, lastPos.yCoord)); + i = Math.min(radius, Math.max(-radius, lastPos.xCoord)); + k = Math.min(radius, Math.max(-radius, lastPos.zCoord)); + } + + int yP = y + negYOffset; + int yN = y - negYOffset; + + boolean incrementNext = false; + + + while(i <= radius) + { + while(j <= radius) + { + while(k <= radius) + { + if (i * i + j * j + k * k >= (radius + 0.50f) * (radius + 0.50f)) + { + k++; + continue; + } + + if(incrementNext) + { + this.setLastPosition(ritualStone.getCustomRitualTag(), new Int3(i, j, k)); + return; + } + + Block blk = world.getBlock(x + i, yP + j, z + k); + + if (world.isAirBlock(x + i, yN + j, z + k) || (!world.isAirBlock(x + i, yP + j, z + k) && !SpellHelper.isBlockFluid(blk))) + { + + k++; + continue; + } + + if(BlockTeleposer.swapBlocks(this, world, world, x + i, yN + j, z + k, x + i, yP + j, z + k, false, 2)) + { + SoulNetworkHandler.syphonFromNetwork(owner, this.getCostPerRefresh()); + if(this.canDrainReagent(ritualStone, ReagentRegistry.terraeReagent, terraeDrain, true)) + { + world.setBlock(x + i, yN + j, z + k, Blocks.dirt, 0, 2); + } + } + + this.setLastPosition(ritualStone.getCustomRitualTag(), new Int3(i, j, k)); + + incrementNext = true; + + k++; + } + k = -radius; + j++; + } + j = -radius; + i++; + this.setLastPosition(ritualStone.getCustomRitualTag(), new Int3(i, j, k)); + return; + } + + ritualStone.setActive(false); + this.setLastPosition(ritualStone.getCustomRitualTag(), new Int3(i, j, k)); + return; + + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } + + public Int3 getLastPosition(NBTTagCompound tag, int radius) + { + if(tag != null && tag.getBoolean("hasWorked")) + { + return Int3.readFromNBT(tag); + } + + return new Int3(-radius, -radius, -radius); + } + + public void setLastPosition(NBTTagCompound tag, Int3 pos) + { + if(tag != null) + { + pos.writeToNBT(tag); + tag.setBoolean("hasWorked", true); + } + } + + @Override + public List getRitualComponentList() + { + ArrayList magneticRitual = new ArrayList(); + magneticRitual.add(new RitualComponent(1, 0, 1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(1, 0, -1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(-1, 0, 1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(-1, 0, -1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(2, 1, 0, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(0, 1, 2, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(-2, 1, 0, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(0, 1, -2, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(2, 1, 2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(2, 1, -2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(-2, 1, 2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(-2, 1, -2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(2, 2, 0, RitualComponent.FIRE)); + magneticRitual.add(new RitualComponent(0, 2, 2, RitualComponent.FIRE)); + magneticRitual.add(new RitualComponent(-2, 2, 0, RitualComponent.FIRE)); + magneticRitual.add(new RitualComponent(0, 2, -2, RitualComponent.DUSK)); + return magneticRitual; + } +}