From 96930fc47abb2ace3db9b75793ef5ba13a453015 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 10 Jul 2014 20:52:05 -0400 Subject: [PATCH] Getting ready for release candidate --- .../AlchemicalWizardry.java | 17 ++- .../api/harvest/HarvestRegistry.java | 33 +++++ .../api/harvest/IHarvestHandler.java | 16 +++ .../common/demonVillage/DemonBuilding.java | 5 + .../common/demonVillage/GridSpaceHolder.java | 17 +++ .../common/entity/mob/EntityElemental.java | 6 - .../harvest/BloodMagicHarvestHandler.java | 122 +++++++++++++++++ .../common/harvest/GourdHarvestHandler.java | 58 +++++++++ .../common/items/ItemRitualDiviner.java | 4 + .../items/spell/ItemSpellMultiTool.java | 4 +- .../common/rituals/RitualEffectHarvest.java | 123 ++++++++++++++++++ .../rituals/RitualEffectItemSuction.java | 8 +- .../complex/effect/SpellEffectEarth.java | 6 +- .../earth/ToolEnvironmentalEarth.java | 4 +- .../impactEffects/ice/ToolDefensiveIce.java | 2 +- .../common/tileEntity/TEDemonPortal.java | 119 ++++++++++------- .../assets/alchemicalwizardry/lang/en_US.lang | 2 +- .../schematics/building/buildings.zip | Bin 11317 -> 766 bytes 18 files changed, 477 insertions(+), 69 deletions(-) create mode 100644 1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/HarvestRegistry.java create mode 100644 1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/IHarvestHandler.java create mode 100644 1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/BloodMagicHarvestHandler.java create mode 100644 1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/GourdHarvestHandler.java create mode 100644 1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHarvest.java diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 044e06d1..4b74fd24 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -33,6 +33,7 @@ import WayofTime.alchemicalWizardry.api.alchemy.AlchemicalPotionCreationHandler; import WayofTime.alchemicalWizardry.api.alchemy.AlchemyRecipeRegistry; import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipeRegistry; import WayofTime.alchemicalWizardry.api.bindingRegistry.BindingRegistry; +import WayofTime.alchemicalWizardry.api.harvest.HarvestRegistry; import WayofTime.alchemicalWizardry.api.rituals.Rituals; import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistry; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryEventHooks; @@ -58,6 +59,8 @@ import WayofTime.alchemicalWizardry.common.entity.mob.EntityShadeElemental; import WayofTime.alchemicalWizardry.common.entity.mob.EntitySmallEarthGolem; import WayofTime.alchemicalWizardry.common.entity.mob.EntityWaterElemental; import WayofTime.alchemicalWizardry.common.entity.mob.EntityWingedFireDemon; +import WayofTime.alchemicalWizardry.common.harvest.BloodMagicHarvestHandler; +import WayofTime.alchemicalWizardry.common.harvest.GourdHarvestHandler; import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; @@ -82,6 +85,7 @@ import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFeatheredEarth; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFeatheredKnife; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFlight; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectGrowth; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectHarvest; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectHealing; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectInterdiction; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectItemSuction; @@ -406,6 +410,7 @@ public class AlchemicalWizardry ItemStack runeOfSelfSacrificeStack = new ItemStack(ModBlocks.runeOfSelfSacrifice); ItemStack miningSigilStackCrafted = new ItemStack(ModItems.sigilOfTheFastMiner); ItemStack divinationSigilStackCrafted = new ItemStack(ModItems.divinationSigil); + ItemStack seerSigilStack = new ItemStack(ModItems.itemSeerSigil); // ItemStack elementalInkWaterStack = new ItemStack(elementalInkWater); // ItemStack elementalInkFireStack = new ItemStack(elementalInkFire); // ItemStack elementalInkEarthStack = new ItemStack(elementalInkEarth); @@ -478,7 +483,9 @@ public class AlchemicalWizardry GameRegistry.addRecipe(new ShapedBloodOrbRecipe(runeOfSacrificeStack, "srs", "gog", "srs", 's', stoneStack, 'g', goldIngotStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack)); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(runeOfSelfSacrificeStack, "srs", "gog", "srs", 's', stoneStack, 'g', glowstoneDustStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack)); GameRegistry.addRecipe(new ShapedBloodOrbRecipe(divinationSigilStackCrafted, "ggg", "gsg", "gog", 'g', glassStack, 's', blankSlateStack, 'o', weakBloodOrbStack)); -// GameRegistry.addRecipe(waterScribeToolStack, "f", "i", 'f', featherStack, 'i', elementalInkWaterStack); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(seerSigilStack, "gbg", "gsg", "gog", 'g', glassStack, 's', divinationSigilStackCrafted, 'o', apprenticeBloodOrbStack,'b', new ItemStack(ModItems.bucketLife))); + + // GameRegistry.addRecipe(waterScribeToolStack, "f", "i", 'f', featherStack, 'i', elementalInkWaterStack); // GameRegistry.addRecipe(fireScribeToolStack, "f", "i", 'f', featherStack, 'i', elementalInkFireStack); // GameRegistry.addRecipe(earthScribeToolStack, "f", "i", 'f', featherStack, 'i', elementalInkEarthStack); // GameRegistry.addRecipe(airScribeToolStack, "f", "i", 'f', featherStack, 'i', elementalInkAirStack); @@ -594,6 +601,7 @@ public class AlchemicalWizardry this.initAltarRecipes(); this.initRituals(); this.initBindingRecipes(); + this.initHarvestRegistry(); //MinecraftForge.setToolClass(ModItems.boundPickaxe, "pickaxe", 5); //MinecraftForge.setToolClass(ModItems.boundAxe, "axe", 5); @@ -968,6 +976,7 @@ public class AlchemicalWizardry Rituals.registerRitual("AW021Expulsion", 1, 1000000, new RitualEffectExpulsion(), "Aura of Expulsion"); Rituals.registerRitual("AW022Supression", 1, 10000, new RitualEffectSupression(), "Dome of Supression"); Rituals.registerRitual("AW023Zephyr", 1, 25000, new RitualEffectItemSuction(),"Call of the Zephyr"); + Rituals.registerRitual("AW024Harvest", 1, 1000, new RitualEffectHarvest(), "Reap of the Harvest Moon"); //Rituals.registerRitual(1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); } @@ -979,4 +988,10 @@ public class AlchemicalWizardry BindingRegistry.registerRecipe(new ItemStack(ModItems.energySword), new ItemStack(Items.diamond_sword)); BindingRegistry.registerRecipe(new ItemStack(ModItems.energyBlaster), new ItemStack(ModItems.apprenticeBloodOrb)); } + + public static void initHarvestRegistry() + { + HarvestRegistry.registerHarvestHandler(new BloodMagicHarvestHandler()); + HarvestRegistry.registerHarvestHandler(new GourdHarvestHandler()); + } } diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/HarvestRegistry.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/HarvestRegistry.java new file mode 100644 index 00000000..886c0ea4 --- /dev/null +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/HarvestRegistry.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.api.harvest; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +public class HarvestRegistry +{ + public static List handlerList = new ArrayList(); + + public static void registerHarvestHandler(IHarvestHandler handler) + { + handlerList.add(handler); + } + + public static boolean harvestBlock(World world, int xCoord, int yCoord, int zCoord) + { + Block block = world.getBlock(xCoord, yCoord, zCoord); + int meta = world.getBlockMetadata(xCoord, yCoord, zCoord); + + for(IHarvestHandler handler : handlerList) + { + if(handler.canHandleBlock(block) && handler.harvestAndPlant(world, xCoord, yCoord, zCoord, block, meta)) + { + return true; + } + } + + return false; + } +} diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/IHarvestHandler.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/IHarvestHandler.java new file mode 100644 index 00000000..88e47835 --- /dev/null +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/api/harvest/IHarvestHandler.java @@ -0,0 +1,16 @@ +package WayofTime.alchemicalWizardry.api.harvest; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; + +public interface IHarvestHandler +{ + public boolean canHandleBlock(Block block); + + public int getHarvestMeta(Block block); + + public boolean harvestAndPlant(World world, int xCoord, int yCoord, int zCoord, Block block, int meta); + + public IPlantable getSeedItem(Block block); +} diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java index f6f97f03..b0777a46 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java @@ -112,4 +112,9 @@ public class DemonBuilding { schematic.destroyAllInField(world, xCoord, yCoord, zCoord, dir); } + + public int getNumberOfGridSpaces() + { + return area.getNumberOfGridSpaces(); + } } diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/GridSpaceHolder.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/GridSpaceHolder.java index 5ce845c1..95438be0 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/GridSpaceHolder.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/demonVillage/GridSpaceHolder.java @@ -289,4 +289,21 @@ public class GridSpaceHolder } } } + + public int getNumberOfGridSpaces() + { + int num = 0; + for(int i=-this.negXRadius; i<=this.posXRadius; i++) + { + for(int j=-this.negZRadius; j<=this.posZRadius; j++) + { + if(!this.getGridSpace(i, j).isEmpty()) + { + num++; + } + } + } + + return num; + } } diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java index f07dc92c..95275b21 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java @@ -342,7 +342,6 @@ public class EntityElemental extends EntityDemon { super.writeEntityToNBT(par1NBTTagCompound); par1NBTTagCompound.setBoolean("Angry", this.isAngry()); - par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); } /** @@ -353,11 +352,6 @@ public class EntityElemental extends EntityDemon super.readEntityFromNBT(par1NBTTagCompound); this.setAngry(par1NBTTagCompound.getBoolean("Angry")); - if (par1NBTTagCompound.hasKey("CollarColor")) - { - this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); - } - this.setCombatTask(); } diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/BloodMagicHarvestHandler.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/BloodMagicHarvestHandler.java new file mode 100644 index 00000000..861932f9 --- /dev/null +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/BloodMagicHarvestHandler.java @@ -0,0 +1,122 @@ +package WayofTime.alchemicalWizardry.common.harvest; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import WayofTime.alchemicalWizardry.api.harvest.IHarvestHandler; + +public class BloodMagicHarvestHandler implements IHarvestHandler +{ + @Override + public boolean canHandleBlock(Block block) + { + return block == Blocks.wheat || block == Blocks.carrots || block == Blocks.potatoes; + } + + @Override + public int getHarvestMeta(Block block) + { + if(block == Blocks.wheat) + { + return 7; + } + if(block == Blocks.carrots) + { + return 7; + } + if(block == Blocks.potatoes) + { + return 7; + } + return 7; + } + + @Override + public boolean harvestAndPlant(World world, int xCoord, int yCoord, int zCoord, Block block, int meta) + { + if(!this.canHandleBlock(block) || meta != this.getHarvestMeta(block)) + { + return false; + } + + IPlantable seed = this.getSeedItem(block); + + if(seed == null) + { + return false; + } + + int fortune = 0; + + List list = block.getDrops(world, xCoord, yCoord, zCoord, meta, fortune); + boolean foundAndRemovedSeed = false; + + for(ItemStack stack : list) + { + if(stack == null) + { + continue; + } + + Item item = stack.getItem(); + if(item == seed) + { + int itemSize = stack.stackSize; + if(itemSize > 1) + { + stack.stackSize--; + foundAndRemovedSeed = true; + break; + }else if(itemSize == 1) + { + list.remove(stack); + foundAndRemovedSeed = true; + break; + } + } + } + + if(foundAndRemovedSeed) + { + int plantMeta = seed.getPlantMetadata(world, xCoord, yCoord, zCoord); + Block plantBlock = seed.getPlant(world, xCoord, yCoord, zCoord); + + world.setBlock(xCoord, yCoord, zCoord, plantBlock, plantMeta, 3); + + for(ItemStack stack : list) + { + EntityItem itemEnt = new EntityItem(world, xCoord, yCoord, zCoord, stack); + + world.spawnEntityInWorld(itemEnt); + } + } + + return false; + } + + @Override + public IPlantable getSeedItem(Block block) + { + if(block == Blocks.wheat) + { + return (IPlantable) Items.wheat_seeds; + } + if(block == Blocks.carrots) + { + return (IPlantable) Items.carrot; + } + if(block == Blocks.potatoes) + { + return (IPlantable) Items.potato; + } + + return null; + } +} \ No newline at end of file diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/GourdHarvestHandler.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/GourdHarvestHandler.java new file mode 100644 index 00000000..7870cf09 --- /dev/null +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/harvest/GourdHarvestHandler.java @@ -0,0 +1,58 @@ +package WayofTime.alchemicalWizardry.common.harvest; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import WayofTime.alchemicalWizardry.api.harvest.IHarvestHandler; + +public class GourdHarvestHandler implements IHarvestHandler +{ + @Override + public boolean canHandleBlock(Block block) + { + return block == Blocks.melon_block || block == Blocks.pumpkin; + } + + @Override + public int getHarvestMeta(Block block) + { + return 0; + } + + @Override + public boolean harvestAndPlant(World world, int xCoord, int yCoord, int zCoord, Block block, int meta) + { + if(!this.canHandleBlock(block)) + { + return false; + } + + int fortune = 0; + + List list = block.getDrops(world, xCoord, yCoord, zCoord, meta, fortune); + + world.setBlockToAir(xCoord, yCoord, zCoord); + + for(ItemStack stack : list) + { + EntityItem itemEnt = new EntityItem(world, xCoord, yCoord, zCoord, stack); + + world.spawnEntityInWorld(itemEnt); + } + + return false; + } + + @Override + public IPlantable getSeedItem(Block block) + { + return null; + } +} \ No newline at end of file diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java index 00d9c533..9ab96a21 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java @@ -144,6 +144,10 @@ public class ItemRitualDiviner extends EnergyItems { TEMasterStone masterStone = (TEMasterStone) tileEntity; List ritualList = Rituals.getRitualList(this.getCurrentRitual(par1ItemStack)); + if(ritualList == null) + { + return false; + } int playerInvRitualStoneLocation = -1; for (int i = 0; i < playerInventory.length; i++) diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java index f770c9dd..6f1806a1 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java @@ -417,7 +417,7 @@ public class ItemSpellMultiTool extends Item @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Here's a 'Tool Tip' :D"); + par3List.add("A mace filled with ancient alchemy"); if (!(par1ItemStack.stackTagCompound == null)) { @@ -434,7 +434,7 @@ public class ItemSpellMultiTool extends Item par3List.add(""); float damage = this.getCustomItemAttack(par1ItemStack); par3List.add("\u00A79+" + ((int)(damage*10))/10.0f + " " + "Attack Damage"); - float critChance = ((int)(this.getCritChance(par1ItemStack)*1000))/10; + float critChance = ((int)(this.getCritChance(par1ItemStack)*1000))/10.0f; par3List.add("\u00A79+" + critChance + "% " + "Crit Chance"); } } diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHarvest.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHarvest.java new file mode 100644 index 00000000..42564449 --- /dev/null +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHarvest.java @@ -0,0 +1,123 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import WayofTime.alchemicalWizardry.api.harvest.HarvestRegistry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectHarvest extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + int maxCount = 9; + + if (currentEssence < this.getCostPerRefresh() * maxCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + if (world.getWorldTime() % 20 != 0) + { + return; + } + + int flag = 0; + int range = 4; + + for (int i = -range; i <= range; i++) + { + for (int j = -range; j <= range; j++) + { + for(int k = -range; k<=range; k++) + { + if(HarvestRegistry.harvestBlock(world, x + i, y + j, z + k)) + { + flag++; + } + } + } + } + + if (flag > 0) + { + data.currentEssence = currentEssence - this.getCostPerRefresh() * Math.min(maxCount, flag); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 20; + } + + @Override + public List getRitualComponentList() + { + ArrayList harvestRitual = new ArrayList(); + + harvestRitual.add(new RitualComponent(1,0,1,RitualComponent.DUSK)); + harvestRitual.add(new RitualComponent(1,0,-1,RitualComponent.DUSK)); + harvestRitual.add(new RitualComponent(-1,0,-1,RitualComponent.DUSK)); + harvestRitual.add(new RitualComponent(-1,0,1,RitualComponent.DUSK)); + harvestRitual.add(new RitualComponent(2,0,0,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(-2,0,0,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(0,0,2,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(0,0,-2,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(3,0,1,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(3,0,-1,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(-3,0,1,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(-3,0,-1,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(1,0,3,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(-1,0,3,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(1,0,-3,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(-1,0,-3,RitualComponent.EARTH)); + harvestRitual.add(new RitualComponent(2,0,3,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(3,0,2,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(2,0,-3,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(-3,0,2,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(-2,0,3,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(3,0,-2,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(-2,0,-3,RitualComponent.WATER)); + harvestRitual.add(new RitualComponent(-3,0,-2,RitualComponent.WATER)); + + + return harvestRitual; + } +} diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java index 7c712ec7..d405b21f 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java @@ -9,6 +9,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.server.MinecraftServer; @@ -73,7 +74,7 @@ public class RitualEffectItemSuction extends RitualEffect entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); } else { - List itemDropList = SpellHelper.getItemsInRange(world, x+0.5f, y+0.5f, z+0.5f, 10, 10); + List itemDropList = SpellHelper.getItemsInRange(world, x+0.5f, y+0.5f, z+0.5f, range, range); int count = 0; @@ -100,7 +101,10 @@ public class RitualEffectItemSuction extends RitualEffect copyStack.stackSize = 0; } else { - if (itemStack.getItem().equals(copyStack.getItem()) && itemStack.getItemDamage() == copyStack.getItemDamage()) + NBTTagCompound data1 = itemStack.getTagCompound(); + NBTTagCompound data2 = copyStack.getTagCompound(); + //TODO + if (itemStack.getItem().equals(copyStack.getItem()) && itemStack.getItemDamage() == copyStack.getItemDamage() && ((data1 == null && data2 == null) || (data1 != null && data1.equals(data2)))) { int itemSize = itemStack.stackSize; int copySize = copyStack.stackSize; diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java index 96e284b2..094d3fb4 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -263,22 +263,18 @@ public class SpellEffectEarth extends SpellEffect @Override protected int getCostForOffenseTool() { - // TODO Auto-generated method stub - return 0; + return 1000; } - @Override protected int getCostForDefenseTool() { return (int)(1000 * (1 + this.potencyEnhancement*0.1f) * (1 + this.powerEnhancement*0.2f) * Math.pow(0.85, costEnhancement)); } - @Override protected int getCostForEnvironmentTool() { return (int)(10 * (1+this.potencyEnhancement*0.8) * Math.pow(1.5*this.powerEnhancement + 3, 2) * Math.pow(0.85, this.costEnhancement)); } - } diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java index a6f03bc1..a3ee9ce2 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java @@ -28,8 +28,8 @@ public class ToolEnvironmentalEarth extends DigAreaEffect int z = blockPos.blockZ; ForgeDirection sidehit = ForgeDirection.getOrientation(blockPos.sideHit); - int radius = 2; - int depth = 5; + int radius = this.powerUpgrades + 1; + int depth = 1 + this.potencyUpgrades * 2; depth--; diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java index 4a4fac77..8cf4bc63 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java @@ -25,7 +25,7 @@ public class ToolDefensiveIce extends SummonToolEffect public int onSummonTool(ItemStack toolStack, World world, Entity entity) { int horizRadius = this.powerUpgrades*2+2; - int vertRadius = this.powerUpgrades * 3 + 2; + int vertRadius = this.potencyUpgrades * 3 + 2; List entityList = SpellHelper.getEntitiesInRange(world, entity.posX, entity.posY, entity.posZ, horizRadius, vertRadius); for(Entity ent : entityList) diff --git a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java index b9273060..9b6f08d6 100644 --- a/1.7.2/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java +++ b/1.7.2/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java @@ -36,6 +36,9 @@ import com.google.gson.GsonBuilder; public class TEDemonPortal extends TileEntity { + public static int buildingGridDelay = 25; + public static int roadGridDelay = 10; + public static List buildingList = new ArrayList(); public Random rand = new Random(); private GridSpace[][] area; @@ -105,12 +108,41 @@ public class TEDemonPortal extends TileEntity } } - this.houseCooldown = 1000; - this.roadCooldown = 100; + this.houseCooldown = TEDemonPortal.buildingGridDelay; + this.roadCooldown = TEDemonPortal.roadGridDelay; isInitialized = true; } + @Override + public void updateEntity() + { + if(!isInitialized) + { + return; + } + + if(this.roadCooldown <= 0) + { + int roadsMade = this.createRandomRoad(); + if(roadsMade > 0) + { + this.roadCooldown = TEDemonPortal.roadGridDelay * roadsMade; + } + } + else if(this.houseCooldown <= 0) + { + int gridsUsed = this.createRandomBuilding(0, 0); + if(gridsUsed > 0) + { + this.houseCooldown = TEDemonPortal.buildingGridDelay * gridsUsed; + } + } + + this.houseCooldown = Math.max(0, this.houseCooldown - 1); + this.roadCooldown = Math.max(0, this.roadCooldown - 1); + } + @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound) { @@ -140,6 +172,9 @@ public class TEDemonPortal extends TileEntity } this.isInitialized = par1NBTTagCompound.getBoolean("init"); + + this.tier = par1NBTTagCompound.getInteger("tier"); + this.totalPoints = par1NBTTagCompound.getInteger("totalPoints"); } @Override @@ -179,6 +214,8 @@ public class TEDemonPortal extends TileEntity par1NBTTagCompound.setTag("Grid", gridList); par1NBTTagCompound.setBoolean("init", isInitialized); + par1NBTTagCompound.setInteger("tier", this.tier); + par1NBTTagCompound.setInteger("totalPoints", this.totalPoints); } public int createRandomRoad() //Return the number of road spaces @@ -745,7 +782,6 @@ public class TEDemonPortal extends TileEntity { return; } - Int3 roadMarker = this.getNextRoadMarker(); this.initialize(); @@ -761,20 +797,20 @@ public class TEDemonPortal extends TileEntity } } - public void createRandomBuilding(int type, int tier) + public int createRandomBuilding(int type, int tier) { switch(type) { case DemonBuilding.BUILDING_HOUSE: - this.createRandomHouse(tier); - break; + return this.createRandomHouse(tier); case DemonBuilding.BUILDING_PORTAL: - this.createPortalBuilding(tier); - break; + return this.createPortalBuilding(tier); } + + return 0; } - public void createPortalBuilding(int buildingTier) + public int createPortalBuilding(int buildingTier) { int x = 0; int z = 0; @@ -797,7 +833,7 @@ public class TEDemonPortal extends TileEntity if(directions.isEmpty()) { - return; + return 0; } HashMap> schemMap = new HashMap(); @@ -823,7 +859,7 @@ public class TEDemonPortal extends TileEntity if(schemMap.keySet().isEmpty()) { - return; + return 0; } ForgeDirection chosenDirection = (ForgeDirection) schemMap.keySet().toArray()[new Random().nextInt(schemMap.keySet().size())]; @@ -847,9 +883,11 @@ public class TEDemonPortal extends TileEntity build.buildAll(worldObj, xCoord + (x)*5, yLevel, zCoord + (z)*5, chosenDirection.getOpposite()); build.setAllGridSpaces(x, z, yLevel, chosenDirection.getOpposite(), GridSpace.MAIN_PORTAL, grid); this.loadGSH(grid); + + return build.getNumberOfGridSpaces(); } - public void createRandomHouse(int buildingTier) + public int createRandomHouse(int buildingTier) { int next = rand.nextInt(4); ForgeDirection dir; @@ -872,8 +910,6 @@ public class TEDemonPortal extends TileEntity dir = ForgeDirection.NORTH; } - int length = 5; - boolean newProtocol = true; if(newProtocol) @@ -890,7 +926,7 @@ public class TEDemonPortal extends TileEntity if(!this.getGridSpace(x, z).isRoadSegment()) { - return; + return 0; } List directions = new ArrayList(); @@ -906,7 +942,7 @@ public class TEDemonPortal extends TileEntity if(directions.isEmpty()) { - return; + return 0; } HashMap> schemMap = new HashMap(); @@ -942,7 +978,7 @@ public class TEDemonPortal extends TileEntity if(schemMap.keySet().isEmpty()) { - return; + return 0; } ForgeDirection chosenDirection = (ForgeDirection) schemMap.keySet().toArray()[new Random().nextInt(schemMap.keySet().size())]; @@ -956,6 +992,8 @@ public class TEDemonPortal extends TileEntity build.buildAll(worldObj, xCoord + (x + xOff)*5, yLevel, zCoord + (z + zOff)*5, chosenDirection.getOpposite()); build.setAllGridSpaces(x + xOff, z + zOff, yLevel, chosenDirection.getOpposite(), GridSpace.HOUSE, grid); this.loadGSH(grid); + + return build.getNumberOfGridSpaces(); }else { Int3 space = findEmptySpaceNearRoad(dir, 3*(rand.nextInt(negXRadius + negZRadius + posXRadius + posZRadius))+1, 2); @@ -967,12 +1005,12 @@ public class TEDemonPortal extends TileEntity GridSpace newSpace = this.getGridSpace(x, z); if(!newSpace.isEmpty()) { - return; + return 0; } if(yLevel == -1) { - return; + return 0; } GridSpaceHolder grid = this.createGSH(); @@ -1012,7 +1050,7 @@ public class TEDemonPortal extends TileEntity build = buildingList.get(new Random().nextInt(buildingList.size())); }else { - return; + return 0; } //TODO: Finish the selection algorythm //TODO: Should favour those directions that have a road right next to them. @@ -1021,7 +1059,8 @@ public class TEDemonPortal extends TileEntity build.setAllGridSpaces(x, z, yLevel, chosenDirection, GridSpace.HOUSE, grid); this.loadGSH(grid); - System.out.println("X: " + x + " Z: " + z + " Direction: " + chosenDirection.toString()); + return build.getNumberOfGridSpaces(); +// System.out.println("X: " + x + " Z: " + z + " Direction: " + chosenDirection.toString()); } } @@ -1091,34 +1130,6 @@ public class TEDemonPortal extends TileEntity return 10; } - public Block getRoadMarker() - { - return ModBlocks.ritualStone; - } - - public Int3 getNextRoadMarker() - { - int horizSearchMax = 25; - int vertSearchMax = 10; - - for(int xPos=xCoord-horizSearchMax; xPos<=xCoord+horizSearchMax; xPos++) - { - for(int zPos=zCoord-horizSearchMax; zPos<=zCoord+horizSearchMax; zPos++) - { - for(int yPos=yCoord-vertSearchMax; yPos<=yCoord+vertSearchMax; yPos++) - { - Block block = worldObj.getBlock(xPos, yPos, zPos); - if(block == this.getRoadMarker()) - { - return new Int3(xPos,yPos,zPos); - } - } - } - } - - return null; - } - public int getRoadSpacer() { return 1; @@ -1177,4 +1188,14 @@ public class TEDemonPortal extends TileEntity } + + public int getTotalPoints() + { + return this.totalPoints; + } + + public void addToPoints(int addition) + { + this.totalPoints += addition; + } } diff --git a/1.7.2/main/resources/assets/alchemicalwizardry/lang/en_US.lang b/1.7.2/main/resources/assets/alchemicalwizardry/lang/en_US.lang index a550139b..510f46c9 100644 --- a/1.7.2/main/resources/assets/alchemicalwizardry/lang/en_US.lang +++ b/1.7.2/main/resources/assets/alchemicalwizardry/lang/en_US.lang @@ -130,7 +130,7 @@ item.bloodLightSigil.name=Sigil of the Blood Lamp item.itemComplexSpellCrystal.name=Complex Spell Crystal item.itemSigilOfSupression.name=Sigil of Supression item.itemSigilOfEnderSeverance.name=Sigil of Ender Severance -item.bucketLive.name=Bucket of Life +item.bucketLife.name=Bucket of Life item.bloodMagicBaseItem.QuartzRod.name=Quartz Rod item.bloodMagicBaseItem.EmptyCore.name=Empty Core item.bloodMagicBaseItem.MagicalesCable.name=Magicales Cable diff --git a/1.7.2/main/resources/assets/alchemicalwizardry/schematics/building/buildings.zip b/1.7.2/main/resources/assets/alchemicalwizardry/schematics/building/buildings.zip index 88db9bbc41e47a980ed65e2ef5515280009d7e74..795c759598afbd61eb01e1a1a274c1dd9bd29dc7 100644 GIT binary patch literal 766 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 KhLB|i0Q?_6dW~cN